mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-12-05 04:21:40 +00:00
Compare commits
61 Commits
4.8.1.6
...
4.8.2-alph
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
380f59dab2 | ||
|
|
c558bc3247 | ||
|
|
25378b3f9a | ||
|
|
abf84e94b1 | ||
|
|
8baf29b835 | ||
|
|
d709a9489d | ||
|
|
33ce7c0767 | ||
|
|
ec54ec22f6 | ||
|
|
706e722c6f | ||
|
|
58ec0c4add | ||
|
|
88692f0058 | ||
|
|
a8af0fa678 | ||
|
|
0bdd48ffec | ||
|
|
766a82a983 | ||
|
|
d749d550ee | ||
|
|
2ea1852a94 | ||
|
|
4f44a42655 | ||
|
|
26ed00e7b5 | ||
|
|
51f25b2dce | ||
|
|
3fc653687c | ||
|
|
4cd824f3b7 | ||
|
|
a6af263b50 | ||
|
|
0844278eca | ||
|
|
1b63bfc3db | ||
|
|
a4906a2d21 | ||
|
|
c4256dd25b | ||
|
|
091ab17fdb | ||
|
|
02ddb95cf2 | ||
|
|
f2d43d71ad | ||
|
|
af611b78de | ||
|
|
724a1b8b08 | ||
|
|
34e70c7446 | ||
|
|
01f869f1b6 | ||
|
|
73a6db8eda | ||
|
|
0bbc008848 | ||
|
|
5e61fa785e | ||
|
|
c131e6ad9b | ||
|
|
cbc92d89e1 | ||
|
|
9a028d5002 | ||
|
|
bed182cf13 | ||
|
|
d5afba6137 | ||
|
|
6b4b69b695 | ||
|
|
b528fa2e5d | ||
|
|
f4b9f81e71 | ||
|
|
ca37d782ed | ||
|
|
f7c34db39b | ||
|
|
0d072b4ed9 | ||
|
|
13a29a66c8 | ||
|
|
cfd9828438 | ||
|
|
b4d565400e | ||
|
|
be0e2bf6a7 | ||
|
|
64a2f22b13 | ||
|
|
778e0bcbae | ||
|
|
92a1f12f6c | ||
|
|
ea0a440de0 | ||
|
|
92271ffe66 | ||
|
|
0499433cea | ||
|
|
dcdecfbc64 | ||
|
|
8b11afb83f | ||
|
|
6823adc976 | ||
|
|
2cf000a9fd |
@@ -1,20 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# build image
|
||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
|
||||
if [ "$TRAVIS_BRANCH" == "develop" ]; then
|
||||
echo "Build develop amd64"
|
||||
docker build -t jc5x/firefly-iii:develop-amd64 -f Dockerfile.amd64 .
|
||||
docker tag jc5x/firefly-iii:develop-amd64 jc5x/firefly-iii:develop-$VERSION-amd64
|
||||
docker push jc5x/firefly-iii:develop-amd64
|
||||
docker push jc5x/firefly-iii:develop-$VERSION-amd64
|
||||
fi
|
||||
|
||||
if [ "$TRAVIS_BRANCH" == "master" ]; then
|
||||
echo "Build master amd64"
|
||||
docker build -t jc5x/firefly-iii:latest-amd64 -f Dockerfile.amd64 .
|
||||
docker tag jc5x/firefly-iii:latest-amd64 jc5x/firefly-iii:release-$VERSION-amd64
|
||||
docker push jc5x/firefly-iii:latest-amd64
|
||||
docker push jc5x/firefly-iii:release-$VERSION-amd64
|
||||
fi
|
||||
@@ -1,29 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
docker run --rm --privileged multiarch/qemu-user-static:register --reset
|
||||
|
||||
# get qemu-arm-static binary
|
||||
mkdir tmp
|
||||
pushd tmp && \
|
||||
curl -L -o qemu-arm-static.tar.gz https://github.com/multiarch/qemu-user-static/releases/download/v2.6.0/qemu-arm-static.tar.gz && \
|
||||
tar xzf qemu-arm-static.tar.gz && \
|
||||
popd
|
||||
|
||||
# build image
|
||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
|
||||
if [ "$TRAVIS_BRANCH" == "develop" ]; then
|
||||
echo "Build develop arm"
|
||||
docker build --tag jc5x/firefly-iii:develop-arm --file Dockerfile.arm .
|
||||
docker tag jc5x/firefly-iii:develop-arm jc5x/firefly-iii:develop-$VERSION-arm
|
||||
docker push jc5x/firefly-iii:develop-arm
|
||||
docker push jc5x/firefly-iii:develop-$VERSION-arm
|
||||
fi
|
||||
|
||||
if [ "$TRAVIS_BRANCH" == "master" ]; then
|
||||
echo "Build master arm"
|
||||
docker build --tag jc5x/firefly-iii:latest-arm --file Dockerfile.arm .
|
||||
docker tag jc5x/firefly-iii:latest-arm jc5x/firefly-iii:release-$VERSION-arm
|
||||
docker push jc5x/firefly-iii:latest-arm
|
||||
docker push jc5x/firefly-iii:release-$VERSION-arm
|
||||
fi
|
||||
@@ -1,35 +1,154 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if [ "$TRAVIS_BRANCH" == "develop" ]; then
|
||||
echo '{"experimental":true}' | sudo tee /etc/docker/daemon.json
|
||||
mkdir $HOME/.docker
|
||||
touch $HOME/.docker/config.json
|
||||
echo '{"experimental":"enabled"}' | sudo tee $HOME/.docker/config.json
|
||||
sudo service docker restart
|
||||
|
||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
|
||||
|
||||
# if the github branch is develop, only push the 'develop' tag
|
||||
if [ $TRAVIS_BRANCH == "develop" ]; then
|
||||
TARGET=jc5x/firefly-iii:develop
|
||||
ARM=jc5x/firefly-iii:develop-arm
|
||||
AMD=jc5x/firefly-iii:develop-amd64
|
||||
ARM32=jc5x/firefly-iii:develop-arm
|
||||
ARM64=jc5x/firefly-iii:develop-arm64
|
||||
AMD64=jc5x/firefly-iii:develop-amd64
|
||||
|
||||
docker manifest create $TARGET $AMD $ARM
|
||||
docker manifest annotate $TARGET $ARM --arch arm --os linux
|
||||
docker manifest annotate $TARGET $AMD --arch amd64 --os linux
|
||||
echo "GitHub branch is $TRAVIS_BRANCH."
|
||||
echo "Push develop-* builds to $TARGET"
|
||||
|
||||
docker manifest create $TARGET $ARM32 $ARM64 $AMD64
|
||||
docker manifest annotate $TARGET $ARM32 --arch arm --os linux
|
||||
docker manifest annotate $TARGET $ARM64 --arch arm64 --os linux
|
||||
docker manifest annotate $TARGET $AMD64 --arch amd64 --os linux
|
||||
docker manifest push $TARGET
|
||||
fi
|
||||
|
||||
echo "The version is $VERSION"
|
||||
# if branch = master AND channel = alpha, push 'alpha'
|
||||
if [ $TRAVIS_BRANCH == "master" ] && [ $CHANNEL == "alpha" ]; then
|
||||
TARGET=jc5x/firefly-iii:alpha
|
||||
ARM32=jc5x/firefly-iii:alpha-arm
|
||||
ARM64=jc5x/firefly-iii:alpha-arm64
|
||||
AMD64=jc5x/firefly-iii:alpha-amd64
|
||||
|
||||
echo "GitHub branch is $TRAVIS_BRANCH."
|
||||
echo "Channel is $CHANNEL."
|
||||
echo "Push alpha-* builds to $TARGET"
|
||||
|
||||
docker manifest create $TARGET $ARM32 $ARM64 $AMD64
|
||||
docker manifest annotate $TARGET $ARM32 --arch arm --os linux
|
||||
docker manifest annotate $TARGET $ARM64 --arch arm64 --os linux
|
||||
docker manifest annotate $TARGET $AMD64 --arch amd64 --os linux
|
||||
docker manifest push $TARGET
|
||||
fi
|
||||
|
||||
# if branch is master and channel is alpha, push 'alpha' and 'beta'.
|
||||
if [ $TRAVIS_BRANCH == "master" ] && [ $CHANNEL == "beta" ]; then
|
||||
TARGET=jc5x/firefly-iii:alpha
|
||||
ARM32=jc5x/firefly-iii:beta-arm
|
||||
ARM64=jc5x/firefly-iii:beta-arm64
|
||||
AMD64=jc5x/firefly-iii:beta-amd64
|
||||
|
||||
echo "GitHub branch is $TRAVIS_BRANCH."
|
||||
echo "Channel is $CHANNEL."
|
||||
echo "Push beta-* builds to $TARGET"
|
||||
|
||||
docker manifest create $TARGET $ARM32 $ARM64 $AMD64
|
||||
docker manifest annotate $TARGET $ARM32 --arch arm --os linux
|
||||
docker manifest annotate $TARGET $ARM64 --arch arm64 --os linux
|
||||
docker manifest annotate $TARGET $AMD64 --arch amd64 --os linux
|
||||
docker manifest push $TARGET
|
||||
|
||||
TARGET=jc5x/firefly-iii:beta
|
||||
ARM32=jc5x/firefly-iii:beta-arm
|
||||
ARM64=jc5x/firefly-iii:beta-arm64
|
||||
AMD64=jc5x/firefly-iii:beta-amd64
|
||||
|
||||
echo "Push beta-* builds to $TARGET"
|
||||
|
||||
docker manifest create $TARGET $ARM32 $ARM64 $AMD64
|
||||
docker manifest annotate $TARGET $ARM32 --arch arm --os linux
|
||||
docker manifest annotate $TARGET $ARM64 --arch arm64 --os linux
|
||||
docker manifest annotate $TARGET $AMD64 --arch amd64 --os linux
|
||||
docker manifest push $TARGET
|
||||
fi
|
||||
|
||||
# if branch is master and channel is stable, push 'alpha' and 'beta' and 'stable'.
|
||||
if [ $TRAVIS_BRANCH == "master" ] && [ $CHANNEL == "stable" ]; then
|
||||
TARGET=jc5x/firefly-iii:alpha
|
||||
ARM32=jc5x/firefly-iii:stable-arm
|
||||
ARM64=jc5x/firefly-iii:stable-arm64
|
||||
AMD64=jc5x/firefly-iii:stable-amd64
|
||||
|
||||
echo "GitHub branch is $TRAVIS_BRANCH."
|
||||
echo "Channel is $CHANNEL."
|
||||
echo "Push stable-* builds to $TARGET"
|
||||
|
||||
docker manifest create $TARGET $ARM32 $ARM64 $AMD64
|
||||
docker manifest annotate $TARGET $ARM32 --arch arm --os linux
|
||||
docker manifest annotate $TARGET $ARM64 --arch arm64 --os linux
|
||||
docker manifest annotate $TARGET $AMD64 --arch amd64 --os linux
|
||||
docker manifest push $TARGET
|
||||
|
||||
TARGET=jc5x/firefly-iii:beta
|
||||
ARM32=jc5x/firefly-iii:stable-arm
|
||||
ARM64=jc5x/firefly-iii:stable-arm64
|
||||
AMD64=jc5x/firefly-iii:stable-amd64
|
||||
|
||||
echo "Push stable-* builds to $TARGET"
|
||||
|
||||
docker manifest create $TARGET $ARM32 $ARM64 $AMD64
|
||||
docker manifest annotate $TARGET $ARM32 --arch arm --os linux
|
||||
docker manifest annotate $TARGET $ARM64 --arch arm64 --os linux
|
||||
docker manifest annotate $TARGET $AMD64 --arch amd64 --os linux
|
||||
docker manifest push $TARGET
|
||||
|
||||
TARGET=jc5x/firefly-iii:stable
|
||||
ARM32=jc5x/firefly-iii:stable-arm
|
||||
ARM64=jc5x/firefly-iii:stable-arm64
|
||||
AMD64=jc5x/firefly-iii:stable-amd64
|
||||
|
||||
echo "Push stable-* builds to $TARGET"
|
||||
|
||||
docker manifest create $TARGET $ARM32 $ARM64 $AMD64
|
||||
docker manifest annotate $TARGET $ARM32 --arch arm --os linux
|
||||
docker manifest annotate $TARGET $ARM64 --arch arm64 --os linux
|
||||
docker manifest annotate $TARGET $AMD64 --arch amd64 --os linux
|
||||
docker manifest push $TARGET
|
||||
|
||||
if [ "$TRAVIS_BRANCH" == "master" ]; then
|
||||
TARGET=jc5x/firefly-iii:latest
|
||||
ARM=jc5x/firefly-iii:latest-arm
|
||||
AMD=jc5x/firefly-iii:latest-amd64
|
||||
ARM32=jc5x/firefly-iii:stable-arm
|
||||
ARM64=jc5x/firefly-iii:stable-arm64
|
||||
AMD64=jc5x/firefly-iii:stable-amd64
|
||||
|
||||
docker manifest create $TARGET $AMD $ARM
|
||||
docker manifest annotate $TARGET $ARM --arch arm --os linux
|
||||
docker manifest annotate $TARGET $AMD --arch amd64 --os linux
|
||||
docker manifest push $TARGET
|
||||
echo "Push stable-* builds to $TARGET"
|
||||
|
||||
# and another one for version specific:
|
||||
TARGET=jc5x/firefly-iii:release-$VERSION
|
||||
ARM=jc5x/firefly-iii:release-$VERSION-arm
|
||||
AMD=jc5x/firefly-iii:release-$VERSION-amd64
|
||||
|
||||
docker manifest create $TARGET $AMD $ARM
|
||||
docker manifest annotate $TARGET $ARM --arch arm --os linux
|
||||
docker manifest annotate $TARGET $AMD --arch amd64 --os linux
|
||||
docker manifest create $TARGET $ARM32 $ARM64 $AMD64
|
||||
docker manifest annotate $TARGET $ARM32 --arch arm --os linux
|
||||
docker manifest annotate $TARGET $ARM64 --arch arm64 --os linux
|
||||
docker manifest annotate $TARGET $AMD64 --arch amd64 --os linux
|
||||
docker manifest push $TARGET
|
||||
fi
|
||||
|
||||
# push to channel 'version' if master
|
||||
if [ $TRAVIS_BRANCH == "master" ]; then
|
||||
TARGET=jc5x/firefly-iii:release-$VERSION
|
||||
ARM32=jc5x/firefly-iii:stable-arm
|
||||
ARM64=jc5x/firefly-iii:stable-arm64
|
||||
AMD64=jc5x/firefly-iii:stable-amd64
|
||||
|
||||
echo "GitHub branch is $TRAVIS_BRANCH."
|
||||
echo "Channel is $CHANNEL."
|
||||
echo "Push stable-* builds to $TARGET"
|
||||
|
||||
docker manifest create $TARGET $ARM32 $ARM64 $AMD64
|
||||
docker manifest annotate $TARGET $ARM32 --arch arm --os linux
|
||||
docker manifest annotate $TARGET $ARM64 --arch arm64 --os linux
|
||||
docker manifest annotate $TARGET $AMD64 --arch amd64 --os linux
|
||||
docker manifest push $TARGET
|
||||
fi
|
||||
|
||||
echo 'Done!'
|
||||
# done!
|
||||
103
.deploy/docker/travis.sh
Executable file
103
.deploy/docker/travis.sh
Executable file
@@ -0,0 +1,103 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
echo "travis.sh: I am building channel ${CHANNEL} for version ${VERSION} on architecture ${ARCH}, branch $TRAVIS_BRANCH."
|
||||
|
||||
echo '{"experimental":true}' | sudo tee /etc/docker/daemon.json
|
||||
mkdir $HOME/.docker
|
||||
touch $HOME/.docker/config.json
|
||||
echo '{"experimental":"enabled"}' | sudo tee $HOME/.docker/config.json
|
||||
sudo service docker restart
|
||||
|
||||
# First build amd64 image:
|
||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
|
||||
if [ $ARCH == "arm" ]; then
|
||||
echo "Because architecture is $ARCH running some extra commands."
|
||||
docker run --rm --privileged multiarch/qemu-user-static:register --reset
|
||||
|
||||
# get qemu-arm-static binary
|
||||
mkdir tmp
|
||||
pushd tmp && \
|
||||
curl -L -o qemu-arm-static.tar.gz https://github.com/multiarch/qemu-user-static/releases/download/v2.6.0/qemu-arm-static.tar.gz && \
|
||||
tar xzf qemu-arm-static.tar.gz && \
|
||||
popd
|
||||
fi
|
||||
|
||||
# if the github branch is develop, build and push develop. Don't push a version tag anymore.
|
||||
if [ $TRAVIS_BRANCH == "develop" ]; then
|
||||
LABEL=jc5x/firefly-iii:develop-$ARCH
|
||||
echo "GitHub branch is $TRAVIS_BRANCH. Will build and push $LABEL"
|
||||
docker build -t $LABEL -f Dockerfile.$ARCH .
|
||||
docker push $LABEL
|
||||
fi
|
||||
|
||||
# if branch = master AND channel = alpha, build and push 'alpha'
|
||||
if [ $TRAVIS_BRANCH == "master" ] && [ $CHANNEL == "alpha" ]; then
|
||||
LABEL=jc5x/firefly-iii:alpha-$ARCH
|
||||
echo "GitHub branch is $TRAVIS_BRANCH and channel is $CHANNEL. Will build and push $LABEL"
|
||||
docker build -t $LABEL -f Dockerfile.$ARCH .
|
||||
docker push $LABEL
|
||||
fi
|
||||
|
||||
# if branch is master and channel is alpha, build and push 'alpha' and 'beta'.
|
||||
if [ $TRAVIS_BRANCH == "master" ] && [ $CHANNEL == "beta" ]; then
|
||||
LABEL=jc5x/firefly-iii:beta-$ARCH
|
||||
echo "GitHub branch is $TRAVIS_BRANCH and channel is $CHANNEL. Will build and push $LABEL"
|
||||
docker build -t $LABEL -f Dockerfile.$ARCH .
|
||||
docker push $LABEL
|
||||
|
||||
# then tag as alpha and push:
|
||||
docker tag $LABEL jc5x/firefly-iii:alpha-$ARCH
|
||||
docker push jc5x/firefly-iii:alpha-$ARCH
|
||||
echo "Also tagged $LABEL as jc5x/firefly-iii:alpha-$ARCH and pushed"
|
||||
fi
|
||||
|
||||
# if branch is master and channel is stable, push 'alpha' and 'beta' and 'stable'.
|
||||
if [ $TRAVIS_BRANCH == "master" ] && [ $CHANNEL == "stable" ]; then
|
||||
# first build stable
|
||||
LABEL=jc5x/firefly-iii:stable-$ARCH
|
||||
echo "GitHub branch is $TRAVIS_BRANCH and channel is $CHANNEL. Will build and push $LABEL"
|
||||
docker build -t $LABEL -f Dockerfile.$ARCH .
|
||||
docker push $LABEL
|
||||
|
||||
# then tag as beta and push:
|
||||
docker tag $LABEL jc5x/firefly-iii:beta-$ARCH
|
||||
docker push jc5x/firefly-iii:beta-$ARCH
|
||||
echo "Also tagged $LABEL as jc5x/firefly-iii:beta-$ARCH and pushed"
|
||||
|
||||
# then tag as alpha and push:
|
||||
docker tag $LABEL jc5x/firefly-iii:alpha-$ARCH
|
||||
docker push jc5x/firefly-iii:alpha-$ARCH
|
||||
echo "Also tagged $LABEL as jc5x/firefly-iii:alpha-$ARCH and pushed"
|
||||
|
||||
# then tag as latest and push:
|
||||
docker tag $LABEL jc5x/firefly-iii:latest-$ARCH
|
||||
docker push jc5x/firefly-iii:latest-$ARCH
|
||||
echo "Also tagged $LABEL as jc5x/firefly-iii:latest-$ARCH and pushed"
|
||||
fi
|
||||
|
||||
# push to channel 'version' if master + alpha
|
||||
if [ $TRAVIS_BRANCH == "master" ] && [$CHANNEL == "alpha"]; then
|
||||
LABEL=jc5x/firefly-iii:version-$VERSION-$ARCH
|
||||
echo "GitHub branch is $TRAVIS_BRANCH and channel is $CHANNEL. Will also push alpha as $LABEL"
|
||||
docker tag jc5x/firefly-iii:alpha-$ARCH $LABEL
|
||||
docker push $LABEL
|
||||
fi
|
||||
|
||||
# push to channel 'version' if master + beta
|
||||
if [ $TRAVIS_BRANCH == "master" ] && [$CHANNEL == "beta"]; then
|
||||
LABEL=jc5x/firefly-iii:version-$VERSION-$ARCH
|
||||
echo "GitHub branch is $TRAVIS_BRANCH and channel is $CHANNEL. Will also push beta as $LABEL"
|
||||
docker tag jc5x/firefly-iii:beta-$ARCH $LABEL
|
||||
docker push $LABEL
|
||||
fi
|
||||
|
||||
# push to channel 'version' if master + stable
|
||||
if [ $TRAVIS_BRANCH == "master" ] && [$CHANNEL == "stable"]; then
|
||||
LABEL=jc5x/firefly-iii:version-$VERSION-$ARCH
|
||||
echo "GitHub branch is $TRAVIS_BRANCH and channel is $CHANNEL. Will also push beta as $LABEL"
|
||||
docker tag jc5x/firefly-iii:stable-$ARCH $LABEL
|
||||
docker push $LABEL
|
||||
fi
|
||||
|
||||
echo "Done!"
|
||||
@@ -1,26 +0,0 @@
|
||||
server {
|
||||
listen 80 default_server;
|
||||
|
||||
server_name _ *.vm docker;
|
||||
|
||||
root "/app/public";
|
||||
index index.php;
|
||||
|
||||
include /opt/docker/etc/nginx/vhost.common.d/*.conf;
|
||||
}
|
||||
|
||||
##############
|
||||
# SSL
|
||||
##############
|
||||
|
||||
server {
|
||||
listen 443 default_server;
|
||||
|
||||
server_name _ *.vm docker;
|
||||
|
||||
root "/app/public";
|
||||
index index.php;
|
||||
|
||||
include /opt/docker/etc/nginx/vhost.common.d/*.conf;
|
||||
include /opt/docker/etc/nginx/vhost.ssl.conf;
|
||||
}
|
||||
13
.env.example
13
.env.example
@@ -26,10 +26,12 @@ APP_URL=http://localhost
|
||||
TRUSTED_PROXIES=
|
||||
|
||||
# The log channel defines where your log entries go to.
|
||||
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
|
||||
# - If you use DOCKER, use 'docker_out'
|
||||
# - For everything else, use 'daily'
|
||||
|
||||
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
|
||||
# Also available are 'syslog', 'errorlog' and 'stdout' which will log to the system itself.
|
||||
LOG_CHANNEL=daily
|
||||
LOG_CHANNEL=docker_out
|
||||
|
||||
# Log level. You can set this from least severe to most severe:
|
||||
# debug, info, notice, warning, error, critical, alert, emergency
|
||||
@@ -38,7 +40,7 @@ LOG_CHANNEL=daily
|
||||
APP_LOG_LEVEL=notice
|
||||
|
||||
# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III
|
||||
# For other database types, please see the FAQ: http://firefly-iii.readthedocs.io/en/latest/support/faq.html
|
||||
# For other database types, please see the FAQ: https://docs.firefly-iii.org/support/faq
|
||||
DB_CONNECTION=pgsql
|
||||
DB_HOST=firefly_iii_db
|
||||
DB_PORT=5432
|
||||
@@ -76,7 +78,7 @@ COOKIE_DOMAIN=
|
||||
COOKIE_SECURE=false
|
||||
|
||||
# If you want Firefly III to mail you, update these settings
|
||||
# For instructions, see: https://firefly-iii.readthedocs.io/en/latest/installation/mail.html
|
||||
# For instructions, see: https://docs.firefly-iii.org/advanced-installation/email
|
||||
MAIL_DRIVER=log
|
||||
MAIL_HOST=smtp.mailtrap.io
|
||||
MAIL_PORT=2525
|
||||
@@ -121,7 +123,7 @@ ANALYTICS_ID=
|
||||
# Firefly III has two options for user authentication. "eloquent" is the default,
|
||||
# and "ldap" for LDAP servers.
|
||||
# For full instructions on these settings please visit:
|
||||
# https://firefly-iii.readthedocs.io/en/latest/installation/authentication.html
|
||||
# https://docs.firefly-iii.org/advanced-installation/authentication
|
||||
LOGIN_PROVIDER=eloquent
|
||||
|
||||
# LDAP connection configuration
|
||||
@@ -180,6 +182,7 @@ DEMO_USERNAME=
|
||||
DEMO_PASSWORD=
|
||||
USE_ENCRYPTION=false
|
||||
IS_SANDSTORM=false
|
||||
IS_DOCKER=false
|
||||
IS_HEROKU=false
|
||||
BUNQ_USE_SANDBOX=false
|
||||
FFIII_LAYOUT=v1
|
||||
|
||||
39
.travis.yml
39
.travis.yml
@@ -1,9 +1,5 @@
|
||||
sudo: required
|
||||
language: bash
|
||||
env:
|
||||
- VERSION=4.8.1.6
|
||||
|
||||
dist: xenial
|
||||
|
||||
# safelist
|
||||
branches:
|
||||
@@ -14,16 +10,25 @@ branches:
|
||||
services:
|
||||
- docker
|
||||
|
||||
script:
|
||||
# enable experimental features.
|
||||
- echo '{"experimental":true}' | sudo tee /etc/docker/daemon.json
|
||||
- mkdir $HOME/.docker
|
||||
- touch $HOME/.docker/config.json
|
||||
- echo '{"experimental":"enabled"}' | sudo tee $HOME/.docker/config.json
|
||||
- sudo service docker restart
|
||||
- docker version -f '{{.Server.Experimental}}'
|
||||
- docker version
|
||||
# build everything
|
||||
- .deploy/docker/build-amd64.sh
|
||||
- .deploy/docker/build-arm.sh
|
||||
- .deploy/docker/manifest.sh
|
||||
jobs:
|
||||
include:
|
||||
- dist: xenial
|
||||
arch: amd64
|
||||
env: ARCH=amd64 CHANNEL=alpha VERSION=4.8.2-alpha.1
|
||||
stage: build
|
||||
script: ./.deploy/docker/travis.sh
|
||||
- dist: xenial
|
||||
arch: amd64
|
||||
env: ARCH=arm CHANNEL=alpha VERSION=4.8.2-alpha.1
|
||||
stage: build
|
||||
script: ./.deploy/docker/travis.sh
|
||||
- dist: xenial
|
||||
arch: arm64
|
||||
env: ARCH=arm64 CHANNEL=alpha VERSION=4.8.2-alpha.1
|
||||
stage: build
|
||||
script: ./.deploy/docker/travis.sh
|
||||
- dist: xenial
|
||||
arch: amd64
|
||||
env: CHANNEL=alpha VERSION=4.8.2-alpha.1
|
||||
stage: manifest
|
||||
script: ./.deploy/docker/manifest.sh
|
||||
@@ -1,25 +1,13 @@
|
||||
FROM arm32v7/php:7.2-apache-stretch
|
||||
ARG ARCH
|
||||
COPY tmp/qemu-arm-static /usr/bin/qemu-arm-static
|
||||
FROM jc5x/firefly-iii-base-image:latest-arm
|
||||
|
||||
# See also: https://github.com/JC5/firefly-iii-base-image
|
||||
|
||||
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
|
||||
LABEL version="1.5" maintainer="thegrumpydictator@gmail.com"
|
||||
|
||||
# Create volumes
|
||||
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
|
||||
|
||||
# Install stuff Firefly III runs with & depends on: php extensions, locales, dev headers and composer
|
||||
RUN apt-get update && apt-get install -y locales unzip && apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ADD https://raw.githubusercontent.com/mlocati/docker-php-extension-installer/master/install-php-extensions /usr/local/bin/
|
||||
|
||||
RUN chmod uga+x /usr/local/bin/install-php-extensions && sync && \
|
||||
install-php-extensions --cleanup bcmath ldap gd pdo_pgsql pdo_sqlite pdo_mysql intl opcache memcached
|
||||
|
||||
RUN a2enmod rewrite && a2enmod ssl
|
||||
RUN echo "hu_HU.UTF-8 UTF-8\nro_RO.UTF-8 UTF-8\nnb_NO.UTF-8 UTF-8\nde_DE.UTF-8 UTF-8\ncs_CZ.UTF-8 UTF-8\nen_US.UTF-8 UTF-8\nes_ES.UTF-8 UTF-8\nfr_FR.UTF-8 UTF-8\nid_ID.UTF-8 UTF-8\nit_IT.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npl_PL.UTF-8 UTF-8\npt_BR.UTF-8 UTF-8\nru_RU.UTF-8 UTF-8\ntr_TR.UTF-8 UTF-8\nzh_TW.UTF-8 UTF-8\nzh_CN.UTF-8 UTF-8\n\n" > /etc/locale.gen
|
||||
RUN locale-gen
|
||||
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
|
||||
|
||||
# Copy in Firefly III source
|
||||
WORKDIR $FIREFLY_PATH
|
||||
ADD . $FIREFLY_PATH
|
||||
@@ -29,15 +17,6 @@ RUN chown -R www-data:www-data /var/www && \
|
||||
chmod -R 775 $FIREFLY_PATH/storage && \
|
||||
composer install --prefer-dist --no-dev --no-scripts --no-suggest
|
||||
|
||||
# copy ca certs to correct location
|
||||
COPY ./.deploy/docker/cacert.pem /usr/local/ssl/cert.pem
|
||||
|
||||
# copy Apache config to correct spot.
|
||||
COPY ./.deploy/docker/apache2.conf /etc/apache2/apache2.conf
|
||||
|
||||
# Enable default site (Firefly III)
|
||||
COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf
|
||||
|
||||
# Expose port 80
|
||||
EXPOSE 80
|
||||
|
||||
|
||||
@@ -98,15 +98,15 @@ class AttachmentController extends Controller
|
||||
public function download(Attachment $attachment): LaravelResponse
|
||||
{
|
||||
if (false === $attachment->uploaded) {
|
||||
throw new FireflyException('No file has been uploaded for this attachment (yet).');
|
||||
throw new FireflyException('200000: File has not been uploaded (yet).');
|
||||
}
|
||||
if (0 === $attachment->size) {
|
||||
throw new FireflyException('No file has been uploaded for this attachment (yet).');
|
||||
throw new FireflyException('200000: File has not been uploaded (yet).');
|
||||
}
|
||||
if ($this->repository->exists($attachment)) {
|
||||
$content = $this->repository->getContent($attachment);
|
||||
if ('' === $content) {
|
||||
throw new FireflyException('No file has been uploaded for this attachment (yet).');
|
||||
throw new FireflyException('200002: File is empty (zero bytes).');
|
||||
}
|
||||
$quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\'));
|
||||
|
||||
@@ -125,7 +125,7 @@ class AttachmentController extends Controller
|
||||
|
||||
return $response;
|
||||
}
|
||||
throw new FireflyException('Could not find the indicated attachment. The file is no longer there.');
|
||||
throw new FireflyException('200003: File does not exist.');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -211,20 +211,16 @@ class BillController extends Controller
|
||||
*/
|
||||
public function store(BillRequest $request): JsonResponse
|
||||
{
|
||||
$bill = $this->repository->store($request->getAll());
|
||||
if (null !== $bill) {
|
||||
$manager = $this->getManager();
|
||||
$bill = $this->repository->store($request->getAll());
|
||||
$manager = $this->getManager();
|
||||
|
||||
/** @var BillTransformer $transformer */
|
||||
$transformer = app(BillTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
/** @var BillTransformer $transformer */
|
||||
$transformer = app(BillTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
|
||||
$resource = new Item($bill, $transformer, 'bills');
|
||||
|
||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||
}
|
||||
throw new FireflyException('Could not store new bill.'); // @codeCoverageIgnore
|
||||
$resource = new Item($bill, $transformer, 'bills');
|
||||
|
||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -187,19 +187,16 @@ class BudgetController extends Controller
|
||||
*/
|
||||
public function store(BudgetRequest $request): JsonResponse
|
||||
{
|
||||
$budget = $this->repository->store($request->getAll());
|
||||
if (null !== $budget) {
|
||||
$manager = $this->getManager();
|
||||
$budget = $this->repository->store($request->getAll());
|
||||
$manager = $this->getManager();
|
||||
|
||||
/** @var BudgetTransformer $transformer */
|
||||
$transformer = app(BudgetTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
/** @var BudgetTransformer $transformer */
|
||||
$transformer = app(BudgetTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
|
||||
$resource = new Item($budget, $transformer, 'budgets');
|
||||
$resource = new Item($budget, $transformer, 'budgets');
|
||||
|
||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||
}
|
||||
throw new FireflyException('Could not store new budget.'); // @codeCoverageIgnore
|
||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -165,7 +165,7 @@ class BudgetLimitController extends Controller
|
||||
$data = $request->getAll();
|
||||
$budget = $this->repository->findNull($data['budget_id']);
|
||||
if (null === $budget) {
|
||||
throw new FireflyException('Unknown budget.');
|
||||
throw new FireflyException('200004: Budget does not exist.');
|
||||
}
|
||||
$data['budget'] = $budget;
|
||||
$budgetLimit = $this->blRepository->storeBudgetLimit($data);
|
||||
|
||||
@@ -152,18 +152,15 @@ class CategoryController extends Controller
|
||||
public function store(CategoryRequest $request): JsonResponse
|
||||
{
|
||||
$category = $this->repository->store($request->getAll());
|
||||
if (null !== $category) {
|
||||
$manager = $this->getManager();
|
||||
$manager = $this->getManager();
|
||||
|
||||
/** @var CategoryTransformer $transformer */
|
||||
$transformer = app(CategoryTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
/** @var CategoryTransformer $transformer */
|
||||
$transformer = app(CategoryTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
|
||||
$resource = new Item($category, $transformer, 'categories');
|
||||
$resource = new Item($category, $transformer, 'categories');
|
||||
|
||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||
}
|
||||
throw new FireflyException('Could not store new category.'); // @codeCoverageIgnore
|
||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -57,7 +57,7 @@ class ConfigurationController extends Controller
|
||||
$admin = auth()->user();
|
||||
|
||||
if (!$this->repository->hasRole($admin, 'owner')) {
|
||||
throw new FireflyException('No access to method.'); // @codeCoverageIgnore
|
||||
throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
|
||||
@@ -313,10 +313,10 @@ class CurrencyController extends Controller
|
||||
|
||||
if (!$this->userRepository->hasRole($admin, 'owner')) {
|
||||
// access denied:
|
||||
throw new FireflyException('No access to method, user is not owner.'); // @codeCoverageIgnore
|
||||
throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore
|
||||
}
|
||||
if ($this->repository->currencyInUse($currency)) {
|
||||
throw new FireflyException('No access to method, currency is in use.'); // @codeCoverageIgnore
|
||||
throw new FireflyException('200006: Currency in use.'); // @codeCoverageIgnore
|
||||
}
|
||||
$this->repository->destroy($currency);
|
||||
|
||||
@@ -574,26 +574,21 @@ class CurrencyController extends Controller
|
||||
public function store(CurrencyRequest $request): JsonResponse
|
||||
{
|
||||
$currency = $this->repository->store($request->getAll());
|
||||
|
||||
if (null !== $currency) {
|
||||
if (true === $request->boolean('default')) {
|
||||
app('preferences')->set('currencyPreference', $currency->code);
|
||||
app('preferences')->mark();
|
||||
}
|
||||
$manager = $this->getManager();
|
||||
$defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user());
|
||||
$this->parameters->set('defaultCurrency', $defaultCurrency);
|
||||
|
||||
/** @var CurrencyTransformer $transformer */
|
||||
$transformer = app(CurrencyTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
|
||||
$resource = new Item($currency, $transformer, 'currencies');
|
||||
|
||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||
if (true === $request->boolean('default')) {
|
||||
app('preferences')->set('currencyPreference', $currency->code);
|
||||
app('preferences')->mark();
|
||||
}
|
||||
throw new FireflyException('Could not store new currency.'); // @codeCoverageIgnore
|
||||
$manager = $this->getManager();
|
||||
$defaultCurrency = app('amount')->getDefaultCurrencyByUser(auth()->user());
|
||||
$this->parameters->set('defaultCurrency', $defaultCurrency);
|
||||
|
||||
/** @var CurrencyTransformer $transformer */
|
||||
$transformer = app(CurrencyTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
|
||||
$resource = new Item($currency, $transformer, 'currencies');
|
||||
|
||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -79,10 +79,10 @@ class CurrencyExchangeRateController extends Controller
|
||||
$toCurrency = $this->repository->findByCodeNull($request->get('to') ?? 'USD');
|
||||
|
||||
if (null === $fromCurrency) {
|
||||
throw new FireflyException('Unknown source currency.');
|
||||
throw new FireflyException('200007: Unknown source currency');
|
||||
}
|
||||
if (null === $toCurrency) {
|
||||
throw new FireflyException('Unknown destination currency.');
|
||||
throw new FireflyException('200007: Unknown destination currency');
|
||||
}
|
||||
|
||||
/** @var Carbon $dateObj */
|
||||
|
||||
@@ -86,7 +86,7 @@ class LinkTypeController extends Controller
|
||||
public function delete(LinkType $linkType): JsonResponse
|
||||
{
|
||||
if (false === $linkType->editable) {
|
||||
throw new FireflyException(sprintf('You cannot delete this link type (#%d, "%s")', $linkType->id, $linkType->name));
|
||||
throw new FireflyException('200020: Link type cannot be changed.');
|
||||
}
|
||||
$this->repository->destroy($linkType);
|
||||
|
||||
@@ -160,7 +160,7 @@ class LinkTypeController extends Controller
|
||||
$admin = auth()->user();
|
||||
|
||||
if (!$this->userRepository->hasRole($admin, 'owner')) {
|
||||
throw new FireflyException('You need the "owner"-role to do this.');
|
||||
throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore
|
||||
}
|
||||
$data = $request->getAll();
|
||||
// if currency ID is 0, find the currency by the code:
|
||||
@@ -247,14 +247,14 @@ class LinkTypeController extends Controller
|
||||
public function update(LinkTypeRequest $request, LinkType $linkType): JsonResponse
|
||||
{
|
||||
if (false === $linkType->editable) {
|
||||
throw new FireflyException(sprintf('You cannot edit this link type (#%d, "%s")', $linkType->id, $linkType->name));
|
||||
throw new FireflyException('200020: Link type cannot be changed.');
|
||||
}
|
||||
|
||||
/** @var User $admin */
|
||||
$admin = auth()->user();
|
||||
|
||||
if (!$this->userRepository->hasRole($admin, 'owner')) {
|
||||
throw new FireflyException('You need the "owner"-role to do this.');
|
||||
throw new FireflyException('200005: You need the "owner" role to do this.'); // @codeCoverageIgnore
|
||||
}
|
||||
|
||||
$data = $request->getAll();
|
||||
|
||||
@@ -181,19 +181,15 @@ class PiggyBankController extends Controller
|
||||
public function store(PiggyBankRequest $request): JsonResponse
|
||||
{
|
||||
$piggyBank = $this->repository->store($request->getAll());
|
||||
if (null !== $piggyBank) {
|
||||
$manager = $this->getManager();
|
||||
$manager = $this->getManager();
|
||||
|
||||
/** @var PiggyBankTransformer $transformer */
|
||||
$transformer = app(PiggyBankTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
/** @var PiggyBankTransformer $transformer */
|
||||
$transformer = app(PiggyBankTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
|
||||
$resource = new Item($piggyBank, $transformer, 'piggy_banks');
|
||||
|
||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||
}
|
||||
throw new FireflyException('Could not store new piggy bank.');
|
||||
$resource = new Item($piggyBank, $transformer, 'piggy_banks');
|
||||
|
||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -236,7 +236,7 @@ class RecurrenceController extends Controller
|
||||
$result = $recurring->fire();
|
||||
} catch (FireflyException $e) {
|
||||
Log::error($e->getMessage());
|
||||
throw new FireflyException('Could not fire recurring cron job.');
|
||||
throw new FireflyException('200022: Error in cron job.');
|
||||
}
|
||||
if (false === $result) {
|
||||
return response()->json([], 204);
|
||||
|
||||
@@ -257,7 +257,7 @@ class RuleGroupController extends Controller
|
||||
/** @var Collection $rules */
|
||||
$rules = $this->ruleGroupRepository->getActiveRules($group);
|
||||
if (0 === $rules->count()) {
|
||||
throw new FireflyException('No rules in this rule group.');
|
||||
throw new FireflyException('200023: No rules in this rule group.');
|
||||
}
|
||||
$parameters = $request->getTestParameters();
|
||||
$matchingTransactions = [];
|
||||
|
||||
116
app/Api/V1/Controllers/Search/TransferController.php
Normal file
116
app/Api/V1/Controllers/Search/TransferController.php
Normal file
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
/**
|
||||
* TransferController.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace FireflyIII\Api\V1\Controllers\Search;
|
||||
|
||||
|
||||
use FireflyIII\Api\V1\Controllers\Controller;
|
||||
use FireflyIII\Api\V1\Requests\Search\TransferRequest;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||
use FireflyIII\Support\Search\TransferSearch;
|
||||
use FireflyIII\Transformers\TransactionGroupTransformer;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
||||
use League\Fractal\Resource\Collection as FractalCollection;
|
||||
|
||||
/**
|
||||
* Class TransferController
|
||||
*/
|
||||
class TransferController extends Controller
|
||||
{
|
||||
/**
|
||||
* @param Request $request
|
||||
*
|
||||
* @return JsonResponse|Response
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function search(TransferRequest $request)
|
||||
{
|
||||
// configure transfer search to search for a > b
|
||||
$search = app(TransferSearch::class);
|
||||
$search->setSource($request->get('source'));
|
||||
$search->setDestination($request->get('destination'));
|
||||
$search->setAmount($request->get('amount'));
|
||||
$search->setDescription($request->get('description'));
|
||||
$search->setDate($request->get('date'));
|
||||
|
||||
$left = $search->search();
|
||||
|
||||
// configure transfer search to search for b > a
|
||||
$search->setSource($request->get('destination'));
|
||||
$search->setDestination($request->get('source'));
|
||||
$search->setAmount($request->get('amount'));
|
||||
$search->setDescription($request->get('description'));
|
||||
$search->setDate($request->get('date'));
|
||||
|
||||
$right = $search->search();
|
||||
|
||||
// add parameters to URL:
|
||||
$this->parameters->set('source', $request->get('source'));
|
||||
$this->parameters->set('destination', $request->get('destination'));
|
||||
$this->parameters->set('amount', $request->get('amount'));
|
||||
$this->parameters->set('description', $request->get('description'));
|
||||
$this->parameters->set('date', $request->get('date'));
|
||||
|
||||
// get all journal ID's.
|
||||
$total = $left->merge($right)->unique('id')->pluck('id')->toArray();
|
||||
if (0 === count($total)) {
|
||||
// forces search to be empty.
|
||||
$total = [-1];
|
||||
}
|
||||
|
||||
// collector to return results.
|
||||
$pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
|
||||
$manager = $this->getManager();
|
||||
/** @var User $admin */
|
||||
$admin = auth()->user();
|
||||
|
||||
// use new group collector:
|
||||
/** @var GroupCollectorInterface $collector */
|
||||
$collector = app(GroupCollectorInterface::class);
|
||||
$collector
|
||||
->setUser($admin)
|
||||
// all info needed for the API:
|
||||
->withAPIInformation()
|
||||
// set page size:
|
||||
->setLimit($pageSize)
|
||||
// set page to retrieve
|
||||
->setPage(1)
|
||||
->setJournalIds($total);
|
||||
|
||||
$paginator = $collector->getPaginatedGroups();
|
||||
$paginator->setPath(route('api.v1.search.transfers') . $this->buildParams());
|
||||
$transactions = $paginator->getCollection();
|
||||
|
||||
/** @var TransactionGroupTransformer $transformer */
|
||||
$transformer = app(TransactionGroupTransformer::class);
|
||||
$transformer->setParameters($this->parameters);
|
||||
|
||||
$resource = new FractalCollection($transactions, $transformer, 'transactions');
|
||||
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
||||
|
||||
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,7 @@ use FireflyIII\Api\V1\Requests\TransactionStoreRequest;
|
||||
use FireflyIII\Api\V1\Requests\TransactionUpdateRequest;
|
||||
use FireflyIII\Events\StoredTransactionGroup;
|
||||
use FireflyIII\Events\UpdatedTransactionGroup;
|
||||
use FireflyIII\Exceptions\DuplicateTransactionException;
|
||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||
use FireflyIII\Models\TransactionGroup;
|
||||
use FireflyIII\Models\TransactionJournal;
|
||||
@@ -279,7 +280,20 @@ class TransactionController extends Controller
|
||||
Log::channel('audit')
|
||||
->info('Store new transaction over API.', $data);
|
||||
|
||||
$transactionGroup = $this->groupRepository->store($data);
|
||||
try {
|
||||
$transactionGroup = $this->groupRepository->store($data);
|
||||
} catch (DuplicateTransactionException $e) {
|
||||
// return bad validation message.
|
||||
// TODO use Laravel's internal validation thing to do this.
|
||||
$response = [
|
||||
'message' => 'The given data was invalid.',
|
||||
'errors' => [
|
||||
'transactions.0.description' => [$e->getMessage()],
|
||||
],
|
||||
];
|
||||
|
||||
return response()->json($response, 422);
|
||||
}
|
||||
|
||||
event(new StoredTransactionGroup($transactionGroup));
|
||||
|
||||
|
||||
@@ -165,7 +165,7 @@ class TransactionLinkController extends Controller
|
||||
$inward = $this->journalRepository->findNull($data['inward_id'] ?? 0);
|
||||
$outward = $this->journalRepository->findNull($data['outward_id'] ?? 0);
|
||||
if (null === $inward || null === $outward) {
|
||||
throw new FireflyException('Source or destination is NULL.');
|
||||
throw new FireflyException('200024: Source or destination does not exist.');
|
||||
}
|
||||
$data['direction'] = 'inward';
|
||||
|
||||
@@ -196,7 +196,7 @@ class TransactionLinkController extends Controller
|
||||
$data['inward'] = $this->journalRepository->findNull($data['inward_id'] ?? 0);
|
||||
$data['outward'] = $this->journalRepository->findNull($data['outward_id'] ?? 0);
|
||||
if (null === $data['inward'] || null === $data['outward']) {
|
||||
throw new FireflyException('Source or destination is NULL.');
|
||||
throw new FireflyException('200024: Source or destination does not exist.');
|
||||
}
|
||||
$data['direction'] = 'inward';
|
||||
$journalLink = $this->repository->updateLink($journalLink, $data);
|
||||
|
||||
@@ -83,7 +83,7 @@ class UserController extends Controller
|
||||
|
||||
return response()->json([], 204);
|
||||
}
|
||||
throw new FireflyException('No access to method.'); // @codeCoverageIgnore
|
||||
throw new FireflyException('200025: No access to function.'); // @codeCoverageIgnore
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
58
app/Api/V1/Requests/Search/TransferRequest.php
Normal file
58
app/Api/V1/Requests/Search/TransferRequest.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
/**
|
||||
* TransferRequest.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace FireflyIII\Api\V1\Requests\Search;
|
||||
|
||||
|
||||
use FireflyIII\Api\V1\Requests\Request;
|
||||
use FireflyIII\Rules\IsTransferAccount;
|
||||
|
||||
/**
|
||||
* Class TransferRequest
|
||||
*/
|
||||
class TransferRequest extends Request
|
||||
{
|
||||
/**
|
||||
* Authorize logged in users.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
// Only allow authenticated users
|
||||
return auth()->check();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'source' => ['required', new IsTransferAccount],
|
||||
'destination' => ['required', new IsTransferAccount],
|
||||
'amount' => 'required|numeric|more:0',
|
||||
'description' => 'required|min:1',
|
||||
'date' => 'required|date',
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -58,8 +58,9 @@ class TransactionStoreRequest extends Request
|
||||
public function getAll(): array
|
||||
{
|
||||
$data = [
|
||||
'group_title' => $this->string('group_title'),
|
||||
'transactions' => $this->getTransactionData(),
|
||||
'group_title' => $this->string('group_title'),
|
||||
'error_if_duplicate_hash' => $this->boolean('error_if_duplicate_hash'),
|
||||
'transactions' => $this->getTransactionData(),
|
||||
];
|
||||
|
||||
return $data;
|
||||
@@ -75,6 +76,7 @@ class TransactionStoreRequest extends Request
|
||||
$rules = [
|
||||
// basic fields for group:
|
||||
'group_title' => 'between:1,1000|nullable',
|
||||
'error_if_duplicate_hash' => [new IsBoolean],
|
||||
|
||||
// transaction rules (in array for splits):
|
||||
'transactions.*.type' => 'required|in:withdrawal,deposit,transfer,opening-balance,reconciliation',
|
||||
|
||||
@@ -30,6 +30,7 @@ use FireflyIII\Models\Transaction;
|
||||
use FireflyIII\Models\TransactionJournal;
|
||||
use FireflyIII\Models\TransactionType;
|
||||
use Illuminate\Console\Command;
|
||||
use Log;
|
||||
|
||||
/**
|
||||
* Class FixAccountTypes
|
||||
@@ -66,6 +67,7 @@ class FixAccountTypes extends Command
|
||||
public function handle(): int
|
||||
{
|
||||
$this->stupidLaravel();
|
||||
Log::debug('Now in fix-account-types');
|
||||
$start = microtime(true);
|
||||
$this->factory = app(AccountFactory::class);
|
||||
// some combinations can be fixed by this script:
|
||||
@@ -88,13 +90,16 @@ class FixAccountTypes extends Command
|
||||
|
||||
$this->expected = config('firefly.source_dests');
|
||||
$journals = TransactionJournal::with(['TransactionType', 'transactions', 'transactions.account', 'transactions.account.accounttype'])->get();
|
||||
Log::debug(sprintf('Found %d journals to fix.', $journals->count()));
|
||||
foreach ($journals as $journal) {
|
||||
$this->inspectJournal($journal);
|
||||
}
|
||||
if (0 === $this->count) {
|
||||
Log::debug('No journals had to be fixed.');
|
||||
$this->info('All account types are OK!');
|
||||
}
|
||||
if (0 !== $this->count) {
|
||||
Log::debug(sprintf('%d journals had to be fixed.', $this->count));
|
||||
$this->info(sprintf('Acted on %d transaction(s)!', $this->count));
|
||||
}
|
||||
|
||||
@@ -223,21 +228,36 @@ class FixAccountTypes extends Command
|
||||
*/
|
||||
private function inspectJournal(TransactionJournal $journal): void
|
||||
{
|
||||
Log::debug(sprintf('Now trying to fix journal #%d', $journal->id));
|
||||
$count = $journal->transactions()->count();
|
||||
if (2 !== $count) {
|
||||
Log::debug(sprintf('Journal has %d transactions, so cant fix.', $count));
|
||||
$this->info(sprintf('Cannot inspect transaction journal #%d because it has %d transaction(s) instead of 2.', $journal->id, $count));
|
||||
|
||||
return;
|
||||
}
|
||||
$type = $journal->transactionType->type;
|
||||
$sourceTransaction = $this->getSourceTransaction($journal);
|
||||
$destTransaction = $this->getDestinationTransaction($journal);
|
||||
if (null === $sourceTransaction) {
|
||||
Log::error('Source transaction is unexpectedly NULL. Wont fix this journal.');
|
||||
|
||||
return;
|
||||
}
|
||||
if (null === $destTransaction) {
|
||||
Log::error('Destination transaction is unexpectedly NULL. Wont fix this journal.');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$sourceAccount = $sourceTransaction->account;
|
||||
$sourceAccountType = $sourceAccount->accountType->type;
|
||||
$destTransaction = $this->getDestinationTransaction($journal);
|
||||
$destAccount = $destTransaction->account;
|
||||
$destAccountType = $destAccount->accountType->type;
|
||||
|
||||
if (!isset($this->expected[$type])) {
|
||||
// @codeCoverageIgnoreStart
|
||||
Log::info(sprintf('No source/destination info for transaction type %s.', $type));
|
||||
$this->info(sprintf('No source/destination info for transaction type %s.', $type));
|
||||
|
||||
return;
|
||||
|
||||
31
app/Exceptions/DuplicateTransactionException.php
Normal file
31
app/Exceptions/DuplicateTransactionException.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
/**
|
||||
* DuplicateTransactionException.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace FireflyIII\Exceptions;
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* Class DuplicateTransactionException
|
||||
*/
|
||||
class DuplicateTransactionException extends Exception
|
||||
{
|
||||
|
||||
}
|
||||
@@ -24,10 +24,12 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Factory;
|
||||
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Bill;
|
||||
use FireflyIII\Models\TransactionCurrency;
|
||||
use FireflyIII\Services\Internal\Support\BillServiceTrait;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Database\QueryException;
|
||||
use Log;
|
||||
|
||||
/**
|
||||
@@ -55,6 +57,7 @@ class BillFactory
|
||||
* @param array $data
|
||||
*
|
||||
* @return Bill|null
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function create(array $data): ?Bill
|
||||
{
|
||||
@@ -64,28 +67,31 @@ class BillFactory
|
||||
$currency = $factory->find((int)($data['currency_id'] ?? null), (string)($data['currency_code'] ?? null));
|
||||
|
||||
if (null === $currency) {
|
||||
// use default currency:
|
||||
$currency = app('amount')->getDefaultCurrencyByUser($this->user);
|
||||
}
|
||||
try {
|
||||
/** @var Bill $bill */
|
||||
$bill = Bill::create(
|
||||
[
|
||||
'name' => $data['name'],
|
||||
'match' => 'MIGRATED_TO_RULES',
|
||||
'amount_min' => $data['amount_min'],
|
||||
'user_id' => $this->user->id,
|
||||
'transaction_currency_id' => $currency->id,
|
||||
'amount_max' => $data['amount_max'],
|
||||
'date' => $data['date'],
|
||||
'repeat_freq' => $data['repeat_freq'],
|
||||
'skip' => $data['skip'],
|
||||
'automatch' => true,
|
||||
'active' => $data['active'] ?? true,
|
||||
]
|
||||
);
|
||||
} catch(QueryException $e) {
|
||||
Log::error($e->getMessage());
|
||||
Log::error($e->getTraceAsString());
|
||||
throw new FireflyException('400000: Could not store bill.');
|
||||
}
|
||||
|
||||
/** @var Bill $bill */
|
||||
$bill = Bill::create(
|
||||
[
|
||||
'name' => $data['name'],
|
||||
'match' => 'MIGRATED_TO_RULES',
|
||||
'amount_min' => $data['amount_min'],
|
||||
'user_id' => $this->user->id,
|
||||
'transaction_currency_id' => $currency->id,
|
||||
'amount_max' => $data['amount_max'],
|
||||
'date' => $data['date'],
|
||||
'repeat_freq' => $data['repeat_freq'],
|
||||
'skip' => $data['skip'],
|
||||
'automatch' => true,
|
||||
'active' => $data['active'] ?? true,
|
||||
]
|
||||
);
|
||||
|
||||
// update note:
|
||||
if (isset($data['notes'])) {
|
||||
$this->updateNote($bill, $data['notes']);
|
||||
}
|
||||
|
||||
@@ -24,8 +24,10 @@ declare(strict_types=1);
|
||||
namespace FireflyIII\Factory;
|
||||
|
||||
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Category;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Database\QueryException;
|
||||
use Log;
|
||||
|
||||
/**
|
||||
@@ -62,7 +64,7 @@ class CategoryFactory
|
||||
* @param null|string $categoryName
|
||||
*
|
||||
* @return Category|null
|
||||
*
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function findOrCreate(?int $categoryId, ?string $categoryName): ?Category
|
||||
{
|
||||
@@ -88,13 +90,17 @@ class CategoryFactory
|
||||
if (null !== $category) {
|
||||
return $category;
|
||||
}
|
||||
|
||||
return Category::create(
|
||||
[
|
||||
'user_id' => $this->user->id,
|
||||
'name' => $categoryName,
|
||||
]
|
||||
);
|
||||
try {
|
||||
return Category::create(
|
||||
[
|
||||
'user_id' => $this->user->id,
|
||||
'name' => $categoryName,
|
||||
]
|
||||
);
|
||||
} catch (QueryException $e) {
|
||||
Log::error($e->getMessage());
|
||||
throw new FireflyException('400003: Could not store new category.');
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
@@ -27,6 +27,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Factory;
|
||||
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\TransactionCurrency;
|
||||
use Illuminate\Database\QueryException;
|
||||
use Log;
|
||||
@@ -51,9 +52,10 @@ class TransactionCurrencyFactory
|
||||
/**
|
||||
* @param array $data
|
||||
*
|
||||
* @return TransactionCurrency|null
|
||||
* @return TransactionCurrency
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function create(array $data): ?TransactionCurrency
|
||||
public function create(array $data): TransactionCurrency
|
||||
{
|
||||
try {
|
||||
/** @var TransactionCurrency $currency */
|
||||
@@ -69,6 +71,7 @@ class TransactionCurrencyFactory
|
||||
} catch (QueryException $e) {
|
||||
$result = null;
|
||||
Log::error(sprintf('Could not create new currency: %s', $e->getMessage()));
|
||||
throw new FireflyException('400004: Could not store new currency.');
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
||||
@@ -23,6 +23,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Factory;
|
||||
|
||||
use FireflyIII\Exceptions\DuplicateTransactionException;
|
||||
use FireflyIII\Models\TransactionGroup;
|
||||
use FireflyIII\User;
|
||||
|
||||
@@ -52,10 +53,13 @@ class TransactionGroupFactory
|
||||
* @param array $data
|
||||
*
|
||||
* @return TransactionGroup
|
||||
* @throws DuplicateTransactionException
|
||||
*/
|
||||
public function create(array $data): TransactionGroup
|
||||
{
|
||||
$this->journalFactory->setUser($this->user);
|
||||
$this->journalFactory->setErrorOnHash($data['error_if_duplicate_hash'] ?? false);
|
||||
|
||||
$collection = $this->journalFactory->create($data);
|
||||
$title = $data['group_title'] ?? null;
|
||||
$title = '' === $title ? null : $title;
|
||||
|
||||
@@ -26,10 +26,12 @@ namespace FireflyIII\Factory;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Exception;
|
||||
use FireflyIII\Exceptions\DuplicateTransactionException;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Account;
|
||||
use FireflyIII\Models\TransactionCurrency;
|
||||
use FireflyIII\Models\TransactionJournal;
|
||||
use FireflyIII\Models\TransactionJournalMeta;
|
||||
use FireflyIII\Models\TransactionType;
|
||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
|
||||
@@ -72,6 +74,8 @@ class TransactionJournalFactory
|
||||
private $typeRepository;
|
||||
/** @var User The user */
|
||||
private $user;
|
||||
/** @var bool */
|
||||
private $errorOnHash;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
@@ -81,7 +85,8 @@ class TransactionJournalFactory
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->fields = [
|
||||
$this->errorOnHash = false;
|
||||
$this->fields = [
|
||||
// sepa
|
||||
'sepa_cc', 'sepa_ct_op', 'sepa_ct_id',
|
||||
'sepa_db', 'sepa_country', 'sepa_ep',
|
||||
@@ -119,6 +124,7 @@ class TransactionJournalFactory
|
||||
* @param array $data
|
||||
*
|
||||
* @return Collection
|
||||
* @throws DuplicateTransactionException
|
||||
*/
|
||||
public function create(array $data): Collection
|
||||
{
|
||||
@@ -193,11 +199,15 @@ class TransactionJournalFactory
|
||||
* @param NullArrayObject $row
|
||||
*
|
||||
* @return TransactionJournal|null
|
||||
* @throws Exception
|
||||
* @throws DuplicateTransactionException
|
||||
*/
|
||||
private function createJournal(NullArrayObject $row): ?TransactionJournal
|
||||
{
|
||||
$row['import_hash_v2'] = $this->hashArray($row);
|
||||
|
||||
$this->errorIfDuplicate($row['import_hash_v2']);
|
||||
|
||||
/** Some basic fields */
|
||||
$type = $this->typeRepository->findTransactionType(null, $row['type']);
|
||||
$carbon = $row['date'] ?? new Carbon;
|
||||
@@ -376,6 +386,30 @@ class TransactionJournalFactory
|
||||
return $journal;
|
||||
}
|
||||
|
||||
/**
|
||||
* If this transaction already exists, throw an error.
|
||||
*
|
||||
* @param string $hash
|
||||
*
|
||||
* @throws DuplicateTransactionException
|
||||
*/
|
||||
private function errorIfDuplicate(string $hash): void
|
||||
{
|
||||
if (false === $this->errorOnHash) {
|
||||
return;
|
||||
}
|
||||
$result = null;
|
||||
if ($this->errorOnHash) {
|
||||
/** @var TransactionJournalMeta $result */
|
||||
$result = TransactionJournalMeta::where('data', json_encode($hash, JSON_THROW_ON_ERROR))
|
||||
->with(['transactionJournal', 'transactionJournal.transactionGroup'])
|
||||
->first();
|
||||
}
|
||||
if (null !== $result) {
|
||||
throw new DuplicateTransactionException(sprintf('Duplicate of transaction #%d.', $result->transactionJournal->transaction_group_id));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param TransactionCurrency|null $currency
|
||||
* @param Account $account
|
||||
@@ -485,4 +519,14 @@ class TransactionJournalFactory
|
||||
throw new FireflyException(sprintf('Destination: %s', $this->accountValidator->destError)); // @codeCoverageIgnore
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $errorOnHash
|
||||
*/
|
||||
public function setErrorOnHash(bool $errorOnHash): void
|
||||
{
|
||||
$this->errorOnHash = $errorOnHash;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ namespace FireflyIII\Handlers\Events;
|
||||
|
||||
|
||||
use FireflyIII\Events\RequestedVersionCheckStatus;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Helpers\Update\UpdateTrait;
|
||||
use FireflyIII\Models\Configuration;
|
||||
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
||||
@@ -78,8 +79,15 @@ class VersionCheckEventHandler
|
||||
}
|
||||
// last check time was more than a week ago.
|
||||
Log::debug('Have not checked for a new version in a week!');
|
||||
try {
|
||||
$latestRelease = $this->getLatestRelease();
|
||||
} catch (FireflyException $e) {
|
||||
Log::error($e);
|
||||
session()->flash('error', (string)trans('firefly.update_check_error'));
|
||||
|
||||
$latestRelease = $this->getLatestRelease();
|
||||
// softfail.
|
||||
return;
|
||||
}
|
||||
$versionCheck = $this->versionCheck($latestRelease);
|
||||
$resultString = $this->parseResult($versionCheck, $latestRelease);
|
||||
if (0 !== $versionCheck && '' !== $resultString) {
|
||||
|
||||
@@ -25,8 +25,7 @@ namespace FireflyIII\Helpers\Update;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Services\Github\Object\Release;
|
||||
use FireflyIII\Services\Github\Request\UpdateRequest;
|
||||
use FireflyIII\Services\FireflyIIIOrg\Update\UpdateRequestInterface;
|
||||
use Log;
|
||||
|
||||
/**
|
||||
@@ -38,75 +37,54 @@ trait UpdateTrait
|
||||
/**
|
||||
* Get object for the latest release from GitHub.
|
||||
*
|
||||
* @return Release|null
|
||||
* @return array
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function getLatestRelease(): ?Release
|
||||
public function getLatestRelease(): array
|
||||
{
|
||||
Log::debug('Now in getLatestRelease()');
|
||||
$return = null;
|
||||
/** @var UpdateRequest $request */
|
||||
$request = app(UpdateRequest::class);
|
||||
try {
|
||||
$request->call();
|
||||
} catch (FireflyException $e) {
|
||||
Log::error(sprintf('Could not check for updates: %s', $e->getMessage()));
|
||||
/** @var UpdateRequestInterface $checker */
|
||||
$checker = app(UpdateRequestInterface::class);
|
||||
$channel = app('fireflyconfig')->get('update_channel', 'stable')->data;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// get releases from array.
|
||||
$releases = $request->getReleases();
|
||||
|
||||
Log::debug(sprintf('Found %d releases', count($releases)));
|
||||
|
||||
if (count($releases) > 0) {
|
||||
// first entry should be the latest entry:
|
||||
/** @var Release $first */
|
||||
$first = reset($releases);
|
||||
$return = $first;
|
||||
Log::debug(sprintf('Number of releases found is larger than zero. Return %s ', $first->getTitle()));
|
||||
}
|
||||
|
||||
return $return;
|
||||
return $checker->getVersion($channel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the version check result in a human readable sentence.
|
||||
*
|
||||
* @param int $versionCheck
|
||||
* @param Release|null $release
|
||||
* @param int $versionCheck
|
||||
* @param array $information
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function parseResult(int $versionCheck, Release $release = null): string
|
||||
public function parseResult(int $versionCheck, array $information): string
|
||||
{
|
||||
Log::debug(sprintf('Now in parseResult(%d)', $versionCheck));
|
||||
$current = (string)config('firefly.version');
|
||||
$return = '';
|
||||
$triggered = false;
|
||||
if ($versionCheck === -2) {
|
||||
Log::debug('-2, so give error.');
|
||||
$return = (string)trans('firefly.update_check_error');
|
||||
$triggered = true;
|
||||
}
|
||||
if ($versionCheck === -1 && null !== $release) {
|
||||
$triggered = true;
|
||||
Log::debug('New version!');
|
||||
// there is a new FF version!
|
||||
// has it been released for at least three days?
|
||||
$today = new Carbon;
|
||||
$releaseDate = $release->getUpdated();
|
||||
if ($today->diffInDays($releaseDate) > 3) {
|
||||
Log::debug('New version is older than 3 days!');
|
||||
$monthAndDayFormat = (string)trans('config.month_and_day');
|
||||
$return = (string)trans(
|
||||
'firefly.update_new_version_alert',
|
||||
[
|
||||
'your_version' => $current,
|
||||
'new_version' => $release->getTitle(),
|
||||
'date' => $release->getUpdated()->formatLocalized($monthAndDayFormat),
|
||||
]
|
||||
);
|
||||
if (-1 === $versionCheck) {
|
||||
$triggered = true;
|
||||
$monthAndDayFormat = (string)trans('config.month_and_day');
|
||||
$carbon = Carbon::createFromFormat('Y-m-d', $information['date']);
|
||||
$return = (string)trans(
|
||||
'firefly.update_new_version_alert',
|
||||
[
|
||||
'your_version' => $current,
|
||||
'new_version' => $information['version'],
|
||||
'date' => $carbon->formatLocalized($monthAndDayFormat),
|
||||
]
|
||||
);
|
||||
// append warning if beta or alpha.
|
||||
$isBeta = $information['is_beta'] ?? false;
|
||||
if (true === $isBeta) {
|
||||
$return = sprintf('%s %s', $return, trans('firefly.update_version_beta'));
|
||||
}
|
||||
|
||||
$isAlpha = $information['is_alpha'] ?? false;
|
||||
if (true === $isAlpha) {
|
||||
$return = sprintf('%s %s', $return, trans('firefly.update_version_alpha'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,19 +94,16 @@ trait UpdateTrait
|
||||
// you are running the current version!
|
||||
$return = (string)trans('firefly.update_current_version_alert', ['version' => $current]);
|
||||
}
|
||||
if (1 === $versionCheck && null !== $release) {
|
||||
if (1 === $versionCheck) {
|
||||
$triggered = true;
|
||||
Log::debug('User is running NEWER version.');
|
||||
// you are running a newer version!
|
||||
$return = (string)trans('firefly.update_newer_version_alert', ['your_version' => $current, 'new_version' => $release->getTitle()]);
|
||||
$return = (string)trans('firefly.update_newer_version_alert', ['your_version' => $current, 'new_version' => $information['version']]);
|
||||
}
|
||||
|
||||
// @codeCoverageIgnoreStart
|
||||
if (false === $triggered) {
|
||||
Log::debug('No option was triggered.');
|
||||
$return = (string)trans('firefly.update_check_error');
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
return $return;
|
||||
}
|
||||
@@ -136,22 +111,16 @@ trait UpdateTrait
|
||||
/**
|
||||
* Compare version and store result.
|
||||
*
|
||||
* @param Release|null $release
|
||||
* @param array $information
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function versionCheck(Release $release = null): int
|
||||
public function versionCheck(array $information): int
|
||||
{
|
||||
Log::debug('Now in versionCheck()');
|
||||
if (null === $release) {
|
||||
Log::debug('Release is null, return -2.');
|
||||
|
||||
return -2;
|
||||
}
|
||||
$current = (string)config('firefly.version');
|
||||
$latest = $release->getTitle();
|
||||
$check = version_compare($current, $latest);
|
||||
Log::debug(sprintf('Comparing %s with %s, result is %s', $current, $latest, $check));
|
||||
$check = version_compare($current, $information['version']);
|
||||
Log::debug(sprintf('Comparing %s with %s, result is %s', $current, $information['version'], $check), $information);
|
||||
|
||||
return $check;
|
||||
}
|
||||
|
||||
@@ -23,10 +23,12 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Http\Controllers\Admin;
|
||||
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Helpers\Update\UpdateTrait;
|
||||
use FireflyIII\Http\Controllers\Controller;
|
||||
use FireflyIII\Http\Middleware\IsDemoUser;
|
||||
use FireflyIII\Http\Middleware\IsSandStormUser;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Log;
|
||||
|
||||
@@ -44,7 +46,7 @@ class UpdateController extends Controller
|
||||
{
|
||||
parent::__construct();
|
||||
$this->middleware(
|
||||
function ($request, $next) {
|
||||
static function ($request, $next) {
|
||||
app('view')->share('title', (string)trans('firefly.administration'));
|
||||
app('view')->share('mainTitleIcon', 'fa-hand-spock-o');
|
||||
|
||||
@@ -64,17 +66,25 @@ class UpdateController extends Controller
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$subTitle = (string)trans('firefly.update_check_title');
|
||||
$subTitleIcon = 'fa-star';
|
||||
$permission = app('fireflyconfig')->get('permission_update_check', -1);
|
||||
$selected = $permission->data;
|
||||
$options = [
|
||||
$subTitle = (string)trans('firefly.update_check_title');
|
||||
$subTitleIcon = 'fa-star';
|
||||
$permission = app('fireflyconfig')->get('permission_update_check', -1);
|
||||
$channel = app('fireflyconfig')->get('update_channel', 'stable');
|
||||
$selected = $permission->data;
|
||||
$channelSelected = $channel->data;
|
||||
$options = [
|
||||
-1 => (string)trans('firefly.updates_ask_me_later'),
|
||||
0 => (string)trans('firefly.updates_do_not_check'),
|
||||
1 => (string)trans('firefly.updates_enable_check'),
|
||||
];
|
||||
|
||||
return view('admin.update.index', compact('subTitle', 'subTitleIcon', 'selected', 'options'));
|
||||
$channelOptions = [
|
||||
'stable' => (string)trans('firefly.update_channel_stable'),
|
||||
'beta' => (string)trans('firefly.update_channel_beta'),
|
||||
'alpha' => (string)trans('firefly.update_channel_alpha'),
|
||||
];
|
||||
|
||||
return view('admin.update.index', compact('subTitle', 'subTitleIcon', 'selected', 'options', 'channelSelected', 'channelOptions'));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -87,8 +97,11 @@ class UpdateController extends Controller
|
||||
public function post(Request $request)
|
||||
{
|
||||
$checkForUpdates = (int)$request->get('check_for_updates');
|
||||
$channel = $request->get('update_channel');
|
||||
$channel = in_array($channel, ['stable', 'beta', 'alpha'], true) ? $channel : 'stable';
|
||||
app('fireflyconfig')->set('permission_update_check', $checkForUpdates);
|
||||
app('fireflyconfig')->set('last_update_check', time());
|
||||
app('fireflyconfig')->set('update_channel', $channel);
|
||||
session()->flash('success', (string)trans('firefly.configuration_updated'));
|
||||
|
||||
return redirect(route('admin.update-check'));
|
||||
@@ -97,11 +110,33 @@ class UpdateController extends Controller
|
||||
/**
|
||||
* Does a manual update check.
|
||||
*/
|
||||
public function updateCheck()
|
||||
public function updateCheck(): JsonResponse
|
||||
{
|
||||
$latestRelease = $this->getLatestRelease();
|
||||
$versionCheck = $this->versionCheck($latestRelease);
|
||||
$resultString = $this->parseResult($versionCheck, $latestRelease);
|
||||
$success = true;
|
||||
$latestRelease = '1.0';
|
||||
$resultString = '';
|
||||
$versionCheck = -2;
|
||||
$channel = app('fireflyconfig')->get('update_channel', 'stable')->data;
|
||||
|
||||
try {
|
||||
$latestRelease = $this->getLatestRelease();
|
||||
} catch (FireflyException $e) {
|
||||
Log::error($e->getMessage());
|
||||
$success = false;
|
||||
}
|
||||
|
||||
// if error, tell the user.
|
||||
if (false === $success) {
|
||||
$resultString = (string)trans('firefly.update_check_error');
|
||||
session()->flash('error', $resultString);
|
||||
}
|
||||
|
||||
// if not, compare and tell the user.
|
||||
if (true === $success) {
|
||||
$versionCheck = $this->versionCheck($latestRelease);
|
||||
$resultString = $this->parseResult($versionCheck, $latestRelease);
|
||||
}
|
||||
|
||||
Log::debug(sprintf('Result string is: "%s"', $resultString));
|
||||
|
||||
if (0 !== $versionCheck && '' !== $resultString) {
|
||||
@@ -110,6 +145,11 @@ class UpdateController extends Controller
|
||||
}
|
||||
app('fireflyconfig')->set('last_update_check', time());
|
||||
|
||||
return response()->json(['result' => $resultString]);
|
||||
return response()->json(
|
||||
[
|
||||
'result' => $resultString,
|
||||
'channel' => $channel,
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,9 +174,9 @@ class ReportController extends Controller
|
||||
$data[$currencyId] = $data[$currencyId] ?? [
|
||||
'currency_id' => $currencyId,
|
||||
'currency_symbol' => $journal['currency_symbol'],
|
||||
'currency_code' => $journal['currency_symbol'],
|
||||
'currency_code' => $journal['currency_code'],
|
||||
'currency_name' => $journal['currency_name'],
|
||||
'currency_decimal_places' => $journal['currency_decimal_places'],
|
||||
'currency_decimal_places' => (int)$journal['currency_decimal_places'],
|
||||
];
|
||||
$data[$currencyId][$period] = $data[$currencyId][$period] ?? [
|
||||
'period' => $period,
|
||||
@@ -218,7 +218,6 @@ class ReportController extends Controller
|
||||
// loop all possible periods between $start and $end
|
||||
$currentStart = clone $start;
|
||||
while ($currentStart <= $end) {
|
||||
$currentEnd = app('navigation')->endOfPeriod($currentStart, $preferredRange);
|
||||
$key = $currentStart->format($format);
|
||||
$title = $currentStart->formatLocalized($titleFormat);
|
||||
$income['entries'][$title] = round($currency[$key]['earned'] ?? '0', $currency['currency_decimal_places']);
|
||||
|
||||
@@ -78,7 +78,8 @@ class CreateController extends Controller
|
||||
$defaultCurrency = app('amount')->getDefaultCurrency();
|
||||
$previousUri = $this->rememberPreviousUri('transactions.create.uri');
|
||||
$parts = parse_url($previousUri);
|
||||
$previousUri = sprintf('%s://%s/%s', $parts['scheme'], $parts['host'], $parts['path']);
|
||||
$search = sprintf('?%s', $parts['query'] ?? '');
|
||||
$previousUri = str_replace($search, '', $previousUri);
|
||||
|
||||
session()->put('preFilled', $preFilled);
|
||||
|
||||
|
||||
@@ -83,7 +83,8 @@ class EditController extends Controller
|
||||
$cash = $repository->getCashAccount();
|
||||
$previousUri = $this->rememberPreviousUri('transactions.edit.uri');
|
||||
$parts = parse_url($previousUri);
|
||||
$previousUri = sprintf('%s://%s/%s', $parts['scheme'], $parts['host'], $parts['path']);
|
||||
$search = sprintf('?%s', $parts['query'] ?? '');
|
||||
$previousUri = str_replace($search, '', $previousUri);
|
||||
|
||||
|
||||
return view('transactions.edit', compact('cash', 'transactionGroup', 'allowedOpposingTypes', 'accountToTypes', 'defaultCurrency', 'previousUri'));
|
||||
|
||||
@@ -218,6 +218,7 @@ class CreateRecurringTransactions implements ShouldQueue
|
||||
$return = [];
|
||||
/** @var RecurrenceTransaction $transaction */
|
||||
foreach ($transactions as $index => $transaction) {
|
||||
|
||||
$single = [
|
||||
'type' => strtolower($recurrence->transactionType->type),
|
||||
'date' => $date,
|
||||
@@ -242,8 +243,8 @@ class CreateRecurringTransactions implements ShouldQueue
|
||||
'recurrence_id' => (int)$recurrence->id,
|
||||
'order' => $index,
|
||||
'notes' => (string)trans('firefly.created_from_recurrence', ['id' => $recurrence->id, 'title' => $recurrence->title]),
|
||||
'tags' => $this->repository->getTags($recurrence),
|
||||
'piggy_bank_id' => null,
|
||||
'tags' => $this->repository->getTags($transaction),
|
||||
'piggy_bank_id' => $this->repository->getPiggyBank($transaction),
|
||||
'piggy_bank_name' => null,
|
||||
'bill_id' => null,
|
||||
'bill_name' => null,
|
||||
@@ -324,7 +325,7 @@ class CreateRecurringTransactions implements ShouldQueue
|
||||
Log::info(sprintf('Created new transaction group #%d', $group->id));
|
||||
|
||||
// link to piggy:
|
||||
$this->linkGroupToPiggies($recurrence, $group);
|
||||
//$this->linkGroupToPiggies($recurrence, $group);
|
||||
|
||||
// trigger event:
|
||||
event(new StoredTransactionGroup($group, $recurrence->apply_rules));
|
||||
|
||||
@@ -42,6 +42,8 @@ use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface;
|
||||
use FireflyIII\Repositories\User\UserRepository;
|
||||
use FireflyIII\Repositories\User\UserRepositoryInterface;
|
||||
use FireflyIII\Services\Currency\ExchangeRateInterface;
|
||||
use FireflyIII\Services\FireflyIIIOrg\Update\UpdateRequest;
|
||||
use FireflyIII\Services\FireflyIIIOrg\Update\UpdateRequestInterface;
|
||||
use FireflyIII\Services\IP\IpifyOrg;
|
||||
use FireflyIII\Services\IP\IPRetrievalInterface;
|
||||
use FireflyIII\Services\Password\PwndVerifierV3;
|
||||
@@ -184,6 +186,8 @@ class FireflyServiceProvider extends ServiceProvider
|
||||
$this->app->bind(HelpInterface::class, Help::class);
|
||||
$this->app->bind(ReportHelperInterface::class, ReportHelper::class);
|
||||
$this->app->bind(FiscalHelperInterface::class, FiscalHelper::class);
|
||||
$this->app->bind(UpdateRequestInterface::class, UpdateRequest::class);
|
||||
|
||||
$class = (string)config(sprintf('firefly.cer_providers.%s', (string)config('firefly.cer_provider')));
|
||||
if ('' === $class) {
|
||||
throw new FireflyException('Invalid currency exchange rate provider. Cannot continue.');
|
||||
|
||||
@@ -554,6 +554,7 @@ class AccountRepository implements AccountRepositoryInterface
|
||||
{
|
||||
$dbQuery = $this->user->accounts()
|
||||
->where('active', 1)
|
||||
->orderBy('accounts.name', 'ASC')
|
||||
->with(['accountType']);
|
||||
if ('' !== $query) {
|
||||
$search = sprintf('%%%s%%', $query);
|
||||
|
||||
@@ -24,6 +24,7 @@ namespace FireflyIII\Repositories\Bill;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use DB;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Factory\BillFactory;
|
||||
use FireflyIII\Models\Bill;
|
||||
use FireflyIII\Models\Note;
|
||||
@@ -662,9 +663,10 @@ class BillRepository implements BillRepositoryInterface
|
||||
/**
|
||||
* @param array $data
|
||||
*
|
||||
* @return Bill|null
|
||||
* @return Bill
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function store(array $data): ?Bill
|
||||
public function store(array $data): Bill
|
||||
{
|
||||
/** @var BillFactory $factory */
|
||||
$factory = app(BillFactory::class);
|
||||
|
||||
@@ -23,6 +23,7 @@ declare(strict_types=1);
|
||||
namespace FireflyIII\Repositories\Bill;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Bill;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
@@ -266,9 +267,10 @@ interface BillRepositoryInterface
|
||||
/**
|
||||
* @param array $data
|
||||
*
|
||||
* @return Bill|null
|
||||
* @return Bill
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function store(array $data): ?Bill;
|
||||
public function store(array $data): Bill;
|
||||
|
||||
/**
|
||||
* @param Bill $bill
|
||||
|
||||
@@ -73,6 +73,7 @@ class BudgetLimitRepository implements BudgetLimitRepositoryInterface
|
||||
->where('budget_limits.start_date', $start->format('Y-m-d 00:00:00'))
|
||||
->where('budget_limits.end_date', $end->format('Y-m-d 00:00:00'))
|
||||
->where('budget_limits.transaction_currency_id', $currency->id)
|
||||
->whereNull('budgets.deleted_at')
|
||||
->where('budgets.user_id', $this->user->id);
|
||||
if (null !== $budgets && $budgets->count() > 0) {
|
||||
$query->whereIn('budget_limits.budget_id', $budgets->pluck('id')->toArray());
|
||||
|
||||
@@ -25,6 +25,7 @@ namespace FireflyIII\Repositories\Budget;
|
||||
use Carbon\Carbon;
|
||||
use DB;
|
||||
use Exception;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Budget;
|
||||
use FireflyIII\Models\BudgetLimit;
|
||||
use FireflyIII\Models\RecurrenceTransactionMeta;
|
||||
@@ -32,6 +33,7 @@ use FireflyIII\Models\RuleAction;
|
||||
use FireflyIII\Models\RuleTrigger;
|
||||
use FireflyIII\Services\Internal\Destroy\BudgetDestroyService;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Database\QueryException;
|
||||
use Illuminate\Support\Collection;
|
||||
use Log;
|
||||
|
||||
@@ -269,16 +271,20 @@ class BudgetRepository implements BudgetRepositoryInterface
|
||||
* @param array $data
|
||||
*
|
||||
* @return Budget
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function store(array $data): Budget
|
||||
{
|
||||
$newBudget = new Budget(
|
||||
[
|
||||
'user_id' => $this->user->id,
|
||||
'name' => $data['name'],
|
||||
]
|
||||
);
|
||||
$newBudget->save();
|
||||
try {
|
||||
$newBudget = Budget::create(
|
||||
[
|
||||
'user_id' => $this->user->id,
|
||||
'name' => $data['name'],
|
||||
]
|
||||
);
|
||||
} catch(QueryException $e) {
|
||||
throw new FireflyException('400002: Could not store budget.');
|
||||
}
|
||||
|
||||
return $newBudget;
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ declare(strict_types=1);
|
||||
namespace FireflyIII\Repositories\Budget;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Budget;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Support\Collection;
|
||||
@@ -132,6 +133,7 @@ interface BudgetRepositoryInterface
|
||||
* @param array $data
|
||||
*
|
||||
* @return Budget
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function store(array $data): Budget;
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ namespace FireflyIII\Repositories\Category;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use DB;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Factory\CategoryFactory;
|
||||
use FireflyIII\Models\Category;
|
||||
use FireflyIII\Models\RecurrenceTransactionMeta;
|
||||
@@ -239,6 +240,7 @@ class CategoryRepository implements CategoryRepositoryInterface
|
||||
* @param array $data
|
||||
*
|
||||
* @return Category
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function store(array $data): Category
|
||||
{
|
||||
@@ -246,7 +248,13 @@ class CategoryRepository implements CategoryRepositoryInterface
|
||||
$factory = app(CategoryFactory::class);
|
||||
$factory->setUser($this->user);
|
||||
|
||||
return $factory->findOrCreate(null, $data['name']);
|
||||
$category = $factory->findOrCreate(null, $data['name']);
|
||||
|
||||
if (null === $category) {
|
||||
throw new FireflyException(sprintf('400003: Could not store new category with name "%s"', $data['name']));
|
||||
}
|
||||
return $category;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -23,6 +23,7 @@ declare(strict_types=1);
|
||||
namespace FireflyIII\Repositories\Category;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Category;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Support\Collection;
|
||||
@@ -117,7 +118,7 @@ interface CategoryRepositoryInterface
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
*
|
||||
* @throws FireflyException
|
||||
* @return Category
|
||||
*/
|
||||
public function store(array $data): Category;
|
||||
|
||||
@@ -23,6 +23,7 @@ declare(strict_types=1);
|
||||
namespace FireflyIII\Repositories\Currency;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Factory\TransactionCurrencyFactory;
|
||||
use FireflyIII\Models\AccountMeta;
|
||||
use FireflyIII\Models\AvailableBudget;
|
||||
@@ -489,14 +490,20 @@ class CurrencyRepository implements CurrencyRepositoryInterface
|
||||
/**
|
||||
* @param array $data
|
||||
*
|
||||
* @return TransactionCurrency|null
|
||||
* @return TransactionCurrency
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function store(array $data): ?TransactionCurrency
|
||||
public function store(array $data): TransactionCurrency
|
||||
{
|
||||
/** @var TransactionCurrencyFactory $factory */
|
||||
$factory = app(TransactionCurrencyFactory::class);
|
||||
$result = $factory->create($data);
|
||||
|
||||
return $factory->create($data);
|
||||
if (null === $result) {
|
||||
throw new FireflyException('400004: Could not store new currency.');
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -234,9 +234,9 @@ interface CurrencyRepositoryInterface
|
||||
/**
|
||||
* @param array $data
|
||||
*
|
||||
* @return TransactionCurrency|null
|
||||
* @return TransactionCurrency
|
||||
*/
|
||||
public function store(array $data): ?TransactionCurrency;
|
||||
public function store(array $data): TransactionCurrency;
|
||||
|
||||
/**
|
||||
* @param TransactionCurrency $currency
|
||||
|
||||
@@ -24,6 +24,7 @@ namespace FireflyIII\Repositories\PiggyBank;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Exception;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\Note;
|
||||
use FireflyIII\Models\PiggyBank;
|
||||
use FireflyIII\Models\PiggyBankEvent;
|
||||
@@ -33,6 +34,7 @@ use FireflyIII\Models\TransactionJournal;
|
||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Database\QueryException;
|
||||
use Illuminate\Support\Collection;
|
||||
use Log;
|
||||
|
||||
@@ -556,13 +558,19 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface
|
||||
/**
|
||||
* @param array $data
|
||||
*
|
||||
* @return PiggyBank|null
|
||||
* @return PiggyBank
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function store(array $data): ?PiggyBank
|
||||
public function store(array $data): PiggyBank
|
||||
{
|
||||
$data['order'] = $this->getMaxOrder() + 1;
|
||||
try {
|
||||
/** @var PiggyBank $piggyBank */
|
||||
$piggyBank = PiggyBank::create($data);
|
||||
} catch(QueryException $e) {
|
||||
Log::error(sprintf('Could not store piggy bank: %s',$e->getMessage()));
|
||||
throw new FireflyException('400005: Could not store new piggy bank.');
|
||||
}
|
||||
|
||||
$this->updateNote($piggyBank, $data['notes']);
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ declare(strict_types=1);
|
||||
namespace FireflyIII\Repositories\PiggyBank;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Models\PiggyBank;
|
||||
use FireflyIII\Models\PiggyBankEvent;
|
||||
use FireflyIII\Models\PiggyBankRepetition;
|
||||
@@ -245,9 +246,10 @@ interface PiggyBankRepositoryInterface
|
||||
*
|
||||
* @param array $data
|
||||
*
|
||||
* @return PiggyBank|null
|
||||
* @return PiggyBank
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function store(array $data): ?PiggyBank;
|
||||
public function store(array $data): PiggyBank;
|
||||
|
||||
/**
|
||||
* Update existing piggy bank.
|
||||
|
||||
@@ -28,7 +28,6 @@ use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Factory\RecurrenceFactory;
|
||||
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
|
||||
use FireflyIII\Models\Note;
|
||||
use FireflyIII\Models\PiggyBank;
|
||||
use FireflyIII\Models\Preference;
|
||||
use FireflyIII\Models\Recurrence;
|
||||
use FireflyIII\Models\RecurrenceMeta;
|
||||
@@ -253,19 +252,17 @@ class RecurringRepository implements RecurringRepositoryInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Recurrence $recurrence
|
||||
* @param RecurrenceTransaction $transaction
|
||||
*
|
||||
* @return PiggyBank|null
|
||||
* @return int|null
|
||||
*/
|
||||
public function getPiggyBank(Recurrence $recurrence): ?PiggyBank
|
||||
public function getPiggyBank(RecurrenceTransaction $transaction): ?int
|
||||
{
|
||||
$meta = $recurrence->recurrenceMeta;
|
||||
/** @var RecurrenceMeta $metaEntry */
|
||||
$meta = $transaction->recurrenceTransactionMeta;
|
||||
/** @var RecurrenceTransactionMeta $metaEntry */
|
||||
foreach ($meta as $metaEntry) {
|
||||
if ('piggy_bank_id' === $metaEntry->name) {
|
||||
$piggyId = (int)$metaEntry->value;
|
||||
|
||||
return $this->user->piggyBanks()->where('piggy_banks.id', $piggyId)->first(['piggy_banks.*']);
|
||||
return (int)$metaEntry->value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -275,15 +272,15 @@ class RecurringRepository implements RecurringRepositoryInterface
|
||||
/**
|
||||
* Get the tags from the recurring transaction.
|
||||
*
|
||||
* @param Recurrence $recurrence
|
||||
* @param RecurrenceTransaction $transaction
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getTags(Recurrence $recurrence): array
|
||||
public function getTags(RecurrenceTransaction $transaction): array
|
||||
{
|
||||
$tags = [];
|
||||
/** @var RecurrenceMeta $meta */
|
||||
foreach ($recurrence->recurrenceMeta as $meta) {
|
||||
foreach ($transaction->recurrenceTransactionMeta as $meta) {
|
||||
if ('tags' === $meta->name && '' !== $meta->value) {
|
||||
$tags = explode(',', $meta->value);
|
||||
}
|
||||
|
||||
@@ -120,19 +120,19 @@ interface RecurringRepositoryInterface
|
||||
public function getOccurrencesInRange(RecurrenceRepetition $repetition, Carbon $start, Carbon $end): array;
|
||||
|
||||
/**
|
||||
* @param Recurrence $recurrence
|
||||
* @return PiggyBank|null
|
||||
* @param RecurrenceTransaction $transaction
|
||||
* @return int|null
|
||||
*/
|
||||
public function getPiggyBank(Recurrence $recurrence): ?PiggyBank;
|
||||
public function getPiggyBank(RecurrenceTransaction $transaction): ?int;
|
||||
|
||||
/**
|
||||
* Get the tags from the recurring transaction.
|
||||
*
|
||||
* @param Recurrence $recurrence
|
||||
* @param RecurrenceTransaction $transaction
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getTags(Recurrence $recurrence): array;
|
||||
public function getTags(RecurrenceTransaction $transaction): array;
|
||||
|
||||
/**
|
||||
* @param Recurrence $recurrence
|
||||
|
||||
@@ -27,6 +27,7 @@ namespace FireflyIII\Repositories\TransactionGroup;
|
||||
use Carbon\Carbon;
|
||||
use DB;
|
||||
use Exception;
|
||||
use FireflyIII\Exceptions\DuplicateTransactionException;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use FireflyIII\Factory\TransactionGroupFactory;
|
||||
use FireflyIII\Models\AccountMeta;
|
||||
@@ -314,6 +315,7 @@ class TransactionGroupRepository implements TransactionGroupRepositoryInterface
|
||||
* @param array $data
|
||||
*
|
||||
* @return TransactionGroup
|
||||
* @throws DuplicateTransactionException
|
||||
*/
|
||||
public function store(array $data): TransactionGroup
|
||||
{
|
||||
|
||||
@@ -23,6 +23,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Repositories\TransactionGroup;
|
||||
|
||||
use FireflyIII\Exceptions\DuplicateTransactionException;
|
||||
use FireflyIII\Models\TransactionGroup;
|
||||
use FireflyIII\Support\NullArrayObject;
|
||||
use FireflyIII\User;
|
||||
@@ -125,6 +126,7 @@ interface TransactionGroupRepositoryInterface
|
||||
* @param array $data
|
||||
*
|
||||
* @return TransactionGroup
|
||||
* @throws DuplicateTransactionException
|
||||
*/
|
||||
public function store(array $data): TransactionGroup;
|
||||
|
||||
|
||||
73
app/Rules/IsTransferAccount.php
Normal file
73
app/Rules/IsTransferAccount.php
Normal file
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
/**
|
||||
* IsTransferAccount.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace FireflyIII\Rules;
|
||||
|
||||
|
||||
use FireflyIII\Models\TransactionType;
|
||||
use FireflyIII\Validation\AccountValidator;
|
||||
use Illuminate\Contracts\Validation\Rule;
|
||||
use Log;
|
||||
|
||||
/**
|
||||
* Class IsTransferAccount
|
||||
*/
|
||||
class IsTransferAccount implements Rule
|
||||
{
|
||||
/**
|
||||
* Get the validation error message.
|
||||
*
|
||||
* @return string|array
|
||||
*/
|
||||
public function message(): string
|
||||
{
|
||||
return (string)trans('validation.not_transfer_account');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the validation rule passes.
|
||||
*
|
||||
* @param string $attribute
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function passes($attribute, $value): bool
|
||||
{
|
||||
Log::debug(sprintf('Now in %s(%s)', __METHOD__, $value));
|
||||
/** @var AccountValidator $validator */
|
||||
$validator = app(AccountValidator::class);
|
||||
$validator->setTransactionType(TransactionType::TRANSFER);
|
||||
$validator->setUser(auth()->user());
|
||||
|
||||
$validAccount = $validator->validateSource(null, (string)$value);
|
||||
if (true === $validAccount) {
|
||||
Log::debug('Found account based on name. Return true.');
|
||||
|
||||
// found by name, use repos to return.
|
||||
return true;
|
||||
}
|
||||
$validAccount = $validator->validateSource((int)$value, null);
|
||||
Log::debug(sprintf('Search by id (%d), result is %s.', (int)$value, var_export($validAccount, true)));
|
||||
|
||||
return !(false === $validAccount);
|
||||
}
|
||||
}
|
||||
70
app/Services/FireflyIIIOrg/Update/UpdateRequest.php
Normal file
70
app/Services/FireflyIIIOrg/Update/UpdateRequest.php
Normal file
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
/**
|
||||
* UpdateRequest.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace FireflyIII\Services\FireflyIIIOrg\Update;
|
||||
|
||||
use Exception;
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use JsonException;
|
||||
use Log;
|
||||
|
||||
/**
|
||||
* Class UpdateRequest
|
||||
*/
|
||||
class UpdateRequest implements UpdateRequestInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @param string $channel
|
||||
*
|
||||
* @return array
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function getVersion(string $channel): array
|
||||
{
|
||||
$uri = config('firefly.update_endpoint');
|
||||
Log::debug(sprintf('Going to call %s', $uri));
|
||||
try {
|
||||
$client = new Client();
|
||||
$res = $client->request('GET', $uri);
|
||||
} catch (GuzzleException|Exception $e) {
|
||||
throw new FireflyException(sprintf('Response error from update check: %s', $e->getMessage()));
|
||||
}
|
||||
|
||||
if (200 !== $res->getStatusCode()) {
|
||||
throw new FireflyException(sprintf('Returned error code %d from update check.', $res->getStatusCode()));
|
||||
}
|
||||
$body = (string)$res->getBody();
|
||||
try {
|
||||
$json = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
|
||||
} catch (JsonException $e) {
|
||||
throw new FireflyException('Invalid JSON in server response.');
|
||||
}
|
||||
|
||||
if (!isset($json['firefly_iii'][$channel])) {
|
||||
throw new FireflyException(sprintf('Unknown update channel "%s"', $channel));
|
||||
}
|
||||
|
||||
return $json['firefly_iii'][$channel];
|
||||
}
|
||||
}
|
||||
39
app/Services/FireflyIIIOrg/Update/UpdateRequestInterface.php
Normal file
39
app/Services/FireflyIIIOrg/Update/UpdateRequestInterface.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
/**
|
||||
* UpdateRequestInterface.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace FireflyIII\Services\FireflyIIIOrg\Update;
|
||||
|
||||
use FireflyIII\Exceptions\FireflyException;
|
||||
|
||||
/**
|
||||
* Interface UpdateRequestInterface
|
||||
*/
|
||||
interface UpdateRequestInterface
|
||||
{
|
||||
/**
|
||||
* @param string $channel
|
||||
*
|
||||
* @return array
|
||||
* @throws FireflyException
|
||||
*/
|
||||
public function getVersion(string $channel): array;
|
||||
|
||||
}
|
||||
@@ -22,7 +22,16 @@
|
||||
namespace FireflyIII\Support\Search;
|
||||
|
||||
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
/**
|
||||
* Interface GenericSearchInterface
|
||||
*/
|
||||
interface GenericSearchInterface
|
||||
{
|
||||
/**
|
||||
* @return Collection
|
||||
*/
|
||||
public function search(): Collection;
|
||||
|
||||
}
|
||||
147
app/Support/Search/TransferSearch.php
Normal file
147
app/Support/Search/TransferSearch.php
Normal file
@@ -0,0 +1,147 @@
|
||||
<?php
|
||||
/**
|
||||
* TransferSearch.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* This file is part of Firefly III (https://github.com/firefly-iii).
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace FireflyIII\Support\Search;
|
||||
|
||||
|
||||
use Carbon\Carbon;
|
||||
use FireflyIII\Models\Account;
|
||||
use FireflyIII\Models\AccountType;
|
||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Database\Query\JoinClause;
|
||||
use Illuminate\Support\Collection;
|
||||
use InvalidArgumentException;
|
||||
use Log;
|
||||
|
||||
/**
|
||||
* Class TransferSearch
|
||||
*/
|
||||
class TransferSearch implements GenericSearchInterface
|
||||
{
|
||||
/** @var AccountRepositoryInterface */
|
||||
private $accountRepository;
|
||||
/** @var string */
|
||||
private $amount;
|
||||
/** @var Carbon */
|
||||
private $date;
|
||||
/** @var string */
|
||||
private $description;
|
||||
/** @var Account */
|
||||
private $destination;
|
||||
/** @var Account */
|
||||
private $source;
|
||||
/** @var array */
|
||||
private $types;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->accountRepository = app(AccountRepositoryInterface::class);
|
||||
$this->types = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection
|
||||
*/
|
||||
public function search(): Collection
|
||||
{
|
||||
/** @var User $user */
|
||||
$user = auth()->user();
|
||||
|
||||
$query = $user->transactionJournals()
|
||||
->leftJoin(
|
||||
'transactions as source', static function (JoinClause $join) {
|
||||
$join->on('transaction_journals.id', '=', 'source.transaction_journal_id');
|
||||
$join->where('source.amount', '<', '0');
|
||||
}
|
||||
)
|
||||
->leftJoin(
|
||||
'transactions as destination', static function (JoinClause $join) {
|
||||
$join->on('transaction_journals.id', '=', 'destination.transaction_journal_id');
|
||||
$join->where('destination.amount', '>', '0');
|
||||
}
|
||||
)
|
||||
->where('source.account_id', $this->source->id)
|
||||
->where('destination.account_id', $this->destination->id)
|
||||
->where('transaction_journals.description', $this->description)
|
||||
->where('destination.amount', $this->amount)
|
||||
->where('transaction_journals.date', $this->date->format('Y-m-d 00:00:00'))
|
||||
;
|
||||
|
||||
return $query->get(['transaction_journals.id', 'transaction_journals.transaction_group_id']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $amount
|
||||
*/
|
||||
public function setAmount(string $amount): void
|
||||
{
|
||||
$this->amount = $amount;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $date
|
||||
*/
|
||||
public function setDate(string $date): void
|
||||
{
|
||||
try {
|
||||
$carbon = Carbon::createFromFormat('Y-m-d', $date);
|
||||
} catch (InvalidArgumentException $e) {
|
||||
Log::error($e->getMessage());
|
||||
$carbon = Carbon::now();
|
||||
}
|
||||
$this->date = $carbon;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $description
|
||||
*/
|
||||
public function setDescription(string $description): void
|
||||
{
|
||||
$this->description = $description;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $destination
|
||||
*/
|
||||
public function setDestination(string $destination): void
|
||||
{
|
||||
if (is_numeric($destination)) {
|
||||
$this->destination = $this->accountRepository->findNull((int)$destination);
|
||||
}
|
||||
if (null === $this->destination) {
|
||||
$this->destination = $this->accountRepository->findByName($destination, $this->types);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $source
|
||||
*/
|
||||
public function setSource(string $source): void
|
||||
{
|
||||
if (is_numeric($source)) {
|
||||
$this->source = $this->accountRepository->findNull((int)$source);
|
||||
}
|
||||
if (null === $this->source) {
|
||||
$this->source = $this->accountRepository->findByName($source, $this->types);
|
||||
}
|
||||
}
|
||||
}
|
||||
39
changelog.md
39
changelog.md
@@ -2,6 +2,45 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## [4.8.2-alpha.1 (API 0.10.5)] - 2019-11-03
|
||||
|
||||
Normally I won't be detailling alpha versions in the changelog but this is a
|
||||
special one. If your Firefly III installation warned you that this version has
|
||||
been released, please take note that this is a **test** version and may **not**
|
||||
be stable!
|
||||
|
||||
### Changed
|
||||
- Firefly III now comes in three channels: stable, beta and alpha. You can
|
||||
find the latest version for each channel on [this website](https://version.firefly-iii.org/).
|
||||
- To make sure your Docker instance logs everything to `stdout`, make sure
|
||||
you set the environment variable `LOG_CHANNEL` to `docker_out`. This is now
|
||||
default behavior for new installations that use the `.env` file to launch
|
||||
Firefly III (using Docker compose), but if you use environment variables
|
||||
you may have to set this yourself. This is not a mandatory change but will
|
||||
make debugging easier.
|
||||
- The Docker image is now also available in AArch64.
|
||||
|
||||
### Fixed
|
||||
- [Issue 2771](https://github.com/firefly-iii/firefly-iii/issues/2771) Recurring transactions would not hit their piggy bank.
|
||||
- [Issue 2774](https://github.com/firefly-iii/firefly-iii/issues/2774) Fixed redirect issues for exotic URL's.
|
||||
- [Issue 2780](https://github.com/firefly-iii/firefly-iii/issues/2780) Deleted bugs would still count in the budget overview.
|
||||
- [Issue 2783](https://github.com/firefly-iii/firefly-iii/issues/2783) Fixed issue with SQLite and integers.
|
||||
- [Issue 2786](https://github.com/firefly-iii/firefly-iii/issues/2786) Fix links to documentation.
|
||||
|
||||
## [4.8.1.8 (API 0.10.5)] - 2019-10-26
|
||||
|
||||
### Fixed
|
||||
- [Issue 2773](https://github.com/firefly-iii/firefly-iii/issues/2773) Error when importing transactions.
|
||||
|
||||
## [4.8.1.7 (API 0.10.5)] - 2019-10-26
|
||||
|
||||
### Fixed
|
||||
- Error when creating transactions from the index of Firefly III.
|
||||
|
||||
### API
|
||||
- Firefly III can filter duplicate transactions.
|
||||
- New endpoint that can search for specific transfers.
|
||||
|
||||
## [4.8.1.6 (API 0.10.4)] - 2019-10-25
|
||||
|
||||
### Fixed
|
||||
|
||||
247
composer.lock
generated
247
composer.lock
generated
@@ -525,16 +525,16 @@
|
||||
},
|
||||
{
|
||||
"name": "doctrine/cache",
|
||||
"version": "v1.8.0",
|
||||
"version": "v1.8.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/doctrine/cache.git",
|
||||
"reference": "d768d58baee9a4862ca783840eca1b9add7a7f57"
|
||||
"reference": "d4374ae95b36062d02ef310100ed33d78738d76c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57",
|
||||
"reference": "d768d58baee9a4862ca783840eca1b9add7a7f57",
|
||||
"url": "https://api.github.com/repos/doctrine/cache/zipball/d4374ae95b36062d02ef310100ed33d78738d76c",
|
||||
"reference": "d4374ae95b36062d02ef310100ed33d78738d76c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -569,6 +569,10 @@
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Guilherme Blanco",
|
||||
"email": "guilhermeblanco@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Roman Borschel",
|
||||
"email": "roman@code-factory.org"
|
||||
@@ -577,10 +581,6 @@
|
||||
"name": "Benjamin Eberlei",
|
||||
"email": "kontakt@beberlei.de"
|
||||
},
|
||||
{
|
||||
"name": "Guilherme Blanco",
|
||||
"email": "guilhermeblanco@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Jonathan Wage",
|
||||
"email": "jonwage@gmail.com"
|
||||
@@ -596,35 +596,34 @@
|
||||
"cache",
|
||||
"caching"
|
||||
],
|
||||
"time": "2018-08-21T18:01:43+00:00"
|
||||
"time": "2019-10-28T09:31:32+00:00"
|
||||
},
|
||||
{
|
||||
"name": "doctrine/dbal",
|
||||
"version": "v2.9.2",
|
||||
"version": "v2.10.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/doctrine/dbal.git",
|
||||
"reference": "22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9"
|
||||
"reference": "0c9a646775ef549eb0a213a4f9bd4381d9b4d934"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9",
|
||||
"reference": "22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9",
|
||||
"url": "https://api.github.com/repos/doctrine/dbal/zipball/0c9a646775ef549eb0a213a4f9bd4381d9b4d934",
|
||||
"reference": "0c9a646775ef549eb0a213a4f9bd4381d9b4d934",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"doctrine/cache": "^1.0",
|
||||
"doctrine/event-manager": "^1.0",
|
||||
"ext-pdo": "*",
|
||||
"php": "^7.1"
|
||||
"php": "^7.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/coding-standard": "^5.0",
|
||||
"jetbrains/phpstorm-stubs": "^2018.1.2",
|
||||
"phpstan/phpstan": "^0.10.1",
|
||||
"phpunit/phpunit": "^7.4",
|
||||
"symfony/console": "^2.0.5|^3.0|^4.0",
|
||||
"symfony/phpunit-bridge": "^3.4.5|^4.0.5"
|
||||
"doctrine/coding-standard": "^6.0",
|
||||
"jetbrains/phpstorm-stubs": "^2019.1",
|
||||
"phpstan/phpstan": "^0.11.3",
|
||||
"phpunit/phpunit": "^8.4.1",
|
||||
"symfony/console": "^2.0.5|^3.0|^4.0|^5.0"
|
||||
},
|
||||
"suggest": {
|
||||
"symfony/console": "For helpful console commands such as SQL execution and import of files."
|
||||
@@ -635,7 +634,7 @@
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.9.x-dev",
|
||||
"dev-master": "2.10.x-dev",
|
||||
"dev-develop": "3.0.x-dev"
|
||||
}
|
||||
},
|
||||
@@ -649,6 +648,10 @@
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Guilherme Blanco",
|
||||
"email": "guilhermeblanco@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Roman Borschel",
|
||||
"email": "roman@code-factory.org"
|
||||
@@ -657,10 +660,6 @@
|
||||
"name": "Benjamin Eberlei",
|
||||
"email": "kontakt@beberlei.de"
|
||||
},
|
||||
{
|
||||
"name": "Guilherme Blanco",
|
||||
"email": "guilhermeblanco@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Jonathan Wage",
|
||||
"email": "jonwage@gmail.com"
|
||||
@@ -671,14 +670,25 @@
|
||||
"keywords": [
|
||||
"abstraction",
|
||||
"database",
|
||||
"db2",
|
||||
"dbal",
|
||||
"mariadb",
|
||||
"mssql",
|
||||
"mysql",
|
||||
"persistence",
|
||||
"oci8",
|
||||
"oracle",
|
||||
"pdo",
|
||||
"pgsql",
|
||||
"php",
|
||||
"queryobject"
|
||||
"postgresql",
|
||||
"queryobject",
|
||||
"sasql",
|
||||
"sql",
|
||||
"sqlanywhere",
|
||||
"sqlite",
|
||||
"sqlserver",
|
||||
"sqlsrv"
|
||||
],
|
||||
"time": "2018-12-31T03:27:51+00:00"
|
||||
"time": "2019-11-03T16:50:43+00:00"
|
||||
},
|
||||
{
|
||||
"name": "doctrine/event-manager",
|
||||
@@ -1717,16 +1727,16 @@
|
||||
},
|
||||
{
|
||||
"name": "league/commonmark",
|
||||
"version": "1.0.0",
|
||||
"version": "1.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/thephpleague/commonmark.git",
|
||||
"reference": "7a40f2b0931602c504c2a9692d9f1e33635fd5ef"
|
||||
"reference": "d927c05e9a391688b1e59a606c97465a90531789"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/7a40f2b0931602c504c2a9692d9f1e33635fd5ef",
|
||||
"reference": "7a40f2b0931602c504c2a9692d9f1e33635fd5ef",
|
||||
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d927c05e9a391688b1e59a606c97465a90531789",
|
||||
"reference": "d927c05e9a391688b1e59a606c97465a90531789",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1740,6 +1750,7 @@
|
||||
"cebe/markdown": "~1.0",
|
||||
"commonmark/commonmark.js": "0.29.0",
|
||||
"erusev/parsedown": "~1.0",
|
||||
"ext-json": "*",
|
||||
"michelf/php-markdown": "~1.4",
|
||||
"mikehaertl/php-shellcommand": "^1.4",
|
||||
"phpstan/phpstan-shim": "^0.11.5",
|
||||
@@ -1756,7 +1767,7 @@
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.1-dev"
|
||||
"dev-master": "1.2-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
@@ -1783,7 +1794,7 @@
|
||||
"markdown",
|
||||
"parser"
|
||||
],
|
||||
"time": "2019-06-29T11:19:01+00:00"
|
||||
"time": "2019-10-31T13:30:15+00:00"
|
||||
},
|
||||
{
|
||||
"name": "league/csv",
|
||||
@@ -2373,16 +2384,16 @@
|
||||
},
|
||||
{
|
||||
"name": "nesbot/carbon",
|
||||
"version": "2.25.3",
|
||||
"version": "2.26.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/briannesbitt/Carbon.git",
|
||||
"reference": "d07636581795383e2fea2d711212d30f941f2039"
|
||||
"reference": "e01ecc0b71168febb52ae1fdc1cfcc95428e604e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/d07636581795383e2fea2d711212d30f941f2039",
|
||||
"reference": "d07636581795383e2fea2d711212d30f941f2039",
|
||||
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/e01ecc0b71168febb52ae1fdc1cfcc95428e604e",
|
||||
"reference": "e01ecc0b71168febb52ae1fdc1cfcc95428e604e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2436,7 +2447,7 @@
|
||||
"datetime",
|
||||
"time"
|
||||
],
|
||||
"time": "2019-10-20T11:05:44+00:00"
|
||||
"time": "2019-10-21T21:32:25+00:00"
|
||||
},
|
||||
{
|
||||
"name": "opis/closure",
|
||||
@@ -3213,16 +3224,16 @@
|
||||
},
|
||||
{
|
||||
"name": "psr/log",
|
||||
"version": "1.1.0",
|
||||
"version": "1.1.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-fig/log.git",
|
||||
"reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"
|
||||
"reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
|
||||
"reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
|
||||
"url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
|
||||
"reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -3231,7 +3242,7 @@
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0.x-dev"
|
||||
"dev-master": "1.1.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
@@ -3256,7 +3267,7 @@
|
||||
"psr",
|
||||
"psr-3"
|
||||
],
|
||||
"time": "2018-11-20T15:27:04+00:00"
|
||||
"time": "2019-11-01T11:05:21+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/simple-cache",
|
||||
@@ -3564,16 +3575,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/console.git",
|
||||
"reference": "929ddf360d401b958f611d44e726094ab46a7369"
|
||||
"reference": "136c4bd62ea871d00843d1bc0316de4c4a84bb78"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/929ddf360d401b958f611d44e726094ab46a7369",
|
||||
"reference": "929ddf360d401b958f611d44e726094ab46a7369",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/136c4bd62ea871d00843d1bc0316de4c4a84bb78",
|
||||
"reference": "136c4bd62ea871d00843d1bc0316de4c4a84bb78",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -3635,11 +3646,11 @@
|
||||
],
|
||||
"description": "Symfony Console Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2019-10-07T12:36:49+00:00"
|
||||
"time": "2019-10-30T12:58:49+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/css-selector",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/css-selector.git",
|
||||
@@ -3692,16 +3703,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/debug",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/debug.git",
|
||||
"reference": "cc5c1efd0edfcfd10b354750594a46b3dd2afbbe"
|
||||
"reference": "5ea9c3e01989a86ceaa0283f21234b12deadf5e2"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/debug/zipball/cc5c1efd0edfcfd10b354750594a46b3dd2afbbe",
|
||||
"reference": "cc5c1efd0edfcfd10b354750594a46b3dd2afbbe",
|
||||
"url": "https://api.github.com/repos/symfony/debug/zipball/5ea9c3e01989a86ceaa0283f21234b12deadf5e2",
|
||||
"reference": "5ea9c3e01989a86ceaa0283f21234b12deadf5e2",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -3744,11 +3755,11 @@
|
||||
],
|
||||
"description": "Symfony Debug Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2019-09-19T15:51:53+00:00"
|
||||
"time": "2019-10-28T17:07:32+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/event-dispatcher",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/event-dispatcher.git",
|
||||
@@ -3876,16 +3887,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/finder",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/finder.git",
|
||||
"reference": "5e575faa95548d0586f6bedaeabec259714e44d1"
|
||||
"reference": "72a068f77e317ae77c0a0495236ad292cfb5ce6f"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/finder/zipball/5e575faa95548d0586f6bedaeabec259714e44d1",
|
||||
"reference": "5e575faa95548d0586f6bedaeabec259714e44d1",
|
||||
"url": "https://api.github.com/repos/symfony/finder/zipball/72a068f77e317ae77c0a0495236ad292cfb5ce6f",
|
||||
"reference": "72a068f77e317ae77c0a0495236ad292cfb5ce6f",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -3921,20 +3932,20 @@
|
||||
],
|
||||
"description": "Symfony Finder Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2019-09-16T11:29:48+00:00"
|
||||
"time": "2019-10-30T12:53:54+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/http-foundation",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/http-foundation.git",
|
||||
"reference": "76590ced16d4674780863471bae10452b79210a5"
|
||||
"reference": "38f63e471cda9d37ac06e76d14c5ea2ec5887051"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/76590ced16d4674780863471bae10452b79210a5",
|
||||
"reference": "76590ced16d4674780863471bae10452b79210a5",
|
||||
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/38f63e471cda9d37ac06e76d14c5ea2ec5887051",
|
||||
"reference": "38f63e471cda9d37ac06e76d14c5ea2ec5887051",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -3976,20 +3987,20 @@
|
||||
],
|
||||
"description": "Symfony HttpFoundation Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2019-10-04T19:48:13+00:00"
|
||||
"time": "2019-10-30T12:58:49+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/http-kernel",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/http-kernel.git",
|
||||
"reference": "5f08141850932e8019c01d8988bf3ed6367d2991"
|
||||
"reference": "56acfda9e734e8715b3b0e6859cdb4f5b28757bf"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/5f08141850932e8019c01d8988bf3ed6367d2991",
|
||||
"reference": "5f08141850932e8019c01d8988bf3ed6367d2991",
|
||||
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/56acfda9e734e8715b3b0e6859cdb4f5b28757bf",
|
||||
"reference": "56acfda9e734e8715b3b0e6859cdb4f5b28757bf",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4068,20 +4079,20 @@
|
||||
],
|
||||
"description": "Symfony HttpKernel Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2019-10-07T15:06:41+00:00"
|
||||
"time": "2019-11-01T10:00:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/mime",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/mime.git",
|
||||
"reference": "32f71570547b91879fdbd9cf50317d556ae86916"
|
||||
"reference": "3c0e197529da6e59b217615ba8ee7604df88b551"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/mime/zipball/32f71570547b91879fdbd9cf50317d556ae86916",
|
||||
"reference": "32f71570547b91879fdbd9cf50317d556ae86916",
|
||||
"url": "https://api.github.com/repos/symfony/mime/zipball/3c0e197529da6e59b217615ba8ee7604df88b551",
|
||||
"reference": "3c0e197529da6e59b217615ba8ee7604df88b551",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4127,7 +4138,7 @@
|
||||
"mime",
|
||||
"mime-type"
|
||||
],
|
||||
"time": "2019-09-19T17:00:15+00:00"
|
||||
"time": "2019-10-30T12:58:49+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-ctype",
|
||||
@@ -4590,16 +4601,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/process",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/process.git",
|
||||
"reference": "50556892f3cc47d4200bfd1075314139c4c9ff4b"
|
||||
"reference": "3b2e0cb029afbb0395034509291f21191d1a4db0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/process/zipball/50556892f3cc47d4200bfd1075314139c4c9ff4b",
|
||||
"reference": "50556892f3cc47d4200bfd1075314139c4c9ff4b",
|
||||
"url": "https://api.github.com/repos/symfony/process/zipball/3b2e0cb029afbb0395034509291f21191d1a4db0",
|
||||
"reference": "3b2e0cb029afbb0395034509291f21191d1a4db0",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4635,7 +4646,7 @@
|
||||
],
|
||||
"description": "Symfony Process Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2019-09-26T21:17:10+00:00"
|
||||
"time": "2019-10-28T17:07:32+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/psr-http-message-bridge",
|
||||
@@ -4704,16 +4715,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/routing",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/routing.git",
|
||||
"reference": "3b174ef04fe66696524efad1e5f7a6c663d822ea"
|
||||
"reference": "63a9920cc86fcc745e5ea254e362f02b615290b9"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/routing/zipball/3b174ef04fe66696524efad1e5f7a6c663d822ea",
|
||||
"reference": "3b174ef04fe66696524efad1e5f7a6c663d822ea",
|
||||
"url": "https://api.github.com/repos/symfony/routing/zipball/63a9920cc86fcc745e5ea254e362f02b615290b9",
|
||||
"reference": "63a9920cc86fcc745e5ea254e362f02b615290b9",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4776,7 +4787,7 @@
|
||||
"uri",
|
||||
"url"
|
||||
],
|
||||
"time": "2019-10-04T20:57:10+00:00"
|
||||
"time": "2019-10-30T12:58:49+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/service-contracts",
|
||||
@@ -4838,16 +4849,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/translation",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/translation.git",
|
||||
"reference": "fe6193b066c457c144333c06aaa869a2d42a167f"
|
||||
"reference": "a3aa590ce944afb3434d7a55f81b00927144d5ec"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/translation/zipball/fe6193b066c457c144333c06aaa869a2d42a167f",
|
||||
"reference": "fe6193b066c457c144333c06aaa869a2d42a167f",
|
||||
"url": "https://api.github.com/repos/symfony/translation/zipball/a3aa590ce944afb3434d7a55f81b00927144d5ec",
|
||||
"reference": "a3aa590ce944afb3434d7a55f81b00927144d5ec",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4910,7 +4921,7 @@
|
||||
],
|
||||
"description": "Symfony Translation Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2019-09-27T14:37:39+00:00"
|
||||
"time": "2019-10-30T12:53:54+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/translation-contracts",
|
||||
@@ -4971,16 +4982,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/var-dumper",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/var-dumper.git",
|
||||
"reference": "bde8957fc415fdc6964f33916a3755737744ff05"
|
||||
"reference": "ea4940845535c85ff5c505e13b3205b0076d07bf"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/bde8957fc415fdc6964f33916a3755737744ff05",
|
||||
"reference": "bde8957fc415fdc6964f33916a3755737744ff05",
|
||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/ea4940845535c85ff5c505e13b3205b0076d07bf",
|
||||
"reference": "ea4940845535c85ff5c505e13b3205b0076d07bf",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -5043,20 +5054,20 @@
|
||||
"debug",
|
||||
"dump"
|
||||
],
|
||||
"time": "2019-10-04T19:48:13+00:00"
|
||||
"time": "2019-10-13T12:02:04+00:00"
|
||||
},
|
||||
{
|
||||
"name": "tightenco/collect",
|
||||
"version": "v6.4.0",
|
||||
"version": "v6.4.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/tightenco/collect.git",
|
||||
"reference": "48b88a0e488fba617f077e0f89bae286b35d9eef"
|
||||
"reference": "9796fcd7ad3286dda60d0cf5120afbff8e3b9db6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/tightenco/collect/zipball/48b88a0e488fba617f077e0f89bae286b35d9eef",
|
||||
"reference": "48b88a0e488fba617f077e0f89bae286b35d9eef",
|
||||
"url": "https://api.github.com/repos/tightenco/collect/zipball/9796fcd7ad3286dda60d0cf5120afbff8e3b9db6",
|
||||
"reference": "9796fcd7ad3286dda60d0cf5120afbff8e3b9db6",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -5093,7 +5104,7 @@
|
||||
"collection",
|
||||
"laravel"
|
||||
],
|
||||
"time": "2019-10-23T14:47:45+00:00"
|
||||
"time": "2019-10-23T21:04:40+00:00"
|
||||
},
|
||||
{
|
||||
"name": "tijsverkoyen/css-to-inline-styles",
|
||||
@@ -5514,16 +5525,16 @@
|
||||
},
|
||||
{
|
||||
"name": "composer/composer",
|
||||
"version": "1.9.0",
|
||||
"version": "1.9.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/composer/composer.git",
|
||||
"reference": "314aa57fdcfc942065996f59fb73a8b3f74f3fa5"
|
||||
"reference": "bb01f2180df87ce7992b8331a68904f80439dd2f"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/composer/composer/zipball/314aa57fdcfc942065996f59fb73a8b3f74f3fa5",
|
||||
"reference": "314aa57fdcfc942065996f59fb73a8b3f74f3fa5",
|
||||
"url": "https://api.github.com/repos/composer/composer/zipball/bb01f2180df87ce7992b8331a68904f80439dd2f",
|
||||
"reference": "bb01f2180df87ce7992b8331a68904f80439dd2f",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -5590,7 +5601,7 @@
|
||||
"dependency",
|
||||
"package"
|
||||
],
|
||||
"time": "2019-08-02T18:55:33+00:00"
|
||||
"time": "2019-11-01T16:20:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "composer/semver",
|
||||
@@ -6769,16 +6780,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpunit/phpunit",
|
||||
"version": "8.4.1",
|
||||
"version": "8.4.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||
"reference": "366a4a0f2b971fd43b7c351d621e8dd7d7131869"
|
||||
"reference": "a142a7e66c0ea7b5b6c04ee27f08d10d1137cd9b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/366a4a0f2b971fd43b7c351d621e8dd7d7131869",
|
||||
"reference": "366a4a0f2b971fd43b7c351d621e8dd7d7131869",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a142a7e66c0ea7b5b6c04ee27f08d10d1137cd9b",
|
||||
"reference": "a142a7e66c0ea7b5b6c04ee27f08d10d1137cd9b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -6848,7 +6859,7 @@
|
||||
"testing",
|
||||
"xunit"
|
||||
],
|
||||
"time": "2019-10-07T12:57:41+00:00"
|
||||
"time": "2019-10-28T10:39:51+00:00"
|
||||
},
|
||||
{
|
||||
"name": "roave/security-advisories",
|
||||
@@ -6856,12 +6867,12 @@
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/Roave/SecurityAdvisories.git",
|
||||
"reference": "eb59d9f35a47f567ae15e7179d7c666489cd4b85"
|
||||
"reference": "f8c8349a4b12a26edfa8b21d07d3dbeb6dcedcfa"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/eb59d9f35a47f567ae15e7179d7c666489cd4b85",
|
||||
"reference": "eb59d9f35a47f567ae15e7179d7c666489cd4b85",
|
||||
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/f8c8349a4b12a26edfa8b21d07d3dbeb6dcedcfa",
|
||||
"reference": "f8c8349a4b12a26edfa8b21d07d3dbeb6dcedcfa",
|
||||
"shasum": ""
|
||||
},
|
||||
"conflict": {
|
||||
@@ -7064,7 +7075,7 @@
|
||||
}
|
||||
],
|
||||
"description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it",
|
||||
"time": "2019-10-09T14:04:58+00:00"
|
||||
"time": "2019-10-29T22:11:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/code-unit-reverse-lookup",
|
||||
@@ -7776,7 +7787,7 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/filesystem",
|
||||
"version": "v4.3.5",
|
||||
"version": "v4.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/filesystem.git",
|
||||
|
||||
@@ -125,8 +125,8 @@ return [
|
||||
'is_demo_site' => false,
|
||||
],
|
||||
'encryption' => null === env('USE_ENCRYPTION') || env('USE_ENCRYPTION') === true,
|
||||
'version' => '4.8.1.6',
|
||||
'api_version' => '0.10.4',
|
||||
'version' => '4.8.2-alpha.1',
|
||||
'api_version' => '0.10.5',
|
||||
'db_version' => 11,
|
||||
'maxUploadSize' => 15242880,
|
||||
'send_error_message' => env('SEND_ERROR_MESSAGE', true),
|
||||
@@ -145,6 +145,7 @@ return [
|
||||
'disable_frame_header' => env('DISABLE_FRAME_HEADER', false),
|
||||
'login_provider' => envNonEmpty('LOGIN_PROVIDER', 'eloquent'),
|
||||
'cer_provider' => envNonEmpty('CER_PROVIDER', 'fixer'),
|
||||
'update_endpoint' => 'https://version.firefly-iii.org/index.json',
|
||||
'allowedMimes' => [
|
||||
/* plain files */
|
||||
'text/plain',
|
||||
|
||||
@@ -69,6 +69,11 @@ return [
|
||||
'path' => 'php://stdout',
|
||||
'level' => envNonEmpty('APP_LOG_LEVEL', 'info'),
|
||||
],
|
||||
'docker_out' => [
|
||||
'driver' => 'single',
|
||||
'path' => 'php://stdout',
|
||||
'level' => envNonEmpty('APP_LOG_LEVEL', 'info'),
|
||||
],
|
||||
'daily' => [
|
||||
'driver' => 'daily',
|
||||
'path' => storage_path('logs/ff3-' . PHP_SAPI . '.log'),
|
||||
|
||||
9
resources/lang/.gitignore
vendored
Normal file
9
resources/lang/.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
ca_ES
|
||||
da_DK
|
||||
he_IL
|
||||
ja_JP
|
||||
pt_PT
|
||||
sl_SI
|
||||
uk_UA
|
||||
sv_SE
|
||||
sr_CS
|
||||
26
resources/lang/cs_CZ/api.php
Normal file
26
resources/lang/cs_CZ/api.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* api.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* 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 [
|
||||
|
||||
];
|
||||
@@ -224,10 +224,17 @@ return [
|
||||
'admin_update_check_now_title' => 'Zjistit dostupno případných aktualizací nyní',
|
||||
'admin_update_check_now_explain' => 'Stisknutím tohoto tlačítka Firefly III ověří, zda používáte nejnovější verzi.',
|
||||
'check_for_updates_button' => 'Zkontrolovat nyní!',
|
||||
'update_new_version_alert' => 'Je k dispozici nová verze Firefly III. Nyní provozujete verzi :your_version, nejnovější verze je :new_version, která byla vydaná :date.',
|
||||
'update_current_version_alert' => 'Provozujete verzi :version, která je nejnovější dostupnou verzí.',
|
||||
'update_newer_version_alert' => 'Provozujete verzi :your_version, zatímco nejnovější vydání je verze :new_version.',
|
||||
'update_new_version_alert' => 'A new version of Firefly III is available. You are running :your_version, the latest version is :new_version which was released on :date.',
|
||||
'update_version_beta' => 'This version is a BETA version. You may run into issues.',
|
||||
'update_version_alpha' => 'This version is a ALPHA version. You may run into issues.',
|
||||
'update_current_version_alert' => 'You are running :version, which is the latest available release.',
|
||||
'update_newer_version_alert' => 'You are running :your_version, which is newer than the latest release, :new_version.',
|
||||
'update_check_error' => 'Došlo k chybě při zjišťování případných aktualizací. Podívejte se do souborů se záznamem událostí.',
|
||||
'admin_update_channel_title' => 'Update channel',
|
||||
'admin_update_channel_explain' => 'Firefly III has three update "channels" which determine how ahead of the curve you are in terms of features, enhancements and bugs. Use the "beta" channel if you\'re adventurous and the "alpha" when you like to live life dangerously.',
|
||||
'update_channel_stable' => 'Stable. Everything should work as expected.',
|
||||
'update_channel_beta' => 'Beta. New features but things may be broken.',
|
||||
'update_channel_alpha' => 'Alpha. We throw stuff in, and use whatever sticks.',
|
||||
|
||||
// search
|
||||
'search' => 'Hledat',
|
||||
@@ -1277,6 +1284,7 @@ return [
|
||||
'send_test_triggered' => 'Test was triggered. Check your inbox and the log files.',
|
||||
|
||||
'split_transaction_title' => 'Popis rozúčtování',
|
||||
'split_transaction_title_help' => 'If you create a split transaction, there must be a global description for all splits of the transaction.',
|
||||
'split_title_help' => 'Pokud vytvoříte rozúčtování, je třeba, aby zde byl celkový popis pro všechna rozúčtování dané transakce.',
|
||||
'transaction_information' => 'Informace o transakci',
|
||||
'you_create_transfer' => 'Vytváříte <strong>převod</strong>.',
|
||||
|
||||
@@ -38,6 +38,7 @@ return [
|
||||
'match' => 'Matches on',
|
||||
'strict' => 'Striktní režim',
|
||||
'repeat_freq' => 'Repeats',
|
||||
'update_channel' => 'Update channel',
|
||||
'journal_currency_id' => 'Měna',
|
||||
'currency_id' => 'Měna',
|
||||
'transaction_currency_id' => 'Měna',
|
||||
|
||||
@@ -45,6 +45,7 @@ return [
|
||||
'at_least_one_repetition' => 'Potřebujete alespoň jedno opakování.',
|
||||
'require_repeat_until' => 'Require either a number of repetitions, or an end date (repeat_until). Not both.',
|
||||
'require_currency_info' => 'Obsah tohoto pole je neplatný bez informace o měně.',
|
||||
'not_transfer_account' => 'This account is not an account that can be used for transfers.',
|
||||
'require_currency_amount' => 'The content of this field is invalid without foreign amount information.',
|
||||
'equal_description' => 'Popis transakce nesmí být stejný jako globální popis.',
|
||||
'file_invalid_mime' => 'Soubor ":name" je typu ":mime", který není schválen pro nahrání.',
|
||||
|
||||
26
resources/lang/de_DE/api.php
Normal file
26
resources/lang/de_DE/api.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* api.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* 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 [
|
||||
|
||||
];
|
||||
@@ -224,10 +224,17 @@ return [
|
||||
'admin_update_check_now_title' => 'Auf Update überprüfen',
|
||||
'admin_update_check_now_explain' => 'Wenn Sie den Knopf drücken, wird Firefly III überprüfen, ob Ihre Version die aktuellste ist.',
|
||||
'check_for_updates_button' => 'Jetzt prüfen!',
|
||||
'update_new_version_alert' => 'Eine neue Version von Firefly III ist verfügbar. Sie verwenden v:your_version, die neueste Version ist v:new_version und wurde am :date veröffentlicht.',
|
||||
'update_current_version_alert' => 'Sie verwenden Version v:version. Dies ist die neueste verfügbare Version.',
|
||||
'update_newer_version_alert' => 'Sie verwenden v:your_version. Ihre Version ist neuer als die neueste Version (v:new_version).',
|
||||
'update_new_version_alert' => 'Eine neue Version von Firefly III ist verfügbar. Sie verwenden :your_version, die neueste Version ist :new_version, die am :date veröffentlicht wurde.',
|
||||
'update_version_beta' => 'Seien Sie vorsichtig bei der Verwendung dieser BETA-Version. Sie könnte noch Fehler enthaltern.',
|
||||
'update_version_alpha' => 'Seien Sie vorsichtig bei der Verwendung dieser APLPHA-Version. Sie kann Fehler enthaltern.',
|
||||
'update_current_version_alert' => 'Sie verwenden Version :version. Dies ist die neueste verfügbare Version.',
|
||||
'update_newer_version_alert' => 'Sie verwenden :your_version. Ihre Version ist neuer als die neueste Version (:new_version).',
|
||||
'update_check_error' => 'Beim Suchen nach Updates ist ein Fehler aufgetreten. Bitte sehen Sie sich die Log-Dateien an.',
|
||||
'admin_update_channel_title' => 'Aktualisierungskanal',
|
||||
'admin_update_channel_explain' => 'Firefly III verfügt über drei Aktualisierungskanäle, welche bestimmen, wie weit Sie in Bezug auf Funktionen, Verbesserungen und Fehler experimentierfreudig sind. Nutzen Sie den „Beta”-Kanal, wenn Sie abenteuerlustig sind, und den „Alpha”-Kanal, wenn Sie ein gefährliches Leben führen möchten.',
|
||||
'update_channel_stable' => 'Stabil — Alles sollte wie erwartet funktionieren.',
|
||||
'update_channel_beta' => 'Beta — Neue Funktionen, aber einige Funktionen könnten fehlerhaft sein.',
|
||||
'update_channel_alpha' => 'Alpha — Wir experiementieren mit neuen Dingen und benutzen die noch Fallstricke enthalten.',
|
||||
|
||||
// search
|
||||
'search' => 'Suche',
|
||||
@@ -1277,6 +1284,7 @@ return [
|
||||
'send_test_triggered' => 'Der Test wurde ausgelöst. Überprüfen Sie Ihren Posteingang und die Protokolldateien.',
|
||||
|
||||
'split_transaction_title' => 'Beschreibung der Splittbuchung',
|
||||
'split_transaction_title_help' => 'If you create a split transaction, there must be a global description for all splits of the transaction.',
|
||||
'split_title_help' => 'Wenn Sie eine Splittbuchung anlegen, muss es eine eindeutige Beschreibung für alle Aufteilungen der Buchhaltung geben.',
|
||||
'transaction_information' => 'Buchungsinformation',
|
||||
'you_create_transfer' => 'Sie erstellen gerade eine <strong>Umbuchung</strong>.',
|
||||
|
||||
@@ -38,6 +38,7 @@ return [
|
||||
'match' => 'Reagiert auf',
|
||||
'strict' => 'Strenger Modus',
|
||||
'repeat_freq' => 'Wiederholungen',
|
||||
'update_channel' => 'Aktualisierungskanal',
|
||||
'journal_currency_id' => 'Währung',
|
||||
'currency_id' => 'Währung',
|
||||
'transaction_currency_id' => 'Währung',
|
||||
|
||||
@@ -45,6 +45,7 @@ return [
|
||||
'at_least_one_repetition' => 'Mindestens eine Wiederholung erforderlich.',
|
||||
'require_repeat_until' => 'Erfordert entweder eine Anzahl von Wiederholungen oder ein Enddatum (repeat_until). Nicht beides.',
|
||||
'require_currency_info' => 'Der Inhalt dieses Feldes ist ohne Währungsinformationen ungültig.',
|
||||
'not_transfer_account' => 'Dieses Konto ist kein Konto, welches für Buchungen genutzt werden kann.',
|
||||
'require_currency_amount' => 'Der Inhalt dieses Feldes ist ohne Fremdbetragsangaben ungültig.',
|
||||
'equal_description' => 'Die Transaktionsbeschreibung darf nicht der globalen Beschreibung entsprechen.',
|
||||
'file_invalid_mime' => 'Die Datei „:name” ist vom Typ „:mime”, welcher nicht zum Hochladen zugelassen ist.',
|
||||
|
||||
26
resources/lang/el_GR/api.php
Normal file
26
resources/lang/el_GR/api.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* api.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* 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 [
|
||||
|
||||
];
|
||||
@@ -224,10 +224,17 @@ return [
|
||||
'admin_update_check_now_title' => 'Έλεγχος για ενημερώσεις τώρα',
|
||||
'admin_update_check_now_explain' => 'Εάν πατήσετε αυτό του κουμπί, το Firefly III θα ελέγξει εάν έχετε την τελευταία έκδοση.',
|
||||
'check_for_updates_button' => 'Έλεγχος τώρα!',
|
||||
'update_new_version_alert' => 'Μία νέα έκδοση του Firefly III είναι διαθέσιμη. Έχετε την v:your_version, ενώ η τελευταία έκδοση είναι η v:new_version που κυκλοφόρησε στις :date.',
|
||||
'update_current_version_alert' => 'Έχετε την έκδοση v:version, που είναι η τελευταία διαθέσιμη.',
|
||||
'update_newer_version_alert' => 'Έχετε την έκδοση v:your_version, που είναι νεότερη από την τελευταία έκδοση, v:new_version.',
|
||||
'update_new_version_alert' => 'A new version of Firefly III is available. You are running :your_version, the latest version is :new_version which was released on :date.',
|
||||
'update_version_beta' => 'This version is a BETA version. You may run into issues.',
|
||||
'update_version_alpha' => 'This version is a ALPHA version. You may run into issues.',
|
||||
'update_current_version_alert' => 'You are running :version, which is the latest available release.',
|
||||
'update_newer_version_alert' => 'You are running :your_version, which is newer than the latest release, :new_version.',
|
||||
'update_check_error' => 'Ένα σφάλμα παρουσιάστηκε κατά τον έλεγχο ενημερώσεων. Παρακαλώ δείτε τα αρχεία καταγραφής.',
|
||||
'admin_update_channel_title' => 'Update channel',
|
||||
'admin_update_channel_explain' => 'Firefly III has three update "channels" which determine how ahead of the curve you are in terms of features, enhancements and bugs. Use the "beta" channel if you\'re adventurous and the "alpha" when you like to live life dangerously.',
|
||||
'update_channel_stable' => 'Stable. Everything should work as expected.',
|
||||
'update_channel_beta' => 'Beta. New features but things may be broken.',
|
||||
'update_channel_alpha' => 'Alpha. We throw stuff in, and use whatever sticks.',
|
||||
|
||||
// search
|
||||
'search' => 'Αναζήτηση',
|
||||
@@ -1277,6 +1284,7 @@ return [
|
||||
'send_test_triggered' => 'Test was triggered. Check your inbox and the log files.',
|
||||
|
||||
'split_transaction_title' => 'Description of the split transaction',
|
||||
'split_transaction_title_help' => 'If you create a split transaction, there must be a global description for all splits of the transaction.',
|
||||
'split_title_help' => 'If you create a split transaction, there must be a global description for all splits of the transaction.',
|
||||
'transaction_information' => 'Transaction information',
|
||||
'you_create_transfer' => 'You\'re creating a <strong>transfer</strong>.',
|
||||
|
||||
@@ -38,6 +38,7 @@ return [
|
||||
'match' => 'Αντιστοιχίες στις',
|
||||
'strict' => 'Αυστηρή λειτουργία',
|
||||
'repeat_freq' => 'Επαναλήψεις',
|
||||
'update_channel' => 'Update channel',
|
||||
'journal_currency_id' => 'Νόμισμα',
|
||||
'currency_id' => 'Νόμισμα',
|
||||
'transaction_currency_id' => 'Νόμισμα',
|
||||
|
||||
@@ -45,6 +45,7 @@ return [
|
||||
'at_least_one_repetition' => 'Απαιτείται τουλάχιστον μία επανάληψη.',
|
||||
'require_repeat_until' => 'Απαιτείται είτε ένας αριθμός επαναλήψεων, ή μία ημερομηνία λήξης (repeat_until). Όχι και τα δύο.',
|
||||
'require_currency_info' => 'Το περιεχόμενο αυτού του πεδίου δεν είναι έγκυρη χωρίς νομισματικές πληροφορίες.',
|
||||
'not_transfer_account' => 'This account is not an account that can be used for transfers.',
|
||||
'require_currency_amount' => 'Το περιεχόμενο αυτού του πεδίου δεν είναι έγκυρο χωρίς πληροφορίες ετερόχθονος ποσού.',
|
||||
'equal_description' => 'Η περιγραφή της συναλλαγής δεν πρέπει να ισούται με καθολική περιγραφή.',
|
||||
'file_invalid_mime' => 'Το αρχείο ":name" είναι τύπου ":mime" που δεν είναι αποδεκτός ως νέας μεταφόρτωσης.',
|
||||
|
||||
26
resources/lang/en_US/api.php
Normal file
26
resources/lang/en_US/api.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* api.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* 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 [
|
||||
|
||||
];
|
||||
@@ -224,10 +224,17 @@ return [
|
||||
'admin_update_check_now_title' => 'Check for updates now',
|
||||
'admin_update_check_now_explain' => 'If you press the button, Firefly III will see if your current version is the latest.',
|
||||
'check_for_updates_button' => 'Check now!',
|
||||
'update_new_version_alert' => 'A new version of Firefly III is available. You are running v:your_version, the latest version is v:new_version which was released on :date.',
|
||||
'update_current_version_alert' => 'You are running v:version, which is the latest available release.',
|
||||
'update_newer_version_alert' => 'You are running v:your_version, which is newer than the latest release, v:new_version.',
|
||||
'update_new_version_alert' => 'A new version of Firefly III is available. You are running :your_version, the latest version is :new_version which was released on :date.',
|
||||
'update_version_beta' => 'This version is a BETA version. You may run into issues.',
|
||||
'update_version_alpha' => 'This version is a ALPHA version. You may run into issues.',
|
||||
'update_current_version_alert' => 'You are running :version, which is the latest available release.',
|
||||
'update_newer_version_alert' => 'You are running :your_version, which is newer than the latest release, :new_version.',
|
||||
'update_check_error' => 'An error occurred while checking for updates. Please view the log files.',
|
||||
'admin_update_channel_title' => 'Update channel',
|
||||
'admin_update_channel_explain' => 'Firefly III has three update "channels" which determine how ahead of the curve you are in terms of features, enhancements and bugs. Use the "beta" channel if you\'re adventurous and the "alpha" when you like to live life dangerously.',
|
||||
'update_channel_stable' => 'Stable. Everything should work as expected.',
|
||||
'update_channel_beta' => 'Beta. New features but things may be broken.',
|
||||
'update_channel_alpha' => 'Alpha. We throw stuff in, and use whatever sticks.',
|
||||
|
||||
// search
|
||||
'search' => 'Search',
|
||||
@@ -1277,6 +1284,7 @@ return [
|
||||
'send_test_triggered' => 'Test was triggered. Check your inbox and the log files.',
|
||||
|
||||
'split_transaction_title' => 'Description of the split transaction',
|
||||
'split_transaction_title_help' => 'If you create a split transaction, there must be a global description for all splits of the transaction.',
|
||||
'split_title_help' => 'If you create a split transaction, there must be a global description for all splits of the transaction.',
|
||||
'transaction_information' => 'Transaction information',
|
||||
'you_create_transfer' => 'You\'re creating a <strong>transfer</strong>.',
|
||||
|
||||
@@ -38,6 +38,7 @@ return [
|
||||
'match' => 'Matches on',
|
||||
'strict' => 'Strict mode',
|
||||
'repeat_freq' => 'Repeats',
|
||||
'update_channel' => 'Update channel',
|
||||
'journal_currency_id' => 'Currency',
|
||||
'currency_id' => 'Currency',
|
||||
'transaction_currency_id' => 'Currency',
|
||||
|
||||
@@ -45,6 +45,7 @@ return [
|
||||
'at_least_one_repetition' => 'Need at least one repetition.',
|
||||
'require_repeat_until' => 'Require either a number of repetitions, or an end date (repeat_until). Not both.',
|
||||
'require_currency_info' => 'The content of this field is invalid without currency information.',
|
||||
'not_transfer_account' => 'This account is not an account that can be used for transfers.',
|
||||
'require_currency_amount' => 'The content of this field is invalid without foreign amount information.',
|
||||
'equal_description' => 'Transaction description should not equal global description.',
|
||||
'file_invalid_mime' => 'File ":name" is of type ":mime" which is not accepted as a new upload.',
|
||||
|
||||
26
resources/lang/es_ES/api.php
Normal file
26
resources/lang/es_ES/api.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* api.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* 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 [
|
||||
|
||||
];
|
||||
@@ -224,10 +224,17 @@ return [
|
||||
'admin_update_check_now_title' => 'Ver actualizaciones ahora',
|
||||
'admin_update_check_now_explain' => 'SI usted presiona el botón, Firefly III vera si su actual versión es la última.',
|
||||
'check_for_updates_button' => '¡Ver ahora!',
|
||||
'update_new_version_alert' => 'Una nueva versión de Firefly III esta disponible. Usted esta ejecutando v:your_version, la ultima versión es v:new_version que se lanzo en :date.',
|
||||
'update_current_version_alert' => 'Usted esta ejecutando v:version, que es la ultima versión disponible.',
|
||||
'update_newer_version_alert' => 'Usted esta ejecutando v:your_version, que es mas nueva que la versión anterior, v:new_version.',
|
||||
'update_new_version_alert' => 'Una nueva versión de Firefly III esta disponible. Usted esta ejecutando :your_version, la ultima versión es :new_version que se lanzó en :date.',
|
||||
'update_version_beta' => 'Esta versión es una versión BETA. Puede tener problemas.',
|
||||
'update_version_alpha' => 'Esta versión es una versión de ALPHA. Puede tener problemas.',
|
||||
'update_current_version_alert' => 'Usted esta ejecutando :version, que es la última versión disponible.',
|
||||
'update_newer_version_alert' => 'Usted esta ejecutando :your_version, que es mas nueva que la última versión, :new_version.',
|
||||
'update_check_error' => 'Un error ha ocurrido mientras se verificaban las actualizaciones. Por favor ver los archivos de registro.',
|
||||
'admin_update_channel_title' => 'Canal de actualizaciones',
|
||||
'admin_update_channel_explain' => 'Firefly III tiene tres "canales" de actualización que determinan cuán por delante está en términos de características, mejoras y errores. Use el canal "beta" si es aventurero y el "alfa" cuando quiera vivir la vida peligrosamente.',
|
||||
'update_channel_stable' => 'Estable. Todo debería funcionar como se espera.',
|
||||
'update_channel_beta' => 'Beta. Nuevas funcionalidades, pero las cosas pueden romperse.',
|
||||
'update_channel_alpha' => 'Alpha. Tiramos cosas y usamos lo que sea que se pegue.',
|
||||
|
||||
// search
|
||||
'search' => 'Buscar',
|
||||
@@ -1164,7 +1171,7 @@ return [
|
||||
'left_to_spend' => 'Dejar para gastar',
|
||||
'earned' => 'Ganado',
|
||||
'overspent' => 'Sobrepasadas',
|
||||
'left' => 'Izquierda',
|
||||
'left' => 'Para gastar',
|
||||
'max-amount' => 'Cantidad máxima',
|
||||
'min-amount' => 'Monto mínimo',
|
||||
'journal-amount' => 'Entrada actual de factura',
|
||||
@@ -1277,6 +1284,7 @@ return [
|
||||
'send_test_triggered' => 'La prueba fue disparada. Chequee su bandeja de entrada y archivos de registro.',
|
||||
|
||||
'split_transaction_title' => 'Descripción de la transacción dividida',
|
||||
'split_transaction_title_help' => 'If you create a split transaction, there must be a global description for all splits of the transaction.',
|
||||
'split_title_help' => 'Si crea una transacción dividida, debe haber una descripción global para todos los fragmentos de la transacción.',
|
||||
'transaction_information' => 'Información de la transacción',
|
||||
'you_create_transfer' => 'Estás creando una <strong>transferencia</strong>.',
|
||||
|
||||
@@ -38,6 +38,7 @@ return [
|
||||
'match' => 'Encuentros en',
|
||||
'strict' => 'Modo estricto',
|
||||
'repeat_freq' => 'Repetición',
|
||||
'update_channel' => 'Canal de actualizaciones',
|
||||
'journal_currency_id' => 'Divisa',
|
||||
'currency_id' => 'Divisa',
|
||||
'transaction_currency_id' => 'Moneda',
|
||||
|
||||
@@ -45,6 +45,7 @@ return [
|
||||
'at_least_one_repetition' => 'Se necesita al menos una repetición.',
|
||||
'require_repeat_until' => 'Se precisa un número de repeticiones o una fecha de finalización (repeat_until). No ambas.',
|
||||
'require_currency_info' => 'El contenido de este campo no es válido sin la información montearia.',
|
||||
'not_transfer_account' => 'Esta cuenta no es una cuenta que se pueda utilizar para transferencias.',
|
||||
'require_currency_amount' => 'El contenido de este campo no es válido sin información de cantidad extranjera.',
|
||||
'equal_description' => 'La descripción de la transacción no debería ser igual a la descripción global.',
|
||||
'file_invalid_mime' => 'El archivo ":name" es de tipo ":mime", el cual no se acepta.',
|
||||
|
||||
26
resources/lang/fr_FR/api.php
Normal file
26
resources/lang/fr_FR/api.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* api.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* 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 [
|
||||
|
||||
];
|
||||
@@ -134,8 +134,8 @@ return [
|
||||
'show_the_current_period_and_overview' => 'Afficher l’exercice en cours et sa vue d’ensemble',
|
||||
'pref_languages_locale' => 'Pour une langue autre que l’anglais et pour fonctionner correctement, votre système d’exploitation doit être équipé avec les paramètres régionaux correctes. Si ils ne sont pas présents, les données de devises, les dates et les montants peuvent être mal formatés.',
|
||||
'budget_in_period' => 'Toutes les transactions pour le budget ":name" entre :start et :end dans la monnaie :currency',
|
||||
'chart_budget_in_period' => 'Chart for all transactions for budget ":name" between :start and :end in :currency',
|
||||
'chart_budget_in_period_only_currency' => 'The amount you budgeted was in :currency, so this chart will only show transactions in :currency.',
|
||||
'chart_budget_in_period' => 'Graphique pour toutes les transactions pour le budget ":name" entre :start et :end dans :currency',
|
||||
'chart_budget_in_period_only_currency' => 'Le montant que vous avez budgété était en :currency, ce graphique ne montrera donc que les transactions dans :currency.',
|
||||
'chart_account_in_period' => 'Graphique pour toutes les transactions pour le compte ":name" entre :start et :end',
|
||||
'chart_category_in_period' => 'Graphique pour toutes les transactions pour la catégorie ":name" entre :start et :end',
|
||||
'chart_category_all' => 'Graphique pour toutes les transactions pour la catégorie ":name"',
|
||||
@@ -208,7 +208,7 @@ return [
|
||||
'scopes_will_be_able' => 'Cette application pourra :',
|
||||
'button_authorize' => 'Autoriser',
|
||||
'none_in_select_list' => '(aucun)',
|
||||
'no_piggy_bank' => '(no piggy bank)',
|
||||
'no_piggy_bank' => '(aucune tirelire)',
|
||||
'name_in_currency' => ':name en :currency',
|
||||
'paid_in_currency' => 'Payé en :currency',
|
||||
'unpaid_in_currency' => 'Non payé en :currency',
|
||||
@@ -225,9 +225,16 @@ return [
|
||||
'admin_update_check_now_explain' => 'Si vous appuyez sur le bouton, Firefly III verra si votre version actuelle est la dernière.',
|
||||
'check_for_updates_button' => 'Vérifier maintenant !',
|
||||
'update_new_version_alert' => 'Une nouvelle version de Firefly III est disponible. Vous utilisez v:your_version, la dernière version est v:new_version qui a été publiée le :date.',
|
||||
'update_version_beta' => 'Cette version est une version BETA. Vous pouvez rencontrer des problèmes.',
|
||||
'update_version_alpha' => 'Cette version est une version ALPHA. Vous pourriez rencontrer des problèmes.',
|
||||
'update_current_version_alert' => 'Vous utilisez v:version, qui est la dernière version disponible.',
|
||||
'update_newer_version_alert' => 'Vous utilisez v:your_version, qui est plus récente que la dernière version, v:new_version.',
|
||||
'update_check_error' => 'Une erreur s\'est produite lors de la recherche des mises à jour. S\'il vous plaît allez voir les fichiers journaux.',
|
||||
'admin_update_channel_title' => 'Canal de mise à jour',
|
||||
'admin_update_channel_explain' => 'Firefly III dispose de trois canaux de mise à jour qui déterminent ce que vous êtes prêt à accepter en termes de fonctionnalités, d\'améliorations et de bogues. Utilisez le canal « bêta » si vous êtes aventurier et le « alpha » lorsque vous aimez vivre dangereusement.',
|
||||
'update_channel_stable' => 'Stable. Tout devrait fonctionner comme prévu.',
|
||||
'update_channel_beta' => 'Bêta. De nouvelles fonctionnalités sont présentes, mais il peut exister des régressions.',
|
||||
'update_channel_alpha' => 'Alpha. Nous essayons des choses et gardons ce qui fonctionne.',
|
||||
|
||||
// search
|
||||
'search' => 'Rechercher',
|
||||
@@ -255,8 +262,8 @@ return [
|
||||
'search_modifier_on' => 'La date de l\'opération est :value',
|
||||
'search_modifier_before' => 'La date de l\'opération est avant :value',
|
||||
'search_modifier_after' => 'La date de l\'opération est après :value',
|
||||
'search_modifier_created_on' => 'Transaction was created on :value',
|
||||
'search_modifier_updated_on' => 'Transaction was last updated on :value',
|
||||
'search_modifier_created_on' => 'La transaction a été créée sur :value',
|
||||
'search_modifier_updated_on' => 'La transaction a été mise à jour pour la dernière fois sur :value',
|
||||
'modifiers_applies_are' => 'Les modificateurs suivants sont aussi appliqués à la recherche :',
|
||||
'general_search_error' => 'Une erreur s\'est produite lors de la recherche. Veuillez vérifier les fichiers journaux pour plus d\'informations.',
|
||||
'search_box' => 'Rechercher',
|
||||
@@ -540,13 +547,13 @@ return [
|
||||
'optional_field_meta_data' => 'Métadonnées facultatives',
|
||||
|
||||
// profile:
|
||||
'permanent_delete_stuff' => 'Be careful with these buttons. Deleting stuff is permanent.',
|
||||
'delete_all_budgets' => 'Delete ALL your budgets',
|
||||
'delete_all_categories' => 'Delete ALL your categories',
|
||||
'delete_all_tags' => 'Delete ALL your tags',
|
||||
'deleted_all_budgets' => 'All budgets have been deleted',
|
||||
'deleted_all_categories' => 'All categories have been deleted',
|
||||
'deleted_all_tags' => 'All tags have been deleted',
|
||||
'permanent_delete_stuff' => 'Attention à ces boutons. Ce que vous supprimez l\'est de façon définitive.',
|
||||
'delete_all_budgets' => 'Supprimer TOUS vos budgets',
|
||||
'delete_all_categories' => 'Supprimer toutes vos catégories',
|
||||
'delete_all_tags' => 'Supprimer tous vos tags',
|
||||
'deleted_all_budgets' => 'Tous les budgets ont été supprimés',
|
||||
'deleted_all_categories' => 'Toutes les catégories ont été supprimées',
|
||||
'deleted_all_tags' => 'Tous les étiquettes ont été supprimés',
|
||||
'change_your_password' => 'Modifier votre mot de passe',
|
||||
'delete_account' => 'Supprimer le compte',
|
||||
'current_password' => 'Mot de passe actuel',
|
||||
@@ -731,7 +738,7 @@ return [
|
||||
|
||||
// bills:
|
||||
'match_between_amounts' => 'La facture correspond à des transactions entre :low et :high.',
|
||||
'running_again_loss' => 'Previously linked transactions to this bill may lose their connection, if they (no longer) match the rule(s).',
|
||||
'running_again_loss' => 'Les transactions précédemment liées à cette facture peuvent perdre leur connexion, s\'ils ne correspondent plus à la ou les règles.',
|
||||
'bill_related_rules' => 'Règles reliées à cette facture',
|
||||
'repeats' => 'Répétitions',
|
||||
'connected_journals' => 'Opérations liées',
|
||||
@@ -759,9 +766,9 @@ return [
|
||||
'list_inactive_rule' => 'règle inactive',
|
||||
|
||||
// accounts:
|
||||
'inactive_account_link' => 'You have :count inactive (archived) accounts, which you can view on this separate page.',
|
||||
'all_accounts_inactive' => 'These are your inactive accounts.',
|
||||
'active_account_link' => 'This link goes back to your active accounts.',
|
||||
'inactive_account_link' => 'Vous avez :count comptes inactifs (archivés), que vous pouvez voir sur cette autre page.',
|
||||
'all_accounts_inactive' => 'Voici vos comptes inactifs.',
|
||||
'active_account_link' => 'Ce lien renvoie à vos comptes actifs.',
|
||||
'account_missing_transaction' => 'Le compte #:id (":name") ne peut pas être consulter directement et Firefly III ne dispose d\'aucune information pour vous rediriger.',
|
||||
'details_for_asset' => 'Détails pour le compte d’actif ":name"',
|
||||
'details_for_expense' => 'Détails du compte de dépenses ":name"',
|
||||
@@ -789,9 +796,9 @@ return [
|
||||
'make_new_revenue_account' => 'Créer un nouveau compte de recettes',
|
||||
'make_new_liabilities_account' => 'Créer un nouveau passif',
|
||||
'asset_accounts' => 'Comptes d’actif',
|
||||
'asset_accounts_inactive' => 'Asset accounts (inactive)',
|
||||
'asset_accounts_inactive' => 'Comptes d\'actifs (inactif)',
|
||||
'expense_accounts' => 'Comptes de dépenses',
|
||||
'expense_accounts_inactive' => 'Expense accounts (inactive)',
|
||||
'expense_accounts_inactive' => 'Comptes de dépenses (inactif)',
|
||||
'revenue_accounts' => 'Comptes de recettes',
|
||||
'cash_accounts' => 'Comptes de trésorerie',
|
||||
'Cash account' => 'Compte de trésorerie',
|
||||
@@ -878,7 +885,7 @@ return [
|
||||
// transactions:
|
||||
'update_withdrawal' => 'Mettre à jour un retrait',
|
||||
'update_deposit' => 'Mettre à jour un dépôt',
|
||||
'update_transaction' => 'Update transaction',
|
||||
'update_transaction' => 'Mettre à jour la transaction',
|
||||
'update_transfer' => 'Mettre à jour un transfert',
|
||||
'updated_withdrawal' => 'Retrait ":description" mis à jour',
|
||||
'updated_deposit' => 'Dépôt ":description" mis à jour',
|
||||
@@ -935,7 +942,7 @@ return [
|
||||
'tag_report_chart_single_tag' => 'Ce graphique s\'applique à un seul mots-clé. Si une transaction a plusieurs mots-clés, ce que vous voyez ici peut être reflété dans les graphiques d\'autres mots-clés également.',
|
||||
'tag' => 'Mot-clé',
|
||||
'no_budget_squared' => '(pas de budget)',
|
||||
'perm-delete-many' => 'Supprimer beaucoup d\'éléments d\'un coup peut être très turbulent. Soyez prudent. Vous pouvez supprimer une partie d\'une opération scindée de cette page, alors faites attention.',
|
||||
'perm-delete-many' => 'Supprimer beaucoup d\'éléments d\'un coup peut être très perturbateur. Soyez prudent. Vous pouvez supprimer une partie d\'une opération scindée à partir de cette page, alors faites attention.',
|
||||
'mass_deleted_transactions_success' => 'Montant des opérations supprimées : :amount.',
|
||||
'mass_edited_transactions_success' => 'Montant des opérations mises à jour : :amount',
|
||||
'opt_group_' => '(aucun type de compte)',
|
||||
@@ -960,7 +967,7 @@ return [
|
||||
// new user:
|
||||
'welcome' => 'Bienvenue sur Firefly III !',
|
||||
'submit' => 'Soumettre',
|
||||
'submission' => 'Submission',
|
||||
'submission' => 'Soumission',
|
||||
'submit_yes_really' => 'Soumettre (je sais ce que je fais)',
|
||||
'getting_started' => 'Mise en route',
|
||||
'to_get_started' => 'Vous venez d\'installer Firefly III avec succès. Pour commencer avec cet outil, entrez le nom de votre banque et le solde de votre compte courant principal. Ne vous inquiétez pas si vous avez plusieurs comptes. Vous pourrez les ajouter plus tard. Firefly III a simplement besoin de quelque chose pour commencer.',
|
||||
@@ -1166,7 +1173,7 @@ return [
|
||||
'overspent' => 'Trop dépensé',
|
||||
'left' => 'Reste',
|
||||
'max-amount' => 'Montant maximum',
|
||||
'min-amount' => 'Minimum amount',
|
||||
'min-amount' => 'Montant minimum',
|
||||
'journal-amount' => 'Entrée de la facture courante',
|
||||
'name' => 'Nom',
|
||||
'date' => 'Date',
|
||||
@@ -1277,6 +1284,7 @@ return [
|
||||
'send_test_triggered' => 'Le test a été initié. Vérifiez votre boîte de réception (et les logs si nécessaire).',
|
||||
|
||||
'split_transaction_title' => 'Description de l\'opération ventilée',
|
||||
'split_transaction_title_help' => 'If you create a split transaction, there must be a global description for all splits of the transaction.',
|
||||
'split_title_help' => 'Si vous créez une opération ventilée, il doit y avoir une description globale pour chaque fractions de l\'opération.',
|
||||
'transaction_information' => 'Informations sur l\'opération',
|
||||
'you_create_transfer' => 'Vous êtes en train de créer un <strong>transfert</strong>.',
|
||||
@@ -1352,11 +1360,11 @@ return [
|
||||
'breadcrumb_convert_group' => 'Convertir l\'opération',
|
||||
'convert_invalid_source' => 'La source est invalide pour l\'opération n°%d.',
|
||||
'convert_invalid_destination' => 'Le compte de destination est invalide pour l\'opération n°%d.',
|
||||
'create_another' => 'After storing, return here to create another one.',
|
||||
'after_update_create_another' => 'After updating, return here to continue editing.',
|
||||
'store_as_new' => 'Store as a new transaction instead of updating.',
|
||||
'reset_after' => 'Reset form after submission',
|
||||
'errors_submission' => 'There was something wrong with your submission. Please check out the errors below.',
|
||||
'create_another' => 'Après enregistrement, revenir ici pour en créer un nouveau.',
|
||||
'after_update_create_another' => 'Après la mise à jour, revenir ici pour continuer l\'édition.',
|
||||
'store_as_new' => 'Enregistrer comme une nouvelle transaction au lieu de mettre à jour.',
|
||||
'reset_after' => 'Réinitialiser le formulaire après soumission',
|
||||
'errors_submission' => 'Certaines informations ne sont pas correctes dans votre formulaire. Veuillez vérifier les erreurs ci-dessous.',
|
||||
|
||||
// Import page (general strings only)
|
||||
'import_index_title' => 'Importer des opérations dans Firefly III',
|
||||
@@ -1384,11 +1392,11 @@ return [
|
||||
'no_accounts_imperative_liabilities' => 'Vous n’êtes pas obligé d\'utiliser cette fonctionnalité, mais elle peut être utile si vous souhaitez garder une trace de ces éléments.',
|
||||
'no_accounts_create_liabilities' => 'Créer un passif',
|
||||
'no_budgets_title_default' => 'Nous allons créer un budget',
|
||||
'no_budgets_intro_default' => 'You have no budgets yet. Budgets are used to organize your expenses into logical groups, which you can give a soft-cap to limit your expenses.',
|
||||
'no_budgets_intro_default' => 'Vous n\'avez pas encore de budget. Les budgets sont utilisés pour organiser vos dépenses en groupes logiques, ce que vous permet d\'établir des seuils pour limiter ces dépenses.',
|
||||
'no_budgets_imperative_default' => 'Les budgets sont les outils de base de la gestion financière. Nous allons en créer un maintenant :',
|
||||
'no_budgets_create_default' => 'Créer un budget',
|
||||
'no_categories_title_default' => 'Nous allons créer une catégorie !',
|
||||
'no_categories_intro_default' => 'Vous n\'avez pas encore de catégorie. Les catégories sont utilisées pour affiner vos transactions en associant avec.',
|
||||
'no_categories_intro_default' => 'Vous n\'avez pas encore de catégories. Les catégories sont utilisées pour affiner vos transactions et les étiqueter avec leur catégorie désignée.',
|
||||
'no_categories_imperative_default' => 'Les catégories sont créées automatiquement lorsque vous créez des transactions, mais vous pouvez en créer manuellement. Nous allons en créer une maintenant :',
|
||||
'no_categories_create_default' => 'Créer une catégorie',
|
||||
'no_tags_title_default' => 'Nous allons créer un tag !',
|
||||
@@ -1477,7 +1485,7 @@ return [
|
||||
'new_recurring_transaction' => 'Nouvelle opération périodique',
|
||||
'help_weekend' => 'Que doit faire Firefly III lorsque l’opération périodique tombe un samedi ou un dimanche ?',
|
||||
'do_nothing' => 'Créer l\'opération tout de même',
|
||||
'skip_transaction' => 'Skip the occurrence',
|
||||
'skip_transaction' => 'Ignorer l\'occurrence',
|
||||
'jump_to_friday' => 'Créer l\'opération le vendredi précédent',
|
||||
'jump_to_monday' => 'Créer l\'opération le lundi suivant',
|
||||
'will_jump_friday' => 'Sera créé le vendredi plutôt que les week-ends.',
|
||||
|
||||
@@ -38,6 +38,7 @@ return [
|
||||
'match' => 'Correspondre à',
|
||||
'strict' => 'Mode strict',
|
||||
'repeat_freq' => 'Répétitions',
|
||||
'update_channel' => 'Canal de mise à jour',
|
||||
'journal_currency_id' => 'Devise',
|
||||
'currency_id' => 'Devise',
|
||||
'transaction_currency_id' => 'Devise',
|
||||
|
||||
@@ -45,6 +45,7 @@ return [
|
||||
'at_least_one_repetition' => 'Besoin d\'au moins une répétition.',
|
||||
'require_repeat_until' => 'Besoin d’un certain nombre de répétitions ou d\'une date de fin (repeat_until). Pas les deux.',
|
||||
'require_currency_info' => 'Le contenu de ce champ n\'est pas valide sans informations sur la devise.',
|
||||
'not_transfer_account' => 'Ce compte n\'est pas un compte qui peut être utilisé pour les transferts.',
|
||||
'require_currency_amount' => 'Le contenu de ce champ est invalide sans informations sur le montant étranger.',
|
||||
'equal_description' => 'La description de la transaction ne doit pas être identique à la description globale.',
|
||||
'file_invalid_mime' => 'Le fichier ":name" est du type ":mime" ce qui n\'est pas accepté pour un nouvel envoi.',
|
||||
|
||||
26
resources/lang/hu_HU/api.php
Normal file
26
resources/lang/hu_HU/api.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* api.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* 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 [
|
||||
|
||||
];
|
||||
@@ -224,10 +224,17 @@ return [
|
||||
'admin_update_check_now_title' => 'Frissítések keresése most',
|
||||
'admin_update_check_now_explain' => 'Ha megnyomja a gombot, a Firefly III ellenőrinzi fogja, hogy a legfrissebb változatot használja -e.',
|
||||
'check_for_updates_button' => 'Ellenőrzés most!',
|
||||
'update_new_version_alert' => 'A Firefly III új verziója elérhető. A jelenleg használt verzió v:your_version, a legújabb verzió pedig v:new_version, amely megjelent: :date.',
|
||||
'update_current_version_alert' => 'A jelenlegi verzió v:version, ez egyben a legfrissebb elérhető verzió is.',
|
||||
'update_newer_version_alert' => 'A jelenlegi verzió v:your_version, amely újabb, mint a legfrissebb kiadott verzió, ami a v:new_version.',
|
||||
'update_new_version_alert' => 'A new version of Firefly III is available. You are running :your_version, the latest version is :new_version which was released on :date.',
|
||||
'update_version_beta' => 'This version is a BETA version. You may run into issues.',
|
||||
'update_version_alpha' => 'This version is a ALPHA version. You may run into issues.',
|
||||
'update_current_version_alert' => 'You are running :version, which is the latest available release.',
|
||||
'update_newer_version_alert' => 'You are running :your_version, which is newer than the latest release, :new_version.',
|
||||
'update_check_error' => 'Hiba történt a frissítések ellenőrzése során. További információ a naplófájlokban található.',
|
||||
'admin_update_channel_title' => 'Update channel',
|
||||
'admin_update_channel_explain' => 'Firefly III has three update "channels" which determine how ahead of the curve you are in terms of features, enhancements and bugs. Use the "beta" channel if you\'re adventurous and the "alpha" when you like to live life dangerously.',
|
||||
'update_channel_stable' => 'Stable. Everything should work as expected.',
|
||||
'update_channel_beta' => 'Beta. New features but things may be broken.',
|
||||
'update_channel_alpha' => 'Alpha. We throw stuff in, and use whatever sticks.',
|
||||
|
||||
// search
|
||||
'search' => 'Keresés',
|
||||
@@ -1277,6 +1284,7 @@ return [
|
||||
'send_test_triggered' => 'Teszt elindítva. Ellenőrizd a bejövő üzeneteidet és a naplófájlokat.',
|
||||
|
||||
'split_transaction_title' => 'Felosztott tranzakció leírása',
|
||||
'split_transaction_title_help' => 'If you create a split transaction, there must be a global description for all splits of the transaction.',
|
||||
'split_title_help' => 'Felosztott tranzakció létrehozásakor meg kell adni egy globális leírást a tranzakció összes felosztása részére.',
|
||||
'transaction_information' => 'Tranzakció információ',
|
||||
'you_create_transfer' => 'Egy <strong>átvezetést</strong> hozol létre.',
|
||||
|
||||
@@ -38,6 +38,7 @@ return [
|
||||
'match' => 'Találatok',
|
||||
'strict' => 'Szigorú mód',
|
||||
'repeat_freq' => 'Ismétlődések',
|
||||
'update_channel' => 'Update channel',
|
||||
'journal_currency_id' => 'Pénznem',
|
||||
'currency_id' => 'Pénznem',
|
||||
'transaction_currency_id' => 'Pénznem',
|
||||
|
||||
@@ -45,6 +45,7 @@ return [
|
||||
'at_least_one_repetition' => 'Legalább egy ismétlés szükséges.',
|
||||
'require_repeat_until' => 'Legalább egy ismétlésszám vagy egy végdátum (repeat_until) kötelező. Csak az egyik.',
|
||||
'require_currency_info' => 'Ennek a mezőnek a tartalma érvénytelen pénznem információ nélkül.',
|
||||
'not_transfer_account' => 'This account is not an account that can be used for transfers.',
|
||||
'require_currency_amount' => 'The content of this field is invalid without foreign amount information.',
|
||||
'equal_description' => 'A tranzakció leírása nem egyezhet meg a globális leírással.',
|
||||
'file_invalid_mime' => '":name" fájl ":mime" típusú ami nem lehet új feltöltés.',
|
||||
|
||||
26
resources/lang/id_ID/api.php
Normal file
26
resources/lang/id_ID/api.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* api.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* 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 [
|
||||
|
||||
];
|
||||
@@ -224,10 +224,17 @@ return [
|
||||
'admin_update_check_now_title' => 'Check for updates now',
|
||||
'admin_update_check_now_explain' => 'If you press the button, Firefly III will see if your current version is the latest.',
|
||||
'check_for_updates_button' => 'Check now!',
|
||||
'update_new_version_alert' => 'A new version of Firefly III is available. You are running v:your_version, the latest version is v:new_version which was released on :date.',
|
||||
'update_current_version_alert' => 'You are running v:version, which is the latest available release.',
|
||||
'update_newer_version_alert' => 'You are running v:your_version, which is newer than the latest release, v:new_version.',
|
||||
'update_new_version_alert' => 'A new version of Firefly III is available. You are running :your_version, the latest version is :new_version which was released on :date.',
|
||||
'update_version_beta' => 'This version is a BETA version. You may run into issues.',
|
||||
'update_version_alpha' => 'This version is a ALPHA version. You may run into issues.',
|
||||
'update_current_version_alert' => 'You are running :version, which is the latest available release.',
|
||||
'update_newer_version_alert' => 'You are running :your_version, which is newer than the latest release, :new_version.',
|
||||
'update_check_error' => 'An error occurred while checking for updates. Please view the log files.',
|
||||
'admin_update_channel_title' => 'Update channel',
|
||||
'admin_update_channel_explain' => 'Firefly III has three update "channels" which determine how ahead of the curve you are in terms of features, enhancements and bugs. Use the "beta" channel if you\'re adventurous and the "alpha" when you like to live life dangerously.',
|
||||
'update_channel_stable' => 'Stable. Everything should work as expected.',
|
||||
'update_channel_beta' => 'Beta. New features but things may be broken.',
|
||||
'update_channel_alpha' => 'Alpha. We throw stuff in, and use whatever sticks.',
|
||||
|
||||
// search
|
||||
'search' => 'Pencarian',
|
||||
@@ -1277,6 +1284,7 @@ return [
|
||||
'send_test_triggered' => 'Uji dipicu. Periksa kotak masuk dan file log Anda.',
|
||||
|
||||
'split_transaction_title' => 'Description of the split transaction',
|
||||
'split_transaction_title_help' => 'If you create a split transaction, there must be a global description for all splits of the transaction.',
|
||||
'split_title_help' => 'If you create a split transaction, there must be a global description for all splits of the transaction.',
|
||||
'transaction_information' => 'Transaction information',
|
||||
'you_create_transfer' => 'You\'re creating a <strong>transfer</strong>.',
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user