Compare commits

..

53 Commits

Author SHA1 Message Date
github-actions
746f1fd300 Auto commit for release 'develop' on 2024-04-02 2024-04-02 07:47:24 +02:00
James Cole
9e5faf919f Add space 2024-04-02 07:40:40 +02:00
James Cole
cc6cbe6605 Add something to changelog before I forget. 2024-04-02 07:01:13 +02:00
James Cole
dc6d708897 Replace frontpageAccounts variable name. 2024-04-02 06:59:40 +02:00
James Cole
6189d24b98 Replace variable names. 2024-04-01 20:26:02 +02:00
James Cole
f6e28dc88f Fine tune preferences to handle multi-administration options. 2024-04-01 19:59:21 +02:00
James Cole
75ea035630 Preferences can be administration specific. Not yet really working. 2024-04-01 18:18:48 +02:00
James Cole
4cdb14301d Add administration specific thing to preferences. 2024-04-01 18:03:43 +02:00
James Cole
9f95221ba3 Various code cleanup. 2024-04-01 17:43:31 +02:00
James Cole
e3a67be412 Clear user groups when loading 2024-04-01 16:07:14 +02:00
James Cole
5749b642ce Wrong response code. 2024-04-01 16:07:03 +02:00
James Cole
baff7c67f9 Expand user group views and translations 2024-04-01 15:41:16 +02:00
James Cole
ccc005942f Expand user group pages. 2024-04-01 15:40:53 +02:00
James Cole
5b83c33039 Turns out it's pointless to add "default_administration", you can force that already through the owner role (which is already in place). 2024-04-01 14:15:35 +02:00
James Cole
cc32578c5f Add new strings. 2024-04-01 14:04:36 +02:00
James Cole
80f410835b Expand models, user groups need more properties. 2024-04-01 14:04:22 +02:00
James Cole
b537a3145d Expand financial administrations views. 2024-04-01 14:01:52 +02:00
James Cole
bfa1fcbaf8 make sure output.txt is writeable. 2024-04-01 09:08:19 +02:00
James Cole
56243907c4 Add some debug info 2024-04-01 09:01:53 +02:00
James Cole
5928dd72e6 Forgot the zip name 2024-04-01 08:53:56 +02:00
github-actions
c6bf0ff1cd Auto commit for release 'v6.1.13' on 2024-04-01 2024-04-01 08:51:46 +02:00
James Cole
19d1cf192b Fix tests, update changelog. 2024-04-01 08:46:13 +02:00
James Cole
37d7dc7e3e Merge branch 'main' into develop 2024-04-01 08:37:57 +02:00
James Cole
95a3a194b8 Better instructions 2024-04-01 08:37:49 +02:00
James Cole
3542387188 Merge branch 'main' into develop 2024-04-01 08:36:25 +02:00
James Cole
da1b002a64 Clean up and expand normal release 2024-04-01 08:36:15 +02:00
James Cole
46daee28e7 Merge branch 'main' into develop 2024-04-01 08:33:02 +02:00
James Cole
9ade5635d4 Add file with revision of the used branch. 2024-04-01 08:32:51 +02:00
James Cole
e14e80f33c Merge branch 'main' into develop 2024-04-01 08:31:32 +02:00
github-actions
0c824e21c8 Auto commit for release 'develop' on 2024-04-01 2024-04-01 05:10:33 +02:00
James Cole
fab1c68569 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2024-03-31 19:32:00 +02:00
James Cole
c1534657f2 Fix the installation template. 2024-03-31 19:31:52 +02:00
github-actions
39841de680 Auto commit for release 'develop' on 2024-03-31 2024-03-31 17:12:02 +02:00
James Cole
43a720b62b It helps when you actually add 1 2024-03-31 17:06:37 +02:00
James Cole
5ec54de29e Fix shitty test 2024-03-31 16:51:53 +02:00
James Cole
397e37f344 Fix another division by zero 2024-03-31 16:46:38 +02:00
James Cole
b6f84c2b99 Expand v2 layout, add user administration pages. 2024-03-31 16:46:20 +02:00
James Cole
843f86fc66 Merge branch 'main' into develop 2024-03-31 11:29:35 +02:00
James Cole
0e8e364074 Can now release multiple development builds per day 2024-03-31 10:01:21 +02:00
James Cole
bbccbef578 Fix loop 2024-03-31 09:55:17 +02:00
James Cole
ee11a8e3a0 Add check for duplicate tags 2024-03-31 09:48:20 +02:00
James Cole
e8618047bd More readable fix for division by zero error. 2024-03-31 08:40:47 +02:00
James Cole
f104b76f73 Merge pull request #8735 from mansuf/develop
Fix `Division error by zero` in budget views
2024-03-31 08:37:09 +02:00
Rahman Yusuf
cb701d8506 Fix Division error by zero in budget views 2024-03-31 12:03:54 +07:00
James Cole
70a334c56e Merge branch 'main' into develop 2024-03-31 03:16:54 +02:00
github-actions
e6b2db1e29 Auto commit for release 'develop' on 2024-03-31 2024-03-31 03:14:08 +02:00
James Cole
e8dffa0052 Update script version 2024-03-31 03:09:00 +02:00
James Cole
c4f0512f39 Run another composer, and dump the autoload files. 2024-03-31 03:06:58 +02:00
James Cole
3268019d0c Fix #8732 2024-03-31 01:24:18 +01:00
James Cole
a0ef6a1fc8 Fix https://github.com/firefly-iii/firefly-iii/issues/8725 2024-03-30 09:56:51 +01:00
James Cole
99d0098b20 Merge branch 'main' into develop 2024-03-28 05:59:30 +01:00
James Cole
a7a54c042c Touch and exclude tar name 2024-03-28 05:53:31 +01:00
James Cole
53b501ca73 Add tar.gz file 2024-03-27 20:04:14 +01:00
208 changed files with 87065 additions and 83949 deletions

View File

@@ -9,16 +9,16 @@
"packages-dev": [ "packages-dev": [
{ {
"name": "composer/pcre", "name": "composer/pcre",
"version": "3.1.2", "version": "3.1.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/pcre.git", "url": "https://github.com/composer/pcre.git",
"reference": "4775f35b2d70865807c89d32c8e7385b86eb0ace" "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/pcre/zipball/4775f35b2d70865807c89d32c8e7385b86eb0ace", "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
"reference": "4775f35b2d70865807c89d32c8e7385b86eb0ace", "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -60,7 +60,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/composer/pcre/issues", "issues": "https://github.com/composer/pcre/issues",
"source": "https://github.com/composer/pcre/tree/3.1.2" "source": "https://github.com/composer/pcre/tree/3.1.3"
}, },
"funding": [ "funding": [
{ {
@@ -76,20 +76,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-03-07T15:38:35+00:00" "time": "2024-03-19T10:26:25+00:00"
}, },
{ {
"name": "composer/xdebug-handler", "name": "composer/xdebug-handler",
"version": "3.0.3", "version": "3.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/xdebug-handler.git", "url": "https://github.com/composer/xdebug-handler.git",
"reference": "ced299686f41dce890debac69273b47ffe98a40c" "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/4f988f8fdf580d53bdb2d1278fe93d1ed5462255",
"reference": "ced299686f41dce890debac69273b47ffe98a40c", "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -100,7 +100,7 @@
"require-dev": { "require-dev": {
"phpstan/phpstan": "^1.0", "phpstan/phpstan": "^1.0",
"phpstan/phpstan-strict-rules": "^1.1", "phpstan/phpstan-strict-rules": "^1.1",
"symfony/phpunit-bridge": "^6.0" "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -124,9 +124,9 @@
"performance" "performance"
], ],
"support": { "support": {
"irc": "irc://irc.freenode.org/composer", "irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/xdebug-handler/issues", "issues": "https://github.com/composer/xdebug-handler/issues",
"source": "https://github.com/composer/xdebug-handler/tree/3.0.3" "source": "https://github.com/composer/xdebug-handler/tree/3.0.4"
}, },
"funding": [ "funding": [
{ {
@@ -142,7 +142,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-25T21:32:43+00:00" "time": "2024-03-26T18:29:49+00:00"
}, },
{ {
"name": "pdepend/pdepend", "name": "pdepend/pdepend",

View File

@@ -4,7 +4,7 @@ on:
workflow_dispatch: workflow_dispatch:
inputs: inputs:
version: version:
description: 'Version to release' description: 'Release "v1.2.3" or "develop"'
required: true required: true
default: 'develop' default: 'develop'
schedule: schedule:
@@ -51,7 +51,7 @@ jobs:
CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }} CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }}
- name: Cleanup translations - name: Cleanup translations
id: cleanup-transactions id: cleanup-transactions
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:crowdin-warning' action: 'ff3:crowdin-warning'
output: '' output: ''
@@ -60,7 +60,7 @@ jobs:
GH_TOKEN: '' GH_TOKEN: ''
- name: Cleanup changelog - name: Cleanup changelog
id: cleanup-changelog id: cleanup-changelog
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:changelog' action: 'ff3:changelog'
output: '' output: ''
@@ -69,7 +69,7 @@ jobs:
GH_TOKEN: ${{ secrets.CHANGELOG_TOKEN }} GH_TOKEN: ${{ secrets.CHANGELOG_TOKEN }}
- name: Extract changelog - name: Extract changelog
id: extract-changelog id: extract-changelog
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:extract-changelog' action: 'ff3:extract-changelog'
output: 'output' output: 'output'
@@ -78,7 +78,7 @@ jobs:
GH_TOKEN: "" GH_TOKEN: ""
- name: Replace version - name: Replace version
id: replace-version id: replace-version
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:version' action: 'ff3:version'
output: '' output: ''
@@ -88,7 +88,7 @@ jobs:
FF_III_VERSION: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }} FF_III_VERSION: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
- name: Generate JSON v1 - name: Generate JSON v1
id: json-v1 id: json-v1
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:json-translations v1' action: 'ff3:json-translations v1'
output: '' output: ''
@@ -97,7 +97,7 @@ jobs:
GH_TOKEN: '' GH_TOKEN: ''
- name: Generate JSON v2 - name: Generate JSON v2
id: json-v2 id: json-v2
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:json-translations v2' action: 'ff3:json-translations v2'
output: '' output: ''
@@ -106,7 +106,7 @@ jobs:
GH_TOKEN: '' GH_TOKEN: ''
- name: Code cleanup - name: Code cleanup
id: code-cleanup id: code-cleanup
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:code' action: 'ff3:code'
output: '' output: ''
@@ -120,7 +120,7 @@ jobs:
npm run build npm run build
- name: Build old JS - name: Build old JS
id: old-js id: old-js
uses: JC5/firefly-iii-dev@v34 uses: JC5/firefly-iii-dev@v36
with: with:
action: 'ff3:old-js' action: 'ff3:old-js'
output: '' output: ''
@@ -136,20 +136,51 @@ jobs:
.ci/phpcs.sh .ci/phpcs.sh
- name: Release - name: Release
run: | run: |
# do some configuration
sudo timedatectl set-timezone Europe/Amsterdam sudo timedatectl set-timezone Europe/Amsterdam
git config user.name github-actions git config user.name github-actions
git config user.email 41898282+github-actions[bot]@users.noreply.github.com git config user.email 41898282+github-actions[bot]@users.noreply.github.com
git config advice.addIgnoredFile false git config advice.addIgnoredFile false
# set some variables
releaseName=$version releaseName=$version
originalName=$version
zipName=FireflyIII-$version.zip zipName=FireflyIII-$version.zip
tarName=FireflyIII-$version.tar.gz
# update composer (again)
composer validate --strict
composer update --no-dev --no-scripts --no-plugins
composer dump-autoload
# if this is a develop build, slightly different variable names.
if [[ "develop" == "$version" ]]; then if [[ "develop" == "$version" ]]; then
[[ -z $(git status --untracked-files=normal --porcelain) ]] && echo "this branch is clean, no need to push..." && exit 0; [[ -z $(git status --untracked-files=normal --porcelain) ]] && echo "this branch is clean, no need to push..." && exit 0;
releaseName=$version-$(date +'%Y%m%d') releaseName=$version-$(date +'%Y%m%d')
originalName=$releaseName
zipName=FireflyIII-develop.zip zipName=FireflyIII-develop.zip
tarName=FireflyIII-develop.tar.gz
fi fi
# in both cases, if the release or tag already exists, add ".1" until it no longer exists.
tagFound=true
tagCount=1
while [ "$tagFound" = true ]
do
if [ $(git tag -l "$releaseName") ]; then
echo "Tag $releaseName exists already."
releaseName="$originalName"."$tagCount"
echo "Tag for release is now $releaseName"
tagCount=$((tagCount+1))
else
echo "Tag $releaseName does not exist, can continue"
tagFound=false
fi
done
echo "Will use tag and release name $releaseName."
# add all content, except output.txt (this contains the changelog and/or the download instructions)
echo 'Add all and reset output.txt'
git add -A git add -A
if test -f "output.txt"; then if test -f "output.txt"; then
git reset output.txt git reset output.txt
@@ -157,13 +188,20 @@ jobs:
git commit -m "Auto commit for release '$version' on $(date +'%Y-%m-%d')" || true git commit -m "Auto commit for release '$version' on $(date +'%Y-%m-%d')" || true
git push git push
# zip everything # zip and tar everything
echo 'Zip and tar...'
zip -rq $zipName . -x "*.git*" "*.ci*" "*.github*" "*node_modules*" "*output.txt*" zip -rq $zipName . -x "*.git*" "*.ci*" "*.github*" "*node_modules*" "*output.txt*"
touch $tarName
tar --exclude=$tarName --exclude='./.git' --exclude='./.ci' --exclude='./.github' --exclude='./node_modules' --exclude='./output.txt' -czf $tarName .
# add sha256 sum # add sha256 sum
echo 'Sha sum ...'
sha256sum -b $zipName > $zipName.sha256 sha256sum -b $zipName > $zipName.sha256
sha256sum -b $tarName > $tarName.sha256
# create a development (nightly) release:
if [[ "develop" == "$version" ]]; then if [[ "develop" == "$version" ]]; then
echo 'Develop release.'
# add text to output.txt (instructions) # add text to output.txt (instructions)
rm output.txt rm output.txt
echo "Bi-weekly development release of Firefly III with the latest fixes, translations and features. Docker users can find this release under the \`develop\` tag." >> output.txt echo "Bi-weekly development release of Firefly III with the latest fixes, translations and features. Docker users can find this release under the \`develop\` tag." >> output.txt
@@ -185,13 +223,19 @@ jobs:
# add zip file to release. # add zip file to release.
gh release upload $releaseName $zipName gh release upload $releaseName $zipName
gh release upload $releaseName $tarName
# add sha256 sum to release # add sha256 sum to release
gh release upload $releaseName $zipName.sha256 gh release upload $releaseName $zipName.sha256
gh release upload $releaseName $tarName.sha256
# rm output.txt again # get current HEAD and add as file to the release
rm output.txt HEAD=$(git rev-parse HEAD)
echo $HEAD > HEAD.txt
gh release upload $releaseName HEAD.txt
else else
echo 'MAIN (real) release'
sudo chown -R runner:docker output.txt
# add text to output.txt (more instructions) # add text to output.txt (more instructions)
echo '' >> output.txt echo '' >> output.txt
echo '### Instructions' >> output.txt echo '### Instructions' >> output.txt
@@ -203,13 +247,29 @@ jobs:
git tag -a $releaseName -m "Here be changelog" git tag -a $releaseName -m "Here be changelog"
git push origin $releaseName git push origin $releaseName
gh release create $releaseName -F output.txt -t "$releaseName" --verify-tag gh release create $releaseName -F output.txt -t "$releaseName" --verify-tag
# add zip file to release.
# add archive files to release
gh release upload $releaseName $zipName gh release upload $releaseName $zipName
# add sha256 sum to release gh release upload $releaseName $tarName
# add sha256 sums to release
gh release upload $releaseName $zipName.sha256 gh release upload $releaseName $zipName.sha256
gh release upload $releaseName $tarName.sha256
# get current HEAD and add as file to the release
HEAD=$(git rev-parse HEAD)
echo $HEAD > HEAD.txt
gh release upload $releaseName HEAD.txt
# remove all temporary files
rm output.txt rm output.txt
rm HEAD.txt
rm $zipName rm $zipName
rm $zipName.sha256 rm $zipName.sha256
rm $tarName
rm $tarName.sha256
# merge main back into develop
git checkout develop git checkout develop
git merge main git merge main
git push git push

View File

@@ -83,17 +83,17 @@ class AccountController extends Controller
// user's preferences // user's preferences
$defaultSet = $this->repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray(); $defaultSet = $this->repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray();
/** @var Preference $frontPage */ /** @var Preference $frontpage */
$frontPage = app('preferences')->get('frontPageAccounts', $defaultSet); $frontpage = app('preferences')->get('frontpageAccounts', $defaultSet);
$default = app('amount')->getDefaultCurrency(); $default = app('amount')->getDefaultCurrency();
if (!(is_array($frontPage->data) && count($frontPage->data) > 0)) { if (!(is_array($frontpage->data) && count($frontpage->data) > 0)) {
$frontPage->data = $defaultSet; $frontpage->data = $defaultSet;
$frontPage->save(); $frontpage->save();
} }
// get accounts: // get accounts:
$accounts = $this->repository->getAccountsById($frontPage->data); $accounts = $this->repository->getAccountsById($frontpage->data);
$chartData = []; $chartData = [];
/** @var Account $account */ /** @var Account $account */

View File

@@ -98,14 +98,14 @@ class AccountController extends Controller
// user's preferences // user's preferences
if (0 === $accounts->count()) { if (0 === $accounts->count()) {
$defaultSet = $this->repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT])->pluck('id')->toArray(); $defaultSet = $this->repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT])->pluck('id')->toArray();
$frontPage = app('preferences')->get('frontPageAccounts', $defaultSet); $frontpage = app('preferences')->get('frontpageAccounts', $defaultSet);
if (!(is_array($frontPage->data) && count($frontPage->data) > 0)) { if (!(is_array($frontpage->data) && count($frontpage->data) > 0)) {
$frontPage->data = $defaultSet; $frontpage->data = $defaultSet;
$frontPage->save(); $frontpage->save();
} }
$accounts = $this->repository->getAccountsById($frontPage->data); $accounts = $this->repository->getAccountsById($frontpage->data);
} }
// both options are overruled by "preselected" // both options are overruled by "preselected"

View File

@@ -0,0 +1,73 @@
<?php
/*
* IndexController.php
* Copyright (c) 2024 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/.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V2\Controllers\UserGroup;
use FireflyIII\Api\V2\Controllers\Controller;
use FireflyIII\Api\V2\Request\Model\Account\IndexRequest;
use FireflyIII\Repositories\UserGroup\UserGroupRepositoryInterface;
use FireflyIII\Transformers\V2\UserGroupTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Pagination\LengthAwarePaginator;
class IndexController extends Controller
{
public const string RESOURCE_KEY = 'user_groups';
private UserGroupRepositoryInterface $repository;
/**
* AccountController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(UserGroupRepositoryInterface::class);
return $next($request);
}
);
}
/**
* TODO see autocomplete/accountcontroller for list.
*/
public function index(IndexRequest $request): JsonResponse
{
$administrations = $this->repository->get();
$pageSize = $this->parameters->get('limit');
$count = $administrations->count();
$administrations = $administrations->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
$paginator = new LengthAwarePaginator($administrations, $count, $pageSize, $this->parameters->get('page'));
$transformer = new UserGroupTransformer();
$transformer->setParameters($this->parameters); // give params to transformer
return response()
->json($this->jsonApiList(self::RESOURCE_KEY, $paginator, $transformer))
->header('Content-Type', self::CONTENT_TYPE)
;
}
}

View File

@@ -54,6 +54,14 @@ class UpdateController extends Controller
); );
} }
public function useUserGroup(UserGroup $userGroup): JsonResponse
{
// group validation is already in place, so can just update the user.
$this->repository->useUserGroup($userGroup);
return response()->json([], 204);
}
public function update(UpdateRequest $request, UserGroup $userGroup): JsonResponse public function update(UpdateRequest $request, UserGroup $userGroup): JsonResponse
{ {
$all = $request->getAll(); $all = $request->getAll();

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V2\Request\UserGroup;
use FireflyIII\Enums\UserRoleEnum; use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\UserGroup; use FireflyIII\Models\UserGroup;
use FireflyIII\Rules\IsDefaultUserGroupName;
use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes; use FireflyIII\Support\Request\ConvertsDataTypes;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
@@ -53,7 +54,7 @@ class UpdateRequest extends FormRequest
$userGroup = $this->route()->parameter('userGroup'); $userGroup = $this->route()->parameter('userGroup');
return [ return [
'title' => sprintf('required|min:1|max:255|unique:user_groups,title,%d', $userGroup->id), 'title' => ['required', 'min:1', 'max:255', sprintf('unique:user_groups,title,%d', $userGroup->id), new IsDefaultUserGroupName($userGroup)],
]; ];
} }
} }

View File

@@ -73,6 +73,7 @@ class CorrectDatabase extends Command
// new! // new!
'firefly-iii:unify-group-accounts', 'firefly-iii:unify-group-accounts',
'firefly-iii:trigger-credit-recalculation', 'firefly-iii:trigger-credit-recalculation',
'firefly-iii:migrate-preferences',
]; ];
foreach ($commands as $command) { foreach ($commands as $command) {
$this->friendlyLine(sprintf('Now executing command "%s"', $command)); $this->friendlyLine(sprintf('Now executing command "%s"', $command));

View File

@@ -50,7 +50,7 @@ class FixFrontpageAccounts extends Command
/** @var User $user */ /** @var User $user */
foreach ($users as $user) { foreach ($users as $user) {
$preference = app('preferences')->getForUser($user, 'frontPageAccounts'); $preference = app('preferences')->getForUser($user, 'frontpageAccounts');
if (null !== $preference) { if (null !== $preference) {
$this->fixPreference($preference); $this->fixPreference($preference);
} }
@@ -83,6 +83,6 @@ class FixFrontpageAccounts extends Command
} }
} }
} }
app('preferences')->setForUser($preference->user, 'frontPageAccounts', $fixed); app('preferences')->setForUser($preference->user, 'frontpageAccounts', $fixed);
} }
} }

View File

@@ -0,0 +1,76 @@
<?php
declare(strict_types=1);
/*
* MigratePreferences.php
* Copyright (c) 2024 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\Console\Commands\Correction;
use FireflyIII\Models\Preference;
use FireflyIII\User;
use Illuminate\Console\Command;
use Symfony\Component\Console\Command\Command as CommandAlias;
class MigratePreferences extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'firefly-iii:migrate-preferences';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Give Firefly III preferences a user group ID so they can be made administration specific.';
/**
* Execute the console command.
*/
public function handle(): int
{
$items = config('firefly.admin_specific_prefs');
$users = User::get();
/** @var User $user */
foreach ($users as $user) {
$count = 0;
foreach ($items as $item) {
$preference = Preference::where('name', $item)->where('user_id', $user->id)->first();
if (null === $preference) {
continue;
}
if (null !== $preference->user_group_id) {
$preference->user_group_id = $user->user_group_id;
$preference->save();
++$count;
}
}
if ($count > 0) {
$this->info(sprintf('Migrated %d preference(s) for user #%d ("%s").', $count, $user->id, $user->email));
}
}
return CommandAlias::SUCCESS;
}
}

View File

@@ -80,7 +80,7 @@ class CreateGroupMemberships extends Command
// check if membership exists // check if membership exists
$userGroup = UserGroup::where('title', $user->email)->first(); $userGroup = UserGroup::where('title', $user->email)->first();
if (null === $userGroup) { if (null === $userGroup) {
$userGroup = UserGroup::create(['title' => $user->email]); $userGroup = UserGroup::create(['title' => $user->email, 'default_administration' => true]);
} }
$userRole = UserRole::where('title', UserRoleEnum::OWNER->value)->first(); $userRole = UserRole::where('title', UserRoleEnum::OWNER->value)->first();

View File

@@ -69,6 +69,7 @@ class UpgradeDatabase extends Command
'firefly-iii:create-group-memberships', 'firefly-iii:create-group-memberships',
'firefly-iii:upgrade-group-information', 'firefly-iii:upgrade-group-information',
'firefly-iii:upgrade-currency-preferences', 'firefly-iii:upgrade-currency-preferences',
'firefly-iii:correct-database',
]; ];
$args = []; $args = [];
if ($this->option('force')) { if ($this->option('force')) {

View File

@@ -41,7 +41,6 @@ enum UserRoleEnum: string
// manage other financial objects: // manage other financial objects:
case MANAGE_BUDGETS = 'mng_budgets'; case MANAGE_BUDGETS = 'mng_budgets';
case MANAGE_PIGGY_BANKS = 'mng_piggies'; case MANAGE_PIGGY_BANKS = 'mng_piggies';
case MANAGE_REPETITIONS = 'mng_reps';
case MANAGE_SUBSCRIPTIONS = 'mng_subscriptions'; case MANAGE_SUBSCRIPTIONS = 'mng_subscriptions';
case MANAGE_RULES = 'mng_rules'; case MANAGE_RULES = 'mng_rules';
case MANAGE_RECURRING = 'mng_recurring'; case MANAGE_RECURRING = 'mng_recurring';
@@ -51,7 +50,7 @@ enum UserRoleEnum: string
// view and generate reports // view and generate reports
case VIEW_REPORTS = 'view_reports'; case VIEW_REPORTS = 'view_reports';
// view memberships. needs FULL to manage them. // view memberships AND roles. needs FULL to manage them.
case VIEW_MEMBERSHIPS = 'view_memberships'; case VIEW_MEMBERSHIPS = 'view_memberships';
// everything the creator can, except remove/change original creator and delete group // everything the creator can, except remove/change original creator and delete group

View File

@@ -145,13 +145,13 @@ class CreateController extends Controller
Log::channel('audit')->info('Stored new account.', $data); Log::channel('audit')->info('Stored new account.', $data);
// update preferences if necessary: // update preferences if necessary:
$frontPage = app('preferences')->get('frontPageAccounts', [])->data; $frontpage = app('preferences')->get('frontpageAccounts', [])->data;
if (!is_array($frontPage)) { if (!is_array($frontpage)) {
$frontPage = []; $frontpage = [];
} }
if (AccountType::ASSET === $account->accountType->type) { if (AccountType::ASSET === $account->accountType->type) {
$frontPage[] = $account->id; $frontpage[] = $account->id;
app('preferences')->set('frontPageAccounts', $frontPage); app('preferences')->set('frontpageAccounts', $frontpage);
} }
// store attachment(s): // store attachment(s):

View File

@@ -235,12 +235,12 @@ class BudgetLimitController extends Controller
new Collection([$budgetLimit->budget]), new Collection([$budgetLimit->budget]),
$budgetLimit->transactionCurrency $budgetLimit->transactionCurrency
); );
$daysLeft = $this->activeDaysLeft($limit->start_date, $limit->end_date);
$array['spent'] = $spentArr[$budgetLimit->transactionCurrency->id]['sum'] ?? '0'; $array['spent'] = $spentArr[$budgetLimit->transactionCurrency->id]['sum'] ?? '0';
$array['left_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, bcadd($array['spent'], $array['amount'])); $array['left_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, bcadd($array['spent'], $array['amount']));
$array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']); $array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']);
$array['days_left'] = (string)$this->activeDaysLeft($limit->start_date, $limit->end_date); $array['days_left'] = (string)$daysLeft;
// left per day: $array['left_per_day'] = 0 === $daysLeft ? bcadd($array['spent'], $array['amount']) : bcdiv(bcadd($array['spent'], $array['amount']), $array['days_left']);
$array['left_per_day'] = bcdiv(bcadd($array['spent'], $array['amount']), $array['days_left']);
// left per day formatted. // left per day formatted.
$array['amount'] = app('steam')->bcround($limit['amount'], $limit->transactionCurrency->decimal_places); $array['amount'] = app('steam')->bcround($limit['amount'], $limit->transactionCurrency->decimal_places);

View File

@@ -301,14 +301,14 @@ class AccountController extends Controller
$end = clone session('end', today(config('app.timezone'))->endOfMonth()); $end = clone session('end', today(config('app.timezone'))->endOfMonth());
$defaultSet = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])->pluck('id')->toArray(); $defaultSet = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])->pluck('id')->toArray();
app('log')->debug('Default set is ', $defaultSet); app('log')->debug('Default set is ', $defaultSet);
$frontPage = app('preferences')->get('frontPageAccounts', $defaultSet); $frontpage = app('preferences')->get('frontpageAccounts', $defaultSet);
$frontPageArray = !is_array($frontPage->data) ? [] : $frontPage->data; $frontpageArray = !is_array($frontpage->data) ? [] : $frontpage->data;
app('log')->debug('Frontpage preference set is ', $frontPageArray); app('log')->debug('Frontpage preference set is ', $frontpageArray);
if (0 === count($frontPageArray)) { if (0 === count($frontpageArray)) {
app('preferences')->set('frontPageAccounts', $defaultSet); app('preferences')->set('frontpageAccounts', $defaultSet);
app('log')->debug('frontpage set is empty!'); app('log')->debug('frontpage set is empty!');
} }
$accounts = $repository->getAccountsById($frontPageArray); $accounts = $repository->getAccountsById($frontpageArray);
return response()->json($this->accountBalanceChart($accounts, $start, $end)); return response()->json($this->accountBalanceChart($accounts, $start, $end));
} }

View File

@@ -116,8 +116,8 @@ class CategoryController extends Controller
return response()->json($cache->get()); return response()->json($cache->get());
} }
$frontPageGenerator = new FrontpageChartGenerator($start, $end); $frontpageGenerator = new FrontpageChartGenerator($start, $end);
$chartData = $frontPageGenerator->generate(); $chartData = $frontpageGenerator->generate();
$data = $this->generator->multiSet($chartData); $data = $this->generator->multiSet($chartData);
$cache->store($data); $cache->store($data);

View File

@@ -129,10 +129,10 @@ class HomeController extends Controller
} }
$subTitle = (string)trans('firefly.welcome_back'); $subTitle = (string)trans('firefly.welcome_back');
$transactions = []; $transactions = [];
$frontPage = app('preferences')->getFresh('frontPageAccounts', $repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray()); $frontpage = app('preferences')->getFresh('frontpageAccounts', $repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray());
$frontPageArray = $frontPage->data; $frontpageArray = $frontpage->data;
if (!is_array($frontPageArray)) { if (!is_array($frontpageArray)) {
$frontPageArray = []; $frontpageArray = [];
} }
/** @var Carbon $start */ /** @var Carbon $start */
@@ -140,13 +140,13 @@ class HomeController extends Controller
/** @var Carbon $end */ /** @var Carbon $end */
$end = session('end', today(config('app.timezone'))->endOfMonth()); $end = session('end', today(config('app.timezone'))->endOfMonth());
$accounts = $repository->getAccountsById($frontPageArray); $accounts = $repository->getAccountsById($frontpageArray);
$today = today(config('app.timezone')); $today = today(config('app.timezone'));
// sort frontpage accounts by order // sort frontpage accounts by order
$accounts = $accounts->sortBy('order'); $accounts = $accounts->sortBy('order');
app('log')->debug('Frontpage accounts are ', $frontPageArray); app('log')->debug('Frontpage accounts are ', $frontpageArray);
/** @var BillRepositoryInterface $billRepository */ /** @var BillRepositoryInterface $billRepository */
$billRepository = app(BillRepositoryInterface::class); $billRepository = app(BillRepositoryInterface::class);

View File

@@ -130,7 +130,7 @@ class BoxController extends Controller
$boxTitle = (string)trans('firefly.left_to_spend'); $boxTitle = (string)trans('firefly.left_to_spend');
$activeDaysLeft = $this->activeDaysLeft($start, $end); // see method description. $activeDaysLeft = $this->activeDaysLeft($start, $end); // see method description.
$display = 1; // not overspent $display = 1; // not overspent
$leftPerDayAmount = bcdiv($leftToSpendAmount, (string)$activeDaysLeft); $leftPerDayAmount = 0 === (int) $activeDaysLeft ? $leftToSpendAmount : bcdiv($leftToSpendAmount, (string)$activeDaysLeft);
app('log')->debug(sprintf('Left to spend per day is %s', $leftPerDayAmount)); app('log')->debug(sprintf('Left to spend per day is %s', $leftPerDayAmount));
} }
} }

View File

@@ -115,7 +115,7 @@ class NewUserController extends Controller
// store frontpage preferences: // store frontpage preferences:
$accounts = $this->repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray(); $accounts = $this->repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray();
app('preferences')->set('frontPageAccounts', $accounts); app('preferences')->set('frontpageAccounts', $accounts);
// mark. // mark.
app('preferences')->mark(); app('preferences')->mark();

View File

@@ -89,10 +89,10 @@ class PreferencesController extends Controller
/** @var array<int, int> $accountIds */ /** @var array<int, int> $accountIds */
$accountIds = $accounts->pluck('id')->toArray(); $accountIds = $accounts->pluck('id')->toArray();
$viewRange = app('navigation')->getViewRange(false); $viewRange = app('navigation')->getViewRange(false);
$frontPageAccountsPref = app('preferences')->get('frontPageAccounts', $accountIds); $frontpageAccountsPref = app('preferences')->get('frontpageAccounts', $accountIds);
$frontPageAccounts = $frontPageAccountsPref->data; $frontpageAccounts = $frontpageAccountsPref->data;
if (!is_array($frontPageAccounts)) { if (!is_array($frontpageAccounts)) {
$frontPageAccounts = $accountIds; $frontpageAccounts = $accountIds;
} }
$language = app('steam')->getLanguage(); $language = app('steam')->getLanguage();
$languages = config('firefly.languages'); $languages = config('firefly.languages');
@@ -128,8 +128,8 @@ class PreferencesController extends Controller
$locales = ['equal' => (string)trans('firefly.equal_to_language')] + $locales; $locales = ['equal' => (string)trans('firefly.equal_to_language')] + $locales;
// an important fallback is that the frontPageAccount array gets refilled automatically // an important fallback is that the frontPageAccount array gets refilled automatically
// when it turns up empty. // when it turns up empty.
if (0 === count($frontPageAccounts)) { if (0 === count($frontpageAccounts)) {
$frontPageAccounts = $accountIds; $frontpageAccounts = $accountIds;
} }
// for the demo user, the slackUrl is automatically emptied. // for the demo user, the slackUrl is automatically emptied.
@@ -139,7 +139,7 @@ class PreferencesController extends Controller
$slackUrl = ''; $slackUrl = '';
} }
return view('preferences.index', compact('language', 'groupedAccounts', 'isDocker', 'frontPageAccounts', 'languages', 'darkMode', 'availableDarkModes', 'notifications', 'slackUrl', 'locales', 'locale', 'tjOptionalFields', 'viewRange', 'customFiscalYear', 'listPageSize', 'fiscalYearStart')); return view('preferences.index', compact('language', 'groupedAccounts', 'isDocker', 'frontpageAccounts', 'languages', 'darkMode', 'availableDarkModes', 'notifications', 'slackUrl', 'locales', 'locale', 'tjOptionalFields', 'viewRange', 'customFiscalYear', 'listPageSize', 'fiscalYearStart'));
} }
/** /**
@@ -155,12 +155,12 @@ class PreferencesController extends Controller
public function postIndex(Request $request) public function postIndex(Request $request)
{ {
// front page accounts // front page accounts
$frontPageAccounts = []; $frontpageAccounts = [];
if (is_array($request->get('frontPageAccounts')) && count($request->get('frontPageAccounts')) > 0) { if (is_array($request->get('frontpageAccounts')) && count($request->get('frontpageAccounts')) > 0) {
foreach ($request->get('frontPageAccounts') as $id) { foreach ($request->get('frontpageAccounts') as $id) {
$frontPageAccounts[] = (int)$id; $frontpageAccounts[] = (int)$id;
} }
app('preferences')->set('frontPageAccounts', $frontPageAccounts); app('preferences')->set('frontpageAccounts', $frontpageAccounts);
} }
// extract notifications: // extract notifications:

View File

@@ -0,0 +1,45 @@
<?php
/*
* CreateController.php
* Copyright (c) 2024 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/.
*/
declare(strict_types=1);
namespace FireflyIII\Http\Controllers\UserGroup;
use FireflyIII\Http\Controllers\Controller;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Foundation\Application;
class CreateController extends Controller
{
/**
* @return Application|Factory|\Illuminate\Contracts\Foundation\Application|View
*/
public function create()
{
$title = (string)trans('firefly.administrations_page_title');
$subTitle = (string)trans('firefly.administrations_page_create_sub_title');
$mainTitleIcon = 'fa-book';
app('log')->debug(sprintf('Now at %s', __METHOD__));
return view('administrations.create')->with(compact('title', 'subTitle', 'mainTitleIcon'));
}
}

View File

@@ -0,0 +1,46 @@
<?php
/*
* CreateController.php
* Copyright (c) 2024 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/.
*/
declare(strict_types=1);
namespace FireflyIII\Http\Controllers\UserGroup;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\UserGroup;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Foundation\Application;
class EditController extends Controller
{
/**
* @return Application|Factory|\Illuminate\Contracts\Foundation\Application|View
*/
public function edit(UserGroup $userGroup)
{
$title = (string)trans('firefly.administrations_page_title');
$subTitle = (string)trans('firefly.administrations_page_edit_sub_title', ['title' => $userGroup->title]);
$mainTitleIcon = 'fa-book';
app('log')->debug(sprintf('Now at %s', __METHOD__));
return view('administrations.edit')->with(compact('title', 'subTitle', 'mainTitleIcon'));
}
}

View File

@@ -0,0 +1,47 @@
<?php
/*
* IndexController.php
* Copyright (c) 2024 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/.
*/
declare(strict_types=1);
namespace FireflyIII\Http\Controllers\UserGroup;
use FireflyIII\Http\Controllers\Controller;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\Request;
use Illuminate\View\View;
class IndexController extends Controller
{
/**
* Show all administrations.
*
* @return Factory|View
*/
public function index(Request $request)
{
$title = (string)trans('firefly.administrations_page_title');
$subTitle = (string)trans('firefly.administrations_page_sub_title');
$mainTitleIcon = 'fa-book';
app('log')->debug(sprintf('Now at %s', __METHOD__));
return view('administrations.index')->with(compact('title', 'subTitle', 'mainTitleIcon'));
}
}

View File

@@ -110,6 +110,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
* @method static EloquentBuilder|Account whereUserGroupId($value) * @method static EloquentBuilder|Account whereUserGroupId($value)
* *
* @property null|UserGroup $userGroup * @property null|UserGroup $userGroup
* @property mixed $account_id
* *
* @mixin Eloquent * @mixin Eloquent
*/ */

View File

@@ -61,6 +61,8 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
* @method static Builder|InvitedUser whereUpdatedAt($value) * @method static Builder|InvitedUser whereUpdatedAt($value)
* @method static Builder|InvitedUser whereUserId($value) * @method static Builder|InvitedUser whereUserId($value)
* *
* @property mixed $user_group_id
*
* @mixin Eloquent * @mixin Eloquent
*/ */
class InvitedUser extends Model class InvitedUser extends Model

View File

@@ -54,6 +54,8 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
* @method static Builder|Preference whereUpdatedAt($value) * @method static Builder|Preference whereUpdatedAt($value)
* @method static Builder|Preference whereUserId($value) * @method static Builder|Preference whereUserId($value)
* *
* @property mixed $user_group_id
*
* @mixin Eloquent * @mixin Eloquent
*/ */
class Preference extends Model class Preference extends Model
@@ -79,22 +81,39 @@ class Preference extends Model
{ {
if (auth()->check()) { if (auth()->check()) {
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
// some preferences do not have an administration ID.
// some need it, to make sure the correct one is selected.
$userGroupId = (int)$user->user_group_id;
$userGroupId = 0 === $userGroupId ? null : $userGroupId;
/** @var null|Preference $preference */ /** @var null|Preference $preference */
$preference = $user->preferences()->where('name', $value)->first(); $preference = null;
$items = config('firefly.admin_specific_prefs');
if (null !== $userGroupId && in_array($value, $items, true)) {
// find a preference with a specific user_group_id
$preference = $user->preferences()->where('user_group_id', $userGroupId)->where('name', $value)->first();
}
if (!in_array($value, $items, true)) {
// find any one.
$preference = $user->preferences()->where('name', $value)->first();
}
// try again with ID, but this time don't care about the preferred user_group_id
if (null === $preference) { if (null === $preference) {
$preference = $user->preferences()->where('id', (int)$value)->first(); $preference = $user->preferences()->where('id', (int)$value)->first();
} }
if (null !== $preference) { if (null !== $preference) {
return $preference; return $preference;
} }
$default = config('firefly.default_preferences'); $default = config('firefly.default_preferences');
if (array_key_exists($value, $default)) { if (array_key_exists($value, $default)) {
$preference = new self(); $preference = new self();
$preference->name = $value; $preference->name = $value;
$preference->data = $default[$value]; $preference->data = $default[$value];
$preference->user_id = (int)$user->id; $preference->user_id = (int)$user->id;
$preference->user_group_id = in_array($value, $items, true) ? $userGroupId : null;
$preference->save(); $preference->save();
return $preference; return $preference;

View File

@@ -81,6 +81,7 @@ use Illuminate\Database\Query\Builder;
* @method static \Illuminate\Database\Eloquent\Builder|RecurrenceTransaction whereTransactionTypeId($value) * @method static \Illuminate\Database\Eloquent\Builder|RecurrenceTransaction whereTransactionTypeId($value)
* *
* @property null|TransactionType $transactionType * @property null|TransactionType $transactionType
* @property mixed $user_id
* *
* @mixin Eloquent * @mixin Eloquent
*/ */

View File

@@ -98,7 +98,7 @@ class UserGroup extends Model
{ {
use ReturnsIntegerIdTrait; use ReturnsIntegerIdTrait;
protected $fillable = ['title']; protected $fillable = ['title', 'default_administration'];
/** /**
* Route binder. Converts the key in the URL to the specified object (or throw 404). * Route binder. Converts the key in the URL to the specified object (or throw 404).

View File

@@ -392,4 +392,28 @@ class UserRepository implements UserRepositoryInterface
return null !== $invitee; return null !== $invitee;
} }
#[\Override]
public function getUserGroups(User $user): Collection
{
$memberships = $user->groupMemberships()->get();
$set = [];
$collection = new Collection();
/** @var GroupMembership $membership */
foreach ($memberships as $membership) {
/** @var null|UserGroup $group */
$group = $membership->userGroup()->first();
if (null !== $group) {
$groupId = (int)$group->id;
if (in_array($groupId, $set, true)) {
continue;
}
$set[$groupId] = $group;
}
}
$collection->push(...$set);
return $collection;
}
} }

View File

@@ -59,6 +59,8 @@ interface UserRepositoryInterface
public function changeStatus(User $user, bool $isBlocked, string $code): bool; public function changeStatus(User $user, bool $isBlocked, string $code): bool;
public function getUserGroups(User $user): Collection;
/** /**
* Returns a count of all users. * Returns a count of all users.
*/ */

View File

@@ -98,6 +98,7 @@ class UserGroupRepository implements UserGroupRepositoryInterface
public function get(): Collection public function get(): Collection
{ {
$collection = new Collection(); $collection = new Collection();
$set = [];
$memberships = $this->user->groupMemberships()->get(); $memberships = $this->user->groupMemberships()->get();
/** @var GroupMembership $membership */ /** @var GroupMembership $membership */
@@ -105,9 +106,14 @@ class UserGroupRepository implements UserGroupRepositoryInterface
/** @var null|UserGroup $group */ /** @var null|UserGroup $group */
$group = $membership->userGroup()->first(); $group = $membership->userGroup()->first();
if (null !== $group) { if (null !== $group) {
$collection->push($group); $groupId = (int)$group->id;
if (in_array($groupId, $set, true)) {
continue;
}
$set[$groupId] = $group;
} }
} }
$collection->push(...$set);
return $collection; return $collection;
} }
@@ -282,4 +288,11 @@ class UserGroupRepository implements UserGroupRepositoryInterface
return $roles; return $roles;
} }
#[\Override]
public function useUserGroup(UserGroup $userGroup): void
{
$this->user->user_group_id = $userGroup->id;
$this->user->save();
}
} }

View File

@@ -38,6 +38,8 @@ interface UserGroupRepositoryInterface
public function get(): Collection; public function get(): Collection;
public function useUserGroup(UserGroup $userGroup): void;
public function getAll(): Collection; public function getAll(): Collection;
public function setUser(null|Authenticatable|User $user): void; public function setUser(null|Authenticatable|User $user): void;

View File

@@ -74,5 +74,7 @@ interface AccountRepositoryInterface
public function setUserGroup(UserGroup $userGroup): void; public function setUserGroup(UserGroup $userGroup): void;
public function getUserGroup(): UserGroup;
public function update(Account $account, array $data): Account; public function update(Account $account, array $data): Account;
} }

View File

@@ -0,0 +1,63 @@
<?php
/**
* IsTransferAccount.php
* Copyright (c) 2020 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/>.
*/
declare(strict_types=1);
namespace FireflyIII\Rules;
use FireflyIII\Models\UserGroup;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User;
use Illuminate\Contracts\Validation\ValidationRule;
/**
* Class IsDefaultUserGroupName
*/
class IsDefaultUserGroupName implements ValidationRule
{
private UserGroup $userGroup;
public function __construct(UserGroup $userGroup)
{
$this->userGroup = $userGroup;
}
/**
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function validate(string $attribute, mixed $value, \Closure $fail): void
{
app('log')->debug(sprintf('Now in %s(%s)', __METHOD__, $value));
// are you owner of this group and the name is the same? fail.
/** @var User $user */
$user = auth()->user();
/** @var UserRepositoryInterface $userRepos */
$userRepos = app(UserRepositoryInterface::class);
$roles = $userRepos->getRolesInGroup($user, $this->userGroup->id);
if ($this->userGroup->title === $user->email && in_array('owner', $roles, true)) {
$fail('validation.administration_owner_rename')->translate();
}
}
}

View File

@@ -248,9 +248,9 @@ class Navigation
'1M' => 'addMonth', '1M' => 'addMonth',
'month' => 'addMonth', 'month' => 'addMonth',
'monthly' => 'addMonth', 'monthly' => 'addMonth',
'3M' => 'addMonths', '3M' => 'addQuarter',
'quarter' => 'addMonths', 'quarter' => 'addQuarter',
'quarterly' => 'addMonths', 'quarterly' => 'addQuarter',
'6M' => 'addMonths', '6M' => 'addMonths',
'half-year' => 'addMonths', 'half-year' => 'addMonths',
'half_year' => 'addMonths', 'half_year' => 'addMonths',
@@ -258,7 +258,7 @@ class Navigation
'yearly' => 'addYear', 'yearly' => 'addYear',
'1Y' => 'addYear', '1Y' => 'addYear',
]; ];
$modifierMap = ['quarter' => 3, '3M' => 3, 'quarterly' => 3, 'half-year' => 6, 'half_year' => 6, '6M' => 6]; $modifierMap = ['half-year' => 6, 'half_year' => 6, '6M' => 6];
$subDay = ['week', 'weekly', '1W', 'month', 'monthly', '1M', '3M', 'quarter', 'quarterly', '6M', 'half-year', 'half_year', '1Y', 'year', 'yearly']; $subDay = ['week', 'weekly', '1W', 'month', 'monthly', '1M', '3M', 'quarter', 'quarterly', '6M', 'half-year', 'half_year', '1Y', 'year', 'yearly'];
if ('custom' === $repeatFreq) { if ('custom' === $repeatFreq) {

View File

@@ -26,7 +26,10 @@ namespace FireflyIII\Support;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Preference; use FireflyIII\Models\Preference;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Session;
/** /**
* Class Preferences. * Class Preferences.
@@ -40,20 +43,17 @@ class Preferences
return new Collection(); return new Collection();
} }
return Preference::where('user_id', $user->id)->get(); return Preference::where('user_id', $user->id)
->where(function (Builder $q) use ($user): void {
$q->whereNull('user_group_id');
$q->orWhere('user_group_id', $user->user_group_id);
})
->get()
;
} }
/** public function get(string $name, null|array|bool|int|string $default = null): ?Preference
* @param mixed $default
*
* @throws FireflyException
*/
public function get(string $name, $default = null): ?Preference
{ {
if ('currencyPreference' === $name) {
throw new FireflyException('No longer supports "currencyPreference", please refactor me.');
}
/** @var null|User $user */ /** @var null|User $user */
$user = auth()->user(); $user = auth()->user();
if (null === $user) { if (null === $user) {
@@ -66,15 +66,12 @@ class Preferences
return $this->getForUser($user, $name, $default); return $this->getForUser($user, $name, $default);
} }
/**
* @throws FireflyException
*/
public function getForUser(User $user, string $name, null|array|bool|int|string $default = null): ?Preference public function getForUser(User $user, string $name, null|array|bool|int|string $default = null): ?Preference
{ {
if ('currencyPreference' === $name) { // don't care about user group ID, except for some specific preferences.
throw new FireflyException('No longer supports "currencyPreference", please refactor me.'); $userGroupId = $this->getUserGroupId($user, $name);
} $preference = Preference::where('user_group_id', $userGroupId)->where('user_id', $user->id)->where('name', $name)->first(['id', 'user_id', 'name', 'data', 'updated_at', 'created_at']);
$preference = Preference::where('user_id', $user->id)->where('name', $name)->first(['id', 'user_id', 'name', 'data', 'updated_at', 'created_at']);
if (null !== $preference && null === $preference->data) { if (null !== $preference && null === $preference->data) {
$preference->delete(); $preference->delete();
$preference = null; $preference = null;
@@ -92,17 +89,11 @@ class Preferences
return $this->setForUser($user, $name, $default); return $this->setForUser($user, $name, $default);
} }
/**
* @throws FireflyException
*/
public function delete(string $name): bool public function delete(string $name): bool
{ {
if ('currencyPreference' === $name) {
throw new FireflyException('No longer supports "currencyPreference", please refactor me.');
}
$fullName = sprintf('preference%s%s', auth()->user()->id, $name); $fullName = sprintf('preference%s%s', auth()->user()->id, $name);
if (\Cache::has($fullName)) { if (Cache::has($fullName)) {
\Cache::forget($fullName); Cache::forget($fullName);
} }
Preference::where('user_id', auth()->user()->id)->where('name', $name)->delete(); Preference::where('user_id', auth()->user()->id)->where('name', $name)->delete();
@@ -111,29 +102,19 @@ class Preferences
public function forget(User $user, string $name): void public function forget(User $user, string $name): void
{ {
if ('currencyPreference' === $name) {
throw new FireflyException('No longer supports "currencyPreference", please refactor me.');
}
$key = sprintf('preference%s%s', $user->id, $name); $key = sprintf('preference%s%s', $user->id, $name);
\Cache::forget($key); Cache::forget($key);
\Cache::put($key, '', 5); Cache::put($key, '', 5);
} }
/** public function setForUser(User $user, string $name, null|array|bool|int|string $value): Preference
* @param mixed $value
*
* @throws FireflyException
*/
public function setForUser(User $user, string $name, $value): Preference
{ {
if ('currencyPreference' === $name) {
throw new FireflyException('No longer supports "currencyPreference", please refactor me.');
}
$fullName = sprintf('preference%s%s', $user->id, $name); $fullName = sprintf('preference%s%s', $user->id, $name);
\Cache::forget($fullName); $groupId = $this->getUserGroupId($user, $name);
Cache::forget($fullName);
/** @var null|Preference $pref */ /** @var null|Preference $pref */
$pref = Preference::where('user_id', $user->id)->where('name', $name)->first(['id', 'name', 'data', 'updated_at', 'created_at']); $pref = Preference::where('user_group_id', $groupId)->where('user_id', $user->id)->where('name', $name)->first(['id', 'name', 'data', 'updated_at', 'created_at']);
if (null !== $pref && null === $value) { if (null !== $pref && null === $value) {
$pref->delete(); $pref->delete();
@@ -144,18 +125,14 @@ class Preferences
return new Preference(); return new Preference();
} }
if (null === $pref) { if (null === $pref) {
$pref = new Preference(); $pref = new Preference();
$pref->user_id = (int)$user->id; $pref->user_id = (int)$user->id;
$pref->name = $name; $pref->user_group_id = $groupId;
$pref->name = $name;
} }
$pref->data = $value; $pref->data = $value;
$pref->save();
try { Cache::forever($fullName, $pref);
$pref->save();
} catch (\PDOException $e) {
throw new FireflyException(sprintf('Could not save preference: %s', $e->getMessage()), 0, $e);
}
\Cache::forever($fullName, $pref);
return $pref; return $pref;
} }
@@ -165,19 +142,25 @@ class Preferences
return Preference::where('user_id', $user->id)->where('name', 'LIKE', $search.'%')->get(); return Preference::where('user_id', $user->id)->where('name', 'LIKE', $search.'%')->get();
} }
/**
* Find by name, has no user ID in it, because the method is called from an unauthenticated route any way.
*/
public function findByName(string $name): Collection public function findByName(string $name): Collection
{ {
if ('currencyPreference' === $name) {
throw new FireflyException('No longer supports "currencyPreference", please refactor me.');
}
return Preference::where('name', $name)->get(); return Preference::where('name', $name)->get();
} }
public function getArrayForUser(User $user, array $list): array public function getArrayForUser(User $user, array $list): array
{ {
$result = []; $result = [];
$preferences = Preference::where('user_id', $user->id)->whereIn('name', $list)->get(['id', 'name', 'data']); $preferences = Preference::where('user_id', $user->id)
->where(function (Builder $q) use ($user): void {
$q->whereNull('user_group_id');
$q->orWhere('user_group_id', $user->user_group_id);
})
->whereIn('name', $list)
->get(['id', 'name', 'data'])
;
/** @var Preference $preference */ /** @var Preference $preference */
foreach ($preferences as $preference) { foreach ($preferences as $preference) {
@@ -192,17 +175,8 @@ class Preferences
return $result; return $result;
} }
/** public function getFresh(string $name, null|array|bool|int|string $default = null): ?Preference
* @param mixed $default
*
* @throws FireflyException
*/
public function getFresh(string $name, $default = null): ?Preference
{ {
if ('currencyPreference' === $name) {
throw new FireflyException('No longer supports "currencyPreference", please refactor me.');
}
/** @var null|User $user */ /** @var null|User $user */
$user = auth()->user(); $user = auth()->user();
if (null === $user) { if (null === $user) {
@@ -212,22 +186,6 @@ class Preferences
return $preference; return $preference;
} }
return $this->getFreshForUser($user, $name, $default);
}
/**
* TODO remove me.
*
* @param null $default
*
* @throws FireflyException
*/
public function getFreshForUser(User $user, string $name, $default = null): ?Preference
{
if ('currencyPreference' === $name) {
throw new FireflyException('No longer supports "currencyPreference", please refactor me.');
}
return $this->getForUser($user, $name, $default); return $this->getForUser($user, $name, $default);
} }
@@ -252,19 +210,12 @@ class Preferences
public function mark(): void public function mark(): void
{ {
$this->set('lastActivity', microtime()); $this->set('lastActivity', microtime());
\Session::forget('first'); Session::forget('first');
} }
/** public function set(string $name, null|array|bool|int|string $value): Preference
* @param mixed $value
*
* @throws FireflyException
*/
public function set(string $name, $value): Preference
{ {
if ('currencyPreference' === $name) { /** @var User $user */
throw new FireflyException('No longer supports "currencyPreference", please refactor me.');
}
$user = auth()->user(); $user = auth()->user();
if (null === $user) { if (null === $user) {
// make new preference, return it: // make new preference, return it:
@@ -275,6 +226,17 @@ class Preferences
return $pref; return $pref;
} }
return $this->setForUser(auth()->user(), $name, $value); return $this->setForUser($user, $name, $value);
}
private function getUserGroupId(User $user, string $preferenceName): ?int
{
$groupId = null;
$items = config('firefly.admin_specific_prefs');
if (in_array($preferenceName, $items, true)) {
$groupId = (int)$user->user_group_id;
}
return $groupId;
} }
} }

View File

@@ -177,7 +177,7 @@ class OperatorQuerySearch implements SearchInterface
default: default:
app('log')->error(sprintf('Cannot handle node %s', $class)); app('log')->error(sprintf('Cannot handle node %s', $class));
throw new FireflyException(sprintf('Firefly III search cant handle "%s"-nodes', $class)); throw new FireflyException(sprintf('Firefly III search can\'t handle "%s"-nodes', $class));
case Subquery::class: case Subquery::class:
// loop all notes in subquery: // loop all notes in subquery:

View File

@@ -110,7 +110,10 @@ class BillTransformer extends AbstractTransformer
$nem = $nemDate->toAtomString(); $nem = $nemDate->toAtomString();
// nullify again when it's outside the current view range. // nullify again when it's outside the current view range.
if ($nemDate->lt($this->parameters->get('start')) || $nemDate->gt($this->parameters->get('end'))) { if (
(null !== $this->parameters->get('start') && $nemDate->lt($this->parameters->get('start')))
|| (null !== $this->parameters->get('end') && $nemDate->gt($this->parameters->get('end')))
) {
$nem = null; $nem = null;
$nemDate = null; $nemDate = null;
$firstPayDate = null; $firstPayDate = null;

View File

@@ -35,12 +35,15 @@ class PreferenceTransformer extends AbstractTransformer
*/ */
public function transform(Preference $preference): array public function transform(Preference $preference): array
{ {
$userGroupId = 0 === $preference->user_group_id ? null : $preference->user_group_id;
return [ return [
'id' => $preference->id, 'id' => $preference->id,
'created_at' => $preference->created_at->toAtomString(), 'created_at' => $preference->created_at->toAtomString(),
'updated_at' => $preference->updated_at->toAtomString(), 'updated_at' => $preference->updated_at->toAtomString(),
'name' => $preference->name, 'user_group_id' => $userGroupId,
'data' => $preference->data, 'name' => $preference->name,
'data' => $preference->data,
]; ];
} }
} }

View File

@@ -36,10 +36,14 @@ use Illuminate\Support\Collection;
class UserGroupTransformer extends AbstractTransformer class UserGroupTransformer extends AbstractTransformer
{ {
private array $memberships; private array $memberships;
private array $membershipsVisible;
private array $inUse;
public function __construct() public function __construct()
{ {
$this->memberships = []; $this->memberships = [];
$this->membershipsVisible = [];
$this->inUse = [];
} }
public function collectMetaData(Collection $objects): Collection public function collectMetaData(Collection $objects): Collection
@@ -51,8 +55,10 @@ class UserGroupTransformer extends AbstractTransformer
/** @var UserGroup $userGroup */ /** @var UserGroup $userGroup */
foreach ($objects as $userGroup) { foreach ($objects as $userGroup) {
$userGroupId = $userGroup->id; $userGroupId = $userGroup->id;
$access = $user->hasRoleInGroupOrOwner($userGroup, UserRoleEnum::VIEW_MEMBERSHIPS) || $user->hasRole('owner'); $this->inUse[$userGroupId] = $user->user_group_id === $userGroupId;
$access = $user->hasRoleInGroupOrOwner($userGroup, UserRoleEnum::VIEW_MEMBERSHIPS) || $user->hasRole('owner');
$this->membershipsVisible[$userGroupId] = $access;
if ($access) { if ($access) {
$groupMemberships = $userGroup->groupMemberships()->get(); $groupMemberships = $userGroup->groupMemberships()->get();
@@ -62,6 +68,7 @@ class UserGroupTransformer extends AbstractTransformer
'user_id' => (string)$groupMembership->user_id, 'user_id' => (string)$groupMembership->user_id,
'user_email' => $groupMembership->user->email, 'user_email' => $groupMembership->user->email,
'role' => $groupMembership->userRole->title, 'role' => $groupMembership->userRole->title,
'you' => $groupMembership->user_id === $user->id,
]; ];
} }
} }
@@ -77,11 +84,13 @@ class UserGroupTransformer extends AbstractTransformer
public function transform(UserGroup $userGroup): array public function transform(UserGroup $userGroup): array
{ {
return [ return [
'id' => $userGroup->id, 'id' => $userGroup->id,
'created_at' => $userGroup->created_at->toAtomString(), 'created_at' => $userGroup->created_at->toAtomString(),
'updated_at' => $userGroup->updated_at->toAtomString(), 'updated_at' => $userGroup->updated_at->toAtomString(),
'title' => $userGroup->title, 'in_use' => $this->inUse[$userGroup->id] ?? false,
'members' => $this->memberships[$userGroup->id] ?? [], 'title' => $userGroup->title,
'can_see_members' => $this->membershipsVisible[$userGroup->id] ?? false,
'members' => $this->memberships[$userGroup->id] ?? [],
]; ];
// if the user has a specific role in this group, then collect the memberships. // if the user has a specific role in this group, then collect the memberships.
} }

View File

@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/). This project adheres to [Semantic Versioning](http://semver.org/).
## 6.1.14 - 2024-xx-xx
### Changed
- You will have to define again which asset accounts you want to see on the dashboard. Sorry about that.
## 6.1.13 - 2024-04-01
### Added
- sha256 checksums for the release files
- git HEAD added to the release files for easier validation
### Changed
- Updated pages in the `v2`-layout
### Fixed
- [Issue 8648](https://github.com/firefly-iii/firefly-iii/issues/8648) (Crashes during initial setup with PG 16 dbs) reported by @Lysholm
- [Issue 8725](https://github.com/firefly-iii/firefly-iii/issues/8725) (API: Call to `api/v1/bills` without arguments fails) reported by @dreautall
- [Issue 8732](https://github.com/firefly-iii/firefly-iii/issues/8732) (Error "Division by zero" when opening the "Budget" section) reported by @mrResident
- [PR 8735](https://github.com/firefly-iii/firefly-iii/pull/8735) (Fix `Division error by zero` in budget views) reported by @mansuf
## 6.1.12 - 2024-03-21 ## 6.1.12 - 2024-03-21
### Fixed ### Fixed

100
composer.lock generated
View File

@@ -1670,16 +1670,16 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v11.1.0", "version": "v11.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "4a9195f68b529b20fe01e24864f99991459c48d4" "reference": "1437cea6d2b04cbc83743fbb208e1a01efccd9ec"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/4a9195f68b529b20fe01e24864f99991459c48d4", "url": "https://api.github.com/repos/laravel/framework/zipball/1437cea6d2b04cbc83743fbb208e1a01efccd9ec",
"reference": "4a9195f68b529b20fe01e24864f99991459c48d4", "reference": "1437cea6d2b04cbc83743fbb208e1a01efccd9ec",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1871,7 +1871,7 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2024-03-26T15:17:39+00:00" "time": "2024-03-28T15:07:18+00:00"
}, },
{ {
"name": "laravel/passport", "name": "laravel/passport",
@@ -3366,16 +3366,16 @@
}, },
{ {
"name": "nesbot/carbon", "name": "nesbot/carbon",
"version": "3.2.1", "version": "3.2.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/briannesbitt/Carbon.git", "url": "https://github.com/briannesbitt/Carbon.git",
"reference": "b4272c2e78d30f9085b079aedb692b2da879b313" "reference": "4d599a6e2351d6b6bf21737accdfe1a4ce3fdbb1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/b4272c2e78d30f9085b079aedb692b2da879b313", "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4d599a6e2351d6b6bf21737accdfe1a4ce3fdbb1",
"reference": "b4272c2e78d30f9085b079aedb692b2da879b313", "reference": "4d599a6e2351d6b6bf21737accdfe1a4ce3fdbb1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3468,7 +3468,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-03-27T21:37:24+00:00" "time": "2024-03-30T18:22:00+00:00"
}, },
{ {
"name": "nette/schema", "name": "nette/schema",
@@ -5320,16 +5320,16 @@
}, },
{ {
"name": "spatie/ignition", "name": "spatie/ignition",
"version": "1.12.0", "version": "1.13.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/spatie/ignition.git", "url": "https://github.com/spatie/ignition.git",
"reference": "5b6f801c605a593106b623e45ca41496a6e7d56d" "reference": "889bf1dfa59e161590f677728b47bf4a6893983b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/spatie/ignition/zipball/5b6f801c605a593106b623e45ca41496a6e7d56d", "url": "https://api.github.com/repos/spatie/ignition/zipball/889bf1dfa59e161590f677728b47bf4a6893983b",
"reference": "5b6f801c605a593106b623e45ca41496a6e7d56d", "reference": "889bf1dfa59e161590f677728b47bf4a6893983b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -5399,7 +5399,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-01-03T15:49:39+00:00" "time": "2024-03-29T14:03:47+00:00"
}, },
{ {
"name": "spatie/laravel-html", "name": "spatie/laravel-html",
@@ -5481,16 +5481,16 @@
}, },
{ {
"name": "spatie/laravel-ignition", "name": "spatie/laravel-ignition",
"version": "2.4.2", "version": "2.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/spatie/laravel-ignition.git", "url": "https://github.com/spatie/laravel-ignition.git",
"reference": "351504f4570e32908839fc5a2dc53bf77d02f85e" "reference": "e23f4e8ce6644dc3d68b9d8a0aed3beaca0d6ada"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/351504f4570e32908839fc5a2dc53bf77d02f85e", "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/e23f4e8ce6644dc3d68b9d8a0aed3beaca0d6ada",
"reference": "351504f4570e32908839fc5a2dc53bf77d02f85e", "reference": "e23f4e8ce6644dc3d68b9d8a0aed3beaca0d6ada",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -5500,7 +5500,7 @@
"illuminate/support": "^10.0|^11.0", "illuminate/support": "^10.0|^11.0",
"php": "^8.1", "php": "^8.1",
"spatie/flare-client-php": "^1.3.5", "spatie/flare-client-php": "^1.3.5",
"spatie/ignition": "^1.9", "spatie/ignition": "^1.13",
"symfony/console": "^6.2.3|^7.0", "symfony/console": "^6.2.3|^7.0",
"symfony/var-dumper": "^6.2.3|^7.0" "symfony/var-dumper": "^6.2.3|^7.0"
}, },
@@ -5569,7 +5569,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-02-09T16:08:40+00:00" "time": "2024-03-29T14:14:55+00:00"
}, },
{ {
"name": "spatie/period", "name": "spatie/period",
@@ -8897,23 +8897,23 @@
"packages-dev": [ "packages-dev": [
{ {
"name": "barryvdh/laravel-debugbar", "name": "barryvdh/laravel-debugbar",
"version": "v3.12.2", "version": "v3.13.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/barryvdh/laravel-debugbar.git", "url": "https://github.com/barryvdh/laravel-debugbar.git",
"reference": "43555503052443964ce2c1c1f3b0378e58219eb8" "reference": "354a42f3e0b083cdd6f9da5a9d1c0c63b074547a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/43555503052443964ce2c1c1f3b0378e58219eb8", "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/354a42f3e0b083cdd6f9da5a9d1c0c63b074547a",
"reference": "43555503052443964ce2c1c1f3b0378e58219eb8", "reference": "354a42f3e0b083cdd6f9da5a9d1c0c63b074547a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"illuminate/routing": "^9|^10|^11", "illuminate/routing": "^9|^10|^11",
"illuminate/session": "^9|^10|^11", "illuminate/session": "^9|^10|^11",
"illuminate/support": "^9|^10|^11", "illuminate/support": "^9|^10|^11",
"maximebf/debugbar": "~1.21.0", "maximebf/debugbar": "~1.22.0",
"php": "^8.0", "php": "^8.0",
"symfony/finder": "^6|^7" "symfony/finder": "^6|^7"
}, },
@@ -8926,7 +8926,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "3.10-dev" "dev-master": "3.13-dev"
}, },
"laravel": { "laravel": {
"providers": [ "providers": [
@@ -8965,7 +8965,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/barryvdh/laravel-debugbar/issues", "issues": "https://github.com/barryvdh/laravel-debugbar/issues",
"source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.12.2" "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.13.0"
}, },
"funding": [ "funding": [
{ {
@@ -8977,7 +8977,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-13T09:50:34+00:00" "time": "2024-04-01T16:39:30+00:00"
}, },
{ {
"name": "barryvdh/laravel-ide-helper", "name": "barryvdh/laravel-ide-helper",
@@ -9606,25 +9606,27 @@
}, },
{ {
"name": "maximebf/debugbar", "name": "maximebf/debugbar",
"version": "v1.21.3", "version": "v1.22.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/maximebf/php-debugbar.git", "url": "https://github.com/maximebf/php-debugbar.git",
"reference": "0b407703b08ea0cf6ebc61e267cc96ff7000911b" "reference": "d7b6e1dc2dc85c01ed63ab158b00a7f46abdebcc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/0b407703b08ea0cf6ebc61e267cc96ff7000911b", "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/d7b6e1dc2dc85c01ed63ab158b00a7f46abdebcc",
"reference": "0b407703b08ea0cf6ebc61e267cc96ff7000911b", "reference": "d7b6e1dc2dc85c01ed63ab158b00a7f46abdebcc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.1|^8", "php": "^7.2|^8",
"psr/log": "^1|^2|^3", "psr/log": "^1|^2|^3",
"symfony/var-dumper": "^4|^5|^6|^7" "symfony/var-dumper": "^4|^5|^6|^7"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": ">=7.5.20 <10.0", "dbrekelmans/bdi": "^1",
"phpunit/phpunit": "^8|^9",
"symfony/panther": "^1|^2.1",
"twig/twig": "^1.38|^2.7|^3.0" "twig/twig": "^1.38|^2.7|^3.0"
}, },
"suggest": { "suggest": {
@@ -9635,7 +9637,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.21-dev" "dev-master": "1.22-dev"
} }
}, },
"autoload": { "autoload": {
@@ -9666,9 +9668,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/maximebf/php-debugbar/issues", "issues": "https://github.com/maximebf/php-debugbar/issues",
"source": "https://github.com/maximebf/php-debugbar/tree/v1.21.3" "source": "https://github.com/maximebf/php-debugbar/tree/v1.22.1"
}, },
"time": "2024-03-12T14:23:07+00:00" "time": "2024-04-01T10:44:20+00:00"
}, },
{ {
"name": "mockery/mockery", "name": "mockery/mockery",
@@ -10280,16 +10282,16 @@
}, },
{ {
"name": "phpstan/phpstan", "name": "phpstan/phpstan",
"version": "1.10.65", "version": "1.10.66",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpstan/phpstan.git", "url": "https://github.com/phpstan/phpstan.git",
"reference": "3c657d057a0b7ecae19cb12db446bbc99d8839c6" "reference": "94779c987e4ebd620025d9e5fdd23323903950bd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/3c657d057a0b7ecae19cb12db446bbc99d8839c6", "url": "https://api.github.com/repos/phpstan/phpstan/zipball/94779c987e4ebd620025d9e5fdd23323903950bd",
"reference": "3c657d057a0b7ecae19cb12db446bbc99d8839c6", "reference": "94779c987e4ebd620025d9e5fdd23323903950bd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10338,7 +10340,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-03-23T10:30:26+00:00" "time": "2024-03-28T16:17:31+00:00"
}, },
{ {
"name": "phpstan/phpstan-deprecation-rules", "name": "phpstan/phpstan-deprecation-rules",
@@ -10760,16 +10762,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "10.5.15", "version": "10.5.16",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "86376e05e8745ed81d88232ff92fee868247b07b" "reference": "18f8d4a5f52b61fdd9370aaae3167daa0eeb69cd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86376e05e8745ed81d88232ff92fee868247b07b", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/18f8d4a5f52b61fdd9370aaae3167daa0eeb69cd",
"reference": "86376e05e8745ed81d88232ff92fee868247b07b", "reference": "18f8d4a5f52b61fdd9370aaae3167daa0eeb69cd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10841,7 +10843,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy", "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.15" "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.16"
}, },
"funding": [ "funding": [
{ {
@@ -10857,7 +10859,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-03-22T04:17:47+00:00" "time": "2024-03-28T10:08:10+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",

View File

@@ -117,9 +117,9 @@ return [
'expression_engine' => false, 'expression_engine' => false,
// see cer.php for exchange rates feature flag. // see cer.php for exchange rates feature flag.
], ],
'version' => 'develop/2024-03-28', 'version' => 'develop/2024-04-02',
'api_version' => '2.0.12', 'api_version' => '2.0.13',
'db_version' => 23, 'db_version' => 24,
// generic settings // generic settings
'maxUploadSize' => 1073741824, // 1 GB 'maxUploadSize' => 1073741824, // 1 GB
@@ -215,11 +215,14 @@ return [
'zoom_level' => env('MAP_DEFAULT_ZOOM', '6'), 'zoom_level' => env('MAP_DEFAULT_ZOOM', '6'),
], ],
// administration specific preferences
'admin_specific_prefs' => ['frontpageAccounts', 'lastActivity'],
// default user-related values // default user-related values
'darkMode' => 'browser', 'darkMode' => 'browser',
'list_length' => 10, // to be removed if v1 is cancelled. 'list_length' => 10, // to be removed if v1 is cancelled.
'default_preferences' => [ 'default_preferences' => [
'frontPageAccounts' => [], 'frontpageAccounts' => [],
'listPageSize' => 50, 'listPageSize' => 50,
'currencyPreference' => 'EUR', 'currencyPreference' => 'EUR',
'language' => 'en_US', 'language' => 'en_US',

View File

@@ -9,7 +9,7 @@ use Illuminate\Support\Facades\Schema;
return new class () extends Migration { return new class () extends Migration {
private const string QUERY_ERROR = 'Could not execute query (table "%s", field "%s"): %s'; private const string QUERY_ERROR = 'Could not execute query (table "%s", field "%s"): %s';
private const string EXPL = 'If the index already exists (see error), this is not an problem. Otherwise, please open a GitHub discussion.'; private const string EXPL = 'If the index already exists (see error), or if MySQL can\'t do it, this is not an problem. Otherwise, please open a GitHub discussion.';
/** /**
* Run the migrations. * Run the migrations.

View File

@@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class () extends Migration {
/**
* Run the migrations.
*/
public function up(): void
{
try {
Schema::table(
'preferences',
static function (Blueprint $table): void {
if (!Schema::hasColumn('preferences', 'user_group_id')) {
$table->bigInteger('user_group_id', false, true)->nullable()->after('user_id');
$table->foreign('user_group_id', 'preferences_to_ugi')->references('id')->on('user_groups')->onDelete('set null')->onUpdate('cascade');
}
}
);
} catch (QueryException $e) {
app('log')->error(sprintf('Could not execute query: %s', $e->getMessage()));
app('log')->error('If the column or index already exists (see error), this is not an problem. Otherwise, please open a GitHub discussion.');
}
}
/**
* Reverse the migrations.
*/
public function down(): void {}
};

View File

@@ -19,10 +19,7 @@
*/ */
$(function () { document.addEventListener("DOMContentLoaded", (event) => {
"use strict";
//var status = $('#status-box');
// set HTML to "migrating...":
console.log('Starting...'); console.log('Starting...');
startRunningCommands(0); startRunningCommands(0);
}); });
@@ -30,57 +27,81 @@ $(function () {
function startRunningCommands(index) { function startRunningCommands(index) {
console.log('Now in startRunningCommands with index' + index); console.log('Now in startRunningCommands with index' + index);
if (0 === index) { if (0 === index) {
$('#status-box').html('<span class="fa fa-spin fa-spinner"></span> Running first command...'); document.querySelector('#status-box').innerHTML = '<span class="fa fa-spin fa-spinner"></span> Running first command...';
} }
runCommand(index); runCommand(index);
} }
function runCommand(index) { function runCommand(index) {
console.log('Now in runCommand(' + index + '): ' + runCommandUrl); console.log('Now in runCommand(' + index + '): ' + runCommandUrl);
$.post(runCommandUrl, {_token: token, index: parseInt(index)}).done(function (data) {
if (data.error === false) {
// increase index
index++;
if(data.hasNextCommand) { fetch(runCommandUrl, {
// inform user method: 'POST',
$('#status-box').html('<span class="fa fa-spin fa-spinner"></span> Just executed ' + data.previous + '...'); headers: {
console.log('Will call next command.'); 'Accept': 'application/json',
runCommand(index); 'Content-Type': 'application/json'
},
body: JSON.stringify({_token: token, index: parseInt(index)}),
})
.then(response => response.json())
.then(response => {
if (response.error === false) {
index++;
if (response.hasNextCommand) {
// inform user
document.querySelector('#status-box').innerHTML = '<span class="fa fa-spin fa-spinner"></span> Just executed ' + response.previous + '...';
console.log('Will call next command.');
runCommand(index);
} else {
completeDone();
console.log('Finished!');
}
} else { } else {
completeDone(); displaySoftFail(response.errorMessage);
console.log('Finished!'); console.error(response);
} }
} else { })
displaySoftFail(data.errorMessage);
console.error(data);
}
}).fail(function () {
$('#status-box').html('<span class="fa fa-warning"></span> Command failed! See log files :(');
});
} }
function startMigration() { function startMigration() {
console.log('Now in startMigration'); console.log('Now in startMigration');
$.post(migrateUrl, {_token: token}).done(function (data) {
if (data.error === false) { fetch(migrateUrl, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({_token: token}),
})
.then(response => response.json())
.then(response => {
if (response.error === false) {
// move to decrypt routine. // move to decrypt routine.
startDecryption(); startDecryption();
} else { } else {
displaySoftFail(data.message); displaySoftFail(response.message);
} }
}).fail(function () { }).fail(function () {
$('#status-box').html('<span class="fa fa-warning"></span> Migration failed! See log files :('); document.querySelector('#status-box').innerHTML = '<span class="fa fa-warning"></span> Migration failed! See log files :(';
}); });
} }
function startDecryption() { function startDecryption() {
console.log('Now in startDecryption'); console.log('Now in startDecryption');
$('#status-box').html('<span class="fa fa-spin fa-spinner"></span> Setting up DB #2...'); document.querySelector('#status-box').innerHTML = '<span class="fa fa-spin fa-spinner"></span> Setting up DB #2...';
$.post(decryptUrl, {_token: token}).done(function (data) { fetch(decryptUrl, {
if (data.error === false) { method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({_token: token}),
})
.then(response => response.json())
.then(response => {
if (response.error === false) {
// move to decrypt routine. // move to decrypt routine.
startPassport(); startPassport();
} else { } else {
@@ -88,7 +109,7 @@ function startDecryption() {
} }
}).fail(function () { }).fail(function () {
$('#status-box').html('<span class="fa fa-warning"></span> Migration failed! See log files :('); document.querySelector('#status-box').innerHTML = '<span class="fa fa-warning"></span> Migration failed! See log files :(';
}); });
} }
@@ -96,16 +117,25 @@ function startDecryption() {
* *
*/ */
function startPassport() { function startPassport() {
$('#status-box').html('<span class="fa fa-spin fa-spinner"></span> Setting up OAuth2...'); document.querySelector('#status-box').innerHTML = '<span class="fa fa-spin fa-spinner"></span> Setting up OAuth2...';
$.post(keysUrl, {_token: token}).done(function (data) { fetch(keysUrl, {
if (data.error === false) { method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({_token: token}),
})
.then(response => response.json())
.then(response => {
if (response.error === false) {
startUpgrade(); startUpgrade();
} else { } else {
displaySoftFail(data.message); displaySoftFail(data.message);
} }
}).fail(function () { }).fail(function () {
$('#status-box').html('<span class="fa fa-warning"></span> OAuth2 failed! See log files :('); document.querySelector('#status-box').innerHTML = '<span class="fa fa-warning"></span> OAuth2 failed! See log files :(';
}); });
} }
@@ -113,15 +143,24 @@ function startPassport() {
* *
*/ */
function startUpgrade() { function startUpgrade() {
$('#status-box').html('<span class="fa fa-spin fa-spinner"></span> Upgrading database...'); document.querySelector('#status-box').innerHTML = '<span class="fa fa-spin fa-spinner"></span> Upgrading database...';
$.post(upgradeUrl, {_token: token}).done(function (data) { fetch(upgradeUrl, {
if (data.error === false) { method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({_token: token}),
})
.then(response => response.json())
.then(response => {
if (response.error === false) {
startVerify(); startVerify();
} else { } else {
displaySoftFail(data.message); displaySoftFail(data.message);
} }
}).fail(function () { }).fail(function () {
$('#status-box').html('<span class="fa fa-warning"></span> Upgrade failed! See log files :('); document.querySelector('#status-box').innerHTML = '<span class="fa fa-warning"></span> Upgrade failed! See log files :(';
}); });
} }
@@ -129,15 +168,24 @@ function startUpgrade() {
* *
*/ */
function startVerify() { function startVerify() {
$('#status-box').html('<span class="fa fa-spin fa-spinner"></span> Verify database integrity...'); document.querySelector('#status-box').innerHTML = '<span class="fa fa-spin fa-spinner"></span> Verify database integrity...';
$.post(verifyUrl, {_token: token}).done(function (data) { fetch(veifyUrl, {
if (data.error === false) { method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({_token: token}),
})
.then(response => response.json())
.then(response => {
if (response.error === false) {
completeDone(); completeDone();
} else { } else {
displaySoftFail(data.message); displaySoftFail(data.message);
} }
}).fail(function () { }).fail(function () {
$('#status-box').html('<span class="fa fa-warning"></span> Verification failed! See log files :('); document.querySelector('#status-box').innerHTML = '<span class="fa fa-warning"></span> Verification failed! See log files :(';
}); });
} }
@@ -145,14 +193,14 @@ function startVerify() {
* *
*/ */
function completeDone() { function completeDone() {
$('#status-box').html('<span class="fa fa-thumbs-up"></span> Installation + upgrade complete! Wait to be redirected...'); document.querySelector('#status-box').innerHTML = '<span class="fa fa-thumbs-up"></span> Installation + upgrade complete! Wait to be redirected...';
setTimeout(function () { setTimeout(function () {
window.location = homeUrl; window.location = homeUrl;
}, 3000); }, 3000);
} }
function displaySoftFail(message) { function displaySoftFail(message) {
$('#status-box').html('<span class="fa fa-warning"></span> ' + message + '<br /><br />Please read the ' + document.querySelector('#status-box').innerHTML = '<span class="fa fa-warning"></span> ' + message + '<br /><br />Please read the ' +
'<a href="https://docs.firefly-iii.org/">' + '<a href="https://docs.firefly-iii.org/">' +
'documentation</a> about this, and upgrade by hand.'); 'documentation</a> about this, and upgrade by hand.';
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "bg", "html_language": "bg",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "\u041f\u043e\u0445\u0430\u0440\u0447\u0435\u043d\u0438", "spent": "\u041f\u043e\u0445\u0430\u0440\u0447\u0435\u043d\u0438",
"left": "\u041e\u0441\u0442\u0430\u043d\u0430\u043b\u0438", "left": "\u041e\u0441\u0442\u0430\u043d\u0430\u043b\u0438",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "\u0414\u044a\u043b\u0433", "account_type_Debt": "\u0414\u044a\u043b\u0433",
"account_type_Loan": "\u0417\u0430\u0435\u043c", "account_type_Loan": "\u0417\u0430\u0435\u043c",
"account_type_Mortgage": "\u0418\u043f\u043e\u0442\u0435\u043a\u0430" "account_type_Mortgage": "\u0418\u043f\u043e\u0442\u0435\u043a\u0430",
"account_role_defaultAsset": "\u0421\u043c\u0435\u0442\u043a\u0430 \u0437\u0430 \u0430\u043a\u0442\u0438\u0432\u0438 \u043f\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043d\u0435",
"account_role_sharedAsset": "\u0421\u043c\u0435\u0442\u043a\u0430 \u0437\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u0435\u043d\u0438 \u0430\u043a\u0442\u0438\u0432\u0438",
"account_role_savingAsset": "\u0421\u043f\u0435\u0441\u0442\u043e\u0432\u043d\u0430 \u0441\u043c\u0435\u0442\u043a\u0430",
"account_role_ccAsset": "\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u0430 \u043a\u0430\u0440\u0442\u0430",
"account_role_cashWalletAsset": "\u041f\u0430\u0440\u0438\u0447\u0435\u043d \u043f\u043e\u0440\u0442\u0444\u0435\u0439\u043b"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "bg", "html_language": "bg",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "\u041f\u043e\u0445\u0430\u0440\u0447\u0435\u043d\u0438", "spent": "\u041f\u043e\u0445\u0430\u0440\u0447\u0435\u043d\u0438",
"left": "\u041e\u0441\u0442\u0430\u043d\u0430\u043b\u0438", "left": "\u041e\u0441\u0442\u0430\u043d\u0430\u043b\u0438",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "\u0414\u044a\u043b\u0433", "account_type_Debt": "\u0414\u044a\u043b\u0433",
"account_type_Loan": "\u0417\u0430\u0435\u043c", "account_type_Loan": "\u0417\u0430\u0435\u043c",
"account_type_Mortgage": "\u0418\u043f\u043e\u0442\u0435\u043a\u0430" "account_type_Mortgage": "\u0418\u043f\u043e\u0442\u0435\u043a\u0430",
"account_role_defaultAsset": "\u0421\u043c\u0435\u0442\u043a\u0430 \u0437\u0430 \u0430\u043a\u0442\u0438\u0432\u0438 \u043f\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043d\u0435",
"account_role_sharedAsset": "\u0421\u043c\u0435\u0442\u043a\u0430 \u0437\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u0435\u043d\u0438 \u0430\u043a\u0442\u0438\u0432\u0438",
"account_role_savingAsset": "\u0421\u043f\u0435\u0441\u0442\u043e\u0432\u043d\u0430 \u0441\u043c\u0435\u0442\u043a\u0430",
"account_role_ccAsset": "\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u0430 \u043a\u0430\u0440\u0442\u0430",
"account_role_cashWalletAsset": "\u041f\u0430\u0440\u0438\u0447\u0435\u043d \u043f\u043e\u0440\u0442\u0444\u0435\u0439\u043b"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "ca", "html_language": "ca",
"date_time_fns": "D [de\/d'] MMMM yyyy [a les] HH:mm:ss", "date_time_fns": "D [de\/d'] MMMM yyyy [a les] HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III no pot determinar el tipus de transacci\u00f3 a partir d'aquest compte font.",
"bad_type_destination": "Firefly III no pot determinar el tipus de transacci\u00f3 a partir d'aquest compte de dest\u00ed."
},
"firefly": { "firefly": {
"spent": "Gastat", "spent": "Gastat",
"left": "Queda", "left": "Queda",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Compte d'ingressos", "account_type_Revenue account": "Compte d'ingressos",
"account_type_Debt": "Deute", "account_type_Debt": "Deute",
"account_type_Loan": "Cr\u00e8dit", "account_type_Loan": "Cr\u00e8dit",
"account_type_Mortgage": "Hipoteca" "account_type_Mortgage": "Hipoteca",
"account_role_defaultAsset": "Compte d'actius per defecte",
"account_role_sharedAsset": "Compte d'actius compartit",
"account_role_savingAsset": "Compte d'estalvis",
"account_role_ccAsset": "Targeta de cr\u00e8dit",
"account_role_cashWalletAsset": "Cartera d'efectiu"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "ca", "html_language": "ca",
"date_time_fns": "D [de\/d'] MMMM yyyy [a les] HH:mm:ss", "date_time_fns": "D [de\/d'] MMMM yyyy [a les] HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III no pot determinar el tipus de transacci\u00f3 a partir d'aquest compte font.",
"bad_type_destination": "Firefly III no pot determinar el tipus de transacci\u00f3 a partir d'aquest compte de dest\u00ed."
},
"firefly": { "firefly": {
"spent": "Gastat", "spent": "Gastat",
"left": "Queda", "left": "Queda",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Compte d'ingressos", "account_type_Revenue account": "Compte d'ingressos",
"account_type_Debt": "Deute", "account_type_Debt": "Deute",
"account_type_Loan": "Cr\u00e8dit", "account_type_Loan": "Cr\u00e8dit",
"account_type_Mortgage": "Hipoteca" "account_type_Mortgage": "Hipoteca",
"account_role_defaultAsset": "Compte d'actius per defecte",
"account_role_sharedAsset": "Compte d'actius compartit",
"account_role_savingAsset": "Compte d'estalvis",
"account_role_ccAsset": "Targeta de cr\u00e8dit",
"account_role_cashWalletAsset": "Cartera d'efectiu"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "cs", "html_language": "cs",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Utraceno", "spent": "Utraceno",
"left": "Zb\u00fdv\u00e1", "left": "Zb\u00fdv\u00e1",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Dluh", "account_type_Debt": "Dluh",
"account_type_Loan": "P\u016fj\u010dka", "account_type_Loan": "P\u016fj\u010dka",
"account_type_Mortgage": "Hypot\u00e9ka" "account_type_Mortgage": "Hypot\u00e9ka",
"account_role_defaultAsset": "V\u00fdchoz\u00ed \u00fa\u010det aktiv",
"account_role_sharedAsset": "Sd\u00edlen\u00fd \u00fa\u010det aktiv",
"account_role_savingAsset": "Spo\u0159ic\u00ed \u00fa\u010det",
"account_role_ccAsset": "Kreditn\u00ed karta",
"account_role_cashWalletAsset": "Pen\u011b\u017eenka"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "cs", "html_language": "cs",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Utraceno", "spent": "Utraceno",
"left": "Zb\u00fdv\u00e1", "left": "Zb\u00fdv\u00e1",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Dluh", "account_type_Debt": "Dluh",
"account_type_Loan": "P\u016fj\u010dka", "account_type_Loan": "P\u016fj\u010dka",
"account_type_Mortgage": "Hypot\u00e9ka" "account_type_Mortgage": "Hypot\u00e9ka",
"account_role_defaultAsset": "V\u00fdchoz\u00ed \u00fa\u010det aktiv",
"account_role_sharedAsset": "Sd\u00edlen\u00fd \u00fa\u010det aktiv",
"account_role_savingAsset": "Spo\u0159ic\u00ed \u00fa\u010det",
"account_role_ccAsset": "Kreditn\u00ed karta",
"account_role_cashWalletAsset": "Pen\u011b\u017eenka"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "da", "html_language": "da",
"date_time_fns": "MMMM g\u00f8r, yyyy @ HH:mm:ss", "date_time_fns": "MMMM g\u00f8r, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III kan ikke bestemme transaktionstypen baseret p\u00e5 denne kildekonto.",
"bad_type_destination": "Firefly III kan ikke bestemme transaktionstypen baseret p\u00e5 denne destinationskonto."
},
"firefly": { "firefly": {
"spent": "Spent", "spent": "Spent",
"left": "Left", "left": "Left",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "G\u00e6ld", "account_type_Debt": "G\u00e6ld",
"account_type_Loan": "L\u00e5n", "account_type_Loan": "L\u00e5n",
"account_type_Mortgage": "Pant" "account_type_Mortgage": "Pant",
"account_role_defaultAsset": "Default asset account",
"account_role_sharedAsset": "Shared asset account",
"account_role_savingAsset": "Savings account",
"account_role_ccAsset": "Credit card",
"account_role_cashWalletAsset": "Cash wallet"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "da", "html_language": "da",
"date_time_fns": "MMMM g\u00f8r, yyyy @ HH:mm:ss", "date_time_fns": "MMMM g\u00f8r, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III kan ikke bestemme transaktionstypen baseret p\u00e5 denne kildekonto.",
"bad_type_destination": "Firefly III kan ikke bestemme transaktionstypen baseret p\u00e5 denne destinationskonto."
},
"firefly": { "firefly": {
"spent": "Spent", "spent": "Spent",
"left": "Left", "left": "Left",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "G\u00e6ld", "account_type_Debt": "G\u00e6ld",
"account_type_Loan": "L\u00e5n", "account_type_Loan": "L\u00e5n",
"account_type_Mortgage": "Pant" "account_type_Mortgage": "Pant",
"account_role_defaultAsset": "Default asset account",
"account_role_sharedAsset": "Shared asset account",
"account_role_savingAsset": "Savings account",
"account_role_ccAsset": "Credit card",
"account_role_cashWalletAsset": "Cash wallet"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "de", "html_language": "de",
"date_time_fns": "dd. MMM. yyyy um HH:mm:ss", "date_time_fns": "dd. MMM. yyyy um HH:mm:ss",
"month_and_day_fns": "D. MMMM Y",
"date_time_fns_short": "dd. MMM. yyyy um HH:mm" "date_time_fns_short": "dd. MMM. yyyy um HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III kann die Buchungsart anhand dieses Quellkontos nicht ermitteln.",
"bad_type_destination": "Firefly III kann die Buchungsart anhand dieses Zielkontos nicht ermitteln."
},
"firefly": { "firefly": {
"spent": "Ausgegeben", "spent": "Ausgegeben",
"left": "\u00dcbrig", "left": "\u00dcbrig",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Einnahmenkonto", "account_type_Revenue account": "Einnahmenkonto",
"account_type_Debt": "Schuld", "account_type_Debt": "Schuld",
"account_type_Loan": "Darlehen", "account_type_Loan": "Darlehen",
"account_type_Mortgage": "Hypothek" "account_type_Mortgage": "Hypothek",
"account_role_defaultAsset": "Standard-Bestandskonto",
"account_role_sharedAsset": "Gemeinsames Bestandskonto",
"account_role_savingAsset": "Sparkonto",
"account_role_ccAsset": "Kreditkarte",
"account_role_cashWalletAsset": "Geldb\u00f6rse"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "de", "html_language": "de",
"date_time_fns": "dd. MMM. yyyy um HH:mm:ss", "date_time_fns": "dd. MMM. yyyy um HH:mm:ss",
"month_and_day_fns": "D. MMMM Y",
"date_time_fns_short": "dd. MMM. yyyy um HH:mm" "date_time_fns_short": "dd. MMM. yyyy um HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III kann die Buchungsart anhand dieses Quellkontos nicht ermitteln.",
"bad_type_destination": "Firefly III kann die Buchungsart anhand dieses Zielkontos nicht ermitteln."
},
"firefly": { "firefly": {
"spent": "Ausgegeben", "spent": "Ausgegeben",
"left": "\u00dcbrig", "left": "\u00dcbrig",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Einnahmenkonto", "account_type_Revenue account": "Einnahmenkonto",
"account_type_Debt": "Schuld", "account_type_Debt": "Schuld",
"account_type_Loan": "Darlehen", "account_type_Loan": "Darlehen",
"account_type_Mortgage": "Hypothek" "account_type_Mortgage": "Hypothek",
"account_role_defaultAsset": "Standard-Bestandskonto",
"account_role_sharedAsset": "Gemeinsames Bestandskonto",
"account_role_savingAsset": "Sparkonto",
"account_role_ccAsset": "Kreditkarte",
"account_role_cashWalletAsset": "Geldb\u00f6rse"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "el", "html_language": "el",
"date_time_fns": "do MMMM yyyy @ HH:mm:ss", "date_time_fns": "do MMMM yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "\u03a4\u03bf Firefly III \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2.",
"bad_type_destination": "\u03a4\u03bf Firefly III \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c0\u03c1\u03bf\u03bf\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd."
},
"firefly": { "firefly": {
"spent": "\u0394\u03b1\u03c0\u03b1\u03bd\u03ae\u03b8\u03b7\u03ba\u03b1\u03bd", "spent": "\u0394\u03b1\u03c0\u03b1\u03bd\u03ae\u03b8\u03b7\u03ba\u03b1\u03bd",
"left": "\u0391\u03c0\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5\u03bd", "left": "\u0391\u03c0\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5\u03bd",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "\u03a7\u03c1\u03ad\u03bf\u03c2", "account_type_Debt": "\u03a7\u03c1\u03ad\u03bf\u03c2",
"account_type_Loan": "\u0394\u03ac\u03bd\u03b5\u03b9\u03bf", "account_type_Loan": "\u0394\u03ac\u03bd\u03b5\u03b9\u03bf",
"account_type_Mortgage": "\u03a5\u03c0\u03bf\u03b8\u03ae\u03ba\u03b7" "account_type_Mortgage": "\u03a5\u03c0\u03bf\u03b8\u03ae\u03ba\u03b7",
"account_role_defaultAsset": "\u0392\u03b1\u03c3\u03b9\u03ba\u03cc\u03c2 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03ba\u03b5\u03c6\u03b1\u03bb\u03b1\u03af\u03bf\u03c5",
"account_role_sharedAsset": "\u039a\u03bf\u03b9\u03bd\u03cc\u03c2 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03ba\u03b5\u03c6\u03b1\u03bb\u03b1\u03af\u03bf\u03c5",
"account_role_savingAsset": "\u039b\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03b1\u03c0\u03bf\u03c4\u03b1\u03bc\u03af\u03b5\u03c5\u03c3\u03b7\u03c2",
"account_role_ccAsset": "\u03a0\u03b9\u03c3\u03c4\u03c9\u03c4\u03b9\u03ba\u03ae \u03ba\u03ac\u03c1\u03c4\u03b1",
"account_role_cashWalletAsset": "\u03a0\u03bf\u03c1\u03c4\u03bf\u03c6\u03cc\u03bb\u03b9 \u03bc\u03b5\u03c4\u03c1\u03b7\u03c4\u03ce\u03bd"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "el", "html_language": "el",
"date_time_fns": "do MMMM yyyy @ HH:mm:ss", "date_time_fns": "do MMMM yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "\u03a4\u03bf Firefly III \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2.",
"bad_type_destination": "\u03a4\u03bf Firefly III \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03b9 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03c3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae\u03c2 \u03bc\u03b5 \u03b2\u03ac\u03c3\u03b7 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c0\u03c1\u03bf\u03bf\u03c1\u03b9\u03c3\u03bc\u03bf\u03cd."
},
"firefly": { "firefly": {
"spent": "\u0394\u03b1\u03c0\u03b1\u03bd\u03ae\u03b8\u03b7\u03ba\u03b1\u03bd", "spent": "\u0394\u03b1\u03c0\u03b1\u03bd\u03ae\u03b8\u03b7\u03ba\u03b1\u03bd",
"left": "\u0391\u03c0\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5\u03bd", "left": "\u0391\u03c0\u03bf\u03bc\u03ad\u03bd\u03bf\u03c5\u03bd",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "\u03a7\u03c1\u03ad\u03bf\u03c2", "account_type_Debt": "\u03a7\u03c1\u03ad\u03bf\u03c2",
"account_type_Loan": "\u0394\u03ac\u03bd\u03b5\u03b9\u03bf", "account_type_Loan": "\u0394\u03ac\u03bd\u03b5\u03b9\u03bf",
"account_type_Mortgage": "\u03a5\u03c0\u03bf\u03b8\u03ae\u03ba\u03b7" "account_type_Mortgage": "\u03a5\u03c0\u03bf\u03b8\u03ae\u03ba\u03b7",
"account_role_defaultAsset": "\u0392\u03b1\u03c3\u03b9\u03ba\u03cc\u03c2 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03ba\u03b5\u03c6\u03b1\u03bb\u03b1\u03af\u03bf\u03c5",
"account_role_sharedAsset": "\u039a\u03bf\u03b9\u03bd\u03cc\u03c2 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03ba\u03b5\u03c6\u03b1\u03bb\u03b1\u03af\u03bf\u03c5",
"account_role_savingAsset": "\u039b\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03b1\u03c0\u03bf\u03c4\u03b1\u03bc\u03af\u03b5\u03c5\u03c3\u03b7\u03c2",
"account_role_ccAsset": "\u03a0\u03b9\u03c3\u03c4\u03c9\u03c4\u03b9\u03ba\u03ae \u03ba\u03ac\u03c1\u03c4\u03b1",
"account_role_cashWalletAsset": "\u03a0\u03bf\u03c1\u03c4\u03bf\u03c6\u03cc\u03bb\u03b9 \u03bc\u03b5\u03c4\u03c1\u03b7\u03c4\u03ce\u03bd"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "en-gb", "html_language": "en-gb",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Spent", "spent": "Spent",
"left": "Left", "left": "Left",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Debt", "account_type_Debt": "Debt",
"account_type_Loan": "Loan", "account_type_Loan": "Loan",
"account_type_Mortgage": "Mortgage" "account_type_Mortgage": "Mortgage",
"account_role_defaultAsset": "Default asset account",
"account_role_sharedAsset": "Shared asset account",
"account_role_savingAsset": "Savings account",
"account_role_ccAsset": "Credit card",
"account_role_cashWalletAsset": "Cash wallet"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "en", "html_language": "en",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Spent", "spent": "Spent",
"left": "Left", "left": "Left",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Debt", "account_type_Debt": "Debt",
"account_type_Loan": "Loan", "account_type_Loan": "Loan",
"account_type_Mortgage": "Mortgage" "account_type_Mortgage": "Mortgage",
"account_role_defaultAsset": "Default asset account",
"account_role_sharedAsset": "Shared asset account",
"account_role_savingAsset": "Savings account",
"account_role_ccAsset": "Credit card",
"account_role_cashWalletAsset": "Cash wallet"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "en-gb", "html_language": "en-gb",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Spent", "spent": "Spent",
"left": "Left", "left": "Left",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Debt", "account_type_Debt": "Debt",
"account_type_Loan": "Loan", "account_type_Loan": "Loan",
"account_type_Mortgage": "Mortgage" "account_type_Mortgage": "Mortgage",
"account_role_defaultAsset": "Default asset account",
"account_role_sharedAsset": "Shared asset account",
"account_role_savingAsset": "Savings account",
"account_role_ccAsset": "Credit card",
"account_role_cashWalletAsset": "Cash wallet"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "en", "html_language": "en",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Spent", "spent": "Spent",
"left": "Left", "left": "Left",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Debt", "account_type_Debt": "Debt",
"account_type_Loan": "Loan", "account_type_Loan": "Loan",
"account_type_Mortgage": "Mortgage" "account_type_Mortgage": "Mortgage",
"account_role_defaultAsset": "Default asset account",
"account_role_sharedAsset": "Shared asset account",
"account_role_savingAsset": "Savings account",
"account_role_ccAsset": "Credit card",
"account_role_cashWalletAsset": "Cash wallet"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "es", "html_language": "es",
"date_time_fns": "El MMMM hacer, yyyy a las HH:mm:ss", "date_time_fns": "El MMMM hacer, yyyy a las HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III no puede determinar el tipo de transacci\u00f3n basado en esta cuenta de origen.",
"bad_type_destination": "Firefly III no puede determinar el tipo de transacci\u00f3n basado en esta cuenta de destino."
},
"firefly": { "firefly": {
"spent": "Gastado", "spent": "Gastado",
"left": "Disponible", "left": "Disponible",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Cuenta de ingresos", "account_type_Revenue account": "Cuenta de ingresos",
"account_type_Debt": "Deuda", "account_type_Debt": "Deuda",
"account_type_Loan": "Pr\u00e9stamo", "account_type_Loan": "Pr\u00e9stamo",
"account_type_Mortgage": "Hipoteca" "account_type_Mortgage": "Hipoteca",
"account_role_defaultAsset": "Cuentas de ingresos por defecto",
"account_role_sharedAsset": "Cuenta de ingresos compartida",
"account_role_savingAsset": "Cuentas de ahorros",
"account_role_ccAsset": "Tarjeta de Cr\u00e9dito",
"account_role_cashWalletAsset": "Billetera de efectivo"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "es", "html_language": "es",
"date_time_fns": "El MMMM hacer, yyyy a las HH:mm:ss", "date_time_fns": "El MMMM hacer, yyyy a las HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III no puede determinar el tipo de transacci\u00f3n basado en esta cuenta de origen.",
"bad_type_destination": "Firefly III no puede determinar el tipo de transacci\u00f3n basado en esta cuenta de destino."
},
"firefly": { "firefly": {
"spent": "Gastado", "spent": "Gastado",
"left": "Disponible", "left": "Disponible",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Cuenta de ingresos", "account_type_Revenue account": "Cuenta de ingresos",
"account_type_Debt": "Deuda", "account_type_Debt": "Deuda",
"account_type_Loan": "Pr\u00e9stamo", "account_type_Loan": "Pr\u00e9stamo",
"account_type_Mortgage": "Hipoteca" "account_type_Mortgage": "Hipoteca",
"account_role_defaultAsset": "Cuentas de ingresos por defecto",
"account_role_sharedAsset": "Cuenta de ingresos compartida",
"account_role_savingAsset": "Cuentas de ahorros",
"account_role_ccAsset": "Tarjeta de Cr\u00e9dito",
"account_role_cashWalletAsset": "Billetera de efectivo"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "fi", "html_language": "fi",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "K\u00e4ytetty", "spent": "K\u00e4ytetty",
"left": "J\u00e4ljell\u00e4", "left": "J\u00e4ljell\u00e4",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Velka", "account_type_Debt": "Velka",
"account_type_Loan": "Laina", "account_type_Loan": "Laina",
"account_type_Mortgage": "Kiinnelaina" "account_type_Mortgage": "Kiinnelaina",
"account_role_defaultAsset": "Oletusk\u00e4ytt\u00f6tili",
"account_role_sharedAsset": "Jaettu k\u00e4ytt\u00f6tili",
"account_role_savingAsset": "S\u00e4\u00e4st\u00f6tili",
"account_role_ccAsset": "Luottokortti",
"account_role_cashWalletAsset": "K\u00e4teinen"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "fi", "html_language": "fi",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "K\u00e4ytetty", "spent": "K\u00e4ytetty",
"left": "J\u00e4ljell\u00e4", "left": "J\u00e4ljell\u00e4",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Velka", "account_type_Debt": "Velka",
"account_type_Loan": "Laina", "account_type_Loan": "Laina",
"account_type_Mortgage": "Kiinnelaina" "account_type_Mortgage": "Kiinnelaina",
"account_role_defaultAsset": "Oletusk\u00e4ytt\u00f6tili",
"account_role_sharedAsset": "Jaettu k\u00e4ytt\u00f6tili",
"account_role_savingAsset": "S\u00e4\u00e4st\u00f6tili",
"account_role_ccAsset": "Luottokortti",
"account_role_cashWalletAsset": "K\u00e4teinen"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "fr", "html_language": "fr",
"date_time_fns": "do MMMM, yyyy @ HH:mm:ss", "date_time_fns": "do MMMM, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "do MMMM, yyyy @ HH:mm" "date_time_fns_short": "do MMMM, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III ne peut pas d\u00e9terminer le type de transaction bas\u00e9 sur ce compte source.",
"bad_type_destination": "Firefly III ne peut pas d\u00e9terminer le type de transaction bas\u00e9 sur ce compte de destination."
},
"firefly": { "firefly": {
"spent": "D\u00e9pens\u00e9", "spent": "D\u00e9pens\u00e9",
"left": "Reste", "left": "Reste",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Compte de recettes", "account_type_Revenue account": "Compte de recettes",
"account_type_Debt": "Dette", "account_type_Debt": "Dette",
"account_type_Loan": "Pr\u00eat", "account_type_Loan": "Pr\u00eat",
"account_type_Mortgage": "Pr\u00eat hypoth\u00e9caire" "account_type_Mortgage": "Pr\u00eat hypoth\u00e9caire",
"account_role_defaultAsset": "Compte d'actif par d\u00e9faut",
"account_role_sharedAsset": "Compte d'actif partag\u00e9",
"account_role_savingAsset": "Compte d\u2019\u00e9pargne",
"account_role_ccAsset": "Carte de cr\u00e9dit",
"account_role_cashWalletAsset": "Porte-monnaie"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "fr", "html_language": "fr",
"date_time_fns": "do MMMM, yyyy @ HH:mm:ss", "date_time_fns": "do MMMM, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "do MMMM, yyyy @ HH:mm" "date_time_fns_short": "do MMMM, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III ne peut pas d\u00e9terminer le type de transaction bas\u00e9 sur ce compte source.",
"bad_type_destination": "Firefly III ne peut pas d\u00e9terminer le type de transaction bas\u00e9 sur ce compte de destination."
},
"firefly": { "firefly": {
"spent": "D\u00e9pens\u00e9", "spent": "D\u00e9pens\u00e9",
"left": "Reste", "left": "Reste",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Compte de recettes", "account_type_Revenue account": "Compte de recettes",
"account_type_Debt": "Dette", "account_type_Debt": "Dette",
"account_type_Loan": "Pr\u00eat", "account_type_Loan": "Pr\u00eat",
"account_type_Mortgage": "Pr\u00eat hypoth\u00e9caire" "account_type_Mortgage": "Pr\u00eat hypoth\u00e9caire",
"account_role_defaultAsset": "Compte d'actif par d\u00e9faut",
"account_role_sharedAsset": "Compte d'actif partag\u00e9",
"account_role_savingAsset": "Compte d\u2019\u00e9pargne",
"account_role_ccAsset": "Carte de cr\u00e9dit",
"account_role_cashWalletAsset": "Porte-monnaie"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "hu", "html_language": "hu",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "HHHH n, \u00e9",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "A Firefly III nem tudja eld\u00f6nteni a tranzakci\u00f3 t\u00edpus\u00e1t a forr\u00e1ssz\u00e1mla alapj\u00e1n.",
"bad_type_destination": "A Firefly III nem tudja eld\u00f6nteni a tranzakci\u00f3 t\u00edpus\u00e1t a c\u00e9lsz\u00e1mla alapj\u00e1n."
},
"firefly": { "firefly": {
"spent": "Elk\u00f6lt\u00f6tt", "spent": "Elk\u00f6lt\u00f6tt",
"left": "Maradv\u00e1ny", "left": "Maradv\u00e1ny",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Ad\u00f3ss\u00e1g", "account_type_Debt": "Ad\u00f3ss\u00e1g",
"account_type_Loan": "Hitel", "account_type_Loan": "Hitel",
"account_type_Mortgage": "Jelz\u00e1log" "account_type_Mortgage": "Jelz\u00e1log",
"account_role_defaultAsset": "Alap\u00e9rtelmezett eszk\u00f6zsz\u00e1mla",
"account_role_sharedAsset": "Megosztott eszk\u00f6zsz\u00e1mla",
"account_role_savingAsset": "Megtakar\u00edt\u00e1si sz\u00e1mla",
"account_role_ccAsset": "Hitelk\u00e1rtya",
"account_role_cashWalletAsset": "K\u00e9szp\u00e9nz"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "hu", "html_language": "hu",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "HHHH n, \u00e9",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "A Firefly III nem tudja eld\u00f6nteni a tranzakci\u00f3 t\u00edpus\u00e1t a forr\u00e1ssz\u00e1mla alapj\u00e1n.",
"bad_type_destination": "A Firefly III nem tudja eld\u00f6nteni a tranzakci\u00f3 t\u00edpus\u00e1t a c\u00e9lsz\u00e1mla alapj\u00e1n."
},
"firefly": { "firefly": {
"spent": "Elk\u00f6lt\u00f6tt", "spent": "Elk\u00f6lt\u00f6tt",
"left": "Maradv\u00e1ny", "left": "Maradv\u00e1ny",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Ad\u00f3ss\u00e1g", "account_type_Debt": "Ad\u00f3ss\u00e1g",
"account_type_Loan": "Hitel", "account_type_Loan": "Hitel",
"account_type_Mortgage": "Jelz\u00e1log" "account_type_Mortgage": "Jelz\u00e1log",
"account_role_defaultAsset": "Alap\u00e9rtelmezett eszk\u00f6zsz\u00e1mla",
"account_role_sharedAsset": "Megosztott eszk\u00f6zsz\u00e1mla",
"account_role_savingAsset": "Megtakar\u00edt\u00e1si sz\u00e1mla",
"account_role_ccAsset": "Hitelk\u00e1rtya",
"account_role_cashWalletAsset": "K\u00e9szp\u00e9nz"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "id", "html_language": "id",
"date_time_fns": "do MMMM yyyy @ HH:mm:ss", "date_time_fns": "do MMMM yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Menghabiskan", "spent": "Menghabiskan",
"left": "Kiri", "left": "Kiri",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Debt", "account_type_Debt": "Debt",
"account_type_Loan": "Loan", "account_type_Loan": "Loan",
"account_type_Mortgage": "Mortgage" "account_type_Mortgage": "Mortgage",
"account_role_defaultAsset": "Akun aset standar",
"account_role_sharedAsset": "Akun aset bersama",
"account_role_savingAsset": "Rekening tabungan",
"account_role_ccAsset": "Kartu kredit",
"account_role_cashWalletAsset": "Cash wallet"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "id", "html_language": "id",
"date_time_fns": "do MMMM yyyy @ HH:mm:ss", "date_time_fns": "do MMMM yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Menghabiskan", "spent": "Menghabiskan",
"left": "Kiri", "left": "Kiri",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Debt", "account_type_Debt": "Debt",
"account_type_Loan": "Loan", "account_type_Loan": "Loan",
"account_type_Mortgage": "Mortgage" "account_type_Mortgage": "Mortgage",
"account_role_defaultAsset": "Akun aset standar",
"account_role_sharedAsset": "Akun aset bersama",
"account_role_savingAsset": "Rekening tabungan",
"account_role_ccAsset": "Kartu kredit",
"account_role_cashWalletAsset": "Cash wallet"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "it", "html_language": "it",
"date_time_fns": "do MMMM yyyy @ HH:mm:ss", "date_time_fns": "do MMMM yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III non pu\u00f2 determinare il tipo di transazione in base a questo account sorgente.",
"bad_type_destination": "Firefly III non pu\u00f2 determinare il tipo di transazione in base a questo account di destinazione."
},
"firefly": { "firefly": {
"spent": "Speso", "spent": "Speso",
"left": "Resto", "left": "Resto",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Conto di entrate", "account_type_Revenue account": "Conto di entrate",
"account_type_Debt": "Debito", "account_type_Debt": "Debito",
"account_type_Loan": "Prestito", "account_type_Loan": "Prestito",
"account_type_Mortgage": "Mutuo" "account_type_Mortgage": "Mutuo",
"account_role_defaultAsset": "Conto attivit\u00e0 predefinito",
"account_role_sharedAsset": "Conto attivit\u00e0 condiviso",
"account_role_savingAsset": "Conto risparmio",
"account_role_ccAsset": "Carta di credito",
"account_role_cashWalletAsset": "Portafoglio"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "it", "html_language": "it",
"date_time_fns": "do MMMM yyyy @ HH:mm:ss", "date_time_fns": "do MMMM yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III non pu\u00f2 determinare il tipo di transazione in base a questo account sorgente.",
"bad_type_destination": "Firefly III non pu\u00f2 determinare il tipo di transazione in base a questo account di destinazione."
},
"firefly": { "firefly": {
"spent": "Speso", "spent": "Speso",
"left": "Resto", "left": "Resto",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Conto di entrate", "account_type_Revenue account": "Conto di entrate",
"account_type_Debt": "Debito", "account_type_Debt": "Debito",
"account_type_Loan": "Prestito", "account_type_Loan": "Prestito",
"account_type_Mortgage": "Mutuo" "account_type_Mortgage": "Mutuo",
"account_role_defaultAsset": "Conto attivit\u00e0 predefinito",
"account_role_sharedAsset": "Conto attivit\u00e0 condiviso",
"account_role_savingAsset": "Conto risparmio",
"account_role_ccAsset": "Carta di credito",
"account_role_cashWalletAsset": "Portafoglio"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "ja", "html_language": "ja",
"date_time_fns": "yyyy\u5e74MMMM\u6708do\u65e5 HH:mm:ss", "date_time_fns": "yyyy\u5e74MMMM\u6708do\u65e5 HH:mm:ss",
"month_and_day_fns": "y\u5e74 MMMM d\u65e5",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "\u652f\u51fa", "spent": "\u652f\u51fa",
"left": "\u6b8b\u308a", "left": "\u6b8b\u308a",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "\u53ce\u5165\u53e3\u5ea7", "account_type_Revenue account": "\u53ce\u5165\u53e3\u5ea7",
"account_type_Debt": "\u501f\u91d1", "account_type_Debt": "\u501f\u91d1",
"account_type_Loan": "\u30ed\u30fc\u30f3", "account_type_Loan": "\u30ed\u30fc\u30f3",
"account_type_Mortgage": "\u4f4f\u5b85\u30ed\u30fc\u30f3" "account_type_Mortgage": "\u4f4f\u5b85\u30ed\u30fc\u30f3",
"account_role_defaultAsset": "\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u8cc7\u7523\u53e3\u5ea7",
"account_role_sharedAsset": "\u5171\u6709\u8cc7\u7523\u53e3\u5ea7",
"account_role_savingAsset": "\u8caf\u84c4\u53e3\u5ea7",
"account_role_ccAsset": "\u30af\u30ec\u30b8\u30c3\u30c8\u30ab\u30fc\u30c9",
"account_role_cashWalletAsset": "\u73fe\u91d1"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "ja", "html_language": "ja",
"date_time_fns": "yyyy\u5e74MMMM\u6708do\u65e5 HH:mm:ss", "date_time_fns": "yyyy\u5e74MMMM\u6708do\u65e5 HH:mm:ss",
"month_and_day_fns": "y\u5e74 MMMM d\u65e5",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "\u652f\u51fa", "spent": "\u652f\u51fa",
"left": "\u6b8b\u308a", "left": "\u6b8b\u308a",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "\u53ce\u5165\u53e3\u5ea7", "account_type_Revenue account": "\u53ce\u5165\u53e3\u5ea7",
"account_type_Debt": "\u501f\u91d1", "account_type_Debt": "\u501f\u91d1",
"account_type_Loan": "\u30ed\u30fc\u30f3", "account_type_Loan": "\u30ed\u30fc\u30f3",
"account_type_Mortgage": "\u4f4f\u5b85\u30ed\u30fc\u30f3" "account_type_Mortgage": "\u4f4f\u5b85\u30ed\u30fc\u30f3",
"account_role_defaultAsset": "\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u8cc7\u7523\u53e3\u5ea7",
"account_role_sharedAsset": "\u5171\u6709\u8cc7\u7523\u53e3\u5ea7",
"account_role_savingAsset": "\u8caf\u84c4\u53e3\u5ea7",
"account_role_ccAsset": "\u30af\u30ec\u30b8\u30c3\u30c8\u30ab\u30fc\u30c9",
"account_role_cashWalletAsset": "\u73fe\u91d1"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "ko", "html_language": "ko",
"date_time_fns": "YYYY\ub144 M\uc6d4 D\uc77c HH:mm:ss", "date_time_fns": "YYYY\ub144 M\uc6d4 D\uc77c HH:mm:ss",
"month_and_day_fns": "y\ub144 MMMM d\uc77c",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "\uc9c0\ucd9c", "spent": "\uc9c0\ucd9c",
"left": "\ub0a8\uc74c", "left": "\ub0a8\uc74c",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "\ub300\ucd9c", "account_type_Debt": "\ub300\ucd9c",
"account_type_Loan": "\ube5a", "account_type_Loan": "\ube5a",
"account_type_Mortgage": "\ubaa8\uae30\uc9c0" "account_type_Mortgage": "\ubaa8\uae30\uc9c0",
"account_role_defaultAsset": "\uae30\ubcf8 \uc790\uc0b0 \uacc4\uc815",
"account_role_sharedAsset": "\uacf5\uc720 \uc790\uc0b0 \uacc4\uc815",
"account_role_savingAsset": "\uc608\uae08 \uacc4\uc88c",
"account_role_ccAsset": "\uc2e0\uc6a9\uce74\ub4dc",
"account_role_cashWalletAsset": "\ud604\uae08 \uc9c0\uac11"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "ko", "html_language": "ko",
"date_time_fns": "YYYY\ub144 M\uc6d4 D\uc77c HH:mm:ss", "date_time_fns": "YYYY\ub144 M\uc6d4 D\uc77c HH:mm:ss",
"month_and_day_fns": "y\ub144 MMMM d\uc77c",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "\uc9c0\ucd9c", "spent": "\uc9c0\ucd9c",
"left": "\ub0a8\uc74c", "left": "\ub0a8\uc74c",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "\ub300\ucd9c", "account_type_Debt": "\ub300\ucd9c",
"account_type_Loan": "\ube5a", "account_type_Loan": "\ube5a",
"account_type_Mortgage": "\ubaa8\uae30\uc9c0" "account_type_Mortgage": "\ubaa8\uae30\uc9c0",
"account_role_defaultAsset": "\uae30\ubcf8 \uc790\uc0b0 \uacc4\uc815",
"account_role_sharedAsset": "\uacf5\uc720 \uc790\uc0b0 \uacc4\uc815",
"account_role_savingAsset": "\uc608\uae08 \uacc4\uc88c",
"account_role_ccAsset": "\uc2e0\uc6a9\uce74\ub4dc",
"account_role_cashWalletAsset": "\ud604\uae08 \uc9c0\uac11"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "nb", "html_language": "nb",
"date_time_fns": "do MMMM, yyyy @ HH:mm:ss", "date_time_fns": "do MMMM, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Brukt", "spent": "Brukt",
"left": "Gjenv\u00e6rende", "left": "Gjenv\u00e6rende",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Inntektskonto", "account_type_Revenue account": "Inntektskonto",
"account_type_Debt": "Gjeld", "account_type_Debt": "Gjeld",
"account_type_Loan": "L\u00e5n", "account_type_Loan": "L\u00e5n",
"account_type_Mortgage": "Boligl\u00e5n" "account_type_Mortgage": "Boligl\u00e5n",
"account_role_defaultAsset": "Standard aktivakonto",
"account_role_sharedAsset": "Delt aktivakonto",
"account_role_savingAsset": "Sparekonto",
"account_role_ccAsset": "Kredittkort",
"account_role_cashWalletAsset": "Kontant lommebok"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "nb", "html_language": "nb",
"date_time_fns": "do MMMM, yyyy @ HH:mm:ss", "date_time_fns": "do MMMM, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Brukt", "spent": "Brukt",
"left": "Gjenv\u00e6rende", "left": "Gjenv\u00e6rende",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Inntektskonto", "account_type_Revenue account": "Inntektskonto",
"account_type_Debt": "Gjeld", "account_type_Debt": "Gjeld",
"account_type_Loan": "L\u00e5n", "account_type_Loan": "L\u00e5n",
"account_type_Mortgage": "Boligl\u00e5n" "account_type_Mortgage": "Boligl\u00e5n",
"account_role_defaultAsset": "Standard aktivakonto",
"account_role_sharedAsset": "Delt aktivakonto",
"account_role_savingAsset": "Sparekonto",
"account_role_ccAsset": "Kredittkort",
"account_role_cashWalletAsset": "Kontant lommebok"
} }
} }

View File

@@ -2,7 +2,12 @@
"config": { "config": {
"html_language": "nl", "html_language": "nl",
"date_time_fns": "d MMMM yyyy @ HH:mm:ss", "date_time_fns": "d MMMM yyyy @ HH:mm:ss",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "month_and_day_fns": "d MMMM y",
"date_time_fns_short": "d MMMM yyyy @ HH:mm"
},
"validation": {
"bad_type_source": "Firefly III kan het transactietype niet bepalen op basis van deze bronrekening.",
"bad_type_destination": "Firefly III kan het transactietype niet bepalen op basis van deze doelrekening."
}, },
"firefly": { "firefly": {
"spent": "Uitgegeven", "spent": "Uitgegeven",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Debiteur", "account_type_Revenue account": "Debiteur",
"account_type_Debt": "Schuld", "account_type_Debt": "Schuld",
"account_type_Loan": "Lening", "account_type_Loan": "Lening",
"account_type_Mortgage": "Hypotheek" "account_type_Mortgage": "Hypotheek",
"account_role_defaultAsset": "Standaard betaalrekening",
"account_role_sharedAsset": "Gedeelde betaalrekening",
"account_role_savingAsset": "Spaarrekening",
"account_role_ccAsset": "Credit card",
"account_role_cashWalletAsset": "Cash"
} }
} }

View File

@@ -2,7 +2,12 @@
"config": { "config": {
"html_language": "nl", "html_language": "nl",
"date_time_fns": "d MMMM yyyy @ HH:mm:ss", "date_time_fns": "d MMMM yyyy @ HH:mm:ss",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "month_and_day_fns": "d MMMM y",
"date_time_fns_short": "d MMMM yyyy @ HH:mm"
},
"validation": {
"bad_type_source": "Firefly III kan het transactietype niet bepalen op basis van deze bronrekening.",
"bad_type_destination": "Firefly III kan het transactietype niet bepalen op basis van deze doelrekening."
}, },
"firefly": { "firefly": {
"spent": "Uitgegeven", "spent": "Uitgegeven",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Debiteur", "account_type_Revenue account": "Debiteur",
"account_type_Debt": "Schuld", "account_type_Debt": "Schuld",
"account_type_Loan": "Lening", "account_type_Loan": "Lening",
"account_type_Mortgage": "Hypotheek" "account_type_Mortgage": "Hypotheek",
"account_role_defaultAsset": "Standaard betaalrekening",
"account_role_sharedAsset": "Gedeelde betaalrekening",
"account_role_savingAsset": "Spaarrekening",
"account_role_ccAsset": "Credit card",
"account_role_cashWalletAsset": "Cash"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "nn", "html_language": "nn",
"date_time_fns": "do MMMM, yyyy @ HH:mm:ss", "date_time_fns": "do MMMM, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Brukt", "spent": "Brukt",
"left": "Att", "left": "Att",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Gjeld", "account_type_Debt": "Gjeld",
"account_type_Loan": "L\u00e5n", "account_type_Loan": "L\u00e5n",
"account_type_Mortgage": "Boligl\u00e5n" "account_type_Mortgage": "Boligl\u00e5n",
"account_role_defaultAsset": "Standard aktivakonto",
"account_role_sharedAsset": "Delt aktivakonto",
"account_role_savingAsset": "Sparekonto",
"account_role_ccAsset": "Kredittkort",
"account_role_cashWalletAsset": "Kontant lommebok"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "nn", "html_language": "nn",
"date_time_fns": "do MMMM, yyyy @ HH:mm:ss", "date_time_fns": "do MMMM, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Brukt", "spent": "Brukt",
"left": "Att", "left": "Att",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Gjeld", "account_type_Debt": "Gjeld",
"account_type_Loan": "L\u00e5n", "account_type_Loan": "L\u00e5n",
"account_type_Mortgage": "Boligl\u00e5n" "account_type_Mortgage": "Boligl\u00e5n",
"account_role_defaultAsset": "Standard aktivakonto",
"account_role_sharedAsset": "Delt aktivakonto",
"account_role_savingAsset": "Sparekonto",
"account_role_ccAsset": "Kredittkort",
"account_role_cashWalletAsset": "Kontant lommebok"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "pl", "html_language": "pl",
"date_time_fns": "do MMMM yyyy @ HH:mm:ss", "date_time_fns": "do MMMM yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Wydano", "spent": "Wydano",
"left": "Pozosta\u0142o", "left": "Pozosta\u0142o",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Konto przychod\u00f3w", "account_type_Revenue account": "Konto przychod\u00f3w",
"account_type_Debt": "D\u0142ug", "account_type_Debt": "D\u0142ug",
"account_type_Loan": "Po\u017cyczka", "account_type_Loan": "Po\u017cyczka",
"account_type_Mortgage": "Hipoteka" "account_type_Mortgage": "Hipoteka",
"account_role_defaultAsset": "Domy\u015blne konto aktyw\u00f3w",
"account_role_sharedAsset": "Wsp\u00f3\u0142dzielone konto aktyw\u00f3w",
"account_role_savingAsset": "Konto oszcz\u0119dno\u015bciowe",
"account_role_ccAsset": "Karta kredytowa",
"account_role_cashWalletAsset": "Portfel got\u00f3wkowy"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "pl", "html_language": "pl",
"date_time_fns": "do MMMM yyyy @ HH:mm:ss", "date_time_fns": "do MMMM yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Wydano", "spent": "Wydano",
"left": "Pozosta\u0142o", "left": "Pozosta\u0142o",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Konto przychod\u00f3w", "account_type_Revenue account": "Konto przychod\u00f3w",
"account_type_Debt": "D\u0142ug", "account_type_Debt": "D\u0142ug",
"account_type_Loan": "Po\u017cyczka", "account_type_Loan": "Po\u017cyczka",
"account_type_Mortgage": "Hipoteka" "account_type_Mortgage": "Hipoteka",
"account_role_defaultAsset": "Domy\u015blne konto aktyw\u00f3w",
"account_role_sharedAsset": "Wsp\u00f3\u0142dzielone konto aktyw\u00f3w",
"account_role_savingAsset": "Konto oszcz\u0119dno\u015bciowe",
"account_role_ccAsset": "Karta kredytowa",
"account_role_cashWalletAsset": "Portfel got\u00f3wkowy"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "pt-br", "html_language": "pt-br",
"date_time_fns": "dd 'de' MMMM 'de' yyyy, '\u00e0s' HH:mm:ss", "date_time_fns": "dd 'de' MMMM 'de' yyyy, '\u00e0s' HH:mm:ss",
"month_and_day_fns": "d [de] MMMM [de] y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III n\u00e3o conseguiu determinar o tipo de transa\u00e7\u00e3o baseado nesta conta de origem.",
"bad_type_destination": "Firefly III n\u00e3o conseguiu determinar o tipo de transa\u00e7\u00e3o baseado nesta conta destino."
},
"firefly": { "firefly": {
"spent": "Gasto", "spent": "Gasto",
"left": "Restante", "left": "Restante",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Conta de receitas", "account_type_Revenue account": "Conta de receitas",
"account_type_Debt": "D\u00edvida", "account_type_Debt": "D\u00edvida",
"account_type_Loan": "Empr\u00e9stimo", "account_type_Loan": "Empr\u00e9stimo",
"account_type_Mortgage": "Hipoteca" "account_type_Mortgage": "Hipoteca",
"account_role_defaultAsset": "Conta padr\u00e3o",
"account_role_sharedAsset": "Contas de ativos compartilhadas",
"account_role_savingAsset": "Conta poupan\u00e7a",
"account_role_ccAsset": "Cart\u00e3o de cr\u00e9dito",
"account_role_cashWalletAsset": "Carteira de dinheiro"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "pt", "html_language": "pt",
"date_time_fns": "DO [de] MMMM YYYY, @ HH:mm:ss", "date_time_fns": "DO [de] MMMM YYYY, @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "O Firefly III n\u00e3o consegue determinar o tipo de transa\u00e7\u00e3o baseado nesta conta de origem.",
"bad_type_destination": "O Firefly III n\u00e3o consegue determinar o tipo de transa\u00e7\u00e3o baseado nesta conta de destino."
},
"firefly": { "firefly": {
"spent": "Gasto", "spent": "Gasto",
"left": "Em falta", "left": "Em falta",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Conta de receitas", "account_type_Revenue account": "Conta de receitas",
"account_type_Debt": "D\u00edvida", "account_type_Debt": "D\u00edvida",
"account_type_Loan": "Empr\u00e9stimo", "account_type_Loan": "Empr\u00e9stimo",
"account_type_Mortgage": "Hipoteca" "account_type_Mortgage": "Hipoteca",
"account_role_defaultAsset": "Conta de ativos predefinida",
"account_role_sharedAsset": "Conta de ativos partilhados",
"account_role_savingAsset": "Conta poupan\u00e7a",
"account_role_ccAsset": "Cart\u00e3o de cr\u00e9dito",
"account_role_cashWalletAsset": "Carteira de dinheiro"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "pt-br", "html_language": "pt-br",
"date_time_fns": "dd 'de' MMMM 'de' yyyy, '\u00e0s' HH:mm:ss", "date_time_fns": "dd 'de' MMMM 'de' yyyy, '\u00e0s' HH:mm:ss",
"month_and_day_fns": "d [de] MMMM [de] y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III n\u00e3o conseguiu determinar o tipo de transa\u00e7\u00e3o baseado nesta conta de origem.",
"bad_type_destination": "Firefly III n\u00e3o conseguiu determinar o tipo de transa\u00e7\u00e3o baseado nesta conta destino."
},
"firefly": { "firefly": {
"spent": "Gasto", "spent": "Gasto",
"left": "Restante", "left": "Restante",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Conta de receitas", "account_type_Revenue account": "Conta de receitas",
"account_type_Debt": "D\u00edvida", "account_type_Debt": "D\u00edvida",
"account_type_Loan": "Empr\u00e9stimo", "account_type_Loan": "Empr\u00e9stimo",
"account_type_Mortgage": "Hipoteca" "account_type_Mortgage": "Hipoteca",
"account_role_defaultAsset": "Conta padr\u00e3o",
"account_role_sharedAsset": "Contas de ativos compartilhadas",
"account_role_savingAsset": "Conta poupan\u00e7a",
"account_role_ccAsset": "Cart\u00e3o de cr\u00e9dito",
"account_role_cashWalletAsset": "Carteira de dinheiro"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "pt", "html_language": "pt",
"date_time_fns": "DO [de] MMMM YYYY, @ HH:mm:ss", "date_time_fns": "DO [de] MMMM YYYY, @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "O Firefly III n\u00e3o consegue determinar o tipo de transa\u00e7\u00e3o baseado nesta conta de origem.",
"bad_type_destination": "O Firefly III n\u00e3o consegue determinar o tipo de transa\u00e7\u00e3o baseado nesta conta de destino."
},
"firefly": { "firefly": {
"spent": "Gasto", "spent": "Gasto",
"left": "Em falta", "left": "Em falta",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Conta de receitas", "account_type_Revenue account": "Conta de receitas",
"account_type_Debt": "D\u00edvida", "account_type_Debt": "D\u00edvida",
"account_type_Loan": "Empr\u00e9stimo", "account_type_Loan": "Empr\u00e9stimo",
"account_type_Mortgage": "Hipoteca" "account_type_Mortgage": "Hipoteca",
"account_role_defaultAsset": "Conta de ativos predefinida",
"account_role_sharedAsset": "Conta de ativos partilhados",
"account_role_savingAsset": "Conta poupan\u00e7a",
"account_role_ccAsset": "Cart\u00e3o de cr\u00e9dito",
"account_role_cashWalletAsset": "Carteira de dinheiro"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "ro", "html_language": "ro",
"date_time_fns": "MMMM do yyy @ HH:mm:ss", "date_time_fns": "MMMM do yyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do yyy @ HH:mm" "date_time_fns_short": "MMMM do yyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III nu poate determina tipul de tranzac\u021bie pe baza acestui cont surs\u0103.",
"bad_type_destination": "Firefly III nu poate determina tipul de tranzac\u021bie bazat pe acest cont de destina\u021bie."
},
"firefly": { "firefly": {
"spent": "Cheltuit", "spent": "Cheltuit",
"left": "R\u0103mas", "left": "R\u0103mas",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Cont de venituri", "account_type_Revenue account": "Cont de venituri",
"account_type_Debt": "Datorie", "account_type_Debt": "Datorie",
"account_type_Loan": "\u00cemprumut", "account_type_Loan": "\u00cemprumut",
"account_type_Mortgage": "Credit ipotecar" "account_type_Mortgage": "Credit ipotecar",
"account_role_defaultAsset": "Contul implicit activ",
"account_role_sharedAsset": "Contul de active partajat",
"account_role_savingAsset": "Cont de economii",
"account_role_ccAsset": "Card de credit",
"account_role_cashWalletAsset": "Cash - Numerar"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "ro", "html_language": "ro",
"date_time_fns": "MMMM do yyy @ HH:mm:ss", "date_time_fns": "MMMM do yyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do yyy @ HH:mm" "date_time_fns_short": "MMMM do yyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III nu poate determina tipul de tranzac\u021bie pe baza acestui cont surs\u0103.",
"bad_type_destination": "Firefly III nu poate determina tipul de tranzac\u021bie bazat pe acest cont de destina\u021bie."
},
"firefly": { "firefly": {
"spent": "Cheltuit", "spent": "Cheltuit",
"left": "R\u0103mas", "left": "R\u0103mas",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Cont de venituri", "account_type_Revenue account": "Cont de venituri",
"account_type_Debt": "Datorie", "account_type_Debt": "Datorie",
"account_type_Loan": "\u00cemprumut", "account_type_Loan": "\u00cemprumut",
"account_type_Mortgage": "Credit ipotecar" "account_type_Mortgage": "Credit ipotecar",
"account_role_defaultAsset": "Contul implicit activ",
"account_role_sharedAsset": "Contul de active partajat",
"account_role_savingAsset": "Cont de economii",
"account_role_ccAsset": "Card de credit",
"account_role_cashWalletAsset": "Cash - Numerar"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "ru", "html_language": "ru",
"date_time_fns": "Do MMMM yyyy, @ HH:mm:ss", "date_time_fns": "Do MMMM yyyy, @ HH:mm:ss",
"month_and_day_fns": "D MMMM YYYY",
"date_time_fns_short": "Do MMMM YYYY \u0432 HH:mm" "date_time_fns_short": "Do MMMM YYYY \u0432 HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430.",
"bad_type_destination": "Firefly III \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430."
},
"firefly": { "firefly": {
"spent": "\u0420\u0430\u0441\u0445\u043e\u0434", "spent": "\u0420\u0430\u0441\u0445\u043e\u0434",
"left": "\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c", "left": "\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "\u0421\u0447\u0435\u0442 \u0434\u043e\u0445\u043e\u0434\u043e\u0432", "account_type_Revenue account": "\u0421\u0447\u0435\u0442 \u0434\u043e\u0445\u043e\u0434\u043e\u0432",
"account_type_Debt": "\u0414\u0435\u0431\u0438\u0442", "account_type_Debt": "\u0414\u0435\u0431\u0438\u0442",
"account_type_Loan": "\u0417\u0430\u0451\u043c", "account_type_Loan": "\u0417\u0430\u0451\u043c",
"account_type_Mortgage": "\u0418\u043f\u043e\u0442\u0435\u043a\u0430" "account_type_Mortgage": "\u0418\u043f\u043e\u0442\u0435\u043a\u0430",
"account_role_defaultAsset": "\u0421\u0447\u0451\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",
"account_role_sharedAsset": "\u041e\u0431\u0449\u0438\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0447\u0451\u0442",
"account_role_savingAsset": "\u0421\u0431\u0435\u0440\u0435\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0447\u0435\u0442",
"account_role_ccAsset": "\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430",
"account_role_cashWalletAsset": "\u041d\u0430\u043b\u0438\u0447\u043d\u044b\u0435"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "ru", "html_language": "ru",
"date_time_fns": "Do MMMM yyyy, @ HH:mm:ss", "date_time_fns": "Do MMMM yyyy, @ HH:mm:ss",
"month_and_day_fns": "D MMMM YYYY",
"date_time_fns_short": "Do MMMM YYYY \u0432 HH:mm" "date_time_fns_short": "Do MMMM YYYY \u0432 HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430.",
"bad_type_destination": "Firefly III \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430."
},
"firefly": { "firefly": {
"spent": "\u0420\u0430\u0441\u0445\u043e\u0434", "spent": "\u0420\u0430\u0441\u0445\u043e\u0434",
"left": "\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c", "left": "\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "\u0421\u0447\u0435\u0442 \u0434\u043e\u0445\u043e\u0434\u043e\u0432", "account_type_Revenue account": "\u0421\u0447\u0435\u0442 \u0434\u043e\u0445\u043e\u0434\u043e\u0432",
"account_type_Debt": "\u0414\u0435\u0431\u0438\u0442", "account_type_Debt": "\u0414\u0435\u0431\u0438\u0442",
"account_type_Loan": "\u0417\u0430\u0451\u043c", "account_type_Loan": "\u0417\u0430\u0451\u043c",
"account_type_Mortgage": "\u0418\u043f\u043e\u0442\u0435\u043a\u0430" "account_type_Mortgage": "\u0418\u043f\u043e\u0442\u0435\u043a\u0430",
"account_role_defaultAsset": "\u0421\u0447\u0451\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",
"account_role_sharedAsset": "\u041e\u0431\u0449\u0438\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0447\u0451\u0442",
"account_role_savingAsset": "\u0421\u0431\u0435\u0440\u0435\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0447\u0435\u0442",
"account_role_ccAsset": "\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430",
"account_role_cashWalletAsset": "\u041d\u0430\u043b\u0438\u0447\u043d\u044b\u0435"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "sk", "html_language": "sk",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Utraten\u00e9", "spent": "Utraten\u00e9",
"left": "Zost\u00e1va", "left": "Zost\u00e1va",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Dlh", "account_type_Debt": "Dlh",
"account_type_Loan": "P\u00f4\u017ei\u010dka", "account_type_Loan": "P\u00f4\u017ei\u010dka",
"account_type_Mortgage": "Hypot\u00e9ka" "account_type_Mortgage": "Hypot\u00e9ka",
"account_role_defaultAsset": "Predvolen\u00fd \u00fa\u010det akt\u00edv",
"account_role_sharedAsset": "Zdie\u013ean\u00fd \u00fa\u010det akt\u00edv",
"account_role_savingAsset": "\u0160etriaci \u00fa\u010det",
"account_role_ccAsset": "Kreditn\u00e1 karta",
"account_role_cashWalletAsset": "Pe\u0148a\u017eenka"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "sk", "html_language": "sk",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III can't determine the transaction type based on this source account.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Utraten\u00e9", "spent": "Utraten\u00e9",
"left": "Zost\u00e1va", "left": "Zost\u00e1va",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Dlh", "account_type_Debt": "Dlh",
"account_type_Loan": "P\u00f4\u017ei\u010dka", "account_type_Loan": "P\u00f4\u017ei\u010dka",
"account_type_Mortgage": "Hypot\u00e9ka" "account_type_Mortgage": "Hypot\u00e9ka",
"account_role_defaultAsset": "Predvolen\u00fd \u00fa\u010det akt\u00edv",
"account_role_sharedAsset": "Zdie\u013ean\u00fd \u00fa\u010det akt\u00edv",
"account_role_savingAsset": "\u0160etriaci \u00fa\u010det",
"account_role_ccAsset": "Kreditn\u00e1 karta",
"account_role_cashWalletAsset": "Pe\u0148a\u017eenka"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "sl", "html_language": "sl",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Na podlagi tega izvornega ra\u010duna Firefly III ne more dolo\u010diti vrste transakcije.",
"bad_type_destination": "Na podlagi tega ciljnega ra\u010duna Firefly III ne more dolo\u010diti vrste transakcije."
},
"firefly": { "firefly": {
"spent": "Porabljeno", "spent": "Porabljeno",
"left": "Preostalo", "left": "Preostalo",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Ra\u010dun prihodkov", "account_type_Revenue account": "Ra\u010dun prihodkov",
"account_type_Debt": "Dolg", "account_type_Debt": "Dolg",
"account_type_Loan": "Posojilo", "account_type_Loan": "Posojilo",
"account_type_Mortgage": "Hipoteka" "account_type_Mortgage": "Hipoteka",
"account_role_defaultAsset": "Privzeti ra\u010dun sredstev",
"account_role_sharedAsset": "Skupni ra\u010dun sredstev",
"account_role_savingAsset": "Var\u010devalni ra\u010dun",
"account_role_ccAsset": "Kreditna kartica",
"account_role_cashWalletAsset": "Gotovina"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "sl", "html_language": "sl",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Na podlagi tega izvornega ra\u010duna Firefly III ne more dolo\u010diti vrste transakcije.",
"bad_type_destination": "Na podlagi tega ciljnega ra\u010duna Firefly III ne more dolo\u010diti vrste transakcije."
},
"firefly": { "firefly": {
"spent": "Porabljeno", "spent": "Porabljeno",
"left": "Preostalo", "left": "Preostalo",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Ra\u010dun prihodkov", "account_type_Revenue account": "Ra\u010dun prihodkov",
"account_type_Debt": "Dolg", "account_type_Debt": "Dolg",
"account_type_Loan": "Posojilo", "account_type_Loan": "Posojilo",
"account_type_Mortgage": "Hipoteka" "account_type_Mortgage": "Hipoteka",
"account_role_defaultAsset": "Privzeti ra\u010dun sredstev",
"account_role_sharedAsset": "Skupni ra\u010dun sredstev",
"account_role_savingAsset": "Var\u010devalni ra\u010dun",
"account_role_ccAsset": "Kreditna kartica",
"account_role_cashWalletAsset": "Gotovina"
} }
} }

View File

@@ -2,8 +2,13 @@
"config": { "config": {
"html_language": "sv", "html_language": "sv",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss", "date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm" "date_time_fns_short": "MMMM do, yyyy @ HH:mm"
}, },
"validation": {
"bad_type_source": "Firefly III kan inte avg\u00f6ra transaktionstypen baserat p\u00e5 detta k\u00e4llkonto.",
"bad_type_destination": "Firefly III can't determine the transaction type based on this destination account."
},
"firefly": { "firefly": {
"spent": "Spenderat", "spent": "Spenderat",
"left": "\u00c5terst\u00e5r", "left": "\u00c5terst\u00e5r",
@@ -38,6 +43,11 @@
"account_type_Revenue account": "Revenue account", "account_type_Revenue account": "Revenue account",
"account_type_Debt": "Skuld", "account_type_Debt": "Skuld",
"account_type_Loan": "L\u00e5n", "account_type_Loan": "L\u00e5n",
"account_type_Mortgage": "Bol\u00e5n" "account_type_Mortgage": "Bol\u00e5n",
"account_role_defaultAsset": "F\u00f6rvalt tillg\u00e5ngskonto",
"account_role_sharedAsset": "Delat tillg\u00e5ngskonto",
"account_role_savingAsset": "Sparkonto",
"account_role_ccAsset": "Kreditkort",
"account_role_cashWalletAsset": "Pl\u00e5nbok"
} }
} }

Some files were not shown because too many files have changed in this diff Show More