Compare commits

...

33 Commits

Author SHA1 Message Date
James Cole
edd54e23c5 Merge branch 'main' into develop 2024-04-07 10:40:03 +02:00
James Cole
1238df8784 Switch to v38 2024-04-07 10:38:17 +02:00
github-actions
b8c62652b0 Auto commit for release 'develop' on 2024-04-07 2024-04-07 10:37:19 +02:00
James Cole
54b2d02f63 Build JS in one go. 2024-04-07 10:31:24 +02:00
James Cole
47faf89a5c Update script to apply patch. 2024-04-07 10:29:54 +02:00
James Cole
b7fb5a3854 This configuration works but patch-package doesn't take (yt) 2024-04-07 10:12:23 +02:00
James Cole
a384b4202a Add gitkeep file 2024-04-07 07:26:31 +02:00
James Cole
99ecac0ce4 Clean up some scripts. 2024-04-07 07:25:54 +02:00
James Cole
6102982456 Move more JS files 2024-04-07 07:21:08 +02:00
James Cole
b88e981b4b Move v2 files 2024-04-07 07:17:34 +02:00
James Cole
827263b03e Move v1 assets 2024-04-07 07:16:38 +02:00
James Cole
d44e74d334 Merge branch 'main' into develop 2024-04-07 06:52:49 +02:00
github-actions
911f46c590 Auto commit for release 'develop' on 2024-04-07 2024-04-07 06:51:34 +02:00
James Cole
7d42c4ee5d Move to v37 2024-04-07 06:45:48 +02:00
James Cole
ea89f6177f Move selected translations to Firefly III 2024-04-07 06:44:45 +02:00
James Cole
74291b3870 Expand API administration validation 2024-04-07 06:06:40 +02:00
James Cole
2c4f2082fe Update workflows. 2024-04-06 06:26:21 +02:00
github-actions
d8d58cc29b Auto commit for release 'develop' on 2024-04-04 2024-04-04 05:11:18 +02:00
James Cole
85b17e4035 Drop the type for now, fixes https://github.com/orgs/firefly-iii/discussions/8750 2024-04-03 20:07:18 +02:00
James Cole
83de5667b3 Fix icons en styling 2024-04-03 08:59:44 +02:00
James Cole
5fffe873c6 Update PR template 2024-04-03 05:55:39 +02:00
James Cole
78c09c82d6 Merge branch 'main' into develop 2024-04-03 05:48:55 +02:00
James Cole
704abc315d New template 2024-04-03 05:48:38 +02:00
github-actions
86b4965458 Auto commit for release 'develop' on 2024-04-03 2024-04-03 05:19:06 +02:00
James Cole
d2dc0c2bf0 Merge branch 'main' into develop 2024-04-03 05:12:51 +02:00
James Cole
9f4894bbb5 Fix https://github.com/firefly-iii/firefly-iii/issues/8748 2024-04-03 05:12:28 +02:00
James Cole
76a8675a34 make sure boxes are empty 2024-04-02 18:04:42 +02:00
James Cole
6988301da1 Merge pull request #8746 from imlonghao/patch-1
Set date to now when cloning journal
2024-04-02 18:03:52 +02:00
imlonghao
109cd37211 Set date to now when cloning journal
Signed-off-by: imlonghao <git@imlonghao.com>
2024-04-02 23:44:45 +08:00
James Cole
284ff4d1b0 Merge branch 'main' into develop 2024-04-02 16:53:31 +02:00
James Cole
bc0ab7af99 Spelling error in nightly release instructions 2024-04-02 16:53:18 +02:00
James Cole
a17bc7258f Fix phpstan error courtesy of the laravel 11 upgrade (changed signatures and return types) 2024-04-02 15:40:33 +02:00
James Cole
87911c2438 Catch empty preference, just in case. 2024-04-02 12:38:31 +02:00
414 changed files with 95905 additions and 85183 deletions

View File

@@ -1,5 +1,5 @@
{
"require": {
"friendsofphp/php-cs-fixer": "^3.12"
}
"require": {
"friendsofphp/php-cs-fixer": "^3.12"
}
}

View File

@@ -538,16 +538,16 @@
},
{
"name": "symfony/console",
"version": "v7.0.4",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "6b099f3306f7c9c2d2786ed736d0026b2903205f"
"reference": "fde915cd8e7eb99b3d531d3d5c09531429c3f9e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/6b099f3306f7c9c2d2786ed736d0026b2903205f",
"reference": "6b099f3306f7c9c2d2786ed736d0026b2903205f",
"url": "https://api.github.com/repos/symfony/console/zipball/fde915cd8e7eb99b3d531d3d5c09531429c3f9e5",
"reference": "fde915cd8e7eb99b3d531d3d5c09531429c3f9e5",
"shasum": ""
},
"require": {
@@ -611,7 +611,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v7.0.4"
"source": "https://github.com/symfony/console/tree/v7.0.6"
},
"funding": [
{
@@ -627,7 +627,7 @@
"type": "tidelift"
}
],
"time": "2024-02-22T20:27:20+00:00"
"time": "2024-04-01T11:04:53+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -778,16 +778,16 @@
},
{
"name": "symfony/event-dispatcher-contracts",
"version": "v3.4.0",
"version": "v3.4.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "a76aed96a42d2b521153fb382d418e30d18b59df"
"reference": "4e64b49bf370ade88e567de29465762e316e4224"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df",
"reference": "a76aed96a42d2b521153fb382d418e30d18b59df",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/4e64b49bf370ade88e567de29465762e316e4224",
"reference": "4e64b49bf370ade88e567de29465762e316e4224",
"shasum": ""
},
"require": {
@@ -834,7 +834,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0"
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.2"
},
"funding": [
{
@@ -850,20 +850,20 @@
"type": "tidelift"
}
],
"time": "2023-05-23T14:45:45+00:00"
"time": "2024-01-23T14:51:35+00:00"
},
{
"name": "symfony/filesystem",
"version": "v7.0.3",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "2890e3a825bc0c0558526c04499c13f83e1b6b12"
"reference": "408105dff4c104454100730bdfd1a9cdd993f04d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/2890e3a825bc0c0558526c04499c13f83e1b6b12",
"reference": "2890e3a825bc0c0558526c04499c13f83e1b6b12",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/408105dff4c104454100730bdfd1a9cdd993f04d",
"reference": "408105dff4c104454100730bdfd1a9cdd993f04d",
"shasum": ""
},
"require": {
@@ -897,7 +897,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v7.0.3"
"source": "https://github.com/symfony/filesystem/tree/v7.0.6"
},
"funding": [
{
@@ -913,7 +913,7 @@
"type": "tidelift"
}
],
"time": "2024-01-23T15:02:46+00:00"
"time": "2024-03-21T19:37:36+00:00"
},
{
"name": "symfony/finder",
@@ -1583,16 +1583,16 @@
},
{
"name": "symfony/service-contracts",
"version": "v3.4.1",
"version": "v3.4.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
"reference": "fe07cbc8d837f60caf7018068e350cc5163681a0"
"reference": "11bbf19a0fb7b36345861e85c5768844c552906e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0",
"reference": "fe07cbc8d837f60caf7018068e350cc5163681a0",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e",
"reference": "11bbf19a0fb7b36345861e85c5768844c552906e",
"shasum": ""
},
"require": {
@@ -1645,7 +1645,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/service-contracts/tree/v3.4.1"
"source": "https://github.com/symfony/service-contracts/tree/v3.4.2"
},
"funding": [
{
@@ -1661,7 +1661,7 @@
"type": "tidelift"
}
],
"time": "2023-12-26T14:02:43+00:00"
"time": "2023-12-19T21:51:00+00:00"
},
{
"name": "symfony/stopwatch",

View File

@@ -19,9 +19,9 @@
~ along with this program. If not, see <https://www.gnu.org/licenses/>.
-->
<ruleset name="pcsg-generated-ruleset"
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="pcsg-generated-ruleset"
xmlns="http://pmd.sf.net/ruleset/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
<description>Firefly III ruleset.</description>

View File

@@ -1,13 +1,19 @@
<!--
Before you create a new PR, please consider:
Thank you for submitting new code to Firefly III, or any of the related projects. Please read the following rules carefully.
1) Pull requests for the MAIN branch will be closed.
2) DO NOT include translations in your PR. Only English US sentences.
- Do not submit solutions for problems that are not already reported in an issue
- Firefly III can't be your learning experience. If you're new to all of this, please go be new somewhere else
- Do not open PRs to "discuss" possible solutions or to "get feedback" on your code. I don't have time for that.
- Pull requests for the MAIN branch will be closed.
- DO NOT include translated strings in your PR.
Perhaps open an issue first, before you open a PR?
See also: https://docs.firefly-iii.org/explanation/support/#contributing-code
Thanks.
-->
Fixes issue # (if relevant)
This PR fixes issue # (if relevant).
Changes in this pull request:

58
.github/stale.yml vendored
View File

@@ -1,58 +0,0 @@
# Configuration for probot-stale - https://github.com/probot/stale
# Number of days of inactivity before an Issue or Pull Request becomes stale
daysUntilStale: 14
# Number of days of inactivity before a stale Issue or Pull Request is closed.
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
daysUntilClose: 14
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
# - "[Status] Maybe Later"
exemptLabels:
- enhancement
- feature
- bug
- announcement
- "layout-v3"
# Set to true to ignore issues in a project (defaults to false)
exemptProjects: false
# Set to true to ignore issues in a milestone (defaults to false)
exemptMilestones: false
# Label to use when marking as stale
staleLabel: stale
# Comment to post when marking as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when removing the stale label.
# unmarkComment: >
# Your comment here.
# Comment to post when closing a stale Issue or Pull Request.
# closeComment: >
# Your comment here.
# Limit the number of actions per hour, from 1-30. Default is 30
limitPerRun: 30
# Limit to only `issues` or `pulls`
# only: issues
# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls':
# pulls:
# daysUntilStale: 30
# markComment: >
# This pull request has been automatically marked as stale because it has not had
# recent activity. It will be closed if no further activity occurs. Thank you
# for your contributions.
# issues:
# exemptLabels:
# - confirmed

View File

@@ -3,7 +3,7 @@ name: "Issues - Command to close duplicate issues"
# the workflow to execute on is comments that are newly created
on:
issue_comment:
types: [created]
types: [ created ]
permissions:
issues: write

View File

@@ -3,9 +3,9 @@ name: 'Issues - Respond to hidden commands'
# the workflow to execute on is comments that are newly created
on:
issues:
types: [opened, edited]
types: [ opened, edited ]
issue_comment:
types: [created]
types: [ created ]
# permissions needed for reacting to IssueOps commands on issues and PRs
permissions:

View File

@@ -2,11 +2,11 @@ name: 'Issues - Reply to specific labels'
on:
issues:
types: [labeled, unlabeled]
types: [ labeled, unlabeled ]
pull_request_target:
types: [labeled, unlabeled]
types: [ labeled, unlabeled ]
discussion:
types: [labeled, unlabeled]
types: [ labeled, unlabeled ]
permissions:
contents: read

View File

@@ -8,7 +8,7 @@ on:
required: true
default: 'develop'
schedule:
- cron: '0 3 * * MON,THU'
- cron: '0 3 * * MON,THU'
jobs:
build:
@@ -51,7 +51,7 @@ jobs:
CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }}
- name: Cleanup translations
id: cleanup-transactions
uses: JC5/firefly-iii-dev@v36
uses: JC5/firefly-iii-dev@v38
with:
action: 'ff3:crowdin-warning'
output: ''
@@ -60,7 +60,7 @@ jobs:
GH_TOKEN: ''
- name: Cleanup changelog
id: cleanup-changelog
uses: JC5/firefly-iii-dev@v36
uses: JC5/firefly-iii-dev@v38
with:
action: 'ff3:changelog'
output: ''
@@ -69,7 +69,7 @@ jobs:
GH_TOKEN: ${{ secrets.CHANGELOG_TOKEN }}
- name: Extract changelog
id: extract-changelog
uses: JC5/firefly-iii-dev@v36
uses: JC5/firefly-iii-dev@v38
with:
action: 'ff3:extract-changelog'
output: 'output'
@@ -78,7 +78,7 @@ jobs:
GH_TOKEN: ""
- name: Replace version
id: replace-version
uses: JC5/firefly-iii-dev@v36
uses: JC5/firefly-iii-dev@v38
with:
action: 'ff3:version'
output: ''
@@ -88,7 +88,7 @@ jobs:
FF_III_VERSION: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}
- name: Generate JSON v1
id: json-v1
uses: JC5/firefly-iii-dev@v36
uses: JC5/firefly-iii-dev@v38
with:
action: 'ff3:json-translations v1'
output: ''
@@ -97,7 +97,7 @@ jobs:
GH_TOKEN: ''
- name: Generate JSON v2
id: json-v2
uses: JC5/firefly-iii-dev@v36
uses: JC5/firefly-iii-dev@v38
with:
action: 'ff3:json-translations v2'
output: ''
@@ -106,27 +106,19 @@ jobs:
GH_TOKEN: ''
- name: Code cleanup
id: code-cleanup
uses: JC5/firefly-iii-dev@v36
uses: JC5/firefly-iii-dev@v38
with:
action: 'ff3:code'
output: ''
env:
FIREFLY_III_ROOT: /github/workspace
GH_TOKEN: ''
- name: Build new JS
- name: Build JS
run: |
npm install
npm update
npm run build
- name: Build old JS
id: old-js
uses: JC5/firefly-iii-dev@v36
with:
action: 'ff3:old-js'
output: ''
env:
FIREFLY_III_ROOT: /github/workspace
GH_TOKEN: ''
npm run prod --workspace=v1
npm run build --workspace=v2
- name: Run CI
run: |
rm -rf vendor composer.lock
@@ -192,7 +184,7 @@ jobs:
echo 'Zip and tar...'
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 .
tar --exclude=$tarName --exclude=$zipName --exclude='./.git' --exclude='./.ci' --exclude='./.github' --exclude='./node_modules' --exclude='./output.txt' -czf $tarName .
# add sha256 sum
echo 'Sha sum ...'
@@ -211,7 +203,7 @@ jobs:
echo "* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt
echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt
echo "" >> output.txt
echo ":warning: Please be careful with this pre-release, as is may not work as expected." >> output.txt
echo ":warning: Please be careful with this pre-release, as it may not work as expected." >> output.txt
# create the release:
echo "Create nightly release."

View File

@@ -17,7 +17,7 @@ jobs:
- uses: actions/stale@v9
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: >
stale-issue-message: |
Hi there!
This is an automatic reply. `Share and enjoy`
@@ -25,7 +25,7 @@ jobs:
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.
Thank you for your contributions.
stale-pr-message: >
stale-pr-message: |
Hi there!
This is an automatic reply. `Share and enjoy`

8
.gitignore vendored
View File

@@ -10,3 +10,11 @@ coverage.xml
# ignore generated files.
public/build
# ignore v1 build files
resources/assets/v1/node_modules
resources/assets/v1/build
# ignore v2 build files
resources/assets/v2/node_modules
resources/assets/v2/build

View File

@@ -72,6 +72,11 @@ class UpdateController extends Controller
app('log')->debug('Now in update routine for transaction group!');
$data = $request->getAll();
// Fixes 8750.
foreach ($data['transactions'] as $index => $info) {
unset($data['transactions'][$index]['type']);
}
$transactionGroup = $this->groupRepository->update($transactionGroup, $data);
$manager = $this->getManager();

View File

@@ -54,17 +54,13 @@ class TestRequest extends FormRequest
private function getDate(string $field): ?Carbon
{
$value = $this->query($field);
$value = $this->query($field);
if (is_array($value)) {
return null;
}
$value = (string)$value;
$result = null === $this->query($field) ? null : Carbon::createFromFormat('Y-m-d', substr($value, 0, 10));
if (false === $result) {
return null;
}
$value = (string)$value;
return $result;
return null === $this->query($field) ? null : Carbon::createFromFormat('Y-m-d', substr($value, 0, 10));
}
private function getAccounts(): array

View File

@@ -48,17 +48,13 @@ class TriggerRequest extends FormRequest
private function getDate(string $field): ?Carbon
{
$value = $this->query($field);
$value = $this->query($field);
if (is_array($value)) {
return null;
}
$value = (string)$value;
$result = null === $this->query($field) ? null : Carbon::createFromFormat('Y-m-d', substr($value, 0, 10));
if (false === $result) {
return null;
}
$value = (string)$value;
return $result;
return null === $this->query($field) ? null : Carbon::createFromFormat('Y-m-d', substr($value, 0, 10));
}
private function getAccounts(): array

View File

@@ -48,17 +48,13 @@ class TestRequest extends FormRequest
private function getDate(string $field): ?Carbon
{
$value = $this->query($field);
$value = $this->query($field);
if (is_array($value)) {
return null;
}
$value = (string)$value;
$result = null === $this->query($field) ? null : Carbon::createFromFormat('Y-m-d', substr($value, 0, 10));
if (false === $result) {
return null;
}
$value = (string)$value;
return $result;
return null === $this->query($field) ? null : Carbon::createFromFormat('Y-m-d', substr($value, 0, 10));
}
private function getAccounts(): array

View File

@@ -48,17 +48,13 @@ class TriggerRequest extends FormRequest
private function getDate(string $field): ?Carbon
{
$value = $this->query($field);
$value = $this->query($field);
if (is_array($value)) {
return null;
}
$value = (string)$value;
$result = null === $this->query($field) ? null : Carbon::createFromFormat('Y-m-d', substr($value, 0, 10));
if (false === $result) {
return null;
}
$value = (string)$value;
return $result;
return null === $this->query($field) ? null : Carbon::createFromFormat('Y-m-d', substr($value, 0, 10));
}
private function getAccounts(): array

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V2\Controllers\Chart;
use Carbon\Carbon;
use FireflyIII\Api\V2\Controllers\Controller;
use FireflyIII\Api\V2\Request\Chart\DashboardChartRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
@@ -46,6 +47,7 @@ class AccountController extends Controller
use ValidatesUserGroupTrait;
private AccountRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
public function __construct()
{
@@ -54,9 +56,7 @@ class AccountController extends Controller
function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$userGroup = $this->validateUserGroup($request);
if (null !== $userGroup) {
$this->repository->setUserGroup($userGroup);
}
$this->repository->setUserGroup($userGroup);
return $next($request);
}

View File

@@ -27,6 +27,7 @@ namespace FireflyIII\Api\V2\Controllers;
use Carbon\Carbon;
use Carbon\Exceptions\InvalidDateException;
use Carbon\Exceptions\InvalidFormatException;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use FireflyIII\Transformers\V2\AbstractTransformer;
use Illuminate\Database\Eloquent\Model;
@@ -55,6 +56,7 @@ class Controller extends BaseController
protected const string CONTENT_TYPE = 'application/vnd.api+json';
protected ParameterBag $parameters;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
public function __construct()
{

View File

@@ -26,6 +26,7 @@ namespace FireflyIII\Api\V2\Controllers\Model\Account;
use FireflyIII\Api\V2\Controllers\Controller;
use FireflyIII\Api\V2\Request\Model\Account\IndexRequest;
use FireflyIII\Api\V2\Request\Model\Transaction\InfiniteListRequest;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
use FireflyIII\Transformers\V2\AccountTransformer;
use Illuminate\Http\JsonResponse;
@@ -33,9 +34,10 @@ use Illuminate\Pagination\LengthAwarePaginator;
class IndexController extends Controller
{
public const string RESOURCE_KEY = 'accounts';
public const string RESOURCE_KEY = 'accounts';
private AccountRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY, UserRoleEnum::MANAGE_TRANSACTIONS];
/**
* AccountController constructor.
@@ -48,9 +50,7 @@ class IndexController extends Controller
$this->repository = app(AccountRepositoryInterface::class);
// new way of user group validation
$userGroup = $this->validateUserGroup($request);
if (null !== $userGroup) {
$this->repository->setUserGroup($userGroup);
}
$this->repository->setUserGroup($userGroup);
return $next($request);
}

View File

@@ -25,7 +25,9 @@ declare(strict_types=1);
namespace FireflyIII\Api\V2\Controllers\Model\Account;
use FireflyIII\Api\V2\Controllers\Controller;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\Account;
use FireflyIII\Repositories\UserGroups\Account\AccountRepositoryInterface;
use FireflyIII\Transformers\V2\AccountTransformer;
use Illuminate\Http\JsonResponse;
@@ -36,6 +38,29 @@ use Illuminate\Http\JsonResponse;
*/
class ShowController extends Controller
{
public const string RESOURCE_KEY = 'accounts';
private AccountRepositoryInterface $repository;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY, UserRoleEnum::MANAGE_TRANSACTIONS];
/**
* AccountController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
// new way of user group validation
$userGroup = $this->validateUserGroup($request);
$this->repository->setUserGroup($userGroup);
return $next($request);
}
);
}
/**
* TODO this endpoint is not yet reachable.
*/

View File

@@ -77,13 +77,11 @@ class BasicController extends Controller
$this->opsRepository = app(OperationsRepositoryInterface::class);
$userGroup = $this->validateUserGroup($request);
if (null !== $userGroup) {
$this->abRepository->setUserGroup($userGroup);
$this->accountRepository->setUserGroup($userGroup);
$this->billRepository->setUserGroup($userGroup);
$this->budgetRepository->setUserGroup($userGroup);
$this->opsRepository->setUserGroup($userGroup);
}
$this->abRepository->setUserGroup($userGroup);
$this->accountRepository->setUserGroup($userGroup);
$this->billRepository->setUserGroup($userGroup);
$this->budgetRepository->setUserGroup($userGroup);
$this->opsRepository->setUserGroup($userGroup);
return $next($request);
}
@@ -298,7 +296,7 @@ class BasicController extends Controller
app('log')->debug(sprintf('Amount left is %s', $left));
// how much left per day?
$days = (int) $today->diffInDays($end, true) + 1;
$days = (int)$today->diffInDays($end, true) + 1;
$perDay = '0';
$perDayNative = '0';
if (0 !== $days && bccomp($left, '0') > -1) {

View File

@@ -54,14 +54,6 @@ 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
{
$all = $request->getAll();
@@ -87,4 +79,12 @@ class UpdateController extends Controller
->header('Content-Type', self::CONTENT_TYPE)
;
}
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);
}
}

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Api\V2\Request\Chart;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Support\Http\Api\ValidatesUserGroupTrait;
use FireflyIII\Support\Request\ChecksLogin;
use FireflyIII\Support\Request\ConvertsDataTypes;
@@ -39,6 +40,8 @@ class DashboardChartRequest extends FormRequest
use ConvertsDataTypes;
use ValidatesUserGroupTrait;
protected array $acceptedRoles = [UserRoleEnum::READ_ONLY];
/**
* Get all data from the request.
*/

View File

@@ -30,20 +30,10 @@ 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.';
protected $signature = 'firefly-iii:migrate-preferences';
/**
* Execute the console command.
*/

View File

@@ -191,7 +191,7 @@ class ExportData extends Command
$this->friendlyError(sprintf('%s date "%s" must be formatted YYYY-MM-DD. Field will be ignored.', $field, $this->option('start')));
$error = true;
}
if (false === $date) {
if (null === $date) {
$this->friendlyError(sprintf('%s date "%s" must be formatted YYYY-MM-DD.', $field, $this->option('start')));
throw new FireflyException(sprintf('%s date "%s" must be formatted YYYY-MM-DD.', $field, $this->option('start')));

View File

@@ -32,24 +32,13 @@ class LaravelPassportKeys extends Command
{
use ShowsFriendlyMessages;
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'firefly-iii:laravel-passport-keys';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Calls the Laravel "passport:keys" but doesn\'t exit 1.';
protected $signature = 'firefly-iii:laravel-passport-keys';
/**
* Execute the console command.
*/
public function handle()
public function handle(): int
{
Artisan::call('passport:keys --no-interaction', []);
$result = Artisan::output();

View File

@@ -285,7 +285,7 @@ class ApplyRules extends Command
if (null !== $endString && '' !== $endString) {
$inputEnd = Carbon::createFromFormat('Y-m-d', $endString);
}
if (false === $inputEnd || false === $inputStart) {
if (null === $inputEnd || null === $inputStart) {
Log::error('Could not parse start or end date in verifyInputDate().');
return;

View File

@@ -25,6 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Exceptions;
use FireflyIII\Jobs\MailError;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Database\QueryException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
@@ -98,6 +99,13 @@ class Handler extends ExceptionHandler
return response()->json(['message' => 'Resource not found', 'exception' => 'NotFoundHttpException'], 404);
}
if ($e instanceof AuthorizationException && $expectsJson) {
// somehow Laravel handler does not catch this:
app('log')->debug('Return JSON unauthorized error.');
return response()->json(['message' => $e->getMessage(), 'exception' => 'AuthorizationException'], 401);
}
if ($e instanceof AuthenticationException && $expectsJson) {
// somehow Laravel handler does not catch this:
app('log')->debug('Return JSON unauthenticated error.');

View File

@@ -405,7 +405,7 @@ class UserEventHandler
}
// clean up old entries (6 months)
$carbon = Carbon::createFromFormat('Y-m-d H:i:s', $preference[$index]['time']);
if (false !== $carbon && $carbon->diffInMonths(today(), true) > 6) {
if (null !== $carbon && $carbon->diffInMonths(today(), true) > 6) {
app('log')->debug(sprintf('Entry for %s is very old, remove it.', $row['ip']));
unset($preference[$index]);
}

View File

@@ -128,7 +128,7 @@ class BudgetLimitController extends Controller
$start = Carbon::createFromFormat('Y-m-d', $request->get('start'));
$end = Carbon::createFromFormat('Y-m-d', $request->get('end'));
if (false === $start || false === $end) {
if (null === $start || null === $end) {
return response()->json([]);
}

View File

@@ -79,10 +79,10 @@ class HomeController extends Controller
app('log')->error(sprintf('End could not parse date string "%s" so ignore it.', $stringEnd));
$end = Carbon::now()->endOfMonth();
}
if (false === $start) {
if (null === $start) {
$start = Carbon::now()->startOfMonth();
}
if (false === $end) {
if (null === $end) {
$end = Carbon::now()->endOfMonth();
}
@@ -120,13 +120,28 @@ class HomeController extends Controller
*/
public function index(AccountRepositoryInterface $repository): mixed
{
$types = config('firefly.accountTypesByIdentifier.asset');
$count = $repository->count($types);
$types = config('firefly.accountTypesByIdentifier.asset');
$count = $repository->count($types);
Log::channel('audit')->info('User visits homepage.');
if (0 === $count) {
return redirect(route('new-user.index'));
}
if ('v1' === (string)config('view.layout')) {
return $this->indexV1($repository);
}
if ('v2' === (string)config('view.layout')) {
return $this->indexV2();
}
throw new FireflyException('Invalid layout configuration');
}
private function indexV1(AccountRepositoryInterface $repository): mixed
{
$types = config('firefly.accountTypesByIdentifier.asset');
$count = $repository->count($types);
$subTitle = (string)trans('firefly.welcome_back');
$transactions = [];
$frontpage = app('preferences')->getFresh('frontpageAccounts', $repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray());
@@ -136,15 +151,12 @@ class HomeController extends Controller
}
/** @var Carbon $start */
$start = session('start', today(config('app.timezone'))->startOfMonth());
/** @var Carbon $end */
$start = session('start', today(config('app.timezone'))->startOfMonth());
$end = session('end', today(config('app.timezone'))->endOfMonth());
$accounts = $repository->getAccountsById($frontpageArray);
$today = today(config('app.timezone'));
// sort frontpage accounts by order
$accounts = $accounts->sortBy('order');
$accounts = $accounts->sortBy('order'); // sort frontpage accounts by order
app('log')->debug('Frontpage accounts are ', $frontpageArray);
@@ -166,4 +178,18 @@ class HomeController extends Controller
return view('index', compact('count', 'subTitle', 'transactions', 'billCount', 'start', 'end', 'today'));
}
private function indexV2(): mixed
{
$subTitle = (string)trans('firefly.welcome_back');
$start = session('start', today(config('app.timezone'))->startOfMonth());
$end = session('end', today(config('app.timezone'))->endOfMonth());
/** @var User $user */
$user = auth()->user();
event(new RequestedVersionCheckStatus($user));
return view('index', compact('subTitle', 'start', 'end'));
}
}

View File

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

View File

@@ -81,7 +81,7 @@ class RecurrenceController extends Controller
$skip = $skip < 0 || $skip > 31 ? 0 : $skip;
$weekend = $weekend < 1 || $weekend > 4 ? 1 : $weekend;
if (false === $start || false === $end || false === $firstDate || false === $endDate) {
if (null === $start || null === $end || null === $firstDate || null === $endDate) {
return response()->json();
}
@@ -112,7 +112,7 @@ class RecurrenceController extends Controller
$actualEnd = clone $end;
if ('until_date' === $endsAt) {
$actualEnd = $endDate ?? clone $end;
$actualEnd = $endDate;
$occurrences = $this->recurring->getOccurrencesInRange($repetition, $actualStart, $actualEnd);
}
if ('times' === $endsAt) {
@@ -155,7 +155,7 @@ class RecurrenceController extends Controller
} catch (InvalidFormatException $e) {
$date = Carbon::today(config('app.timezone'));
}
if (false === $date) {
if (null === $date) {
return response()->json();
}
$date->startOfDay();

View File

@@ -223,8 +223,8 @@ class PreferencesController extends Controller
// same for locale:
if (!auth()->user()->hasRole('demo')) {
/** @var Preference $locale */
$locale = $request->get('locale');
$locale = (string) $request->get('locale');
$locale = '' === $locale ? null : $locale;
app('preferences')->set('locale', $locale);
}

View File

@@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers;
use Auth;
use FireflyIII\Events\UserChangedEmail;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Exceptions\ValidationException;
@@ -467,9 +466,7 @@ class ProfileController extends Controller
if (is_array($secret)) {
$secret = null;
}
if (is_int($secret)) {
$secret = (string)$secret;
}
$secret = (string)$secret;
$repository->setMFACode($user, $secret);

View File

@@ -119,7 +119,7 @@ class DownloadExchangeRates implements ShouldQueue
return;
}
$date = Carbon::createFromFormat('Y-m-d', $json['date'], config('app.timezone'));
if (false === $date) {
if (null === $date) {
return;
}
$this->saveRates($currency, $date, $json['rates']);

View File

@@ -128,7 +128,7 @@ class WarnAboutBills implements ShouldQueue
$today = clone $this->date;
$carbon = clone $bill->{$field};
return (int) $today->diffInDays($carbon);
return (int)$today->diffInDays($carbon);
}
private function sendWarning(Bill $bill, string $field): void

View File

@@ -36,13 +36,13 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* FireflyIII\Models\Preference
*
* @property int $id
* @property null|Carbon $created_at
* @property null|Carbon $updated_at
* @property int $user_id
* @property string $name
* @property null|array|int|string $data
* @property User $user
* @property int $id
* @property null|Carbon $created_at
* @property null|Carbon $updated_at
* @property int $user_id
* @property string $name
* @property null|array|bool|int|string $data
* @property User $user
*
* @method static Builder|Preference newModelQuery()
* @method static Builder|Preference newQuery()

View File

@@ -69,7 +69,10 @@ class AppServiceProvider extends ServiceProvider
if ('' === $firstParam && str_contains($name, $route)) {
return true;
}
$params = Route::getCurrentRoute()->parameters() ?? [];
/** @var null|array $params */
$params = Route::getCurrentRoute()->parameters();
$params ??= [];
$objectType = $params['objectType'] ?? '';
if ($objectType === $firstParam && str_contains($name, $route)) {
return true;

View File

@@ -183,21 +183,21 @@ class BudgetRepository implements BudgetRepositoryInterface
// |-----------|
// |----------------|
if ($start->gte($limit->start_date) && $end->lte($limit->end_date)) {
return (int) $start->diffInDays($end, true) + 1; // add one day
return (int)$start->diffInDays($end, true) + 1; // add one day
}
// limit starts earlier and limit ends first:
// |-----------|
// |-------|
if ($limit->start_date->lte($start) && $limit->end_date->lte($end)) {
// return days in the range $start-$limit_end
return (int) $start->diffInDays($limit->end_date, true) + 1; // add one day, the day itself
return (int)$start->diffInDays($limit->end_date, true) + 1; // add one day, the day itself
}
// limit starts later and limit ends earlier
// |-----------|
// |-------|
if ($limit->start_date->gte($start) && $limit->end_date->gte($end)) {
// return days in the range $limit_start - $end
return (int) $limit->start_date->diffInDays($end, true) + 1; // add one day, the day itself
return (int)$limit->start_date->diffInDays($end, true) + 1; // add one day, the day itself
}
return 0;

View File

@@ -51,7 +51,7 @@ class OperationsRepository implements OperationsRepositoryInterface
$total = '0';
$count = 0;
foreach ($budget->budgetlimits as $limit) {
$diff = (int) $limit->start_date->diffInDays($limit->end_date, true);
$diff = (int)$limit->start_date->diffInDays($limit->end_date, true);
$diff = 0 === $diff ? 1 : $diff;
$amount = $limit->amount;
$perDay = bcdiv($amount, (string)$diff);

View File

@@ -301,7 +301,7 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface
if (null !== $piggyBank->targetdate && $repetition->currentamount < $piggyBank->targetamount) {
$now = today(config('app.timezone'));
$startDate = null !== $piggyBank->startdate && $piggyBank->startdate->gte($now) ? $piggyBank->startdate : $now;
$diffInMonths = (int) $startDate->diffInMonths($piggyBank->targetdate);
$diffInMonths = (int)$startDate->diffInMonths($piggyBank->targetdate);
$remainingAmount = bcsub($piggyBank->targetamount, $repetition->currentamount);
// more than 1 month to go and still need money to save:

View File

@@ -473,10 +473,10 @@ class RecurringRepository implements RecurringRepositoryInterface
if ('yearly' === $repetition->repetition_type) {
$today = today(config('app.timezone'))->endOfYear();
$repDate = Carbon::createFromFormat('Y-m-d', $repetition->repetition_moment);
if (false === $repDate) {
if (null === $repDate) {
$repDate = clone $today;
}
$diffInYears = (int) $today->diffInYears($repDate, true);
$diffInYears = (int)$today->diffInYears($repDate, true);
$repDate->addYears($diffInYears); // technically not necessary.
$string = $repDate->isoFormat((string)trans('config.month_and_day_no_year_js'));

View File

@@ -242,6 +242,30 @@ class UserRepository implements UserRepositoryInterface
return false;
}
#[\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 = $group->id;
if (in_array($groupId, array_keys($set), true)) {
continue;
}
$set[$groupId] = $group;
}
}
$collection->push(...$set);
return $collection;
}
public function inviteUser(null|Authenticatable|User $user, string $email): InvitedUser
{
$now = today(config('app.timezone'));
@@ -392,28 +416,4 @@ class UserRepository implements UserRepositoryInterface
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,8 +59,6 @@ interface UserRepositoryInterface
public function changeStatus(User $user, bool $isBlocked, string $code): bool;
public function getUserGroups(User $user): Collection;
/**
* Returns a count of all users.
*/
@@ -96,6 +94,8 @@ interface UserRepositoryInterface
*/
public function getUserData(User $user): array;
public function getUserGroups(User $user): Collection;
public function hasRole(null|Authenticatable|User $user, string $role): bool;
public function inviteUser(null|Authenticatable|User $user, string $email): InvitedUser;

View File

@@ -106,8 +106,8 @@ class UserGroupRepository implements UserGroupRepositoryInterface
/** @var null|UserGroup $group */
$group = $membership->userGroup()->first();
if (null !== $group) {
$groupId = (int)$group->id;
if (in_array($groupId, $set, true)) {
$groupId = $group->id;
if (in_array($groupId, array_keys($set), true)) {
continue;
}
$set[$groupId] = $group;

View File

@@ -38,8 +38,6 @@ interface UserGroupRepositoryInterface
public function get(): Collection;
public function useUserGroup(UserGroup $userGroup): void;
public function getAll(): Collection;
public function setUser(null|Authenticatable|User $user): void;
@@ -49,4 +47,6 @@ interface UserGroupRepositoryInterface
public function update(UserGroup $userGroup, array $data): UserGroup;
public function updateMembership(UserGroup $userGroup, array $data): UserGroup;
public function useUserGroup(UserGroup $userGroup): void;
}

View File

@@ -63,6 +63,8 @@ interface AccountRepositoryInterface
*/
public function getMetaValue(Account $account, string $field): ?string;
public function getUserGroup(): UserGroup;
/**
* Reset order types of the mentioned accounts.
*/
@@ -74,7 +76,5 @@ interface AccountRepositoryInterface
public function setUserGroup(UserGroup $userGroup): void;
public function getUserGroup(): UserGroup;
public function update(Account $account, array $data): Account;
}

View File

@@ -117,7 +117,7 @@ class UpdateRequest implements UpdateRequestInterface
// parse response a bit. No message yet.
$response = $json['firefly_iii'][$channel];
$date = Carbon::createFromFormat('Y-m-d', $response['date']);
if (false === $date) {
if (null === $date) {
$date = today(config('app.timezone'));
}
$return['version'] = $response['version'];

View File

@@ -54,7 +54,7 @@ class GroupCloneService
{
$newJournal = $journal->replicate();
$newJournal->transaction_group_id = $newGroup->id;
$newJournal->date = today(config('app.timezone'));
$newJournal->date = now();
$newJournal->save();
foreach ($journal->transactions as $transaction) {

View File

@@ -187,7 +187,7 @@ class JournalUpdateService
// make new account validator.
$expectedType = $this->getExpectedType();
app('log')->debug(sprintf('Expected type (new or unchanged) is %s', $expectedType));
app('log')->debug(sprintf('(a) Expected type (new or unchanged) is %s', $expectedType));
// make a new validator.
/** @var AccountValidator $validator */
@@ -273,7 +273,7 @@ class JournalUpdateService
// make new account validator.
$expectedType = $this->getExpectedType();
app('log')->debug(sprintf('Expected type (new or unchanged) is %s', $expectedType));
app('log')->debug(sprintf('(b) Expected type (new or unchanged) is %s', $expectedType));
// make a new validator.
/** @var AccountValidator $validator */
@@ -404,7 +404,7 @@ class JournalUpdateService
// make new account validator.
$expectedType = $this->getExpectedType();
app('log')->debug(sprintf('Expected type (new or unchanged) is %s', $expectedType));
app('log')->debug(sprintf('(c) Expected type (new or unchanged) is %s', $expectedType));
try {
$result = $this->getAccount($expectedType, 'destination', $destInfo);

View File

@@ -146,7 +146,7 @@ class RemoteUserGuard implements Guard
return $this->user?->id;
}
public function setUser(null|Authenticatable|User $user): void
public function setUser(null|Authenticatable|User $user): void // @phpstan-ignore-line
{
app('log')->debug(sprintf('Now at %s', __METHOD__));
if ($user instanceof User) {

View File

@@ -36,6 +36,14 @@ use Illuminate\Contracts\Auth\UserProvider;
*/
class RemoteUserProvider implements UserProvider
{
#[\Override]
public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false): void
{
app('log')->debug(sprintf('Now at %s', __METHOD__));
throw new FireflyException(sprintf('Did not implement %s', __METHOD__));
}
/**
* @throws FireflyException
*
@@ -120,12 +128,4 @@ class RemoteUserProvider implements UserProvider
throw new FireflyException(sprintf('C) Did not implement %s', __METHOD__));
}
#[\Override]
public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false): void
{
app('log')->debug(sprintf('Now at %s', __METHOD__));
throw new FireflyException(sprintf('Did not implement %s', __METHOD__));
}
}

View File

@@ -23,10 +23,12 @@ declare(strict_types=1);
namespace FireflyIII\Support\Http\Api;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Enums\UserRoleEnum;
use FireflyIII\Models\GroupMembership;
use FireflyIII\Models\UserGroup;
use FireflyIII\User;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Http\Request;
/**
@@ -35,37 +37,68 @@ use Illuminate\Http\Request;
trait ValidatesUserGroupTrait
{
/**
* This check does not validate which rights the user has, that comes later.
*
* @throws FireflyException
* @throws AuthorizationException
* @throws AuthenticationException
*/
protected function validateUserGroup(Request $request): ?UserGroup
protected function validateUserGroup(Request $request): UserGroup
{
app('log')->debug(sprintf('validateUserGroup: %s', static::class));
if (!auth()->check()) {
app('log')->debug('validateUserGroup: user is not logged in, return NULL.');
return null;
throw new AuthenticationException();
}
/** @var User $user */
$user = auth()->user();
$groupId = 0;
if (!$request->has('user_group_id')) {
$group = $user->userGroup;
app('log')->debug(sprintf('validateUserGroup: no user group submitted, return default group #%d.', $group?->id));
return $group;
$groupId = $user->user_group_id;
app('log')->debug(sprintf('validateUserGroup: no user group submitted, use default group #%d.', $groupId));
}
if ($request->has('user_group_id')) {
$groupId = (int)$request->get('user_group_id');
app('log')->debug(sprintf('validateUserGroup: user group submitted, search for memberships in group #%d.', $groupId));
}
$groupId = (int)$request->get('user_group_id');
/** @var null|GroupMembership $membership */
$membership = $user->groupMemberships()->where('user_group_id', $groupId)->first();
if (null === $membership) {
app('log')->debug('validateUserGroup: user has no access to this group.');
app('log')->debug(sprintf('validateUserGroup: user has no access to group #%d.', $groupId));
throw new FireflyException((string)trans('validation.belongs_user_or_user_group'));
throw new AuthorizationException((string)trans('validation.no_access_group'));
}
app('log')->debug(sprintf('validateUserGroup: user has role "%s" in group #%d.', $membership->userRole->title, $membership->userGroup->id));
return $membership->userGroup;
// need to get the group from the membership:
/** @var null|UserGroup $group */
$group = $membership->userGroup;
if (null === $group) {
app('log')->debug(sprintf('validateUserGroup: group #%d does not exist.', $groupId));
throw new AuthorizationException((string)trans('validation.belongs_user_or_user_group'));
}
app('log')->debug(sprintf('validateUserGroup: validate access of user to group #%d ("%s").', $groupId, $group->title));
$roles = property_exists($this, 'acceptedRoles') ? $this->acceptedRoles : [];
if (0 === count($roles)) {
app('log')->debug('validateUserGroup: no roles defined, so no access.');
throw new AuthorizationException((string)trans('validation.no_accepted_roles_defined'));
}
app('log')->debug(sprintf('validateUserGroup: have %d roles to check.', count($roles)), $roles);
/** @var UserRoleEnum $role */
foreach ($roles as $role) {
if ($user->hasRoleInGroupOrOwner($group, $role)) {
app('log')->debug(sprintf('validateUserGroup: User has role "%s" in group #%d, return the group.', $role->value, $groupId));
return $group;
}
app('log')->debug(sprintf('validateUserGroup: User does NOT have role "%s" in group #%d, continue searching.', $role->value, $groupId));
}
app('log')->debug('validateUserGroup: User does NOT have enough rights to access endpoint.');
throw new AuthorizationException((string)trans('validation.belongs_user_or_user_group'));
}
}

View File

@@ -46,7 +46,7 @@ trait DateCalculation
$difference = $today->diffInDays($end);
}
return (int) (0 === $difference ? 1 : $difference);
return (int)(0 === $difference ? 1 : $difference);
}
/**
@@ -63,7 +63,7 @@ trait DateCalculation
$difference = $start->diffInDays($today, true) + 1;
}
return (int) $difference;
return (int)$difference;
}
protected function calculateStep(Carbon $start, Carbon $end): string

View File

@@ -145,14 +145,14 @@ trait RequestInformation
$attributes['location'] ??= '';
$attributes['accounts'] = AccountList::routeBinder($attributes['accounts'] ?? '', new Route('get', '', []));
$date = Carbon::createFromFormat('Ymd', $attributes['startDate']);
if (false === $date) {
if (null === $date) {
$date = today(config('app.timezone'));
}
$date->startOfMonth();
$attributes['startDate'] = $date;
$date2 = Carbon::createFromFormat('Ymd', $attributes['endDate']);
if (false === $date2) {
if (null === $date2) {
$date2 = today(config('app.timezone'));
}
$date2->endOfDay();

View File

@@ -188,7 +188,7 @@ class Navigation
Log::debug(sprintf('Function is ->%s()', $function));
if (array_key_exists($function, $parameterMap)) {
Log::debug(sprintf('Parameter map, function becomes ->%s(%s)', $function, implode(', ', $parameterMap[$function])));
$date->{$function}($parameterMap[$function][0]);
$date->{$function}($parameterMap[$function][0]); // @phpstan-ignore-line
Log::debug(sprintf('Result is "%s"', $date->toIso8601String()));
return $date;
@@ -274,7 +274,7 @@ class Navigation
/** @var Carbon $tEnd */
$tEnd = session('end', today(config('app.timezone'))->endOfMonth());
$diffInDays = (int) $tStart->diffInDays($tEnd, true);
$diffInDays = (int)$tStart->diffInDays($tEnd, true);
}
Log::debug(sprintf('Diff in days is %d', $diffInDays));
$currentEnd->addDays($diffInDays);
@@ -327,7 +327,7 @@ class Navigation
{
$endOfMonth = $date->copy()->endOfMonth();
return (int) $date->diffInDays($endOfMonth, true);
return (int)$date->diffInDays($endOfMonth, true);
}
public function diffInPeriods(string $period, int $skip, Carbon $beginning, Carbon $end): int
@@ -677,7 +677,7 @@ class Navigation
/** @var Carbon $tEnd */
$tEnd = session('end', today(config('app.timezone'))->endOfMonth());
$diffInDays = (int) $tStart->diffInDays($tEnd, true);
$diffInDays = (int)$tStart->diffInDays($tEnd, true);
$date->subDays($diffInDays * $subtract);
return $date;

View File

@@ -25,6 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Support;
use Carbon\Carbon;
use Carbon\CarbonInterface;
use Carbon\Exceptions\InvalidFormatException;
use FireflyIII\Exceptions\FireflyException;
use Illuminate\Support\Facades\Log;
@@ -122,12 +123,12 @@ class ParseDateString
{
$today = today(config('app.timezone'))->startOfDay();
return match ($keyword) {
return match ($keyword) { // @phpstan-ignore-line
default => $today,
'yesterday' => $today->subDay(),
'tomorrow' => $today->addDay(),
'start of this week' => $today->startOfWeek(Carbon::MONDAY),
'end of this week' => $today->endOfWeek(Carbon::SUNDAY),
'start of this week' => $today->startOfWeek(CarbonInterface::MONDAY),
'end of this week' => $today->endOfWeek(CarbonInterface::SUNDAY),
'start of this month' => $today->startOfMonth(),
'end of this month' => $today->endOfMonth(),
'start of this quarter' => $today->startOfQuarter(),

View File

@@ -89,6 +89,17 @@ class Preferences
return $this->setForUser($user, $name, $default);
}
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;
}
public function delete(string $name): bool
{
$fullName = sprintf('preference%s%s', auth()->user()->id, $name);
@@ -215,7 +226,7 @@ class Preferences
public function set(string $name, null|array|bool|int|string $value): Preference
{
/** @var User $user */
/** @var null|User $user */
$user = auth()->user();
if (null === $user) {
// make new preference, return it:
@@ -228,15 +239,4 @@ class Preferences
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

@@ -250,7 +250,7 @@ trait ConvertsDataTypes
return null;
}
if (false === $carbon) {
if (null === $carbon) {
app('log')->error(sprintf('[2] "%s" is of an invalid format.', $value));
return null;

View File

@@ -29,7 +29,7 @@ use Symfony\Component\ExpressionLanguage\SyntaxError;
class ActionExpression
{
private static array $NAMES
private static array $NAMES
= [
// 'transaction_group_id',
// 'user_id',

View File

@@ -185,7 +185,7 @@ class AccountTransformer extends AbstractTransformer
// try classic date:
if (10 === strlen($monthlyPaymentDate)) {
$object = Carbon::createFromFormat('!Y-m-d', $monthlyPaymentDate, config('app.timezone'));
if (false === $object) {
if (null === $object) {
$object = today(config('app.timezone'));
}
$monthlyPaymentDate = $object->toAtomString();
@@ -212,7 +212,7 @@ class AccountTransformer extends AbstractTransformer
}
if (null !== $openingBalanceDate) {
$object = Carbon::createFromFormat('Y-m-d H:i:s', $openingBalanceDate, config('app.timezone'));
if (false === $object) {
if (null === $object) {
$object = today(config('app.timezone'));
}
$openingBalanceDate = $object->toAtomString();

View File

@@ -82,7 +82,7 @@ class BillTransformer extends AbstractTransformer
$payDatesFormatted = [];
foreach ($paidData as $object) {
$date = Carbon::createFromFormat('!Y-m-d', $object['date'], config('app.timezone'));
if (false === $date) {
if (null === $date) {
$date = today(config('app.timezone'));
}
$object['date'] = $date->toAtomString();
@@ -91,7 +91,7 @@ class BillTransformer extends AbstractTransformer
foreach ($payDates as $string) {
$date = Carbon::createFromFormat('!Y-m-d', $string, config('app.timezone'));
if (false === $date) {
if (null === $date) {
$date = today(config('app.timezone'));
}
$payDatesFormatted[] = $date->toAtomString();
@@ -104,7 +104,7 @@ class BillTransformer extends AbstractTransformer
if (null !== $firstPayDate) {
$nemDate = Carbon::createFromFormat('!Y-m-d', $firstPayDate, config('app.timezone'));
if (false === $nemDate) {
if (null === $nemDate) {
$nemDate = today(config('app.timezone'));
}
$nem = $nemDate->toAtomString();
@@ -129,7 +129,7 @@ class BillTransformer extends AbstractTransformer
$current = $payDatesFormatted[0] ?? null;
if (null !== $current && !$nemDate->isToday()) {
$temp2 = Carbon::createFromFormat('Y-m-d\TH:i:sP', $current);
if (false === $temp2) {
if (null === $temp2) {
$temp2 = today(config('app.timezone'));
}
$nemDiff = trans('firefly.bill_expected_date', ['date' => $temp2->diffForHumans(today(config('app.timezone')), CarbonInterface::DIFF_RELATIVE_TO_NOW)]);

View File

@@ -248,7 +248,7 @@ class PiggyBankTransformer extends AbstractTransformer
if (bccomp($currentAmount, $targetAmount) < 1) {
$now = today(config('app.timezone'));
$startDate = null !== $startDate && $startDate->gte($now) ? $startDate : $now;
$diffInMonths = (int) $startDate->diffInMonths($targetDate);
$diffInMonths = (int)$startDate->diffInMonths($targetDate);
$remainingAmount = bcsub($targetAmount, $currentAmount);
// more than 1 month to go and still need money to save:

View File

@@ -462,7 +462,7 @@ class TransactionGroupTransformer extends AbstractTransformer
// app('log')->debug(sprintf('Now in date("%s")', $string));
if (10 === strlen($string)) {
$res = Carbon::createFromFormat('Y-m-d', $string, config('app.timezone'));
if (false === $res) {
if (null === $res) {
return null;
}
@@ -473,7 +473,7 @@ class TransactionGroupTransformer extends AbstractTransformer
}
if (19 === strlen($string) && str_contains($string, 'T')) {
$res = Carbon::createFromFormat('Y-m-d\TH:i:s', substr($string, 0, 19), config('app.timezone'));
if (false === $res) {
if (null === $res) {
return null;
}
@@ -482,7 +482,7 @@ class TransactionGroupTransformer extends AbstractTransformer
// 2022-01-01 01:01:01
$res = Carbon::createFromFormat('Y-m-d H:i:s', substr($string, 0, 19), config('app.timezone'));
if (false === $res) {
if (null === $res) {
return null;
}

View File

@@ -35,9 +35,9 @@ use Illuminate\Support\Collection;
*/
class UserGroupTransformer extends AbstractTransformer
{
private array $inUse;
private array $memberships;
private array $membershipsVisible;
private array $inUse;
public function __construct()
{
@@ -84,13 +84,13 @@ class UserGroupTransformer extends AbstractTransformer
public function transform(UserGroup $userGroup): array
{
return [
'id' => $userGroup->id,
'created_at' => $userGroup->created_at->toAtomString(),
'updated_at' => $userGroup->updated_at->toAtomString(),
'in_use' => $this->inUse[$userGroup->id] ?? false,
'title' => $userGroup->title,
'can_see_members' => $this->membershipsVisible[$userGroup->id] ?? false,
'members' => $this->memberships[$userGroup->id] ?? [],
'id' => $userGroup->id,
'created_at' => $userGroup->created_at->toAtomString(),
'updated_at' => $userGroup->updated_at->toAtomString(),
'in_use' => $this->inUse[$userGroup->id] ?? false,
'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.
}

303
composer.lock generated
View File

@@ -1670,16 +1670,16 @@
},
{
"name": "laravel/framework",
"version": "v11.1.1",
"version": "v11.2.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "1437cea6d2b04cbc83743fbb208e1a01efccd9ec"
"reference": "a1750156b671f37cba702380107e2d22161c31e3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/1437cea6d2b04cbc83743fbb208e1a01efccd9ec",
"reference": "1437cea6d2b04cbc83743fbb208e1a01efccd9ec",
"url": "https://api.github.com/repos/laravel/framework/zipball/a1750156b671f37cba702380107e2d22161c31e3",
"reference": "a1750156b671f37cba702380107e2d22161c31e3",
"shasum": ""
},
"require": {
@@ -1871,7 +1871,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2024-03-28T15:07:18+00:00"
"time": "2024-04-02T14:01:33+00:00"
},
{
"name": "laravel/passport",
@@ -3366,16 +3366,16 @@
},
{
"name": "nesbot/carbon",
"version": "3.2.3",
"version": "3.2.4",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
"reference": "4d599a6e2351d6b6bf21737accdfe1a4ce3fdbb1"
"reference": "82c28278c1c8f7b82dcdab25692237f052ffc8d8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4d599a6e2351d6b6bf21737accdfe1a4ce3fdbb1",
"reference": "4d599a6e2351d6b6bf21737accdfe1a4ce3fdbb1",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/82c28278c1c8f7b82dcdab25692237f052ffc8d8",
"reference": "82c28278c1c8f7b82dcdab25692237f052ffc8d8",
"shasum": ""
},
"require": {
@@ -3468,7 +3468,7 @@
"type": "tidelift"
}
],
"time": "2024-03-30T18:22:00+00:00"
"time": "2024-04-05T09:58:10+00:00"
},
{
"name": "nette/schema",
@@ -5481,16 +5481,16 @@
},
{
"name": "spatie/laravel-ignition",
"version": "2.5.0",
"version": "2.5.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-ignition.git",
"reference": "e23f4e8ce6644dc3d68b9d8a0aed3beaca0d6ada"
"reference": "0c864b3cbd66ce67a2096c5f743e07ce8f1d6ab9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/e23f4e8ce6644dc3d68b9d8a0aed3beaca0d6ada",
"reference": "e23f4e8ce6644dc3d68b9d8a0aed3beaca0d6ada",
"url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/0c864b3cbd66ce67a2096c5f743e07ce8f1d6ab9",
"reference": "0c864b3cbd66ce67a2096c5f743e07ce8f1d6ab9",
"shasum": ""
},
"require": {
@@ -5569,7 +5569,7 @@
"type": "github"
}
],
"time": "2024-03-29T14:14:55+00:00"
"time": "2024-04-02T06:30:22+00:00"
},
{
"name": "spatie/period",
@@ -5627,16 +5627,16 @@
},
{
"name": "symfony/cache",
"version": "v7.0.4",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
"reference": "fc822951dd360a593224bb2cef90a087d0dff60f"
"reference": "2d0d3f92c74c445410d05374908b03e0a1131e2b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/cache/zipball/fc822951dd360a593224bb2cef90a087d0dff60f",
"reference": "fc822951dd360a593224bb2cef90a087d0dff60f",
"url": "https://api.github.com/repos/symfony/cache/zipball/2d0d3f92c74c445410d05374908b03e0a1131e2b",
"reference": "2d0d3f92c74c445410d05374908b03e0a1131e2b",
"shasum": ""
},
"require": {
@@ -5703,7 +5703,7 @@
"psr6"
],
"support": {
"source": "https://github.com/symfony/cache/tree/v7.0.4"
"source": "https://github.com/symfony/cache/tree/v7.0.6"
},
"funding": [
{
@@ -5719,20 +5719,20 @@
"type": "tidelift"
}
],
"time": "2024-02-22T20:27:20+00:00"
"time": "2024-03-27T19:55:25+00:00"
},
{
"name": "symfony/cache-contracts",
"version": "v3.4.0",
"version": "v3.4.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache-contracts.git",
"reference": "1d74b127da04ffa87aa940abe15446fa89653778"
"reference": "2c9db6509a1b21dad229606897639d3284f54b2a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1d74b127da04ffa87aa940abe15446fa89653778",
"reference": "1d74b127da04ffa87aa940abe15446fa89653778",
"url": "https://api.github.com/repos/symfony/cache-contracts/zipball/2c9db6509a1b21dad229606897639d3284f54b2a",
"reference": "2c9db6509a1b21dad229606897639d3284f54b2a",
"shasum": ""
},
"require": {
@@ -5779,7 +5779,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/cache-contracts/tree/v3.4.0"
"source": "https://github.com/symfony/cache-contracts/tree/v3.4.2"
},
"funding": [
{
@@ -5795,7 +5795,7 @@
"type": "tidelift"
}
],
"time": "2023-09-25T12:52:38+00:00"
"time": "2024-01-23T14:51:35+00:00"
},
{
"name": "symfony/clock",
@@ -5873,16 +5873,16 @@
},
{
"name": "symfony/console",
"version": "v7.0.4",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "6b099f3306f7c9c2d2786ed736d0026b2903205f"
"reference": "fde915cd8e7eb99b3d531d3d5c09531429c3f9e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/6b099f3306f7c9c2d2786ed736d0026b2903205f",
"reference": "6b099f3306f7c9c2d2786ed736d0026b2903205f",
"url": "https://api.github.com/repos/symfony/console/zipball/fde915cd8e7eb99b3d531d3d5c09531429c3f9e5",
"reference": "fde915cd8e7eb99b3d531d3d5c09531429c3f9e5",
"shasum": ""
},
"require": {
@@ -5946,7 +5946,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v7.0.4"
"source": "https://github.com/symfony/console/tree/v7.0.6"
},
"funding": [
{
@@ -5962,7 +5962,7 @@
"type": "tidelift"
}
],
"time": "2024-02-22T20:27:20+00:00"
"time": "2024-04-01T11:04:53+00:00"
},
{
"name": "symfony/css-selector",
@@ -6098,16 +6098,16 @@
},
{
"name": "symfony/error-handler",
"version": "v7.0.4",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
"reference": "677b24759decff69e65b1e9d1471d90f95ced880"
"reference": "46a4cc138f799886d4bd70477c55c699d3e9dfc8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/677b24759decff69e65b1e9d1471d90f95ced880",
"reference": "677b24759decff69e65b1e9d1471d90f95ced880",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/46a4cc138f799886d4bd70477c55c699d3e9dfc8",
"reference": "46a4cc138f799886d4bd70477c55c699d3e9dfc8",
"shasum": ""
},
"require": {
@@ -6153,7 +6153,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/error-handler/tree/v7.0.4"
"source": "https://github.com/symfony/error-handler/tree/v7.0.6"
},
"funding": [
{
@@ -6169,7 +6169,7 @@
"type": "tidelift"
}
],
"time": "2024-02-22T20:27:20+00:00"
"time": "2024-03-19T11:57:22+00:00"
},
{
"name": "symfony/event-dispatcher",
@@ -6253,16 +6253,16 @@
},
{
"name": "symfony/event-dispatcher-contracts",
"version": "v3.4.0",
"version": "v3.4.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "a76aed96a42d2b521153fb382d418e30d18b59df"
"reference": "4e64b49bf370ade88e567de29465762e316e4224"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df",
"reference": "a76aed96a42d2b521153fb382d418e30d18b59df",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/4e64b49bf370ade88e567de29465762e316e4224",
"reference": "4e64b49bf370ade88e567de29465762e316e4224",
"shasum": ""
},
"require": {
@@ -6309,7 +6309,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0"
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.2"
},
"funding": [
{
@@ -6325,7 +6325,7 @@
"type": "tidelift"
}
],
"time": "2023-05-23T14:45:45+00:00"
"time": "2024-01-23T14:51:35+00:00"
},
{
"name": "symfony/expression-language",
@@ -6456,22 +6456,22 @@
},
{
"name": "symfony/http-client",
"version": "v7.0.5",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client.git",
"reference": "425f462a59d8030703ee04a9e1c666575ed5db3b"
"reference": "6e70473909f46fe5dd3b994a0f1b20ecb6b2f858"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-client/zipball/425f462a59d8030703ee04a9e1c666575ed5db3b",
"reference": "425f462a59d8030703ee04a9e1c666575ed5db3b",
"url": "https://api.github.com/repos/symfony/http-client/zipball/6e70473909f46fe5dd3b994a0f1b20ecb6b2f858",
"reference": "6e70473909f46fe5dd3b994a0f1b20ecb6b2f858",
"shasum": ""
},
"require": {
"php": ">=8.2",
"psr/log": "^1|^2|^3",
"symfony/http-client-contracts": "^3",
"symfony/http-client-contracts": "^3.4.1",
"symfony/service-contracts": "^2.5|^3"
},
"conflict": {
@@ -6489,7 +6489,7 @@
"amphp/http-client": "^4.2.1",
"amphp/http-tunnel": "^1.0",
"amphp/socket": "^1.1",
"guzzlehttp/promises": "^1.4",
"guzzlehttp/promises": "^1.4|^2.0",
"nyholm/psr7": "^1.0",
"php-http/httplug": "^1.0|^2.0",
"psr/http-client": "^1.0",
@@ -6528,7 +6528,7 @@
"http"
],
"support": {
"source": "https://github.com/symfony/http-client/tree/v7.0.5"
"source": "https://github.com/symfony/http-client/tree/v7.0.6"
},
"funding": [
{
@@ -6544,20 +6544,20 @@
"type": "tidelift"
}
],
"time": "2024-03-02T12:46:12+00:00"
"time": "2024-04-01T20:49:44+00:00"
},
{
"name": "symfony/http-client-contracts",
"version": "v3.4.0",
"version": "v3.4.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client-contracts.git",
"reference": "1ee70e699b41909c209a0c930f11034b93578654"
"reference": "b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/1ee70e699b41909c209a0c930f11034b93578654",
"reference": "1ee70e699b41909c209a0c930f11034b93578654",
"url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e",
"reference": "b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e",
"shasum": ""
},
"require": {
@@ -6606,7 +6606,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/http-client-contracts/tree/v3.4.0"
"source": "https://github.com/symfony/http-client-contracts/tree/v3.4.2"
},
"funding": [
{
@@ -6622,20 +6622,20 @@
"type": "tidelift"
}
],
"time": "2023-07-30T20:28:31+00:00"
"time": "2024-04-01T18:51:09+00:00"
},
{
"name": "symfony/http-foundation",
"version": "v7.0.4",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "439fdfdd344943254b1ef6278613e79040548045"
"reference": "8789625dcf36e5fbf753014678a1e090f1bc759c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/439fdfdd344943254b1ef6278613e79040548045",
"reference": "439fdfdd344943254b1ef6278613e79040548045",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/8789625dcf36e5fbf753014678a1e090f1bc759c",
"reference": "8789625dcf36e5fbf753014678a1e090f1bc759c",
"shasum": ""
},
"require": {
@@ -6683,7 +6683,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-foundation/tree/v7.0.4"
"source": "https://github.com/symfony/http-foundation/tree/v7.0.6"
},
"funding": [
{
@@ -6699,20 +6699,20 @@
"type": "tidelift"
}
],
"time": "2024-02-08T19:22:56+00:00"
"time": "2024-03-19T11:46:48+00:00"
},
{
"name": "symfony/http-kernel",
"version": "v7.0.5",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
"reference": "37c24ca28f65e3121a68f3dd4daeb36fb1fa2a72"
"reference": "34c872391046d59af804af62d4573b829cfe4824"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/37c24ca28f65e3121a68f3dd4daeb36fb1fa2a72",
"reference": "37c24ca28f65e3121a68f3dd4daeb36fb1fa2a72",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/34c872391046d59af804af62d4573b829cfe4824",
"reference": "34c872391046d59af804af62d4573b829cfe4824",
"shasum": ""
},
"require": {
@@ -6795,7 +6795,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-kernel/tree/v7.0.5"
"source": "https://github.com/symfony/http-kernel/tree/v7.0.6"
},
"funding": [
{
@@ -6811,20 +6811,20 @@
"type": "tidelift"
}
],
"time": "2024-03-04T21:05:24+00:00"
"time": "2024-04-03T06:12:25+00:00"
},
{
"name": "symfony/mailer",
"version": "v7.0.4",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
"reference": "72e16d87bf50a3ce195b9470c06bb9d7b816ea85"
"reference": "eb0c3187c7ddfde12d8aa0e1fa5fb29e730a41e0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mailer/zipball/72e16d87bf50a3ce195b9470c06bb9d7b816ea85",
"reference": "72e16d87bf50a3ce195b9470c06bb9d7b816ea85",
"url": "https://api.github.com/repos/symfony/mailer/zipball/eb0c3187c7ddfde12d8aa0e1fa5fb29e730a41e0",
"reference": "eb0c3187c7ddfde12d8aa0e1fa5fb29e730a41e0",
"shasum": ""
},
"require": {
@@ -6875,7 +6875,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/mailer/tree/v7.0.4"
"source": "https://github.com/symfony/mailer/tree/v7.0.6"
},
"funding": [
{
@@ -6891,7 +6891,7 @@
"type": "tidelift"
}
],
"time": "2024-02-03T21:34:19+00:00"
"time": "2024-03-28T09:20:36+00:00"
},
{
"name": "symfony/mailgun-mailer",
@@ -6964,16 +6964,16 @@
},
{
"name": "symfony/mime",
"version": "v7.0.3",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
"reference": "c1ffe24ba6fdc3e3f0f3fcb93519103b326a3716"
"reference": "99362408c9abdf8c7cadcf0529b6fc8b16f5ace2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mime/zipball/c1ffe24ba6fdc3e3f0f3fcb93519103b326a3716",
"reference": "c1ffe24ba6fdc3e3f0f3fcb93519103b326a3716",
"url": "https://api.github.com/repos/symfony/mime/zipball/99362408c9abdf8c7cadcf0529b6fc8b16f5ace2",
"reference": "99362408c9abdf8c7cadcf0529b6fc8b16f5ace2",
"shasum": ""
},
"require": {
@@ -6993,6 +6993,7 @@
"league/html-to-markdown": "^5.0",
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
"symfony/dependency-injection": "^6.4|^7.0",
"symfony/process": "^6.4|^7.0",
"symfony/property-access": "^6.4|^7.0",
"symfony/property-info": "^6.4|^7.0",
"symfony/serializer": "^6.4|^7.0"
@@ -7027,7 +7028,7 @@
"mime-type"
],
"support": {
"source": "https://github.com/symfony/mime/tree/v7.0.3"
"source": "https://github.com/symfony/mime/tree/v7.0.6"
},
"funding": [
{
@@ -7043,7 +7044,7 @@
"type": "tidelift"
}
],
"time": "2024-01-30T08:34:29+00:00"
"time": "2024-03-21T19:37:36+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -7819,16 +7820,16 @@
},
{
"name": "symfony/psr-http-message-bridge",
"version": "v7.0.3",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/psr-http-message-bridge.git",
"reference": "d9fadaf9541d7c01c307e48905d7ce1dbee6bf38"
"reference": "fbc500cbcb64d3ea7469f019ab7aa717b320ff3f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/d9fadaf9541d7c01c307e48905d7ce1dbee6bf38",
"reference": "d9fadaf9541d7c01c307e48905d7ce1dbee6bf38",
"url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/fbc500cbcb64d3ea7469f019ab7aa717b320ff3f",
"reference": "fbc500cbcb64d3ea7469f019ab7aa717b320ff3f",
"shasum": ""
},
"require": {
@@ -7882,7 +7883,7 @@
"psr-7"
],
"support": {
"source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.0.3"
"source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.0.6"
},
"funding": [
{
@@ -7898,20 +7899,20 @@
"type": "tidelift"
}
],
"time": "2024-01-23T15:02:46+00:00"
"time": "2024-03-28T09:20:36+00:00"
},
{
"name": "symfony/routing",
"version": "v7.0.5",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
"reference": "ba6bf07d43289c6a4b4591ddb75bc3bc5f069c19"
"reference": "cded64e5bbf9f31786f1055fcc76718fdd77519c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/routing/zipball/ba6bf07d43289c6a4b4591ddb75bc3bc5f069c19",
"reference": "ba6bf07d43289c6a4b4591ddb75bc3bc5f069c19",
"url": "https://api.github.com/repos/symfony/routing/zipball/cded64e5bbf9f31786f1055fcc76718fdd77519c",
"reference": "cded64e5bbf9f31786f1055fcc76718fdd77519c",
"shasum": ""
},
"require": {
@@ -7963,7 +7964,7 @@
"url"
],
"support": {
"source": "https://github.com/symfony/routing/tree/v7.0.5"
"source": "https://github.com/symfony/routing/tree/v7.0.6"
},
"funding": [
{
@@ -7979,20 +7980,20 @@
"type": "tidelift"
}
],
"time": "2024-02-27T12:34:35+00:00"
"time": "2024-03-28T21:02:11+00:00"
},
{
"name": "symfony/service-contracts",
"version": "v3.4.1",
"version": "v3.4.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
"reference": "fe07cbc8d837f60caf7018068e350cc5163681a0"
"reference": "11bbf19a0fb7b36345861e85c5768844c552906e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0",
"reference": "fe07cbc8d837f60caf7018068e350cc5163681a0",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e",
"reference": "11bbf19a0fb7b36345861e85c5768844c552906e",
"shasum": ""
},
"require": {
@@ -8045,7 +8046,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/service-contracts/tree/v3.4.1"
"source": "https://github.com/symfony/service-contracts/tree/v3.4.2"
},
"funding": [
{
@@ -8061,7 +8062,7 @@
"type": "tidelift"
}
],
"time": "2023-12-26T14:02:43+00:00"
"time": "2023-12-19T21:51:00+00:00"
},
{
"name": "symfony/string",
@@ -8245,16 +8246,16 @@
},
{
"name": "symfony/translation-contracts",
"version": "v3.4.1",
"version": "v3.4.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation-contracts.git",
"reference": "06450585bf65e978026bda220cdebca3f867fde7"
"reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/06450585bf65e978026bda220cdebca3f867fde7",
"reference": "06450585bf65e978026bda220cdebca3f867fde7",
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/43810bdb2ddb5400e5c5e778e27b210a0ca83b6b",
"reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b",
"shasum": ""
},
"require": {
@@ -8303,7 +8304,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/translation-contracts/tree/v3.4.1"
"source": "https://github.com/symfony/translation-contracts/tree/v3.4.2"
},
"funding": [
{
@@ -8319,7 +8320,7 @@
"type": "tidelift"
}
],
"time": "2023-12-26T14:02:43+00:00"
"time": "2024-01-23T14:51:35+00:00"
},
{
"name": "symfony/uid",
@@ -8397,16 +8398,16 @@
},
{
"name": "symfony/var-dumper",
"version": "v7.0.4",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
"reference": "e03ad7c1535e623edbb94c22cc42353e488c6670"
"reference": "66d13dc207d5dab6b4f4c2b5460efe1bea29dbfb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/e03ad7c1535e623edbb94c22cc42353e488c6670",
"reference": "e03ad7c1535e623edbb94c22cc42353e488c6670",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/66d13dc207d5dab6b4f4c2b5460efe1bea29dbfb",
"reference": "66d13dc207d5dab6b4f4c2b5460efe1bea29dbfb",
"shasum": ""
},
"require": {
@@ -8460,7 +8461,7 @@
"dump"
],
"support": {
"source": "https://github.com/symfony/var-dumper/tree/v7.0.4"
"source": "https://github.com/symfony/var-dumper/tree/v7.0.6"
},
"funding": [
{
@@ -8476,26 +8477,28 @@
"type": "tidelift"
}
],
"time": "2024-02-15T11:33:06+00:00"
"time": "2024-03-19T11:57:22+00:00"
},
{
"name": "symfony/var-exporter",
"version": "v7.0.4",
"version": "v7.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-exporter.git",
"reference": "dfb0acb6803eb714f05d97dd4c5abe6d5fa9fe41"
"reference": "c74c568d2a15a1d407cf40d61ea82bc2d521e27b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-exporter/zipball/dfb0acb6803eb714f05d97dd4c5abe6d5fa9fe41",
"reference": "dfb0acb6803eb714f05d97dd4c5abe6d5fa9fe41",
"url": "https://api.github.com/repos/symfony/var-exporter/zipball/c74c568d2a15a1d407cf40d61ea82bc2d521e27b",
"reference": "c74c568d2a15a1d407cf40d61ea82bc2d521e27b",
"shasum": ""
},
"require": {
"php": ">=8.2"
},
"require-dev": {
"symfony/property-access": "^6.4|^7.0",
"symfony/serializer": "^6.4|^7.0",
"symfony/var-dumper": "^6.4|^7.0"
},
"type": "library",
@@ -8534,7 +8537,7 @@
"serialize"
],
"support": {
"source": "https://github.com/symfony/var-exporter/tree/v7.0.4"
"source": "https://github.com/symfony/var-exporter/tree/v7.0.6"
},
"funding": [
{
@@ -8550,7 +8553,7 @@
"type": "tidelift"
}
],
"time": "2024-02-26T10:35:24+00:00"
"time": "2024-03-20T21:25:22+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@@ -8897,16 +8900,16 @@
"packages-dev": [
{
"name": "barryvdh/laravel-debugbar",
"version": "v3.13.0",
"version": "v3.13.3",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-debugbar.git",
"reference": "354a42f3e0b083cdd6f9da5a9d1c0c63b074547a"
"reference": "241e9bddb04ab42a04a5fe8b2b9654374c864229"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/354a42f3e0b083cdd6f9da5a9d1c0c63b074547a",
"reference": "354a42f3e0b083cdd6f9da5a9d1c0c63b074547a",
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/241e9bddb04ab42a04a5fe8b2b9654374c864229",
"reference": "241e9bddb04ab42a04a5fe8b2b9654374c864229",
"shasum": ""
},
"require": {
@@ -8965,7 +8968,7 @@
],
"support": {
"issues": "https://github.com/barryvdh/laravel-debugbar/issues",
"source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.13.0"
"source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.13.3"
},
"funding": [
{
@@ -8977,7 +8980,7 @@
"type": "github"
}
],
"time": "2024-04-01T16:39:30+00:00"
"time": "2024-04-04T02:42:49+00:00"
},
{
"name": "barryvdh/laravel-ide-helper",
@@ -9606,16 +9609,16 @@
},
{
"name": "maximebf/debugbar",
"version": "v1.22.1",
"version": "v1.22.3",
"source": {
"type": "git",
"url": "https://github.com/maximebf/php-debugbar.git",
"reference": "d7b6e1dc2dc85c01ed63ab158b00a7f46abdebcc"
"reference": "7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/d7b6e1dc2dc85c01ed63ab158b00a7f46abdebcc",
"reference": "d7b6e1dc2dc85c01ed63ab158b00a7f46abdebcc",
"url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96",
"reference": "7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96",
"shasum": ""
},
"require": {
@@ -9668,9 +9671,9 @@
],
"support": {
"issues": "https://github.com/maximebf/php-debugbar/issues",
"source": "https://github.com/maximebf/php-debugbar/tree/v1.22.1"
"source": "https://github.com/maximebf/php-debugbar/tree/v1.22.3"
},
"time": "2024-04-01T10:44:20+00:00"
"time": "2024-04-03T19:39:26+00:00"
},
{
"name": "mockery/mockery",
@@ -10235,16 +10238,16 @@
},
{
"name": "phpstan/phpdoc-parser",
"version": "1.27.0",
"version": "1.28.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
"reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757"
"reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/86e4d5a4b036f8f0be1464522f4c6b584c452757",
"reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb",
"reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb",
"shasum": ""
},
"require": {
@@ -10276,9 +10279,9 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.27.0"
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.28.0"
},
"time": "2024-03-21T13:14:53+00:00"
"time": "2024-04-03T18:51:33+00:00"
},
{
"name": "phpstan/phpstan",
@@ -10392,21 +10395,21 @@
},
{
"name": "phpstan/phpstan-strict-rules",
"version": "1.5.2",
"version": "1.5.3",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-strict-rules.git",
"reference": "7a50e9662ee9f3942e4aaaf3d603653f60282542"
"reference": "568210bd301f94a0d4b1e5a0808c374c1b9cf11b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/7a50e9662ee9f3942e4aaaf3d603653f60282542",
"reference": "7a50e9662ee9f3942e4aaaf3d603653f60282542",
"url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/568210bd301f94a0d4b1e5a0808c374c1b9cf11b",
"reference": "568210bd301f94a0d4b1e5a0808c374c1b9cf11b",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0",
"phpstan/phpstan": "^1.10.34"
"phpstan/phpstan": "^1.10.60"
},
"require-dev": {
"nikic/php-parser": "^4.13.0",
@@ -10435,9 +10438,9 @@
"description": "Extra strict and opinionated rules for PHPStan",
"support": {
"issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
"source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.2"
"source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.3"
},
"time": "2023-10-30T14:35:06+00:00"
"time": "2024-04-06T07:43:25+00:00"
},
{
"name": "phpunit/php-code-coverage",
@@ -10762,16 +10765,16 @@
},
{
"name": "phpunit/phpunit",
"version": "10.5.16",
"version": "10.5.17",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "18f8d4a5f52b61fdd9370aaae3167daa0eeb69cd"
"reference": "c1f736a473d21957ead7e94fcc029f571895abf5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/18f8d4a5f52b61fdd9370aaae3167daa0eeb69cd",
"reference": "18f8d4a5f52b61fdd9370aaae3167daa0eeb69cd",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c1f736a473d21957ead7e94fcc029f571895abf5",
"reference": "c1f736a473d21957ead7e94fcc029f571895abf5",
"shasum": ""
},
"require": {
@@ -10843,7 +10846,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.16"
"source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.17"
},
"funding": [
{
@@ -10859,7 +10862,7 @@
"type": "tidelift"
}
],
"time": "2024-03-28T10:08:10+00:00"
"time": "2024-04-05T04:39:01+00:00"
},
{
"name": "sebastian/cli-parser",

View File

@@ -117,7 +117,7 @@ return [
'expression_engine' => false,
// see cer.php for exchange rates feature flag.
],
'version' => 'develop/2024-04-02',
'version' => 'develop/2024-04-07',
'api_version' => '2.0.13',
'db_version' => 24,

302
config/translations.php Normal file
View File

@@ -0,0 +1,302 @@
<?php
/*
* translations.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);
return [
'json' => [
'v2' => [
'config' => [
'html_language',
'date_time_fns',
'month_and_day_fns',
'does_not_exist', // on purpose
'date_time_fns_short',
],
'form' => [
'title',
],
'validation' => [
'bad_type_source',
'bad_type_destination',
],
'firefly' => [
'spent',
'administration_owner',
'administration_you',
'administration_role_owner',
'administration_role_ro',
'administration_role_mng_trx',
'administration_role_mng_meta',
'administration_role_mng_budgets',
'administration_role_mng_piggies',
'administration_role_mng_subscriptions',
'administration_role_mng_rules',
'administration_role_mng_recurring',
'administration_role_mng_webhooks',
'administration_role_mng_currencies',
'administration_role_view_reports',
'administration_role_full',
'new_administration_created',
'left',
'paid',
'errors_submission_v2',
'unpaid',
'default_group_title_name_plain',
'subscriptions_in_group',
'subscr_expected_x_times',
'overspent',
'money_flowing_in',
'money_flowing_out',
'category',
'unknown_category_plain',
'all_money',
'unknown_source_plain',
'unknown_dest_plain',
'unknown_any_plain',
'unknown_budget_plain',
'stored_journal_js',
'wait_loading_transaction',
'nothing_found',
'wait_loading_data',
'Transfer',
'Withdrawal',
'Deposit',
'expense_account',
'revenue_account',
'budget',
'account_type_Asset account',
'account_type_Expense account',
'account_type_Revenue account',
'account_type_Debt',
'account_type_Loan',
'account_type_Mortgage',
'account_role_defaultAsset',
'account_role_sharedAsset',
'account_role_savingAsset',
'account_role_ccAsset',
'account_role_cashWalletAsset',
],
],
'v1' => [
'firefly' => [
'welcome_back',
'flash_error',
'flash_warning',
'flash_success',
'close',
'select_dest_account',
'select_source_account',
'split_transaction_title',
'errors_submission',
'split',
'single_split',
'transaction_stored_link',
'webhook_stored_link',
'webhook_updated_link',
'transaction_updated_link',
'transaction_new_stored_link',
'transaction_journal_information',
'submission_options',
'apply_rules_checkbox',
'fire_webhooks_checkbox',
'no_budget_pointer',
'no_bill_pointer',
'source_account',
'hidden_fields_preferences',
'destination_account',
'add_another_split',
'submission',
'stored_journal',
'create_another',
'reset_after',
'submit',
'amount',
'date',
'is_reconciled_fields_dropped',
'tags',
'no_budget',
'no_bill',
'category',
'attachments',
'notes',
'external_url',
'update_transaction',
'after_update_create_another',
'store_as_new',
'reset_after',
'split_title_help',
'none_in_select_list',
'no_piggy_bank',
'description',
'split_transaction_title_help',
'destination_account_reconciliation',
'source_account_reconciliation',
'budget',
'bill',
'you_create_withdrawal',
'you_create_transfer',
'you_create_deposit',
'edit',
'delete',
'name',
'profile_whoops',
'profile_something_wrong',
'profile_try_again',
'profile_oauth_clients',
'profile_oauth_no_clients',
'profile_oauth_clients_header',
'profile_oauth_client_id',
'profile_oauth_client_name',
'profile_oauth_client_secret',
'profile_oauth_create_new_client',
'profile_oauth_create_client',
'profile_oauth_edit_client',
'profile_oauth_name_help',
'profile_oauth_redirect_url',
'profile_oauth_clients_external_auth',
'profile_oauth_redirect_url_help',
'profile_authorized_apps',
'profile_authorized_clients',
'profile_scopes',
'profile_revoke',
'profile_personal_access_tokens',
'profile_personal_access_token',
'profile_personal_access_token_explanation',
'profile_no_personal_access_token',
'profile_create_new_token',
'profile_create_token',
'profile_create',
'profile_save_changes',
'default_group_title_name',
'piggy_bank',
'profile_oauth_client_secret_title',
'profile_oauth_client_secret_expl',
'profile_oauth_confidential',
'profile_oauth_confidential_help',
'multi_account_warning_unknown',
'multi_account_warning_withdrawal',
'multi_account_warning_deposit',
'multi_account_warning_transfer',
'webhook_trigger_STORE_TRANSACTION',
'webhook_trigger_UPDATE_TRANSACTION',
'webhook_trigger_DESTROY_TRANSACTION',
'webhook_response_TRANSACTIONS',
'webhook_response_ACCOUNTS',
'webhook_response_none_NONE',
'webhook_delivery_JSON',
'actions',
'meta_data',
'webhook_messages',
'inactive',
'no_webhook_messages',
'inspect',
'edit',
'delete',
'create_new_webhook',
'webhooks',
'webhook_trigger_form_help',
'webhook_response_form_help',
'webhook_delivery_form_help',
'webhook_active_form_help',
'edit_webhook_js',
'webhook_was_triggered',
'view_message',
'view_attempts',
'message_content_title',
'message_content_help',
'attempt_content_title',
'attempt_content_help',
'no_attempts',
'webhook_attempt_at',
'logs',
'response',
'visit_webhook_url',
'reset_webhook_secret',
],
'form' => [
'url',
'active',
'interest_date',
'title',
'book_date',
'process_date',
'due_date',
'foreign_amount',
'payment_date',
'invoice_date',
'internal_reference',
'webhook_response',
'webhook_trigger',
'webhook_delivery',
],
'list' => [
'active',
'trigger',
'response',
'delivery',
'url',
'secret',
],
'config' => [
'html_language',
'date_time_fns',
],
],
],
// TODO duplicate with firefly.php
'languages' => [
// currently enabled languages
'bg_BG',
'cs_CZ',
'da_DK',
'de_DE',
'el_GR',
'en_GB',
'en_US',
'es_ES',
'ca_ES',
'fi_FI',
'fr_FR',
'hu_HU',
'id_ID',
'it_IT',
'ja_JP',
'ko_KR',
'nb_NO',
'nn_NO',
'nl_NL',
'pl_PL',
'pt_BR',
'pt_PT',
'ro_RO',
'ru_RU',
'sk_SK',
'sl_SI',
'sv_SE',
'tr_TR',
'uk_UA',
'vi_VN',
'zh_TW',
'zh_CN',
],
];

View File

@@ -39,7 +39,7 @@ return [
| the usual Laravel view path has already been registered for you.
|
*/
'layout' => env('FIREFLY_III_LAYOUT', 'v1'),
'paths' => $paths,
/*

View File

@@ -21,7 +21,6 @@
*/
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -46,7 +45,7 @@ class ExpandTransactionsTable extends Migration
$table->dropColumn('identifier');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} catch (QueryException $e) {
app('log')->error(sprintf('Could not drop column "identifier": %s', $e->getMessage()));
app('log')->error('If the column does not exist, this is not an problem. Otherwise, please open a GitHub discussion.');
}

View File

@@ -21,7 +21,6 @@
*/
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -74,7 +73,7 @@ class ChangesForV431 extends Migration
$table->renameColumn('start_date', 'startdate');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -89,7 +88,7 @@ class ChangesForV431 extends Migration
$table->dropColumn('end_date');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -103,7 +102,7 @@ class ChangesForV431 extends Migration
$table->dropColumn('decimal_places');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -141,7 +140,7 @@ class ChangesForV431 extends Migration
$table->renameColumn('startdate', 'start_date');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -171,7 +170,7 @@ class ChangesForV431 extends Migration
$table->dropColumn('repeats');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -184,7 +183,7 @@ class ChangesForV431 extends Migration
$table->dropColumn('repeat_freq');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -21,7 +21,6 @@
*/
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -53,7 +52,7 @@ class ChangesForV440 extends Migration
}
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -21,7 +21,6 @@
*/
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -47,7 +46,7 @@ class ChangesForV450 extends Migration
$table->dropColumn('foreign_amount');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -75,7 +74,7 @@ class ChangesForV450 extends Migration
$table->dropColumn('foreign_currency_id');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -21,7 +21,6 @@
*/
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -47,7 +46,7 @@ class ChangesForV470a extends Migration
$table->dropColumn('reconciled');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -22,7 +22,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -61,7 +60,7 @@ class ChangesForV472 extends Migration
$table->dropColumn('order');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -83,7 +82,7 @@ class ChangesForV472 extends Migration
$table->dropColumn('notes');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -22,7 +22,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -52,7 +51,7 @@ class ChangesForV473 extends Migration
$table->dropColumn('transaction_currency_id');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -66,7 +65,7 @@ class ChangesForV473 extends Migration
$table->dropColumn('strict');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -22,7 +22,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -52,7 +51,7 @@ class ChangesForV477 extends Migration
$table->dropColumn(['transaction_currency_id']);
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -22,7 +22,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -47,7 +46,7 @@ class ChangesForV479 extends Migration
$table->dropColumn(['enabled']);
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -21,7 +21,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -47,7 +46,7 @@ class FixLdapConfiguration extends Migration
$table->dropColumn(['objectguid']);
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -21,7 +21,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -57,7 +56,7 @@ class ChangesForV480 extends Migration
try {
$table->dropColumn('transaction_group_id');
} catch (ColumnDoesNotExist|QueryException $e) {
} catch (QueryException $e) {
app('log')->error(sprintf('Could not drop column: %s', $e->getMessage()));
app('log')->error('If the column does not exist, this is not an problem. Otherwise, please open a GitHub discussion.');
}
@@ -77,7 +76,7 @@ class ChangesForV480 extends Migration
static function (Blueprint $table): void {
try {
$table->dropColumn('stop_processing');
} catch (ColumnDoesNotExist|QueryException $e) {
} catch (QueryException $e) {
app('log')->error(sprintf('Could not drop column: %s', $e->getMessage()));
app('log')->error('If the column does not exist, this is not an problem. Otherwise, please open a GitHub discussion.');
}
@@ -97,7 +96,7 @@ class ChangesForV480 extends Migration
static function (Blueprint $table): void {
try {
$table->dropColumn('mfa_secret');
} catch (ColumnDoesNotExist|QueryException $e) {
} catch (QueryException $e) {
app('log')->error(sprintf('Could not drop column: %s', $e->getMessage()));
app('log')->error('If the column does not exist, this is not an problem. Otherwise, please open a GitHub discussion.');
}

View File

@@ -22,7 +22,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -48,7 +47,7 @@ class ChangesForV530a extends Migration
$table->dropColumn('order');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -22,7 +22,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -48,7 +47,7 @@ class ChangesForV540 extends Migration
$table->dropColumn('provider');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -62,7 +61,7 @@ class ChangesForV540 extends Migration
$table->dropColumn('order');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -76,7 +75,7 @@ class ChangesForV540 extends Migration
$table->dropColumn('end_date');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -89,7 +88,7 @@ class ChangesForV540 extends Migration
$table->dropColumn('extension_date');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -22,7 +22,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -76,7 +75,7 @@ class ChangesForV550 extends Migration
$table->dropColumn('budget_limit_id');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -95,7 +94,7 @@ class ChangesForV550 extends Migration
$table->dropColumn('period');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -108,7 +107,7 @@ class ChangesForV550 extends Migration
$table->dropColumn('generated');
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -22,7 +22,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -51,7 +50,7 @@ class ChangesForV550b2 extends Migration
}
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -22,7 +22,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -43,7 +42,7 @@ class AddLdapColumnsToUsersTable extends Migration
$table->dropColumn(['domain']);
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -22,7 +22,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -72,7 +71,7 @@ class UserGroups extends Migration
}
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}
@@ -92,7 +91,7 @@ class UserGroups extends Migration
}
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -22,7 +22,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -69,7 +68,7 @@ return new class () extends Migration {
}
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

View File

@@ -22,7 +22,6 @@
declare(strict_types=1);
use Doctrine\DBAL\Schema\Exception\ColumnDoesNotExist;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
@@ -71,7 +70,7 @@ return new class () extends Migration {
}
}
);
} catch (ColumnDoesNotExist|QueryException $e) {
} 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.');
}

9013
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,40 +1,9 @@
{
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"postinstall": "patch-package"
"postinstall": "patch-package --error-on-fail"
},
"devDependencies": {
"axios": "^1.6.8",
"laravel-vite-plugin": "^0.8.1",
"patch-package": "^8.0.0",
"sass": "^1.72.0",
"vite": "^4.5.3",
"vite-plugin-manifest-sri": "^0.1.0"
},
"dependencies": {
"@ag-grid-community/client-side-row-model": "^31.0.3",
"@ag-grid-community/core": "^31.0.3",
"@ag-grid-community/infinite-row-model": "^31.0.3",
"@ag-grid-community/styles": "^31.0.3",
"@fortawesome/fontawesome-free": "^6.4.0",
"@popperjs/core": "^2.11.8",
"admin-lte": "^4.0.0-alpha3",
"alpinejs": "^3.13.7",
"bootstrap": "^5.3.0",
"bootstrap5-autocomplete": "^1.1.22",
"bootstrap5-tags": "^1.6.15",
"chart.js": "^4.4.0",
"chartjs-adapter-date-fns": "^3.0.0",
"chartjs-chart-sankey": "^0.12.0",
"date-fns": "^3.6.0",
"i18next": "^23.10.1",
"i18next-chained-backend": "^4.6.2",
"i18next-http-backend": "^2.4.2",
"i18next-localstorage-backend": "^4.2.0",
"leaflet": "^1.9.4",
"store": "^2.0.12"
}
"workspaces": [
"resources/assets/v1",
"resources/assets/v2"
]
}

0
public/v1/js/.gitkeep Normal file
View File

View File

@@ -3,14 +3,34 @@
"html_language": "bg",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"does_not_exist": "(config.does_not_exist)",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
},
"form": {
"title": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435"
},
"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": {
"spent": "\u041f\u043e\u0445\u0430\u0440\u0447\u0435\u043d\u0438",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",
"administration_role_owner": "Owner",
"administration_role_ro": "Read-only",
"administration_role_mng_trx": "Manage transactions",
"administration_role_mng_meta": "Manage classification and meta-data",
"administration_role_mng_budgets": "Manage budgets",
"administration_role_mng_piggies": "Manage piggy banks",
"administration_role_mng_subscriptions": "Manage subscriptions",
"administration_role_mng_rules": "Manage rules",
"administration_role_mng_recurring": "Manage recurring transactions ",
"administration_role_mng_webhooks": "Manage webhooks",
"administration_role_mng_currencies": "Manage currencies",
"administration_role_view_reports": "View reports",
"administration_role_full": "Full access",
"new_administration_created": "New financial administration \"{{title}}\" has been created",
"left": "\u041e\u0441\u0442\u0430\u043d\u0430\u043b\u0438",
"paid": "\u041f\u043b\u0430\u0442\u0435\u043d\u0438",
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",

View File

@@ -3,14 +3,34 @@
"html_language": "bg",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"does_not_exist": "(config.does_not_exist)",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
},
"form": {
"title": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435"
},
"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": {
"spent": "\u041f\u043e\u0445\u0430\u0440\u0447\u0435\u043d\u0438",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",
"administration_role_owner": "Owner",
"administration_role_ro": "Read-only",
"administration_role_mng_trx": "Manage transactions",
"administration_role_mng_meta": "Manage classification and meta-data",
"administration_role_mng_budgets": "Manage budgets",
"administration_role_mng_piggies": "Manage piggy banks",
"administration_role_mng_subscriptions": "Manage subscriptions",
"administration_role_mng_rules": "Manage rules",
"administration_role_mng_recurring": "Manage recurring transactions ",
"administration_role_mng_webhooks": "Manage webhooks",
"administration_role_mng_currencies": "Manage currencies",
"administration_role_view_reports": "View reports",
"administration_role_full": "Full access",
"new_administration_created": "New financial administration \"{{title}}\" has been created",
"left": "\u041e\u0441\u0442\u0430\u043d\u0430\u043b\u0438",
"paid": "\u041f\u043b\u0430\u0442\u0435\u043d\u0438",
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",

View File

@@ -3,14 +3,34 @@
"html_language": "ca",
"date_time_fns": "D [de\/d'] MMMM yyyy [a les] HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"does_not_exist": "(config.does_not_exist)",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
},
"form": {
"title": "T\u00edtol"
},
"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": {
"spent": "Gastat",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",
"administration_role_owner": "Owner",
"administration_role_ro": "Read-only",
"administration_role_mng_trx": "Manage transactions",
"administration_role_mng_meta": "Manage classification and meta-data",
"administration_role_mng_budgets": "Manage budgets",
"administration_role_mng_piggies": "Manage piggy banks",
"administration_role_mng_subscriptions": "Manage subscriptions",
"administration_role_mng_rules": "Manage rules",
"administration_role_mng_recurring": "Manage recurring transactions ",
"administration_role_mng_webhooks": "Manage webhooks",
"administration_role_mng_currencies": "Manage currencies",
"administration_role_view_reports": "View reports",
"administration_role_full": "Full access",
"new_administration_created": "New financial administration \"{{title}}\" has been created",
"left": "Queda",
"paid": "Pagat",
"errors_submission_v2": "Hi ha hagut un error amb el teu enviament. Per favor, comprova els seg\u00fcents errors: {{errorMessage}}",

View File

@@ -3,14 +3,34 @@
"html_language": "ca",
"date_time_fns": "D [de\/d'] MMMM yyyy [a les] HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"does_not_exist": "(config.does_not_exist)",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
},
"form": {
"title": "T\u00edtol"
},
"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": {
"spent": "Gastat",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",
"administration_role_owner": "Owner",
"administration_role_ro": "Read-only",
"administration_role_mng_trx": "Manage transactions",
"administration_role_mng_meta": "Manage classification and meta-data",
"administration_role_mng_budgets": "Manage budgets",
"administration_role_mng_piggies": "Manage piggy banks",
"administration_role_mng_subscriptions": "Manage subscriptions",
"administration_role_mng_rules": "Manage rules",
"administration_role_mng_recurring": "Manage recurring transactions ",
"administration_role_mng_webhooks": "Manage webhooks",
"administration_role_mng_currencies": "Manage currencies",
"administration_role_view_reports": "View reports",
"administration_role_full": "Full access",
"new_administration_created": "New financial administration \"{{title}}\" has been created",
"left": "Queda",
"paid": "Pagat",
"errors_submission_v2": "Hi ha hagut un error amb el teu enviament. Per favor, comprova els seg\u00fcents errors: {{errorMessage}}",

View File

@@ -3,14 +3,34 @@
"html_language": "cs",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM, y",
"does_not_exist": "(config.does_not_exist)",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
},
"form": {
"title": "N\u00e1zev"
},
"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": {
"spent": "Utraceno",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",
"administration_role_owner": "Owner",
"administration_role_ro": "Read-only",
"administration_role_mng_trx": "Manage transactions",
"administration_role_mng_meta": "Manage classification and meta-data",
"administration_role_mng_budgets": "Manage budgets",
"administration_role_mng_piggies": "Manage piggy banks",
"administration_role_mng_subscriptions": "Manage subscriptions",
"administration_role_mng_rules": "Manage rules",
"administration_role_mng_recurring": "Manage recurring transactions ",
"administration_role_mng_webhooks": "Manage webhooks",
"administration_role_mng_currencies": "Manage currencies",
"administration_role_view_reports": "View reports",
"administration_role_full": "Full access",
"new_administration_created": "New financial administration \"{{title}}\" has been created",
"left": "Zb\u00fdv\u00e1",
"paid": "Zaplaceno",
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",

View File

@@ -3,14 +3,34 @@
"html_language": "cs",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM, y",
"does_not_exist": "(config.does_not_exist)",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
},
"form": {
"title": "N\u00e1zev"
},
"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": {
"spent": "Utraceno",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",
"administration_role_owner": "Owner",
"administration_role_ro": "Read-only",
"administration_role_mng_trx": "Manage transactions",
"administration_role_mng_meta": "Manage classification and meta-data",
"administration_role_mng_budgets": "Manage budgets",
"administration_role_mng_piggies": "Manage piggy banks",
"administration_role_mng_subscriptions": "Manage subscriptions",
"administration_role_mng_rules": "Manage rules",
"administration_role_mng_recurring": "Manage recurring transactions ",
"administration_role_mng_webhooks": "Manage webhooks",
"administration_role_mng_currencies": "Manage currencies",
"administration_role_view_reports": "View reports",
"administration_role_full": "Full access",
"new_administration_created": "New financial administration \"{{title}}\" has been created",
"left": "Zb\u00fdv\u00e1",
"paid": "Zaplaceno",
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",

View File

@@ -3,14 +3,34 @@
"html_language": "da",
"date_time_fns": "MMMM g\u00f8r, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"does_not_exist": "(config.does_not_exist)",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
},
"form": {
"title": "Titel"
},
"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": {
"spent": "Spent",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",
"administration_role_owner": "Owner",
"administration_role_ro": "Read-only",
"administration_role_mng_trx": "Manage transactions",
"administration_role_mng_meta": "Manage classification and meta-data",
"administration_role_mng_budgets": "Manage budgets",
"administration_role_mng_piggies": "Manage piggy banks",
"administration_role_mng_subscriptions": "Manage subscriptions",
"administration_role_mng_rules": "Manage rules",
"administration_role_mng_recurring": "Manage recurring transactions ",
"administration_role_mng_webhooks": "Manage webhooks",
"administration_role_mng_currencies": "Manage currencies",
"administration_role_view_reports": "View reports",
"administration_role_full": "Full access",
"new_administration_created": "New financial administration \"{{title}}\" has been created",
"left": "Left",
"paid": "Paid",
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",

View File

@@ -3,14 +3,34 @@
"html_language": "da",
"date_time_fns": "MMMM g\u00f8r, yyyy @ HH:mm:ss",
"month_and_day_fns": "d MMMM y",
"does_not_exist": "(config.does_not_exist)",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
},
"form": {
"title": "Titel"
},
"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": {
"spent": "Spent",
"administration_owner": "Administration owner: {{email}}",
"administration_you": "Your role: {{role}}",
"administration_role_owner": "Owner",
"administration_role_ro": "Read-only",
"administration_role_mng_trx": "Manage transactions",
"administration_role_mng_meta": "Manage classification and meta-data",
"administration_role_mng_budgets": "Manage budgets",
"administration_role_mng_piggies": "Manage piggy banks",
"administration_role_mng_subscriptions": "Manage subscriptions",
"administration_role_mng_rules": "Manage rules",
"administration_role_mng_recurring": "Manage recurring transactions ",
"administration_role_mng_webhooks": "Manage webhooks",
"administration_role_mng_currencies": "Manage currencies",
"administration_role_view_reports": "View reports",
"administration_role_full": "Full access",
"new_administration_created": "New financial administration \"{{title}}\" has been created",
"left": "Left",
"paid": "Paid",
"errors_submission_v2": "There was something wrong with your submission. Please check out the errors below: {{errorMessage}}",

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