Compare commits

...

78 Commits

Author SHA1 Message Date
James Cole
a70b7cc7b9 Merge branch 'hotfix/4.7.17.2' 2019-07-15 19:12:34 +02:00
James Cole
def307010c Fix #2335, attempt 2. 2019-07-15 19:12:20 +02:00
James Cole
45b8c36272 Merge branch 'hotfix/4.7.17.1' 2019-07-15 16:50:36 +02:00
James Cole
45ddb64186 Fix #2335 2019-07-15 16:50:18 +02:00
James Cole
76aa8acf0f Merge branch 'release/4.7.17' 2019-03-17 09:40:13 +01:00
James Cole
220add3eda Update lock file 2019-03-17 09:17:55 +01:00
James Cole
541280ee91 Update change logs and config files. 2019-03-17 09:17:07 +01:00
James Cole
01219c951c Enable norsk, update version of DB 2019-03-17 09:14:52 +01:00
James Cole
69fa60cd21 Various language string updates. 2019-03-17 09:14:33 +01:00
James Cole
a11d2df6bb Norwegian strings. 2019-03-17 09:13:23 +01:00
James Cole
07d39a23a8 Improve installer middleware for Sandstorm. 2019-03-17 09:06:45 +01:00
James Cole
ca67d98676 Fix some issues with importer #2166 2019-03-17 08:18:42 +01:00
James Cole
7b60d210ee Other delete thing. 2019-03-17 07:31:12 +01:00
James Cole
78d955ebf6 More debug things. 2019-03-17 07:20:11 +01:00
James Cole
f6f21e02ac Extra debug info for #2159 and some kernel changes. 2019-03-16 21:54:25 +01:00
James Cole
e2ebd01719 Extra debug info for #2159 2019-03-16 20:07:26 +01:00
James Cole
b8ac7c9d89 Fix #2173 2019-03-16 19:39:39 +01:00
James Cole
037d9b7017 Rename class and add copyright statement @wrouesnel #2167 2019-03-16 19:02:13 +01:00
James Cole
6462d2b87a Merge pull request #2167 from wrouesnel/bugfix/ldapauth
Fix LDAP auth configuration paths.
2019-03-16 18:58:21 +01:00
Will Rouesnel
cb4ff35adb Fix LDAP auth configuration paths.
This commit fixes parameters broken in the latest version of `adldap2`.

Specifically:

* `adldap` auth parameters have changed in the latest version.
  * "usernames" has become `identities` and `discover` has changed to
    `discover_users_by`, `auth` has changed to `bind_users_by`
* Add the missing objectguid field to the users table for adldap2.
  * This is added as a nullable (optional) field at the moment to support
    tracking LDAP users as adldap2 wants to.
2019-03-12 09:12:54 +11:00
James Cole
d063f32c1c Fix some cache issues and a version bump. 2019-03-08 17:57:42 +01:00
James Cole
244d8eecab Updated file list. 2019-03-08 07:09:45 +01:00
James Cole
b66f6d7e2e Updated list. 2019-03-08 07:07:43 +01:00
James Cole
aa3a88f537 New file list. 2019-03-08 06:48:04 +01:00
James Cole
e5476e6e7a Merge tag '4.7.16' into develop
4.7.16
2019-03-08 06:22:05 +01:00
James Cole
4d976312e8 Merge branch 'release/4.7.16' 2019-03-08 06:22:04 +01:00
James Cole
2ef5d3d4c6 Update composer file. 2019-03-08 06:11:22 +01:00
James Cole
eb3a89555d Small fix in changelog. 2019-03-08 06:11:13 +01:00
James Cole
0a80b7fca7 New translations. 2019-03-08 06:11:05 +01:00
James Cole
f682981c1e Fix test for PHPUnit8 2019-03-05 20:11:37 +01:00
James Cole
4aac969ae4 Update version and changelog. 2019-03-05 17:52:44 +01:00
James Cole
00651adf5e Fix issue with bill display 2019-03-05 17:52:34 +01:00
James Cole
ed94e71168 Update language strings. 2019-03-05 17:52:26 +01:00
James Cole
6e12f434ad Fix issue #2144 2019-03-05 16:55:03 +01:00
James Cole
b8c4ec1449 Add old string under new key. 2019-03-03 08:17:19 +01:00
James Cole
4ca60ca92a Code for upgrade of various libraries. 2019-03-02 21:18:26 +01:00
James Cole
48219c9af3 Update libraries. 2019-03-02 20:14:45 +01:00
James Cole
9887b9809d Merge branch 'master' into develop
* master:
  Bump version for travis build.
2019-03-02 17:36:44 +01:00
James Cole
a13ad5b417 Bump version for travis build. 2019-03-02 17:36:08 +01:00
James Cole
3f28fd689f Merge tag '4.7.15' into develop
4.7.15
2019-03-02 17:17:22 +01:00
James Cole
959025545e Merge branch 'release/4.7.15' 2019-03-02 17:17:21 +01:00
James Cole
1978463e59 Update language strings for new release. 2019-03-02 15:55:26 +01:00
James Cole
e85ac07c49 Update meta files for new release. 2019-03-02 15:55:01 +01:00
James Cole
b7f0a6fff4 Update migrations so you can always roll back. 2019-03-02 15:54:24 +01:00
James Cole
3a57e09447 Fix for #2128 2019-03-02 14:33:46 +01:00
James Cole
87d5cabe52 Search improvements. 2019-03-02 14:12:09 +01:00
James Cole
af07522f16 Fix for #2135 2019-03-02 10:42:43 +01:00
James Cole
1b8d4e4c63 Make sure bills show attachment notes 2019-03-02 09:18:41 +01:00
James Cole
9f3c114d57 Add JSON decrypt for #2125 2019-03-02 09:18:26 +01:00
James Cole
c51c1b8098 Some basic date tests 2019-03-02 08:05:15 +01:00
James Cole
143fe2a71f Fix #2125 2019-03-01 17:56:52 +01:00
James Cole
3379b723cf Last attempt I hope for #2125 2019-02-28 19:56:41 +01:00
James Cole
39321b320e Improve search speed. 2019-02-27 19:08:09 +01:00
James Cole
fe738fd321 Another fix for #2125 2019-02-27 18:55:56 +01:00
James Cole
95720673d2 Merge pull request #2130 from lastlink/patch-1
add missing rollback for 477 migration
2019-02-26 18:33:20 +01:00
lastlink
963be4a4fa add missing rollback for 477 migration 2019-02-26 00:16:05 -05:00
James Cole
61db419485 Fixes #2125 2019-02-25 20:57:29 +01:00
James Cole
cb17b09b24 Merge pull request #2120 from lastlink/fix/pwaApple
missing meta tag for ios
2019-02-25 07:23:50 +01:00
Mr. Funk
0f1236a597 missing meta tag for ios 2019-02-24 15:12:58 -05:00
James Cole
ac26427a63 Merge branch 'master' into develop
* master:
  Don't change ARM PHP settings.
2019-02-24 10:56:28 +01:00
James Cole
491903778a Don't change ARM PHP settings. 2019-02-24 10:56:08 +01:00
James Cole
405c3e110a Merge tag '4.7.14' into develop
4.7.14
2019-02-24 07:28:00 +01:00
James Cole
5464bfac19 Merge branch 'release/4.7.14' 2019-02-24 07:28:00 +01:00
James Cole
ad31cc1c1f Fixes #2119 and bump version. 2019-02-24 07:27:24 +01:00
James Cole
3aa79fb1e4 Merge tag '4.7.13' into develop
4.7.13
2019-02-23 21:27:05 +01:00
James Cole
e3de03e50d Merge branch 'release/4.7.13' 2019-02-23 21:27:04 +01:00
James Cole
d8b4af34e0 Update files for release 4.7.13 2019-02-23 14:32:24 +01:00
James Cole
222d8e071a Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop
* 'develop' of github.com:firefly-iii/firefly-iii:
  New check for journals with 0.00 amount.
2019-02-23 12:36:17 +01:00
James Cole
36c2f27d59 New check for journals with 0.00 amount. 2019-02-23 07:47:41 +01:00
James Cole
5d43faab96 Refactor script locations to clear up root directory. 2019-02-20 07:04:24 +01:00
James Cole
07048cb5fb Fix #2100 2019-02-19 20:19:30 +01:00
James Cole
38c79c3dc4 Upgrade fix for Softaculous. 2019-02-19 19:59:02 +01:00
James Cole
7610d9e0db Update Dockerfiles to increase PHP execution time. 2019-02-19 07:10:13 +01:00
James Cole
e4f3d0a0ea Some new strings. 2019-02-18 19:47:48 +01:00
James Cole
fdf147d9c6 Merge branch 'hotfix/4.7.12.1' 2019-02-16 23:01:29 +01:00
James Cole
f7e418f517 Merge tag '4.7.12.1' into develop
4.7.12.1
2019-02-16 23:01:29 +01:00
James Cole
738f6ed232 Fix #2093 2019-02-16 23:01:14 +01:00
James Cole
12217d9850 Merge tag '4.7.12' into develop
4.7.12
2019-02-16 19:35:01 +01:00
166 changed files with 6553 additions and 2534 deletions

View File

@@ -45,6 +45,14 @@ DB_DATABASE=${FF_DB_NAME}
DB_USERNAME=${FF_DB_USER}
DB_PASSWORD="${FF_DB_PASSWORD}"
# PostgreSQL supports SSL. You can configure it here.
PGSQL_SSL=${PGSQL_SSL}
PGSQL_SSL_MODE=${PGSQL_SSL_MODE}
PGSQL_SSL_ROOT_CERT=${PGSQL_SSL_ROOT_CERT}
PGSQL_SSL_CERT=${PGSQL_SSL_CERT}
PGSQL_SSL_KEY=${PGSQL_SSL_KEY}
PGSQL_SSL_CRL_FILE=${PGSQL_SSL_CRL_FILE}
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file

View File

@@ -44,7 +44,7 @@ echo "Remove log file..."
rm -f $FIREFLY_PATH/storage/logs/laravel.log
echo "Map environment variables on .env file..."
cat .env.docker | envsubst > .env
cat $FIREFLY_PATH/.deploy/docker/.env.docker | envsubst > $FIREFLY_PATH/.env
echo "Dump auto load..."
composer dump-autoload
echo "Discover packages..."

View File

@@ -42,7 +42,12 @@ DB_CONNECTION=pgsql
# PostgreSQL supports SSL. You can configure it here.
PGSQL_SSL_MODE=prefer
PGSQL_SSL_ROOT_CERT=null
PGSQL_SSL_CERT=null
PGSQL_SSL_KEY=null
PGSQL_SSL_CRL_FILE=null
# If you're looking for performance improvements, you could install memcached.

View File

@@ -1,4 +1,5 @@
en_US
es_ES
de_DE
fr_FR
it_IT
@@ -6,4 +7,4 @@ nl_NL
pl_PL
pt_BR
ru_RU
tr_TR
nb_NO

View File

@@ -45,6 +45,13 @@ DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
# PostgreSQL supports SSL. You can configure it here.
PGSQL_SSL_MODE=prefer
PGSQL_SSL_ROOT_CERT=null
PGSQL_SSL_CERT=null
PGSQL_SSL_KEY=null
PGSQL_SSL_CRL_FILE=null
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file

View File

@@ -1,178 +0,0 @@
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
# Never set it to "testing".
APP_ENV=testing
# Set to true if you want to see debug information in error screens.
APP_DEBUG=true
# This should be your email address
SITE_OWNER=thegrumpydictator+testing@gmail.com
# The encryption key for your database and sessions. Keep this very secure.
# If you generate a new one all existing data must be considered LOST.
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
APP_KEY=TestTestTestTestTestTestTestTest
# Change this value to your preferred time zone.
# Example: Europe/Amsterdam
TZ=Europe/Amsterdam
# This variable must match your installation's external address but keep in mind that
# it's only used on the command line as a fallback value.
APP_URL=http://localhost
# TRUSTED_PROXIES is a useful variable when using Docker and/or a reverse proxy.
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/.
# 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=dailytest
# Log level. You can set this from least severe to most severe:
# debug, info, notice, warning, error, critical, alert, emergency
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
# nothing will get logged, ever.
APP_LOG_LEVEL=info
# 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
DB_CONNECTION=sqlite
# If you're looking for performance improvements, you could install memcached.
CACHE_DRIVER=file
SESSION_DRIVER=file
# You can configure another file storage backend if you cannot use the local storage option.
# To set this up, fill in the following variables. The upload path is used to store uploaded
# files and the export path is to store exported data (before download).
SFTP_HOST=
SFTP_PORT=
SFTP_UPLOAD_PATH=
SFTP_EXPORT_PATH=
# SFTP uses either the username/password combination or the private key to authenticate.
SFTP_USERNAME=
SFTP_PASSWORD=
SFTP_PRIV_KEY=
# Cookie settings. Should not be necessary to change these.
COOKIE_PATH="/"
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
MAIL_DRIVER=log
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_FROM=changeme@example.com
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
# Other mail drivers:
MAILGUN_DOMAIN=
MAILGUN_SECRET=
MANDRILL_SECRET=
SPARKPOST_SECRET=
# Firefly III can send you the following messages
SEND_REGISTRATION_MAIL=true
SEND_ERROR_MESSAGE=false
# These messages contain (sensitive) transaction information:
SEND_REPORT_JOURNALS=true
# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places.
MAPBOX_API_KEY=
# Firefly III currently supports two provider for live Currency Exchange Rates:
# "fixer" is the default (for backward compatibility), and "ratesapi" is the new one.
# RatesApi.IO (see https://ratesapi.io) is a FREE and OPEN SOURCE live currency exchange rates,
# built compatible with Fixer.IO, based on data published by European Central Bank, and don't require API key.
CER_PROVIDER=fixer
# If you have select "fixer" as default currency exchange rates,
# set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates.
# Please note that this WILL ONLY WORK FOR PAID fixer.io accounts because they severely limited
# the free API up to the point where you might as well offer nothing.
FIXER_API_KEY=
# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here.
ANALYTICS_ID=
# Most parts of the database are encrypted by default, but you can turn this off if you want to.
# This makes it easier to migrate your database. Not that some fields will never be decrypted.
USE_ENCRYPTION=false
# 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
LOGIN_PROVIDER=eloquent
# LDAP connection configuration
# or FreeIPA or ActiveDirectory
ADLDAP_CONNECTION_SCHEME=OpenLDAP
ADLDAP_AUTO_CONNECT=true
# LDAP connection settings
ADLDAP_CONTROLLERS=
ADLDAP_PORT=389
ADLDAP_TIMEOUT=5
ADLDAP_BASEDN=""
ADLDAP_FOLLOW_REFFERALS=false
ADLDAP_USE_SSL=false
ADLDAP_USE_TLS=false
ADLDAP_ADMIN_USERNAME=
ADLDAP_ADMIN_PASSWORD=
ADLDAP_ACCOUNT_PREFIX=
ADLDAP_ACCOUNT_SUFFIX=
# LDAP authentication settings.
ADLDAP_PASSWORD_SYNC=false
ADLDAP_LOGIN_FALLBACK=false
ADLDAP_DISCOVER_FIELD=distinguishedname
ADLDAP_AUTH_FIELD=distinguishedname
# Will allow SSO if your server provides an AUTH_USER field.
WINDOWS_SSO_DISCOVER=samaccountname
WINDOWS_SSO_KEY=AUTH_USER
# field to sync as local username.
ADLDAP_SYNC_FIELD=userprincipalname
# You can disable the X-Frame-Options header if it interfears with tools like
# Organizr. This is at your own risk.
DISABLE_FRAME_HEADER=false
# Leave the following configuration vars as is.
# Unless you like to tinker and know what you're doing.
APP_NAME=FireflyIII
ADLDAP_CONNECTION=default
BROADCAST_DRIVER=log
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
CACHE_PREFIX=firefly_tst
SEARCH_RESULT_LIMIT=50
PUSHER_KEY=
PUSHER_SECRET=
PUSHER_ID=
DEMO_USERNAME=
DEMO_PASSWORD=
IS_DOCKER=false
IS_SANDSTORM=false
IS_HEROKU=false
BUNQ_USE_SANDBOX=true
FFIII_LAYOUT=v1

View File

@@ -1,8 +1,10 @@
<!--
Please read me:
Before you create a new PR, please consider the following two considerations.
1) DO NOT create a pull request for the MASTER branch.
2) DO NOT create pull requests to add new CURRENCIES.
1) Pull request for the MASTER branch will be closed.
2) We cannot accept pull requests to add new currencies.
Thanks.
-->
Fixes issue # (if relevant)

View File

@@ -6,7 +6,7 @@ set -euo pipefail
echo "In build.sh"
cd /opt/app
cp .env.sandstorm .env
cp .deploy/sandstorm/.env.sandstorm .env
if [ -f /opt/app/composer.json ] ; then
if [ ! -f composer.phar ] ; then

View File

@@ -1,3 +1,40 @@
# 4.7.17.2 (API 0.9.2)
- XSS bug in budget title.
# 4.7.17 (API 0.9.2)
- Support for Norwegian!
- Clear cache during install routine.
- Add Firefly III version number to install routine.
- Initial release.
- [Issue 2159](https://github.com/firefly-iii/firefly-iii/issues/2159) Bad redirect due to Laravel upgrade.
- [Issue 2166](https://github.com/firefly-iii/firefly-iii/issues/2166) Importer had some issues with distinguishing double transfers.
- [Issue 2167](https://github.com/firefly-iii/firefly-iii/issues/2167) New LDAP package gave some configuration changes.
- [Issue 2173](https://github.com/firefly-iii/firefly-iii/issues/2173) Missing class when generating 2FA codes.
# 4.7.16 (API 0.9.2)
- 4.7.16 was released to fix a persistent issue with broken user preferences.
- Firefly III now uses Laravel 5.8
# 4.7.15 (API 0.9.2)
- 4.7.15 was released to fix some issues upgrading from older versions.
- [Issue 2128](https://github.com/firefly-iii/firefly-iii/issues/2128) Support for Postgres SSL
- [Issue 2120](https://github.com/firefly-iii/firefly-iii/issues/2120) Add a missing meta tag, thanks to @lastlink
- Search is a lot faster now.
- [Issue 2125](https://github.com/firefly-iii/firefly-iii/issues/2125) Decryption issues during upgrade
- [Issue 2130](https://github.com/firefly-iii/firefly-iii/issues/2130) Fixed database migrations and rollbacks.
- [Issue 2135](https://github.com/firefly-iii/firefly-iii/issues/2135) Date fixes in transaction overview
# 4.7.14 (API 0.9.2)
- 4.7.14 was released to fix an issue with the Composer installation script.
# 4.7.13 (API 0.9.2)
- 4.7.13 was released to fix an issue that affected the Softaculous build.
- A routine has been added that warns about transactions with a 0.00 amount.
- PHP maximum execution time is now 600 seconds in the Docker image.
- Moved several files outside of the root of Firefly III
- Fix issue where missing preference breaks the database upgrade.
- [Issue 2100](https://github.com/firefly-iii/firefly-iii/issues/2100) Mass edit transactions results in a reset of the date.
# 4.7.12
- 4.7.12 was released to fix several shortcomings in v4.7.11's Docker image. Those in turn were caused by me. My apologies.
- [Issue 2085](https://github.com/firefly-iii/firefly-iii/issues/2085) Upgraded the LDAP code. To keep using LDAP, set the `LOGIN_PROVIDER` to `ldap`.

File diff suppressed because it is too large Load Diff

View File

@@ -15,8 +15,8 @@ const pkgdef :Spk.PackageDefinition = (
manifest = (
appTitle = (defaultText = "Firefly III"),
appVersion = 22,
appMarketingVersion = (defaultText = "4.7.12"),
appVersion = 28,
appMarketingVersion = (defaultText = "4.7.17.2"),
actions = [
# Define your "new document" handlers here.

View File

@@ -13,6 +13,7 @@ apt-get update
apt-get install -y python-software-properties software-properties-common
# install all languages
#en_US
sed -i 's/# es_ES.UTF-8 UTF-8/es_ES.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen
@@ -22,6 +23,9 @@ sed -i 's/# pl_PL.UTF-8 UTF-8/pl_PL.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# zh_TW.UTF-8 UTF-8/zh_TW.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/g' /etc/locale.gen
sed -i 's/# nb_NO.UTF-8 UTF-8/nb_NO.UTF-8 UTF-8/g' /etc/locale.gen
dpkg-reconfigure --frontend=noninteractive locales

View File

@@ -1,7 +1,7 @@
sudo: required
language: bash
env:
- VERSION=4.7.12
- VERSION=4.7.17.2
dist: xenial

View File

@@ -1,7 +1,7 @@
FROM php:7.2-apache
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
LABEL version="1.3" maintainer="thegrumpydictator@gmail.com"
LABEL version="1.4" maintainer="thegrumpydictator@gmail.com"
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
@@ -44,6 +44,11 @@ RUN chown -R www-data:www-data /var/www && \
locale-gen && \
composer install --prefer-dist --no-dev --no-scripts --no-suggest
# configure PHP
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini && \
sed -i 's/max_execution_time = 30/max_execution_time = 600/' /usr/local/etc/php/php.ini && \
sed -i 's/memory_limit = 128M/memory_limit = 512M/' /usr/local/etc/php/php.ini
# Expose port 80
EXPOSE 80

View File

@@ -1,7 +1,7 @@
FROM php:7.2-apache
ARG ARCH
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
LABEL version="1.3" maintainer="thegrumpydictator@gmail.com"
LABEL version="1.4" maintainer="thegrumpydictator@gmail.com"
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload
@@ -44,6 +44,12 @@ RUN chown -R www-data:www-data /var/www && \
locale-gen && \
composer install --prefer-dist --no-dev --no-scripts --no-suggest
# configure PHP
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini && \
sed -i 's/max_execution_time = 30/max_execution_time = 600/' /usr/local/etc/php/php.ini && \
sed -i 's/memory_limit = 128M/memory_limit = 512M/' /usr/local/etc/php/php.ini
# Expose port 80
EXPOSE 80

View File

@@ -2,7 +2,7 @@ FROM arm32v7/php:7.2.8-apache-stretch
ARG ARCH
COPY tmp/qemu-arm-static /usr/bin/qemu-arm-static
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
LABEL version="1.3" maintainer="thegrumpydictator@gmail.com"
LABEL version="1.4" maintainer="thegrumpydictator@gmail.com"
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload

View File

@@ -2,7 +2,7 @@ FROM arm32v7/php:7.2.8-apache-stretch
ARG ARCH
COPY tmp/qemu-arm-static /usr/bin/qemu-arm-static
ENV FIREFLY_PATH=/var/www/firefly-iii COMPOSER_ALLOW_SUPERUSER=1
LABEL version="1.3" maintainer="thegrumpydictator@gmail.com"
LABEL version="1.4" maintainer="thegrumpydictator@gmail.com"
# Create volumes
VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload

View File

@@ -364,7 +364,7 @@ class SummaryController extends Controller
{
/** @var User $user */
$user = auth()->user();
$date = Carbon::create()->startOfDay();
$date = Carbon::now()->startOfDay();
// start and end in the future? use $end

View File

@@ -235,7 +235,7 @@ class ApplyRules extends Command
private function parseDates(): void
{
// parse start date.
$startDate = Carbon::create()->startOfMonth();
$startDate = Carbon::now()->startOfMonth();
$startString = $this->option('start_date');
if (null === $startString) {
/** @var JournalRepositoryInterface $repository */

View File

@@ -26,6 +26,8 @@ namespace FireflyIII\Console\Commands;
use Crypt;
use DB;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Preference;
use FireflyIII\Support\Facades\FireflyConfig;
use Illuminate\Console\Command;
use Illuminate\Contracts\Encryption\DecryptException;
@@ -86,6 +88,22 @@ class DecryptDatabase extends Command
}
$id = $row->id;
$value = $this->tryDecrypt($original);
// A separate routine for preferences:
if ('preferences' === $table) {
// try to json_decrypt the value.
$value = json_decode($value, true) ?? $value;
Log::debug(sprintf('Decrypted field "%s" "%s" to "%s" in table "%s" (row #%d)', $field, $original, print_r($value, true), $table, $id));
/** @var Preference $object */
$object = Preference::find((int)$id);
if (null !== $object) {
$object->data = $value;
$object->save();
}
continue;
}
if ($value !== $original) {
Log::debug(sprintf('Decrypted field "%s" "%s" to "%s" in table "%s" (row #%d)', $field, $original, $value, $table, $id));
DB::table($table)->where('id', $id)->update([$field => $value]);
@@ -130,6 +148,9 @@ class DecryptDatabase extends Command
try {
$value = Crypt::decrypt($value);
} catch (DecryptException $e) {
if ('The MAC is invalid.' === $e->getMessage()) {
throw new FireflyException($e->getMessage());
}
Log::debug(sprintf('Could not decrypt. %s', $e->getMessage()));
}

View File

@@ -28,6 +28,7 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands;
use Crypt;
use DB;
use Exception;
use FireflyIII\Models\Account;
@@ -53,6 +54,7 @@ use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\User;
use Illuminate\Console\Command;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Database\QueryException;
use Illuminate\Support\Collection;
use Log;
@@ -106,6 +108,22 @@ class UpgradeDatabase extends Command
return 0;
}
/**
* @param string $value
*
* @return string
*/
private function tryDecrypt(string $value): string
{
try {
$value = Crypt::decrypt($value);
} catch (DecryptException $e) {
Log::debug(sprintf('Could not decrypt. %s', $e->getMessage()));
}
return $value;
}
/**
* Since it is one routine these warnings make sense and should be supressed.
*
@@ -127,8 +145,14 @@ class UpgradeDatabase extends Command
return;
}
$currencyCode = $this->tryDecrypt($currencyPreference->data);
$currency = TransactionCurrency::where('code', $currencyPreference->data)->first();
// try json decrypt just in case.
if (\strlen($currencyCode) > 3) {
$currencyCode = json_decode($currencyCode) ?? 'EUR';
}
$currency = TransactionCurrency::where('code', $currencyCode)->first();
if (null === $currency) {
$this->line('Fall back to default currency in migrateBillsToRules().');
$currency = app('amount')->getDefaultCurrencyByUser($user);
@@ -268,11 +292,11 @@ class UpgradeDatabase extends Command
if (!Schema::hasTable('transaction_journals')) {
return;
}
$subQuery = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->whereNull('transaction_journals.deleted_at')
->whereNull('transactions.deleted_at')
->groupBy(['transaction_journals.id'])
->select(['transaction_journals.id', DB::raw('COUNT(transactions.id) AS t_count')]);
$subQuery = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')
->whereNull('transaction_journals.deleted_at')
->whereNull('transactions.deleted_at')
->groupBy(['transaction_journals.id'])
->select(['transaction_journals.id', DB::raw('COUNT(transactions.id) AS t_count')]);
/** @noinspection PhpStrictTypeCheckingInspection */
$result = DB::table(DB::raw('(' . $subQuery->toSql() . ') AS derived'))
->mergeBindings($subQuery->getQuery())
@@ -294,23 +318,38 @@ class UpgradeDatabase extends Command
*/
public function updateAccountCurrencies(): void
{
Log::debug('Now in updateAccountCurrencies()');
$defaultConfig = (string)config('firefly.default_currency', 'EUR');
Log::debug(sprintf('System default currency is "%s"', $defaultConfig));
$accounts = Account::leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id')
->whereIn('account_types.type', [AccountType::DEFAULT, AccountType::ASSET])->get(['accounts.*']);
/** @var AccountRepositoryInterface $repository */
$repository = app(AccountRepositoryInterface::class);
$accounts->each(
function (Account $account) use ($repository) {
function (Account $account) use ($repository, $defaultConfig) {
$repository->setUser($account->user);
// get users preference, fall back to system pref.
$defaultCurrencyCode = app('preferences')->getForUser($account->user, 'currencyPreference', config('firefly.default_currency', 'EUR'))->data;
$defaultCurrency = TransactionCurrency::where('code', $defaultCurrencyCode)->first();
$accountCurrency = (int)$repository->getMetaValue($account, 'currency_id');
$openingBalance = $account->getOpeningBalance();
$obCurrency = (int)$openingBalance->transaction_currency_id;
// expand and debug routine.
$defaultCurrencyCode = app('preferences')->getForUser($account->user, 'currencyPreference', $defaultConfig)->data;
Log::debug(sprintf('Default currency code is "%s"', var_export($defaultCurrencyCode, true)));
if (!is_string($defaultCurrencyCode)) {
$defaultCurrencyCode = $defaultConfig;
Log::debug(sprintf('Default currency code is not a string, now set to "%s"', $defaultCurrencyCode));
}
$defaultCurrency = TransactionCurrency::where('code', $defaultCurrencyCode)->first();
$accountCurrency = (int)$repository->getMetaValue($account, 'currency_id');
$openingBalance = $account->getOpeningBalance();
$obCurrency = (int)$openingBalance->transaction_currency_id;
if (null === $defaultCurrency) {
throw new UnexpectedValueException('The default currency is NULL, and this is more or less impossible.');
throw new UnexpectedValueException(sprintf('User has a preference for "%s", but this currency does not exist.', $defaultCurrencyCode));
}
Log::debug(
sprintf('Found default currency #%d (%s) while searching for "%s"', $defaultCurrency->id, $defaultCurrency->code, $defaultCurrencyCode)
);
// both 0? set to default currency:
if (0 === $accountCurrency && 0 === $obCurrency) {

View File

@@ -26,6 +26,7 @@ declare(strict_types=1);
namespace FireflyIII\Console\Commands;
use DB;
use Exception;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountMeta;
use FireflyIII\Models\AccountType;
@@ -43,6 +44,7 @@ use FireflyIII\User;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
use Log;
use Schema;
use stdClass;
@@ -97,6 +99,7 @@ class VerifyDatabase extends Command
$this->fixBadMeta();
$this->removeBills();
$this->enableCurrencies();
$this->reportZeroAmount();
return 0;
}
@@ -688,4 +691,24 @@ class VerifyDatabase extends Command
);
}
}
/**
* Collect all journals with empty amount.
*/
private function reportZeroAmount(): void
{
$set = Transaction::where('amount', 0)->get(['transaction_journal_id'])->pluck('transaction_journal_id')->toArray();
$set = array_unique($set);
/** @var Collection $journals */
$journals = TransactionJournal::whereIn('id', $set)->get();
/** @var TransactionJournal $journal */
foreach ($journals as $journal) {
$message = sprintf(
'Transaction "%s" (#%d), owned by user %s, has amount zero (0.00). It should be deleted.', $journal->description,
$journal->id, $journal->user->email
);
$this->error($message);
}
}
}

View File

@@ -651,6 +651,40 @@ class TransactionCollector implements TransactionCollectorInterface
return $this;
}
/**
* Search for words in descriptions.
*
* @param array $array
*
* @return TransactionCollectorInterface
*/
public function setSearchWords(array $array): TransactionCollectorInterface
{
// 'transaction_journals.description',
$this->query->where(
function (EloquentBuilder $q) use ($array) {
$q->where(
function (EloquentBuilder $q1) use ($array) {
foreach ($array as $word) {
$keyword = sprintf('%%%s%%', $word);
$q1->where('transaction_journals.description', 'LIKE', $keyword);
}
}
);
$q->orWhere(
function (EloquentBuilder $q2) use ($array) {
foreach ($array as $word) {
$keyword = sprintf('%%%s%%', $word);
$q2->where('transactions.description', 'LIKE', $keyword);
}
}
);
}
);
return $this;
}
/**
* @param Tag $tag
*

View File

@@ -272,6 +272,15 @@ interface TransactionCollectorInterface
*/
public function setRange(Carbon $start, Carbon $end): TransactionCollectorInterface;
/**
* Search for words in descriptions.
*
* @param array $array
*
* @return TransactionCollectorInterface
*/
public function setSearchWords(array $array): TransactionCollectorInterface;
/**
* Set the tag to collect from.
*

View File

@@ -71,16 +71,18 @@ class LoginController extends Controller
*/
public function login(Request $request)
{
/**
* Temporary bug fix for something that doesn't seem to work in
* AdLdap.
*/
$schema = config('ldap.connections.default.schema');
/** @var Adldap\Connections\Provider $provider */
Adldap::getProvider('default')->setSchema(new $schema);
Log::channel('audit')->info(sprintf('User is trying to login using "%s"', $request->get('email')));
if ('ldap' === config('auth.providers.users.driver')) {
/**
* Temporary bug fix for something that doesn't seem to work in
* AdLdap.
*/
$schema = config('ldap.connections.default.schema');
/** @var Adldap\Connections\Provider $provider */
Adldap::getProvider('default')->setSchema(new $schema);
}
$this->validateLogin($request);
// If the class is using the ThrottlesLogins trait, we can automatically throttle

View File

@@ -243,7 +243,7 @@ class BoxController extends Controller
*/
public function netWorth(): JsonResponse
{
$date = Carbon::create()->startOfDay();
$date = Carbon::now()->startOfDay();
// start and end in the future? use $end
if ($this->notInSessionRange($date)) {

View File

@@ -147,8 +147,9 @@ class RecurrenceController extends Controller
*/
public function suggest(Request $request): JsonResponse
{
$string = $request->get('date') ?? date('Y-m-d');
$today = new Carbon;
$date = Carbon::createFromFormat('Y-m-d', $request->get('date'));
$date = Carbon::createFromFormat('Y-m-d', $string);
$preSelected = (string)$request->get('pre_select');
$result = [];
if ($date > $today || 'true' === (string)$request->get('past')) {

View File

@@ -67,9 +67,10 @@ class SearchController extends Controller
// parse search terms:
$searcher->parseQuery($fullQuery);
$query = $searcher->getWordsAsString();
$modifiers = $searcher->getModifiers();
$subTitle = (string)trans('breadcrumbs.search_result', ['query' => $query]);
return view('search.index', compact('query', 'fullQuery', 'subTitle'));
return view('search.index', compact('query','modifiers', 'fullQuery', 'subTitle'));
}
/**
@@ -83,25 +84,14 @@ class SearchController extends Controller
public function search(Request $request, SearchInterface $searcher): JsonResponse
{
$fullQuery = (string)$request->get('query');
$transactions = new Collection;
// cache
$cache = new CacheProperties;
$cache->addProperty('search');
$cache->addProperty($fullQuery);
if ($cache->has()) {
$transactions = $cache->get(); // @codeCoverageIgnore
}
$searcher->parseQuery($fullQuery);
$searcher->setLimit((int)config('firefly.search_result_limit'));
$transactions = $searcher->searchTransactions();
$searchTime = $searcher->searchTime(); // in seconds
if (!$cache->has()) {
// parse search terms:
$searcher->parseQuery($fullQuery);
$searcher->setLimit((int)config('firefly.search_result_limit'));
$transactions = $searcher->searchTransactions();
$cache->store($transactions);
}
try {
$html = view('search.search', compact('transactions'))->render();
$html = view('search.search', compact('transactions','searchTime'))->render();
// @codeCoverageIgnoreStart
} catch (Throwable $e) {
Log::error(sprintf('Cannot render search.search: %s', $e->getMessage()));

View File

@@ -25,10 +25,13 @@ namespace FireflyIII\Http\Controllers\System;
use Artisan;
use Cache;
use Exception;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\Http\Controllers\GetConfigurationData;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Arr;
use Laravel\Passport\Passport;
use Log;
use phpseclib\Crypt\RSA;
@@ -75,11 +78,17 @@ class InstallController extends Controller
Log::error($e->getMessage());
Log::error($e->getTraceAsString());
if (strpos($e->getMessage(), 'open_basedir restriction in effect')) {
Cache::clear();
return response()->json(['error' => true, 'message' => self::BASEDIR_ERROR]);
}
return response()->json(['error' => true, 'message' => self::OTHER_ERROR . ' ' . $e->getMessage()]);
}
// clear cache as well.
Cache::clear();
Preferences::mark();
return response()->json(['error' => false, 'message' => 'OK']);
}
@@ -91,6 +100,9 @@ class InstallController extends Controller
*/
public function index()
{
// index will set FF3 version.
app('fireflyconfig')->set('ff3_version', (string)config('firefly.version'));
return view('install.index');
}
@@ -118,8 +130,12 @@ class InstallController extends Controller
return response()->json(['error' => false, 'message' => 'OK']);
}
file_put_contents($publicKey, array_get($keys, 'publickey'));
file_put_contents($privateKey, array_get($keys, 'privatekey'));
file_put_contents($publicKey, Arr::get($keys, 'publickey'));
file_put_contents($privateKey, Arr::get($keys, 'privatekey'));
// clear cache as well.
Cache::clear();
Preferences::mark();
return response()->json(['error' => false, 'message' => 'OK']);
}
@@ -148,6 +164,9 @@ class InstallController extends Controller
return response()->json(['error' => true, 'message' => self::OTHER_ERROR]);
}
// clear cache as well.
Cache::clear();
Preferences::mark();
return response()->json(['error' => false, 'message' => 'OK']);
@@ -176,6 +195,10 @@ class InstallController extends Controller
return response()->json(['error' => true, 'message' => self::OTHER_ERROR . ' ' . $e->getMessage()]);
}
// clear cache as well.
Cache::clear();
Preferences::mark();
return response()->json(['error' => false, 'message' => 'OK']);
}
@@ -204,6 +227,11 @@ class InstallController extends Controller
return response()->json(['error' => true, 'message' => self::OTHER_ERROR . ' ' . $e->getMessage()]);
}
// clear cache as well.
Cache::clear();
Preferences::mark();
return response()->json(['error' => false, 'message' => 'OK']);
}

View File

@@ -221,6 +221,7 @@ class SingleController extends Controller
*/
public function delete(TransactionJournal $journal)
{
Log::debug(sprintf('Start of delete view for journal #%d', $journal->id));
// Covered by another controller's tests
// @codeCoverageIgnoreStart
if ($this->isOpeningBalance($journal)) {
@@ -232,6 +233,7 @@ class SingleController extends Controller
$subTitle = (string)trans('firefly.delete_' . $what, ['description' => $journal->description]);
// put previous url in session
Log::debug('Will try to remember previous URI');
$this->rememberPreviousUri('transactions.delete.uri');
return view('transactions.single.delete', compact('journal', 'subTitle', 'what'));

View File

@@ -184,7 +184,21 @@ class Kernel extends HttpKernel
'bindings',
],
];
/**
* The priority-sorted list of middleware.
*
* This forces non-global middleware to always be in the given order.
*
* @var array
*/
protected $middlewarePriority
= [
StartFireflySession::class,
ShareErrorsFromSession::class,
Authenticate::class,
Binder::class,
Authorize::class,
];
/**
* The application's route middleware.
*

View File

@@ -54,9 +54,11 @@ class Installer
*/
public function handle($request, Closure $next)
{
// ignore installer in test environment.
if ('testing' === config('app.env')) {
return $next($request);
}
// don't run installer when already in installer.
$url = $request->url();
$strpos = stripos($url, '/install');
if (!(false === $strpos)) {
@@ -64,37 +66,16 @@ class Installer
return $next($request);
}
// no tables present?
try {
DB::table('users')->count();
} catch (QueryException $e) {
$message = $e->getMessage();
Log::error('Access denied: ' . $message);
if ($this->isAccessDenied($message)) {
throw new FireflyException('It seems your database configuration is not correct. Please verify the username and password in your .env file.');
}
if ($this->noTablesExist($message)) {
// redirect to UpdateController
Log::warning('There are no Firefly III tables present. Redirect to migrate routine.');
return response()->redirectTo(route('installer.index'));
}
throw new FireflyException(sprintf('Could not access the database: %s', $message));
}
// older version in config than database?
$configVersion = (int)config('firefly.db_version');
$dbVersion = (int)app('fireflyconfig')->getFresh('db_version', 1)->data;
if ($configVersion > $dbVersion) {
Log::warning(
sprintf(
'The current installed version (%d) is older than the required version (%d). Redirect to migrate routine.', $dbVersion, $configVersion
)
);
// redirect to migrate routine:
// run installer when no tables are present,
// or when old scheme version
// or when old firefly version
if ($this->hasNoTables() || $this->oldDBVersion() || $this->oldVersion()) {
return response()->redirectTo(route('installer.index'));
}
// update scheme version
// update firefly version
return $next($request);
}
@@ -122,4 +103,85 @@ class Installer
{
return !(false === stripos($message, 'Base table or view not found'));
}
/**
* Check if the tables are created and accounted for.
*
* @return bool
* @throws FireflyException
*/
private function hasNoTables(): bool
{
Log::debug('Now in routine hasNoTables()');
try {
DB::table('users')->count();
} catch (QueryException $e) {
$message = $e->getMessage();
Log::error(sprintf('Error message trying to access users-table: %s', $message));
if ($this->isAccessDenied($message)) {
throw new FireflyException('It seems your database configuration is not correct. Please verify the username and password in your .env file.');
}
if ($this->noTablesExist($message)) {
// redirect to UpdateController
Log::warning('There are no Firefly III tables present. Redirect to migrate routine.');
return true;
}
throw new FireflyException(sprintf('Could not access the database: %s', $message));
}
Log::debug('Everything seems OK with the tables.');
return false;
}
/**
* Check if the "db_version" variable is correct.
*
* @return bool
*/
private function oldDBVersion(): bool
{
// older version in config than database?
$configVersion = (int)config('firefly.db_version');
$dbVersion = (int)app('fireflyconfig')->getFresh('db_version', 1)->data;
if ($configVersion > $dbVersion) {
Log::warning(
sprintf(
'The current configured version (%d) is older than the required version (%d). Redirect to migrate routine.', $dbVersion, $configVersion
)
);
return true;
}
Log::info(sprintf('Configured DB version (%d) equals expected DB version (%d)', $dbVersion, $configVersion));
return false;
}
/**
* Check if the "firefly_version" variable is correct.
*
* @return bool
*/
private function oldVersion(): bool
{
// version compare thing.
$configVersion = (string)config('firefly.version');
$dbVersion = (string)app('fireflyconfig')->getFresh('ff3_version', '1.0')->data;
if (1 === version_compare($configVersion, $dbVersion)) {
Log::warning(
sprintf(
'The current configured Firefly III version (%s) is older than the required version (%s). Redirect to migrate routine.', $dbVersion, $configVersion
)
);
return true;
}
Log::info(sprintf('Installed Firefly III version (%s) equals expected Firefly III version (%s)', $dbVersion, $configVersion));
return false;
}
}

View File

@@ -24,6 +24,7 @@ namespace FireflyIII\Http\Middleware;
use Illuminate\Http\Request;
use Illuminate\Session\Middleware\StartSession;
use Log;
/**
* Class StartFireflySession.
@@ -40,10 +41,18 @@ class StartFireflySession extends StartSession
*/
protected function storeCurrentUrl(Request $request, $session): void
{
$uri = $request->fullUrl();
$strpos = strpos($uri, 'jscript');
if (false === $strpos && 'GET' === $request->method() && !$request->ajax()) {
$uri = $request->fullUrl();
$isScriptPage = strpos($uri, 'jscript');
$isDeletePage = strpos($uri, 'delete');
// also stop remembering "delete" URL's.
if (false === $isScriptPage && false === $isDeletePage && 'GET' === $request->method() && !$request->ajax()) {
$session->setPreviousUrl($uri);
Log::debug(sprintf('Will set previous URL to %s', $uri));
return;
}
Log::debug(sprintf('Will NOT set previous URL to %s', $uri));
}
}

View File

@@ -575,21 +575,24 @@ class ImportArrayStorage
++$hits;
Log::debug(sprintf('Source IDs are the same! (%d)', $hits));
}
Log::debug('Source IDs are not the same.');
unset($transferSourceIDs);
// compare source and destination names
$transferSource = [(string)$transfer->account_name, (int)$transfer->opposing_account_name];
$transferSource = [(string)$transfer->account_name, (string)$transfer->opposing_account_name];
sort($transferSource);
/** @noinspection DisconnectedForeachInstructionInspection */
Log::debug('Comparing current transaction source+dest names', $currentSourceNames);
Log::debug('.. with current transfer source+dest names', $transferSource);
if ($currentSourceNames === $transferSource) {
// @codeCoverageIgnoreStart
Log::debug(sprintf('Source names are the same! (%d)', $hits));
++$hits;
Log::debug(sprintf('Source names are the same! (%d)', $hits));
// @codeCoverageIgnoreEnd
}
Log::debug('Source names are not the same.');
$totalHits += $hits;
Log::debug(sprintf('Total hits is now %d, hits is %d', $totalHits, $hits));
if ($totalHits >= $requiredHits) {
return true;
}

View File

@@ -96,7 +96,7 @@ class FireflyServiceProvider extends ServiceProvider
}
);
$config = app('config');
Twig::addExtension(new Functions($config));
//Twig::addExtension(new Functions($config));
Twig::addRuntimeLoader(new TransactionLoader);
Twig::addRuntimeLoader(new AccountLoader);
Twig::addRuntimeLoader(new TransactionJournalLoader);
@@ -106,7 +106,7 @@ class FireflyServiceProvider extends ServiceProvider
Twig::addExtension(new Transaction);
Twig::addExtension(new Rule);
Twig::addExtension(new AmountFormat);
Twig::addExtension(new Twig_Extension_Debug);
//Twig::addExtension(new Twig_Extension_Debug);
}
/**

View File

@@ -556,6 +556,25 @@ class AccountRepository implements AccountRepositoryInterface
return $result;
}
/**
* @param string $query
* @param array $types
*
* @return Collection
*/
public function searchAccount(string $query, array $types): Collection
{
$dbQuery = $this->user->accounts();
$search = sprintf('%%%s%%', $query);
if (\count($types) > 0) {
$dbQuery->leftJoin('account_types', 'accounts.account_type_id', '=', 'account_types.id');
$dbQuery->whereIn('account_types.type', $types);
}
$dbQuery->where('name', 'LIKE', $search);
return $dbQuery->get(['accounts.*']);
}
/**
* @param User $user
*/

View File

@@ -36,6 +36,7 @@ use Illuminate\Support\Collection;
*/
interface AccountRepositoryInterface
{
/**
* Moved here from account CRUD.
*
@@ -247,6 +248,14 @@ interface AccountRepositoryInterface
*/
public function oldestJournalDate(Account $account): ?Carbon;
/**
* @param string $query
* @param array $types
*
* @return Collection
*/
public function searchAccount(string $query, array $types): Collection;
/**
* @param User $user
*/

View File

@@ -623,6 +623,18 @@ class BillRepository implements BillRepositoryInterface
return $start;
}
/**
* @param string $query
*
* @return Collection
*/
public function searchBill(string $query): Collection
{
$query = sprintf('%%%s%%', $query);
return $this->user->bills()->where('name', 'LIKE', $query)->get();
}
/**
* @param User $user
*/

View File

@@ -33,7 +33,6 @@ use Illuminate\Support\Collection;
*/
interface BillRepositoryInterface
{
/**
* @param Bill $bill
*
@@ -236,6 +235,13 @@ interface BillRepositoryInterface
*/
public function nextExpectedMatch(Bill $bill, Carbon $date): Carbon;
/**
* @param string $query
*
* @return Collection
*/
public function searchBill(string $query): Collection;
/**
* @param User $user
*/

View File

@@ -635,6 +635,20 @@ class BudgetRepository implements BudgetRepositoryInterface
return $result;
}
/**
* @param string $query
*
* @return Collection
*/
public function searchBudget(string $query): Collection
{
$query = sprintf('%%%s%%', $query);
return $this->user->budgets()->where('name', 'LIKE', $query)->get();
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param TransactionCurrency $currency
* @param Carbon $start
@@ -662,8 +676,6 @@ class BudgetRepository implements BudgetRepositoryInterface
return $availableBudget;
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Budget $budget
* @param int $order
@@ -903,6 +915,8 @@ class BudgetRepository implements BudgetRepositoryInterface
return $limit;
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Budget $budget
* @param array $data
@@ -922,8 +936,6 @@ class BudgetRepository implements BudgetRepositoryInterface
return $budget;
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param AvailableBudget $availableBudget
* @param array $data

View File

@@ -169,8 +169,6 @@ interface BudgetRepositoryInterface
*/
public function getBudgets(): Collection;
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* Get all budgets with these ID's.
*
@@ -180,6 +178,8 @@ interface BudgetRepositoryInterface
*/
public function getByIds(array $budgetIds): Collection;
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @return Collection
*/
@@ -194,6 +194,13 @@ interface BudgetRepositoryInterface
*/
public function getNoBudgetPeriodReport(Collection $accounts, Carbon $start, Carbon $end): array;
/**
* @param string $query
*
* @return Collection
*/
public function searchBudget(string $query): Collection;
/**
* @param TransactionCurrency $currency
* @param Carbon $start

View File

@@ -531,6 +531,18 @@ class CategoryRepository implements CategoryRepositoryInterface
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param string $query
*
* @return Collection
*/
public function searchCategory(string $query): Collection
{
$query = sprintf('%%%s%%', $query);
return $this->user->categories()->where('name', 'LIKE', $query)->get();
}
/**
* @param User $user
*/

View File

@@ -40,7 +40,6 @@ interface CategoryRepositoryInterface
*/
public function destroy(Category $category): bool;
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Collection $categories
* @param Collection $accounts
@@ -52,6 +51,7 @@ interface CategoryRepositoryInterface
public function earnedInPeriod(Collection $categories, Collection $accounts, Carbon $start, Carbon $end): string;
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Collection $categories
* @param Collection $accounts
@@ -62,6 +62,8 @@ interface CategoryRepositoryInterface
*/
public function earnedInPeriodCollection(Collection $categories, Collection $accounts, Carbon $start, Carbon $end): Collection;
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* A very cryptic method name that means:
*
@@ -119,8 +121,6 @@ interface CategoryRepositoryInterface
*/
public function getByIds(array $categoryIds): Collection;
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* Returns a list of all the categories belonging to a user.
*
@@ -128,6 +128,8 @@ interface CategoryRepositoryInterface
*/
public function getCategories(): Collection;
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* Return most recent transaction(journal) date or null when never used before.
*
@@ -138,8 +140,6 @@ interface CategoryRepositoryInterface
*/
public function lastUseDate(Category $category, Collection $accounts): ?Carbon;
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Collection $categories
* @param Collection $accounts
@@ -150,6 +150,8 @@ interface CategoryRepositoryInterface
*/
public function periodExpenses(Collection $categories, Collection $accounts, Carbon $start, Carbon $end): array;
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Collection $accounts
* @param Carbon $start
@@ -169,8 +171,6 @@ interface CategoryRepositoryInterface
*/
public function periodIncome(Collection $categories, Collection $accounts, Carbon $start, Carbon $end): array;
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Collection $accounts
* @param Carbon $start
@@ -182,6 +182,15 @@ interface CategoryRepositoryInterface
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param string $query
*
* @return Collection
*/
public function searchCategory(string $query): Collection;
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param User $user
*/

View File

@@ -22,10 +22,13 @@ declare(strict_types=1);
namespace FireflyIII\Support;
use Crypt;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\User;
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Support\Collection;
use Log;
use Preferences as Prefs;
/**
@@ -237,9 +240,19 @@ class Amount
return $cache->get(); // @codeCoverageIgnore
}
$currencyPreference = Prefs::getForUser($user, 'currencyPreference', config('firefly.default_currency', 'EUR'));
$currency = TransactionCurrency::where('code', $currencyPreference->data)->first();
// at this point the currency preference could be encrypted, if coming from an old version.
Log::debug('Going to try to decrypt users currency preference.');
$currencyCode = $this->tryDecrypt((string)$currencyPreference->data);
// could still be json encoded:
if (\strlen($currencyCode) > 3) {
$currencyCode = json_decode($currencyCode) ?? 'EUR';
}
$currency = TransactionCurrency::where('code', $currencyCode)->first();
if (null === $currency) {
throw new FireflyException(sprintf('No currency found with code "%s"', $currencyPreference->data));
throw new FireflyException(sprintf('No currency found with code "%s"', $currencyCode));
}
$cache->store($currency);
@@ -265,4 +278,20 @@ class Amount
'zero' => $positive,
];
}
/**
* @param string $value
*
* @return string
*/
private function tryDecrypt(string $value): string
{
try {
$value = Crypt::decrypt($value);
} catch (DecryptException $e) {
Log::debug(sprintf('Could not decrypt "%s". %s', $value, $e->getMessage()));
}
return $value;
}
}

View File

@@ -140,12 +140,12 @@ trait GetConfigurationData
}
// last seven days:
$seven = Carbon::create()->subDays(7);
$seven = Carbon::now()->subDays(7);
$index = (string)trans('firefly.last_seven_days');
$ranges[$index] = [$seven, new Carbon];
// last 30 days:
$thirty = Carbon::create()->subDays(30);
$thirty = Carbon::now()->subDays(30);
$index = (string)trans('firefly.last_thirty_days');
$ranges[$index] = [$thirty, new Carbon];

View File

@@ -50,6 +50,7 @@ trait UserNavigation
*/
protected function getPreviousUri(string $identifier): string
{
Log::debug(sprintf('Trying to retrieve URL stored under "%s"', $identifier));
// "forbidden" words for specific identifiers:
// if these are in the previous URI, don't refer back there.
$array = [
@@ -66,18 +67,25 @@ trait UserNavigation
'transactions.mass-delete.uri' => '/transactions/show/',
];
$forbidden = $array[$identifier] ?? '/show/';
Log::debug(sprintf('The forbidden word for %s is "%s"', $identifier, $forbidden));
$uri = (string)session($identifier);
Log::debug(sprintf('The URI is %s', $uri));
if (
!(false === strpos($identifier, 'delete'))
&& !(false === strpos($uri, $forbidden))) {
$uri = $this->redirectUri;
Log::debug(sprintf('URI is now %s (identifier contains "delete")', $uri));
}
if (!(false === strpos($uri, 'jscript'))) {
$uri = $this->redirectUri; // @codeCoverageIgnore
Log::debug(sprintf('URI is now %s (uri contains jscript)', $uri));
}
// more debug notes:
Log::debug(sprintf('strpos($identifier, "delete"): %s', var_export(strpos($identifier, 'delete'), true)));
Log::debug(sprintf('strpos($uri, $forbidden): %s', var_export(strpos($uri, $forbidden), true)));
return $uri;
}
@@ -147,6 +155,9 @@ trait UserNavigation
$url = app('url')->previous();
session()->put($identifier, $url);
Log::debug(sprintf('Will put previous URI in cache under key %s: %s', $identifier, $url));
return;
}
Log::debug(sprintf('The users session contains errors somehow so we will not remember the URI!: %s', var_export($errors, true)));
}
}

View File

@@ -164,7 +164,7 @@ class SelectBudgetHandler implements YnabJobConfigurationInterface
{
$currency = $this->currencyRepository->findByCodeNull($code);
if (null === $currency) {
Log::debug(sprintf('No currency found with code "%s"', $code));
Log::debug(sprintf('No currency X found with code "%s"', $code));
return false;
}

View File

@@ -145,7 +145,7 @@ class ImportDataHandler
}
$destinationData = [
'name' => $transaction['payee_name'],
'name' => str_replace('Transfer: ', '', $transaction['payee_name']),
'iban' => null,
'number' => $transaction['payee_id'],
'bic' => null,

View File

@@ -47,12 +47,23 @@ class Navigation
$add = ($skip + 1);
$functionMap = [
'1D' => 'addDays', 'daily' => 'addDays',
'1W' => 'addWeeks', 'weekly' => 'addWeeks', 'week' => 'addWeeks',
'1M' => 'addMonths', 'month' => 'addMonths', 'monthly' => 'addMonths', '3M' => 'addMonths',
'quarter' => 'addMonths', 'quarterly' => 'addMonths', '6M' => 'addMonths', 'half-year' => 'addMonths',
'year' => 'addYears', 'yearly' => 'addYears', '1Y' => 'addYears',
'custom' => 'addMonths', // custom? just add one month.
'1D' => 'addDays',
'daily' => 'addDays',
'1W' => 'addWeeks',
'weekly' => 'addWeeks',
'week' => 'addWeeks',
'1M' => 'addMonths',
'month' => 'addMonths',
'monthly' => 'addMonths',
'3M' => 'addMonths',
'quarter' => 'addMonths',
'quarterly' => 'addMonths',
'6M' => 'addMonths',
'half-year' => 'addMonths',
'year' => 'addYears',
'yearly' => 'addYears',
'1Y' => 'addYears',
'custom' => 'addMonths', // custom? just add one month.
];
$modifierMap = [
'quarter' => 3,
@@ -71,11 +82,16 @@ class Navigation
$function = $functionMap[$repeatFreq];
$date->$function($add);
// if period is 1M and diff in month is 2 and new DOM = 1, sub a day:
// if period is 1M and diff in month is 2 and new DOM > 1, sub a number of days:
// result is:
// '2019-01-29', '2019-02-28'
// '2019-01-30', '2019-02-28'
// '2019-01-31', '2019-02-28'
$months = ['1M', 'month', 'monthly'];
$difference = $date->month - $theDate->month;
if (2 === $difference && 1 === $date->day && \in_array($repeatFreq, $months, true)) {
$date->subDay();
if (2 === $difference && $date->day > 0 && \in_array($repeatFreq, $months, true)) {
$date->subDays($date->day);
}
return $date;
@@ -135,7 +151,7 @@ class Navigation
// per year
while ($perYearEnd >= $perYearStart) {
$perYearEnd = $this->startOfPeriod($perYearEnd, '1Y');
$currentEnd = $this->endOfPeriod($perYearEnd, '1Y')->subDay()->endOfDay();
$currentEnd = $this->endOfPeriod($perYearEnd, '1Y')->endOfDay();
if ($currentEnd->gt($start)) {
$periods[] = [
'start' => $perYearEnd,
@@ -162,11 +178,22 @@ class Navigation
$currentEnd = clone $end;
$functionMap = [
'1D' => 'endOfDay', 'daily' => 'endOfDay',
'1W' => 'addWeek', 'week' => 'addWeek', 'weekly' => 'addWeek',
'1M' => 'addMonth', 'month' => 'addMonth', 'monthly' => 'addMonth',
'3M' => 'addMonths', 'quarter' => 'addMonths', 'quarterly' => 'addMonths', '6M' => 'addMonths', 'half-year' => 'addMonths',
'year' => 'addYear', 'yearly' => 'addYear', '1Y' => 'addYear',
'1D' => 'endOfDay',
'daily' => 'endOfDay',
'1W' => 'addWeek',
'week' => 'addWeek',
'weekly' => 'addWeek',
'1M' => 'addMonth',
'month' => 'addMonth',
'monthly' => 'addMonth',
'3M' => 'addMonths',
'quarter' => 'addMonths',
'quarterly' => 'addMonths',
'6M' => 'addMonths',
'half-year' => 'addMonths',
'year' => 'addYear',
'yearly' => 'addYear',
'1Y' => 'addYear',
];
$modifierMap = [
'quarter' => 3,
@@ -200,14 +227,15 @@ class Navigation
if (isset($modifierMap[$repeatFreq])) {
$currentEnd->$function($modifierMap[$repeatFreq]);
if (\in_array($repeatFreq, $subDay, true)) {
$currentEnd->subDay();
}
$currentEnd->endOfDay();
return $currentEnd;
}
$currentEnd->$function();
$currentEnd->endOfDay();
if (\in_array($repeatFreq, $subDay, true)) {
$currentEnd->subDay();
}

View File

@@ -24,9 +24,15 @@ namespace FireflyIII\Support\Search;
use Carbon\Carbon;
use FireflyIII\Helpers\Collector\TransactionCollectorInterface;
use FireflyIII\Helpers\Filter\DoubleTransactionFilter;
use FireflyIII\Helpers\Filter\InternalTransferFilter;
use FireflyIII\Models\Transaction;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use FireflyIII\User;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use Log;
@@ -35,12 +41,22 @@ use Log;
*/
class Search implements SearchInterface
{
/** @var AccountRepositoryInterface */
private $accountRepository;
/** @var BillRepositoryInterface */
private $billRepository;
/** @var BudgetRepositoryInterface */
private $budgetRepository;
/** @var CategoryRepositoryInterface */
private $categoryRepository;
/** @var int */
private $limit = 100;
/** @var Collection */
private $modifiers;
/** @var string */
private $originalQuery = '';
/** @var float */
private $startTime;
/** @var User */
private $user;
/** @var array */
@@ -53,13 +69,25 @@ class Search implements SearchInterface
*/
public function __construct()
{
$this->modifiers = new Collection;
$this->validModifiers = (array)config('firefly.search_modifiers');
$this->modifiers = new Collection;
$this->validModifiers = (array)config('firefly.search_modifiers');
$this->startTime = microtime(true);
$this->accountRepository = app(AccountRepositoryInterface::class);
$this->categoryRepository = app(CategoryRepositoryInterface::class);
$this->budgetRepository = app(BudgetRepositoryInterface::class);
$this->billRepository = app(BillRepositoryInterface::class);
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this)));
}
}
/**
* @return Collection
*/
public function getModifiers(): Collection
{
return $this->modifiers;
}
/**
@@ -99,78 +127,44 @@ class Search implements SearchInterface
$filteredQuery = str_replace($match, '', $filteredQuery);
}
$filteredQuery = trim(str_replace(['"', "'"], '', $filteredQuery));
if ('' != $filteredQuery) {
if ('' !== $filteredQuery) {
$this->words = array_map('trim', explode(' ', $filteredQuery));
}
}
/**
* @return Collection
* @return float
*/
public function searchTransactions(): Collection
public function searchTime(): float
{
return microtime(true) - $this->startTime;
}
/**
* @return LengthAwarePaginator
*/
public function searchTransactions(): LengthAwarePaginator
{
Log::debug('Start of searchTransactions()');
$pageSize = 100;
$processed = 0;
$page = 1;
$result = new Collection();
$startTime = microtime(true);
do {
/** @var TransactionCollectorInterface $collector */
$collector = app(TransactionCollectorInterface::class);
$collector->setAllAssetAccounts()->setLimit($pageSize)->setPage($page)->withOpposingAccount();
if ($this->hasModifiers()) {
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
}
$pageSize = 50;
$page = 1;
// some modifiers can be applied to the collector directly.
$collector = $this->applyModifiers($collector);
/** @var TransactionCollectorInterface $collector */
$collector = app(TransactionCollectorInterface::class);
$collector->setAllAssetAccounts()->setLimit($pageSize)->setPage($page)->withOpposingAccount();
if ($this->hasModifiers()) {
$collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation();
}
$collector->removeFilter(InternalTransferFilter::class);
$set = $collector->getPaginatedTransactions()->getCollection();
$collector->setSearchWords($this->words);
$collector->removeFilter(InternalTransferFilter::class);
$collector->addFilter(DoubleTransactionFilter::class);
Log::debug(sprintf('Found %d journals to check. ', $set->count()));
// Most modifiers can be applied to the collector directly.
$collector = $this->applyModifiers($collector);
// Filter transactions that match the given triggers.
$filtered = $set->filter(
function (Transaction $transaction) {
if ($this->matchModifiers($transaction)) {
return $transaction;
}
return $collector->getPaginatedTransactions();
// return false:
return false;
}
);
Log::debug(sprintf('Found %d journals that match.', $filtered->count()));
// merge:
/** @var Collection $result */
$result = $result->merge($filtered);
Log::debug(sprintf('Total count is now %d', $result->count()));
// Update counters
++$page;
$processed += \count($set);
Log::debug(sprintf('Page is now %d, processed is %d', $page, $processed));
// Check for conditions to finish the loop
$reachedEndOfList = $set->count() < 1;
$foundEnough = $result->count() >= $this->limit;
Log::debug(sprintf('reachedEndOfList: %s', var_export($reachedEndOfList, true)));
Log::debug(sprintf('foundEnough: %s', var_export($foundEnough, true)));
// break at some point so the script does not crash:
$currentTime = microtime(true) - $startTime;
Log::debug(sprintf('Have been running for %f seconds.', $currentTime));
} while (!$reachedEndOfList && !$foundEnough && $currentTime <= 30);
$result = $result->slice(0, $this->limit);
return $result;
}
/**
@@ -187,6 +181,10 @@ class Search implements SearchInterface
public function setUser(User $user): void
{
$this->user = $user;
$this->accountRepository->setUser($user);
$this->billRepository->setUser($user);
$this->categoryRepository->setUser($user);
$this->budgetRepository->setUser($user);
}
/**
@@ -197,8 +195,49 @@ class Search implements SearchInterface
*/
private function applyModifiers(TransactionCollectorInterface $collector): TransactionCollectorInterface
{
/*
* TODO:
* 'bill',
*/
foreach ($this->modifiers as $modifier) {
switch ($modifier['type']) {
default:
die(sprintf('unsupported modifier: "%s"', $modifier['type']));
case 'source':
// source can only be asset, liability or revenue account:
$searchTypes = [AccountType::ASSET, AccountType::MORTGAGE, AccountType::LOAN, AccountType::DEBT, AccountType::REVENUE];
$accounts = $this->accountRepository->searchAccount($modifier['value'], $searchTypes);
if ($accounts->count() > 0) {
$collector->setAccounts($accounts);
}
break;
case 'destination':
// source can only be asset, liability or expense account:
$searchTypes = [AccountType::ASSET, AccountType::MORTGAGE, AccountType::LOAN, AccountType::DEBT, AccountType::EXPENSE];
$accounts = $this->accountRepository->searchAccount($modifier['value'], $searchTypes);
if ($accounts->count() > 0) {
$collector->setOpposingAccounts($accounts);
}
break;
case 'category':
$result = $this->categoryRepository->searchCategory($modifier['value']);
if ($result->count() > 0) {
$collector->setCategories($result);
}
break;
case 'bill':
$result = $this->billRepository->searchBill($modifier['value']);
if ($result->count() > 0) {
$collector->setBills($result);
}
break;
case 'budget':
$result = $this->budgetRepository->searchBudget($modifier['value']);
if ($result->count() > 0) {
$collector->setBudgets($result);
}
break;
case 'amount_is':
case 'amount':
$amount = app('steam')->positive((string)$modifier['value']);
@@ -260,55 +299,4 @@ class Search implements SearchInterface
}
}
}
/**
* @param Transaction $transaction
*
* @return bool
*
*/
private function matchModifiers(Transaction $transaction): bool
{
Log::debug(sprintf('Now at transaction #%d', $transaction->id));
// first "modifier" is always the text of the search:
// check descr of journal:
if (\count($this->words) > 0
&& !$this->strposArray(strtolower((string)$transaction->description), $this->words)
&& !$this->strposArray(strtolower((string)$transaction->transaction_description), $this->words)
) {
Log::debug('Description does not match', $this->words);
return false;
}
// then a for-each and a switch for every possible other thingie.
foreach ($this->modifiers as $modifier) {
$res = Modifier::apply($modifier, $transaction);
if (false === $res) {
return $res;
}
}
return true;
}
/**
* @param string $haystack
* @param array $needle
*
* @return bool
*/
private function strposArray(string $haystack, array $needle): bool
{
if ('' === $haystack) {
return false;
}
foreach ($needle as $what) {
if (false !== stripos($haystack, $what)) {
return true;
}
}
return false;
}
}

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Support\Search;
use FireflyIII\User;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
/**
@@ -30,6 +31,11 @@ use Illuminate\Support\Collection;
*/
interface SearchInterface
{
/**
* @return Collection
*/
public function getModifiers(): Collection;
/**
* @return string
*/
@@ -46,9 +52,14 @@ interface SearchInterface
public function parseQuery(string $query);
/**
* @return Collection
* @return float
*/
public function searchTransactions(): Collection;
public function searchTime(): float;
/**
* @return LengthAwarePaginator
*/
public function searchTransactions(): LengthAwarePaginator;
/**
* @param int $limit

View File

@@ -132,13 +132,13 @@ class Transaction extends Twig_Extension
// journal has a budget:
if (null !== $transaction->transaction_journal_budget_id) {
$name = $transaction->transaction_journal_budget_name;
$txt = sprintf('<a href="%s" title="%s">%s</a>', route('budgets.show', [$transaction->transaction_journal_budget_id]), $name, $name);
$txt = sprintf('<a href="%s" title="%s">%s</a>', route('budgets.show', [$transaction->transaction_journal_budget_id]), e($name), e($name));
}
// transaction has a budget
if (null !== $transaction->transaction_budget_id && '' === $txt) {
$name = $transaction->transaction_budget_name;
$txt = sprintf('<a href="%s" title="%s">%s</a>', route('budgets.show', [$transaction->transaction_budget_id]), $name, $name);
$txt = sprintf('<a href="%s" title="%s">%s</a>', route('budgets.show', [$transaction->transaction_budget_id]), e($name), e($name));
}
if ('' === $txt) {
@@ -150,7 +150,7 @@ class Transaction extends Twig_Extension
if ($budgets->count() > 0) {
$str = [];
foreach ($budgets as $budget) {
$str[] = sprintf('<a href="%s" title="%s">%s</a>', route('budgets.show', [$budget->id]), $budget->name, $budget->name);
$str[] = sprintf('<a href="%s" title="%s">%s</a>', route('budgets.show', [$budget->id]), e($budget->name), e($budget->name));
}
$txt = implode(', ', $str);
}
@@ -170,13 +170,13 @@ class Transaction extends Twig_Extension
// journal has a category:
if (null !== $transaction->transaction_journal_category_id) {
$name = $transaction->transaction_journal_category_name;
$txt = sprintf('<a href="%s" title="%s">%s</a>', route('categories.show', [$transaction->transaction_journal_category_id]), $name, $name);
$txt = sprintf('<a href="%s" title="%s">%s</a>', route('categories.show', [$transaction->transaction_journal_category_id]), e($name), e($name));
}
// transaction has a category:
if (null !== $transaction->transaction_category_id && '' === $txt) {
$name = $transaction->transaction_category_name;
$txt = sprintf('<a href="%s" title="%s">%s</a>', route('categories.show', [$transaction->transaction_category_id]), $name, $name);
$txt = sprintf('<a href="%s" title="%s">%s</a>', route('categories.show', [$transaction->transaction_category_id]), e($name), e($name));
}
if ('' === $txt) {
@@ -188,7 +188,7 @@ class Transaction extends Twig_Extension
if ($categories->count() > 0) {
$str = [];
foreach ($categories as $category) {
$str[] = sprintf('<a href="%s" title="%s">%s</a>', route('categories.show', [$category->id]), $category->name, $category->name);
$str[] = sprintf('<a href="%s" title="%s">%s</a>', route('categories.show', [$category->id]), e($category->name), e($category->name));
}
$txt = implode(', ', $str);
@@ -266,7 +266,7 @@ class Transaction extends Twig_Extension
return $txt;
}
$txt = sprintf('<a title="%3$s" href="%2$s">%1$s</a>', e($name), route('accounts.show', [$transactionId]), $iban);
$txt = sprintf('<a title="%3$s" href="%2$s">%1$s</a>', e($name), route('accounts.show', [$transactionId]), e($iban));
return $txt;
}
@@ -419,7 +419,7 @@ class Transaction extends Twig_Extension
return $txt;
}
$txt = sprintf('<a title="%3$s" href="%2$s">%1$s</a>', e($name), route('accounts.show', [$transactionId]), $iban);
$txt = sprintf('<a title="%3$s" href="%2$s">%1$s</a>', e($name), route('accounts.show', [$transactionId]), e($iban));
return $txt;
}

View File

@@ -2,6 +2,71 @@
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
## [4.7.17.2 (API 0.9.2)] - 2019-07-15
- XSS bug in budget title.
## [4.7.17 (API 0.9.2)] - 2019-03-17
### Added
- Support for Norwegian!
### Changed
- Clear cache during install routine.
- Add Firefly III version number to install routine.
### Removed
- Initial release.
### Fixed
- [Issue 2159](https://github.com/firefly-iii/firefly-iii/issues/2159) Bad redirect due to Laravel upgrade.
- [Issue 2166](https://github.com/firefly-iii/firefly-iii/issues/2166) Importer had some issues with distinguishing double transfers.
- [Issue 2167](https://github.com/firefly-iii/firefly-iii/issues/2167) New LDAP package gave some configuration changes.
- [Issue 2173](https://github.com/firefly-iii/firefly-iii/issues/2173) Missing class when generating 2FA codes.
## [4.7.16 (API 0.9.2)] - 2019-03-08
4.7.16 was released to fix a persistent issue with broken user preferences.
### Changed
- Firefly III now uses Laravel 5.8.
## [4.7.15 (API 0.9.2)] - 2019-03-02
4.7.15 was released to fix some issues upgrading from older versions.
### Added
- [Issue 2128](https://github.com/firefly-iii/firefly-iii/issues/2128) Support for Postgres SSL
### Changed
- [Issue 2120](https://github.com/firefly-iii/firefly-iii/issues/2120) Add a missing meta tag, thanks to @lastlink
- Search is a lot faster now.
### Fixed
- [Issue 2125](https://github.com/firefly-iii/firefly-iii/issues/2125) Decryption issues during upgrade
- [Issue 2130](https://github.com/firefly-iii/firefly-iii/issues/2130) Fixed database migrations and rollbacks.
- [Issue 2135](https://github.com/firefly-iii/firefly-iii/issues/2135) Date fixes in transaction overview
## [4.7.14 (API 0.9.2)] - 2019-02-24
4.7.14 was released to fix an issue with the Composer installation script.
## [4.7.13 (API 0.9.2)] - 2019-02-23
4.7.13 was released to fix an issue that affected the Softaculous build.
### Added
- A routine has been added that warns about transactions with a 0.00 amount.
### Changed
- PHP maximum execution time is now 600 seconds in the Docker image.
- Moved several files outside of the root of Firefly III
### Fixed
- Fix issue where missing preference breaks the database upgrade.
- [Issue 2100](https://github.com/firefly-iii/firefly-iii/issues/2100) Mass edit transactions results in a reset of the date.
## [4.7.12 (API 0.9.2)] - 2019-02-16
4.7.12 was released to fix several shortcomings in v4.7.11's Docker image. Those in turn were caused by me. My apologies.

View File

@@ -58,37 +58,34 @@
"php": ">=7.2.0",
"ext-bcmath": "*",
"ext-curl": "*",
"ext-gd": "*",
"ext-tokenizer": "*",
"ext-intl": "*",
"ext-xml": "*",
"ext-ldap": "*",
"ext-zip": "*",
"ext-json": "*",
"ext-fileinfo": "*",
"ext-gd": "*",
"ext-intl": "*",
"ext-json": "*",
"ext-openssl": "*",
"ext-simplexml": "*",
"adldap2/adldap2-laravel": "^5.0",
"ext-tokenizer": "*",
"ext-xml": "*",
"ext-zip": "*",
"adldap2/adldap2-laravel": "5.*",
"bacon/bacon-qr-code": "1.*",
"bunq/sdk_php": "dev-master",
"danhunsaker/laravel-flysystem-others": "^1.3",
"danhunsaker/laravel-flysystem-others": "1.*",
"davejamesmiller/laravel-breadcrumbs": "5.*",
"doctrine/dbal": "2.*",
"fideloper/proxy": "4.*",
"laravel/framework": "5.7.*",
"laravel/passport": "^7.0",
"laravelcollective/html": "5.7.*",
"laravel/framework": "5.8.*",
"laravel/passport": "7.*",
"laravelcollective/html": "5.8.*",
"league/commonmark": "0.*",
"league/csv": "9.*",
"league/flysystem-replicate-adapter": "^1.0",
"league/flysystem-sftp": "^1.0",
"league/fractal": "^0.17.0",
"litipk/flysystem-fallback-adapter": "0.1.2",
"mschindler83/fints-hbci-php": "^1.0",
"pragmarx/google2fa": "3.*",
"league/flysystem-replicate-adapter": "1.*",
"league/flysystem-sftp": "1.*",
"league/fractal": "0.*",
"litipk/flysystem-fallback-adapter": "0.*",
"mschindler83/fints-hbci-php": "1.*",
"pragmarx/google2fa-laravel": "0.*",
"rcrowe/twigbridge": "0.9.*",
"twig/twig": "1.*"
"rcrowe/twigbridge": "0.9.*"
},
"require-dev": {
"barryvdh/laravel-ide-helper": "2.*",
@@ -96,8 +93,7 @@
"fzaninotto/faker": "1.*",
"johnkary/phpunit-speedtrap": "^3.0",
"mockery/mockery": "1.*",
"php-coveralls/php-coveralls": "^2.0",
"phpunit/phpunit": "7.*",
"phpunit/phpunit": "8.*",
"roave/security-advisories": "dev-master"
},
"suggest": {
@@ -123,7 +119,7 @@
},
"scripts": {
"pre-install-cmd": [
"@php -r \"if (!(getenv('DYNO'))===false){file_exists('.env') || copy('.env.heroku', '.env');}\""
"@php -r \"if (!(getenv('DYNO'))===false){file_exists('.env') || copy('.deploy/heroku/.env.heroku', '.env');copy('.deploy/heroku/.locales', '.locales');}\""
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""

1277
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -74,7 +74,7 @@ return [
FireflyIII\Providers\RouteServiceProvider::class,
// own stuff:
TwigBridge\ServiceProvider::class,
// TwigBridge\ServiceProvider::class,
PragmaRX\Google2FALaravel\ServiceProvider::class,
@@ -134,7 +134,7 @@ return [
'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,
'Twig' => TwigBridge\Facade\Twig::class,
//'Twig' => TwigBridge\Facade\Twig::class,
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class,
'Preferences' => \FireflyIII\Support\Facades\Preferences::class,

View File

@@ -60,16 +60,19 @@ return [
'engine' => 'InnoDB',
],
'pgsql' => [
'driver' => 'pgsql',
'host' => envNonEmpty('DB_HOST', $host),
'port' => envNonEmpty('DB_PORT', '5432'),
'database' => envNonEmpty('DB_DATABASE', $database),
'username' => envNonEmpty('DB_USERNAME', $username),
'password' => env('DB_PASSWORD', $password),
'charset' => 'utf8',
'prefix' => '',
'schema' => 'public',
'sslmode' => 'prefer',
'driver' => 'pgsql',
'host' => envNonEmpty('DB_HOST', $host),
'port' => envNonEmpty('DB_PORT', '5432'),
'database' => envNonEmpty('DB_DATABASE', $database),
'username' => envNonEmpty('DB_USERNAME', $username),
'password' => env('DB_PASSWORD', $password),
'charset' => 'utf8',
'prefix' => '',
'schema' => 'public',
'sslmode' => envNonEmpty('PGSQL_SSL_MODE', 'prefer'),
'sslcert' => envNonEmpty('PGSQL_SSL_CERT'),
'sslkey' => envNonEmpty('PGSQL_SSL_KEY'),
'sslrootcert' => envNonEmpty('PGSQL_SSL_ROOT_CERT'),
],
'sqlsrv' => [
'driver' => 'sqlsrv',

View File

@@ -93,9 +93,9 @@ return [
'is_demo_site' => false,
],
'encryption' => null === env('USE_ENCRYPTION') || env('USE_ENCRYPTION') === true,
'version' => '4.7.12',
'version' => '4.7.17.2',
'api_version' => '0.9.2',
'db_version' => 9,
'db_version' => 10,
'maxUploadSize' => 15242880,
'send_error_message' => env('SEND_ERROR_MESSAGE', true),
'site_owner' => env('SITE_OWNER', ''),
@@ -264,28 +264,28 @@ return [
],
'languages' => [
'en_US' => ['name_locale' => 'English', 'name_english' => 'English'],
'es_ES' => ['name_locale' => 'Español', 'name_english' => 'Spanish'], // 2019-01-28: 93%
'de_DE' => ['name_locale' => 'Deutsch', 'name_english' => 'German'], // 2019-01-28: 99%
'fr_FR' => ['name_locale' => 'Français', 'name_english' => 'French'], // 2019-01-28: 99%
//'id_ID' => ['name_locale' => 'Bahasa Indonesia', 'name_english' => 'Indonesian'], // 2019-01-28: 65%
'it_IT' => ['name_locale' => 'Italiano', 'name_english' => 'Italian'], // 2019-01-28: 100%
'nl_NL' => ['name_locale' => 'Nederlands', 'name_english' => 'Dutch'], // 2019-01-28: 100%
'pl_PL' => ['name_locale' => 'Polski', 'name_english' => 'Polish '], // 2019-01-28: 85%
'pt_BR' => ['name_locale' => 'Português do Brasil', 'name_english' => 'Portuguese (Brazil)'], // 2019-01-28: 80%
'ru_RU' => ['name_locale' => 'Русский', 'name_english' => 'Russian'], // 2019-01-28: 83%
'zh_TW' => ['name_locale' => 'Chinese Traditional', 'name_english' => 'Chinese Traditional'], // 2019-01-28: 99%
'zh_CN' => ['name_locale' => 'Chinese Simplified', 'name_english' => 'Chinese Simplified'], // 2019-01-28: 99%
//'tr_TR' => ['name_locale' => 'Türkçe', 'name_english' => 'Turkish'], // 2018-12-23: 70%
//'nb_NO' => ['name_locale' => 'Norwegian', 'name_english' => 'Norwegian'], // 2019-01-28: 52%
//'ca_ES' => ['name_locale' => 'Catalan', 'name_english' => 'Catalan'], // 2019-01-28: 0%
//'ja_JA' => ['name_locale' => 'Japanese', 'name_english' => 'Japanese'], // 2019-01-28: 0%
//'cs_CZ' => ['name_locale' => 'Czech', 'name_english' => 'Czech'], // 2019-01-28: 8%
//'he_IL' => ['name_locale' => 'Hebrew', 'name_english' => 'Hebrew'], // 2019-01-28: 2%
//'hu_HU' => ['name_locale' => 'Hungarian', 'name_english' => 'Hungarian'], // 2019-01-28: 40%
//'sv_SE' => ['name_locale' => 'Svenska', 'name_english' => 'Swedish'], // 2019-01-28: 1%
//'sr_CS' => ['name_locale' => 'Serbian (Latin)', 'name_english' => 'Serbian (Latin)'], // 2019-01-28: 0%
//'sl_SI' => ['name_locale' => 'Slovenian', 'name_english' => 'Slovenian'], // 2019-01-28: 10%
//'uk_UA' => ['name_locale' => 'Ukranian', 'name_english' => 'Ukranian'], // 2019-01-28: 4%
'es_ES' => ['name_locale' => 'Español', 'name_english' => 'Spanish'], // 92%
'de_DE' => ['name_locale' => 'Deutsch', 'name_english' => 'German'], // 100%
'fr_FR' => ['name_locale' => 'Français', 'name_english' => 'French'], // 100%
//'id_ID' => ['name_locale' => 'Bahasa Indonesia', 'name_english' => 'Indonesian'], // 65%
'it_IT' => ['name_locale' => 'Italiano', 'name_english' => 'Italian'], // 100%
'nl_NL' => ['name_locale' => 'Nederlands', 'name_english' => 'Dutch'], // 100%
'pl_PL' => ['name_locale' => 'Polski', 'name_english' => 'Polish '], // 87%
'pt_BR' => ['name_locale' => 'Português do Brasil', 'name_english' => 'Portuguese (Brazil)'], // 80%
'ru_RU' => ['name_locale' => 'Русский', 'name_english' => 'Russian'], // 83%
'zh_TW' => ['name_locale' => 'Chinese Traditional', 'name_english' => 'Chinese Traditional'], // 100%
'zh_CN' => ['name_locale' => 'Chinese Simplified', 'name_english' => 'Chinese Simplified'], // 99%
//'tr_TR' => ['name_locale' => 'Türkçe', 'name_english' => 'Turkish'], // 71%
'nb_NO' => ['name_locale' => 'Norsk', 'name_english' => 'Norwegian'],
//'ca_ES' => ['name_locale' => 'Catalan', 'name_english' => 'Catalan'], // 0%
//'ja_JA' => ['name_locale' => 'Japanese', 'name_english' => 'Japanese'], // 0%
//'cs_CZ' => ['name_locale' => 'Czech', 'name_english' => 'Czech'], // 35%
//'he_IL' => ['name_locale' => 'Hebrew', 'name_english' => 'Hebrew'], // 2%
//'hu_HU' => ['name_locale' => 'Hungarian', 'name_english' => 'Hungarian'], // 40%
//'sv_SE' => ['name_locale' => 'Svenska', 'name_english' => 'Swedish'], // 1%
//'sr_CS' => ['name_locale' => 'Serbian (Latin)', 'name_english' => 'Serbian (Latin)'], // 0%
//'sl_SI' => ['name_locale' => 'Slovenian', 'name_english' => 'Slovenian'], // 10%
//'uk_UA' => ['name_locale' => 'Ukranian', 'name_english' => 'Ukranian'], // 4%
],

View File

@@ -143,7 +143,7 @@ return [
'scopes' => $scopes,
'usernames' => [
'identifiers' => [
/*
|--------------------------------------------------------------------------
@@ -173,8 +173,8 @@ return [
'ldap' => [
'discover' => envNonEmpty('ADLDAP_DISCOVER_FIELD', 'userprincipalname'),
'authenticate' => envNonEmpty('ADLDAP_AUTH_FIELD', 'distinguishedname'),
'locate_users_by' => envNonEmpty('ADLDAP_DISCOVER_FIELD', 'userprincipalname'),
'bind_users_by' => envNonEmpty('ADLDAP_AUTH_FIELD', 'distinguishedname'),
],

View File

@@ -1,40 +1,27 @@
<?php
/**
* twigbridge.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
use TwigBridge\Extension\Laravel\Auth;
use TwigBridge\Extension\Laravel\Config;
use TwigBridge\Extension\Laravel\Dump;
use TwigBridge\Extension\Laravel\Input;
use TwigBridge\Extension\Laravel\Session;
use TwigBridge\Extension\Laravel\Url;
use TwigBridge\Extension\Laravel\Str;
use TwigBridge\Extension\Laravel\Translator;
use TwigBridge\Extension\Laravel\Url;
use TwigBridge\Extension\Loader\Facades;
use TwigBridge\Extension\Laravel\Session;
use TwigBridge\Extension\Laravel\Dump;
use TwigBridge\Extension\Laravel\Input;
use TwigBridge\Extension\Laravel\Config;
use TwigBridge\Extension\Laravel\Auth;
use TwigBridge\Extension\Loader\Filters;
use TwigBridge\Extension\Loader\Functions;
use TwigBridge\Extension\Loader\Facades;
use TwigBridge\Twig\Template;
/**
* This file is part of the TwigBridge package.
*
* @copyright Robert Crowe <hello@vivalacrowe.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/**
* Configuration options for Twig.
*/
@@ -67,6 +54,7 @@ return [
'debug' => env('APP_DEBUG', false),
// The charset used by the templates.
// default: utf-8
'charset' => 'utf-8',
// The base template class to use for generated templates.
@@ -119,7 +107,7 @@ return [
|
| Enabled extensions.
|
| `Twig_Extension_Debug` is enabled automatically if twig.debug is TRUE.
| `Twig\Extension\DebugExtension` is enabled automatically if twig.debug is TRUE.
|
*/
'enabled' => [
@@ -202,7 +190,7 @@ return [
| Available functions. Access like `{{ secure_url(...) }}`.
|
| Each function can take an optional array of options. These options are
| passed directly to `Twig_SimpleFunction`.
| passed directly to `Twig\TwigFunction`.
|
| So for example, to mark a function as safe you can do the following:
|
@@ -226,7 +214,7 @@ return [
'elixir',
'head',
'last',
'old',
'mix',
],
/*
@@ -237,7 +225,7 @@ return [
| Available filters. Access like `{{ variable|filter }}`.
|
| Each filter can take an optional array of options. These options are
| passed directly to `Twig_SimpleFilter`.
| passed directly to `Twig\TwigFilter`.
|
| So for example, to mark a filter as safe you can do the following:
|

View File

@@ -1,129 +1,11 @@
#
# Your crowdin's credentials
#
"api_key_env": CROWDIN_API_KEY
"project_identifier_env": CROWDIN_PROJECT_ID
"base_path_env": CROWDIN_BASE_PATH
#"base_url" : ""
#
# Choose file structure in crowdin
# e.g. true or false
#
"preserve_hierarchy": false
#
# Files configuration
#
files: [
{
#
# Source files filter
# e.g. "/resources/en/*.json"
#
"source" : "",
source: "/resources/lang/en_US/*.php",
#
# where translations live
# e.g. "/resources/%two_letters_code%/%original_file_name%"
#
"translation" : "",
translation: /resources/lang/%locale_with_underscore%/%original_file_name%,
#
# files or directories for ignore
# e.g. ["/**/?.txt", "/**/[0-9].txt", "/**/*\?*.txt"]
#
#"ignore" : [],
#
# The dest allows you to specify a file name on Crowdin
# e.g. "/messages.json"
#
#"dest" : "",
#
# File type
# e.g. "json"
#
#type:"json"
#
# The parameter "update_option" is optional. If it is not set, translations for changed strings will be lost. Useful for typo fixes and minor changes in source strings.
# e.g. "update_as_unapproved" or "update_without_changes"
#
#"update_option" : "",
#
# Start block only for XML
#
#
# Defines whether to translate tags attributes.
# e.g. 0 or 1 (Default is 1)
#
# "translate_attributes" : 1,
#
# Defines whether to translate texts placed inside the tags.
# e.g. 0 or 1 (Default is 1)
#
# "translate_content" : 1,
#
# This is an array of strings, where each item is the XPaths to DOM element that should be imported
# e.g. ["/content/text", "/content/text[@value]"]
#
# "translatable_elements" : [],
#
# Defines whether to split long texts into smaller text segments.
# e.g. 0 or 1 (Default is 1)
#
# "content_segmentation" : 1,
#
# End block only for XML
#
#
# Start .properties block
#
#
# Defines whether single quote should be escaped by another single quote or backslash in exported translations.
# e.g. 0 or 1 or 2 or 3 (Default is 3)
# 0 - do not escape single quote;
# 1 - escape single quote by another single quote;
# 2 - escape single quote by backslash;
# 3 - escape single quote by another single quote only in strings containing variables ( {0} ).
#
# "escape_quotes" : 3,
#
# End .properties block
#
#
# Often software projects have custom names for locale directories. crowdin-cli allows you to map your own languages to be understandable by Crowdin.
#
#"languages_mapping" : {
# "two_letters_code" : {
# "crowdin_language_code" : "local_name"
# }
#},
#
# Is first line contains header?
# e.g. true or false
#
#"first_line_contains_header" : true,
#
# for spreadsheets
# e.g. "identifier,source_phrase,context,uk,ru,fr"
#
# "scheme" : "",
}
]

View File

@@ -31,7 +31,7 @@ class CreateSupportTables extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::drop('account_types');
Schema::drop('transaction_currencies');
@@ -50,7 +50,7 @@ class CreateSupportTables extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
$this->createAccountTypeTable();
$this->createCurrencyTable();
@@ -67,7 +67,7 @@ class CreateSupportTables extends Migration
/**
*
*/
private function createAccountTypeTable()
private function createAccountTypeTable(): void
{
if (!Schema::hasTable('account_types')) {
Schema::create(
@@ -84,7 +84,7 @@ class CreateSupportTables extends Migration
}
}
private function createConfigurationTable()
private function createConfigurationTable(): void
{
if (!Schema::hasTable('configuration')) {
Schema::create(
@@ -104,7 +104,7 @@ class CreateSupportTables extends Migration
/**
*
*/
private function createCurrencyTable()
private function createCurrencyTable(): void
{
if (!Schema::hasTable('transaction_currencies')) {
Schema::create(
@@ -127,7 +127,7 @@ class CreateSupportTables extends Migration
/**
*
*/
private function createJobsTable()
private function createJobsTable(): void
{
if (!Schema::hasTable('jobs')) {
Schema::create(
@@ -151,7 +151,7 @@ class CreateSupportTables extends Migration
/**
*
*/
private function createPasswordTable()
private function createPasswordTable(): void
{
if (!Schema::hasTable('password_resets')) {
Schema::create(
@@ -169,7 +169,7 @@ class CreateSupportTables extends Migration
/**
*
*/
private function createPermissionRoleTable()
private function createPermissionRoleTable(): void
{
if (!Schema::hasTable('permission_role')) {
Schema::create(
@@ -190,7 +190,7 @@ class CreateSupportTables extends Migration
/**
*
*/
private function createPermissionsTable()
private function createPermissionsTable(): void
{
if (!Schema::hasTable('permissions')) {
Schema::create(
@@ -209,7 +209,7 @@ class CreateSupportTables extends Migration
/**
*
*/
private function createRolesTable()
private function createRolesTable(): void
{
if (!Schema::hasTable('roles')) {
Schema::create(
@@ -228,7 +228,7 @@ class CreateSupportTables extends Migration
/**
*
*/
private function createSessionsTable()
private function createSessionsTable(): void
{
if (!Schema::hasTable('sessions')) {
Schema::create(
@@ -248,7 +248,7 @@ class CreateSupportTables extends Migration
/**
*
*/
private function createTransactionTypeTable()
private function createTransactionTypeTable(): void
{
if (!Schema::hasTable('transaction_types')) {
Schema::create(

View File

@@ -31,7 +31,7 @@ class CreateUsersTable extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::drop('users');
}
@@ -41,7 +41,7 @@ class CreateUsersTable extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
if (!Schema::hasTable('users')) {
Schema::create(

View File

@@ -31,7 +31,7 @@ class CreateMainTables extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::drop('account_meta');
Schema::drop('piggy_bank_repetitions');
@@ -68,7 +68,7 @@ class CreateMainTables extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
$this->createAccountTables();
$this->createPiggyBanksTable();
@@ -87,7 +87,7 @@ class CreateMainTables extends Migration
/**
*
*/
private function createAccountTables()
private function createAccountTables(): void
{
if (!Schema::hasTable('accounts')) {
Schema::create(
@@ -127,7 +127,7 @@ class CreateMainTables extends Migration
/**
*
*/
private function createAttachmentsTable()
private function createAttachmentsTable(): void
{
if (!Schema::hasTable('attachments')) {
Schema::create(
@@ -158,7 +158,7 @@ class CreateMainTables extends Migration
/**
*
*/
private function createBillsTable()
private function createBillsTable(): void
{
if (!Schema::hasTable('bills')) {
Schema::create(
@@ -190,7 +190,7 @@ class CreateMainTables extends Migration
/**
* @SuppressWarnings(PHPMD.ExcessiveMethodLength) // cannot be helped.
*/
private function createBudgetTables()
private function createBudgetTables(): void
{
if (!Schema::hasTable('budgets')) {
Schema::create(
@@ -241,7 +241,7 @@ class CreateMainTables extends Migration
/**
*
*/
private function createCategoriesTable()
private function createCategoriesTable(): void
{
if (!Schema::hasTable('categories')) {
Schema::create(
@@ -264,7 +264,7 @@ class CreateMainTables extends Migration
/**
*
*/
private function createExportJobsTable()
private function createExportJobsTable(): void
{
if (!Schema::hasTable('export_jobs')) {
Schema::create(
@@ -300,7 +300,7 @@ class CreateMainTables extends Migration
/**
*
*/
private function createPiggyBanksTable()
private function createPiggyBanksTable(): void
{
if (!Schema::hasTable('piggy_banks')) {
Schema::create(
@@ -341,7 +341,7 @@ class CreateMainTables extends Migration
/**
*
*/
private function createPreferencesTable()
private function createPreferencesTable(): void
{
if (!Schema::hasTable('preferences')) {
Schema::create(
@@ -362,7 +362,7 @@ class CreateMainTables extends Migration
/**
*
*/
private function createRoleTable()
private function createRoleTable(): void
{
if (!Schema::hasTable('role_user')) {
Schema::create(
@@ -384,7 +384,7 @@ class CreateMainTables extends Migration
* @SuppressWarnings(PHPMD.ExcessiveMethodLength) // cannot be helped.
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // its exactly five
*/
private function createRuleTables()
private function createRuleTables(): void
{
if (!Schema::hasTable('rule_groups')) {
Schema::create(
@@ -472,7 +472,7 @@ class CreateMainTables extends Migration
/**
*
*/
private function createTagsTable()
private function createTagsTable(): void
{
if (!Schema::hasTable('tags')) {
Schema::create(
@@ -503,7 +503,7 @@ class CreateMainTables extends Migration
* @SuppressWarnings(PHPMD.NPathComplexity) // cannot be helped
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // its exactly five
*/
private function createTransactionTables()
private function createTransactionTables(): void
{
if (!Schema::hasTable('transaction_journals')) {
Schema::create(

View File

@@ -31,8 +31,14 @@ class ChangesFor3101 extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::table(
'import_jobs',
function (Blueprint $table) {
$table->dropColumn('extended_status');
}
);
}
/**
@@ -40,7 +46,7 @@ class ChangesFor3101 extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
Schema::table(
'import_jobs',

View File

@@ -31,7 +31,7 @@ class FixNullables extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
}
@@ -40,7 +40,7 @@ class FixNullables extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
Schema::table(
'rule_groups',

View File

@@ -31,8 +31,14 @@ class ExpandTransactionsTable extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::table(
'transactions',
function (Blueprint $table) {
$table->dropColumn('identifier');
}
);
}
/**
@@ -40,7 +46,7 @@ class ExpandTransactionsTable extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
Schema::table(
'transactions',

View File

@@ -31,7 +31,7 @@ class ChangesForV410 extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::dropIfExists('notes');
}
@@ -41,7 +41,7 @@ class ChangesForV410 extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
Schema::create(
'notes',

View File

@@ -31,8 +31,14 @@ class ChangesForV420 extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::table(
'journal_meta',
function (Blueprint $table) {
$table->dropSoftDeletes();
}
);
}
/**
@@ -40,7 +46,7 @@ class ChangesForV420 extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
Schema::table(
'journal_meta',

View File

@@ -31,7 +31,7 @@ class ChangesForV430 extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::dropIfExists('available_budgets');
}
@@ -41,7 +41,7 @@ class ChangesForV430 extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
Schema::create(
'available_budgets',

View File

@@ -31,7 +31,7 @@ class ChangesForV431 extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
// reinstate "repeats" and "repeat_freq".
Schema::table(
@@ -47,6 +47,14 @@ class ChangesForV431 extends Migration
}
);
// change field "start_date" to "startdate"
Schema::table(
'budget_limits',
function (Blueprint $table) {
$table->renameColumn('start_date', 'startdate');
}
);
// remove date field "end_date"
Schema::table(
'budget_limits',
@@ -54,6 +62,13 @@ class ChangesForV431 extends Migration
$table->dropColumn('end_date');
}
);
// remove decimal places
Schema::table(
'transaction_currencies',
function (Blueprint $table) {
$table->dropColumn('decimal_places');
}
);
}
/**
@@ -61,7 +76,7 @@ class ChangesForV431 extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
// add decimal places to "transaction currencies".
Schema::table(

View File

@@ -31,11 +31,23 @@ class ChangesForV440 extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
if (Schema::hasTable('currency_exchange_rates')) {
Schema::drop('currency_exchange_rates');
}
Schema::table(
'transactions',
function (Blueprint $table) {
// cannot drop foreign keys in SQLite:
if ('sqlite' !== config('database.default')) {
$table->dropForeign('transactions_transaction_currency_id_foreign');
}
$table->dropColumn('transaction_currency_id');
}
);
}
/**
@@ -43,7 +55,7 @@ class ChangesForV440 extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
if (!Schema::hasTable('currency_exchange_rates')) {
Schema::create(

View File

@@ -31,8 +31,20 @@ class ChangesForV450 extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::table(
'transactions',
function (Blueprint $table) {
$table->dropColumn('foreign_amount');
// cannot drop foreign keys in SQLite:
if ('sqlite' !== config('database.default')) {
$table->dropForeign('transactions_foreign_currency_id_foreign');
}
$table->dropColumn('foreign_currency_id');
}
);
}
/**
@@ -40,7 +52,7 @@ class ChangesForV450 extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
// add "foreign_amount" to transactions
Schema::table(

View File

@@ -32,7 +32,7 @@ class ChangesForV470 extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::dropIfExists('journal_links');
Schema::dropIfExists('link_types');
@@ -43,7 +43,7 @@ class ChangesForV470 extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
if (!Schema::hasTable('link_types')) {
Schema::create(

View File

@@ -32,8 +32,14 @@ class ChangesForV470a extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::table(
'transactions',
function (Blueprint $table) {
$table->dropColumn('reconciled');
}
);
}
/**
@@ -41,7 +47,7 @@ class ChangesForV470a extends Migration
*
* @SuppressWarnings(PHPMD.ShortMethodName)
*/
public function up()
public function up(): void
{
Schema::table(
'transactions',

View File

@@ -34,7 +34,7 @@ class CreateOauthAuthCodesTable extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::drop('oauth_auth_codes');
}
@@ -42,7 +42,7 @@ class CreateOauthAuthCodesTable extends Migration
/**
* Run the migrations.
*/
public function up()
public function up(): void
{
Schema::create(
'oauth_auth_codes', function (Blueprint $table) {

View File

@@ -34,7 +34,7 @@ class CreateOauthAccessTokensTable extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::drop('oauth_access_tokens');
}
@@ -42,7 +42,7 @@ class CreateOauthAccessTokensTable extends Migration
/**
* Run the migrations.
*/
public function up()
public function up(): void
{
Schema::create(
'oauth_access_tokens', function (Blueprint $table) {

View File

@@ -34,7 +34,7 @@ class CreateOauthRefreshTokensTable extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::drop('oauth_refresh_tokens');
}
@@ -42,7 +42,7 @@ class CreateOauthRefreshTokensTable extends Migration
/**
* Run the migrations.
*/
public function up()
public function up(): void
{
Schema::create(
'oauth_refresh_tokens', function (Blueprint $table) {

View File

@@ -34,7 +34,7 @@ class CreateOauthClientsTable extends Migration
/**
* Reverse the migrations.
*/
public function down()
public function down(): void
{
Schema::drop('oauth_clients');
}
@@ -42,7 +42,7 @@ class CreateOauthClientsTable extends Migration
/**
* Run the migrations.
*/
public function up()
public function up(): void
{
Schema::create(
'oauth_clients', function (Blueprint $table) {

View File

@@ -37,6 +37,7 @@ class CreateOauthPersonalAccessClientsTable extends Migration
public function down(): void
{
Schema::drop('oauth_personal_access_clients');
}
/**

View File

@@ -37,7 +37,18 @@ class ChangesForV472 extends Migration
*/
public function down(): void
{
//
Schema::table(
'attachments',
function (Blueprint $table) {
$table->text('notes')->nullable();
}
);
Schema::table(
'budgets',
function (Blueprint $table) {
$table->dropColumn('order');
}
);
}
/**

View File

@@ -38,7 +38,25 @@ class ChangesForV473 extends Migration
*/
public function down(): void
{
Schema::table(
'bills',
function (Blueprint $table) {
// cannot drop foreign keys in SQLite:
if ('sqlite' !== config('database.default')) {
$table->dropForeign('bills_transaction_currency_id_foreign');
}
$table->dropColumn('transaction_currency_id');
}
);
Schema::table(
'rules',
function (Blueprint $table) {
$table->dropColumn('strict');
}
);
}
/**

View File

@@ -37,6 +37,23 @@ class ChangesForV474 extends Migration
*/
public function down(): void
{
Schema::table(
'import_jobs',
function (Blueprint $table) {
// cannot drop foreign keys in SQLite:
if ('sqlite' !== config('database.default')) {
$table->dropForeign('import_jobs_tag_id_foreign');
}
$table->dropColumn('provider');
$table->dropColumn('stage');
$table->dropColumn('transactions');
$table->dropColumn('errors');
$table->dropColumn('tag_id');
}
);
}
/**

View File

@@ -38,7 +38,17 @@ class ChangesForV477 extends Migration
*/
public function down(): void
{
//
Schema::table(
'budget_limits', function (Blueprint $table) {
// cannot drop foreign keys in SQLite:
if ('sqlite' !== config('database.default')) {
$table->dropForeign('budget_limits_transaction_currency_id_foreign');
}
$table->dropColumn(['transaction_currency_id']);
}
);
}
/**

View File

@@ -36,7 +36,11 @@ class ChangesForV479 extends Migration
*/
public function down()
{
//
Schema::table(
'transaction_currencies', function (Blueprint $table) {
$table->dropColumn(['enabled']);
}
);
}
/**

View File

@@ -0,0 +1,64 @@
<?php
/**
* 2019_03_11_223700_fix_ldap_configuration.php
* Copyright (c) 2019 https://github.com/wrouesnel
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Class FixLdapConfiguration
*/
class FixLdapConfiguration extends Migration
{
/**
* Reverse the migrations.
*
* @return void
*/
public function down(): void
{
Schema::table(
'users', function (Blueprint $table) {
$table->dropColumn(['objectguid']);
}
);
}
/**
* Run the migrations.
*
* @return void
*/
public function up(): void
{
/**
* ADLdap2 appears to require the ability to store an objectguid for LDAP users
* now. To support this, we add the column.
*/
Schema::table(
'users', function (Blueprint $table) {
$table->uuid('objectguid')->nullable()->after('id');
}
);
}
}

View File

@@ -32,7 +32,7 @@ class ConfigSeeder extends Seeder
/**
* Run the database seeds.
*/
public function run()
public function run(): void
{
$entry = Configuration::where('name', 'db_version')->first();
if (null === $entry) {

View File

@@ -39,8 +39,6 @@ function searchFailure() {
function presentSearchResults(data) {
$('.search_ongoing').hide();
$('p.search_count').show();
$('span.search_count').text(data.count);
$('.search_box').find('.overlay').remove();
$('.search_results').html(data.html).show();

View File

@@ -33,6 +33,7 @@ return [
'last_seven_days' => 'Letzte sieben Tage',
'last_thirty_days' => 'Letzte 30 Tage',
'welcomeBack' => 'Was ist gerade los?',
'welcome_back' => 'What\'s playing?',
'everything' => 'Alle',
'today' => 'Heute',
'customRange' => 'Individueller Bereich',
@@ -217,7 +218,27 @@ return [
// search
'search' => 'Suche',
'search_query' => 'Abfrage',
'search_found_transactions' => 'Anzahl der gefundenen Buchungen:',
'search_found_transactions' => 'Firefly III hat :count Buchung(en) in :time Sekunden gefunden.',
'search_for_query' => 'Firefly III sucht nach Buchungen mit folgenden Wörtern im Namen: <span class="text-info">:query</span>',
'search_modifier_amount_is' => 'Betrag ist genau :value',
'search_modifier_amount' => 'Betrag ist genau :value',
'search_modifier_amount_max' => 'Betrag ist höchstens :value',
'search_modifier_amount_min' => 'Betrag ist mindestens :value',
'search_modifier_amount_less' => 'Betrag ist kleiner als :value',
'search_modifier_amount_more' => 'Betrag ist größer als :value',
'search_modifier_source' => 'Quellkonto ist :value',
'search_modifier_destination' => 'Zielkonto ist :value',
'search_modifier_category' => 'Kategorie ist :value',
'search_modifier_budget' => 'Budget ist :value',
'search_modifier_bill' => 'Rechnung ist :value',
'search_modifier_type' => 'Buchungsart ist :value',
'search_modifier_date' => 'Buchungsdatum ist :value',
'search_modifier_date_before' => 'Buchungsdatum ist vor :value',
'search_modifier_date_after' => 'Buchungsdatum ist nach :value',
'search_modifier_on' => 'Buchungsdatum ist :value',
'search_modifier_before' => 'Buchungsdatum ist vor :value',
'search_modifier_after' => 'Buchungsdatum ist nach :value',
'modifiers_applies_are' => 'Die folgenden Einschränkungen werden ebenfalls auf die Suche angewendet:',
'general_search_error' => 'Bei der Suche ist ein Fehler aufgetreten. Bitte überprüfen Sie die Protokolldateien für weitere Informationen.',
'search_box' => 'Suche',
'search_box_intro' => 'Willkommen zur Suchfunktion von Firefly III. Geben Sie Ihre Suchanfrage in das Feld ein. Stellen Sie sicher, dass Sie sich die Hilfe ansehen, da die Suche ziemlich umfangreich ist.',
@@ -765,6 +786,7 @@ return [
'updated_account' => 'Konto „:name” aktualisiert',
'credit_card_options' => 'Kreditkartenoptionen',
'no_transactions_account' => 'Es liegen (in diesem Zeitraum) keine Buchungen für das Bestandskonto „:name” vor.',
'no_transactions_period' => 'Keine Buchungen (in diesem Zeitraum) vorhanden.',
'no_data_for_chart' => 'Es gibt derzeit (noch) nicht genügend Informationen, um dieses Diagramm zu generieren.',
'select_at_least_one_account' => 'Bitte mindestens ein Bestandskonto auswählen',
'select_at_least_one_category' => 'Bitte mindestens eine Kategorie auswählen',
@@ -878,7 +900,13 @@ return [
// home page:
'yourAccounts' => 'Deine Konten',
'your_accounts' => 'Kontenübersicht',
'category_overview' => 'Kategorieübersicht',
'expense_overview' => 'Übersicht der Aufwandskonten',
'revenue_overview' => 'Übersicht der Erlöskonten',
'budgetsAndSpending' => 'Budgets und Ausgaben',
'budgets_and_spending' => 'Budgets und Ausgaben',
'go_to_budget' => 'Zu Budget „{budget}” wechseln',
'savings' => 'Erspartes',
'newWithdrawal' => 'Neue Ausgabe',
'newDeposit' => 'Neue Einnahme',
@@ -896,7 +924,10 @@ return [
'searchPlaceholder' => 'Suchen...',
'version' => 'Version',
'dashboard' => 'Übersicht',
'available_budget' => 'Verfügbares Budget ({currency})',
'currencies' => 'Währungen',
'activity' => 'Aktivität',
'usage' => 'Verwendung',
'accounts' => 'Konten',
'Asset account' => 'Bestandskonto',
'Default account' => 'Bestandskonto',
@@ -919,6 +950,7 @@ return [
'tools' => 'Extras',
'piggyBanks' => 'Sparschweine',
'piggy_banks' => 'Sparschweine',
'amount_x_of_y' => '{current} von {total}',
'bills' => 'Rechnungen',
'withdrawal' => 'Ausgabe',
'opening_balance' => 'Eröffnungsbilanz',
@@ -1069,8 +1101,11 @@ return [
'period' => 'Zeitraum',
'balance' => 'Kontostand',
'sum' => 'Summe',
'summary' => 'Zusammenfasssung',
'average' => 'Durchschnitt',
'balanceFor' => 'Kontostand für „:name”',
'no_tags_for_cloud' => 'Keine Schlagwörter zum Erstellen der Wolke',
'tag_cloud' => 'Schlagwortwolke',
// piggy banks:
'add_money_to_piggy' => 'Geld zum Sparschwein „:name” übertragen',

View File

@@ -33,6 +33,7 @@ return [
'last_seven_days' => 'Last seven days',
'last_thirty_days' => 'Last thirty days',
'welcomeBack' => 'What\'s playing?',
'welcome_back' => 'What\'s playing?',
'everything' => 'Everything',
'today' => 'today',
'customRange' => 'Custom range',
@@ -217,7 +218,27 @@ return [
// search
'search' => 'Search',
'search_query' => 'Query',
'search_found_transactions' => 'Number of transactions found:',
'search_found_transactions' => 'Firefly III found :count transaction(s) in :time seconds.',
'search_for_query' => 'Firefly III is searching for transactions with all of these words in them: <span class="text-info">:query</span>',
'search_modifier_amount_is' => 'Amount is exactly :value',
'search_modifier_amount' => 'Amount is exactly :value',
'search_modifier_amount_max' => 'Amount is at most :value',
'search_modifier_amount_min' => 'Amount is at least :value',
'search_modifier_amount_less' => 'Amount is less than :value',
'search_modifier_amount_more' => 'Amount is more than :value',
'search_modifier_source' => 'Source account is :value',
'search_modifier_destination' => 'Destination account is :value',
'search_modifier_category' => 'Category is :value',
'search_modifier_budget' => 'Budget is :value',
'search_modifier_bill' => 'Bill is :value',
'search_modifier_type' => 'Transaction type is :value',
'search_modifier_date' => 'Transaction date is :value',
'search_modifier_date_before' => 'Transaction date is before :value',
'search_modifier_date_after' => 'Transaction date is after :value',
'search_modifier_on' => 'Transaction date is :value',
'search_modifier_before' => 'Transaction date is before :value',
'search_modifier_after' => 'Transaction date is after :value',
'modifiers_applies_are' => 'The following modifiers are applied to the search as well:',
'general_search_error' => 'An error occured while searching. Please check the log files for more information.',
'search_box' => 'Search',
'search_box_intro' => 'Welcome to the search function of Firefly III. Enter your search query in the box. Make sure you check out the help file because the search is pretty advanced.',
@@ -765,6 +786,7 @@ return [
'updated_account' => 'Updated account ":name"',
'credit_card_options' => 'Credit card options',
'no_transactions_account' => 'There are no transactions (in this period) for asset account ":name".',
'no_transactions_period' => 'There are no transactions (in this period).',
'no_data_for_chart' => 'There is not enough information (yet) to generate this chart.',
'select_at_least_one_account' => 'Please select at least one asset account',
'select_at_least_one_category' => 'Please select at least one category',
@@ -878,7 +900,13 @@ return [
// home page:
'yourAccounts' => 'Your accounts',
'your_accounts' => 'Your account overview',
'category_overview' => 'Category overview',
'expense_overview' => 'Expense account overview',
'revenue_overview' => 'Revenue account overview',
'budgetsAndSpending' => 'Budgets and spending',
'budgets_and_spending' => 'Budgets and spending',
'go_to_budget' => 'Go to budget "{budget}"',
'savings' => 'Savings',
'newWithdrawal' => 'New expense',
'newDeposit' => 'New deposit',
@@ -896,7 +924,10 @@ return [
'searchPlaceholder' => 'Search...',
'version' => 'Version',
'dashboard' => 'Dashboard',
'available_budget' => 'Available budget ({currency})',
'currencies' => 'Currencies',
'activity' => 'Activity',
'usage' => 'Usage',
'accounts' => 'Accounts',
'Asset account' => 'Asset account',
'Default account' => 'Asset account',
@@ -919,6 +950,7 @@ return [
'tools' => 'Tools',
'piggyBanks' => 'Piggy banks',
'piggy_banks' => 'Piggy banks',
'amount_x_of_y' => '{current} of {total}',
'bills' => 'Bills',
'withdrawal' => 'Withdrawal',
'opening_balance' => 'Opening balance',
@@ -1069,8 +1101,11 @@ return [
'period' => 'Period',
'balance' => 'Balance',
'sum' => 'Sum',
'summary' => 'Summary',
'average' => 'Average',
'balanceFor' => 'Balance for :name',
'no_tags_for_cloud' => 'No tags to generate cloud',
'tag_cloud' => 'Tag cloud',
// piggy banks:
'add_money_to_piggy' => 'Add money to piggy bank ":name"',

View File

@@ -36,7 +36,7 @@ return [
'newBill' => 'Nueva factura',
'edit_bill' => 'Editar factura ":name"',
'delete_bill' => 'Eliminar factura ":name"',
'reports' => 'Reportes',
'reports' => 'Informes',
'search_result' => 'Resultados de la búsqueda para ":query"',
'withdrawal_list' => 'Gastos',
'deposit_list' => 'Ganancia, ingresos y depósitos',

View File

@@ -28,5 +28,5 @@ return [
// bills:
'not_expected_period' => 'Período inesperado',
'not_or_not_yet' => 'No (o todavía no)',
'not_or_not_yet' => 'No (todavía)',
];

View File

@@ -26,17 +26,17 @@ return [
'html_language' => 'es',
'locale' => 'es, Spanish, es_ES.utf8, es_ES.UTF-8',
'month' => '%B %Y',
'month_and_day' => '%B %e, %Y',
'month_and_date_day' => '%A %B %e, %Y',
'month_and_day_no_year' => '%B %e',
'date_time' => '%B %e, %Y, @ %T',
'month_and_day' => '%e de %B %Y',
'month_and_date_day' => '%A %e de %B %Y',
'month_and_day_no_year' => '%e %B',
'date_time' => '%e de %B %Y a las %T',
'specific_day' => '%e %B %Y',
'week_in_year' => 'Semana %W, %Y',
'year' => '%Y',
'half_year' => '%B %Y',
'month_js' => 'MMMM YYYY',
'month_and_day_js' => 'MMMM Do, YYYY',
'date_time_js' => 'MMMM Do, YYYY, @ HH:mm:ss',
'month_and_day_js' => 'D MMM YYYY',
'date_time_js' => 'D MMMM YYYY, HH:mm:ss',
'specific_day_js' => 'D MMMM YYYY',
'week_in_year_js' => '[Week] w, YYYY',
'year_js' => 'YYYY',

View File

@@ -26,7 +26,7 @@ return [
'no_demo_text' => 'Lamentablemente no hay textos de ayuda para <abbr title=":route">esta página</abbr>.',
'see_help_icon' => 'Sin embargo, el icono <i class="fa fa-question-circle"></i> en la esquina superior derecha puede tener más información.',
'index' => '¡Bienvenido a <strong>Firefly III</strong>! En esta página tendrá una vista rápida de sus finanzas. Para más información, mire sus cuentas &rarr; <a href=":asset">Cuentas de activos</a> y, por supuesto, las páginas de <a href=":budgets">presupuestos</a> e <a href=":reports">Informes</a>. O simplemente investigue la aplicación por su cuenta.',
'accounts-index' => 'Asset accounts are your personal bank accounts. Expense accounts are the accounts you spend money at, such as stores and friends. Revenue accounts are accounts you receive money from, such as your job, the government or other sources of income. Liabilities are your debts and loans such as old credit card debts or student loans. On this page you can edit or remove them.',
'accounts-index' => 'Las cuentas de activos son tus cuentas bancarias personales. Las cuentas de gastos son las que gastas dinero, como tiendas y amigos. Las cuentas de ingresos son cuentas de las que recibes dinero, como tu trabajo, el gobierno u otras fuentes de ingresos. Los pasivos son tus deudas y préstamos como deudas de tarjetas de crédito antiguas o préstamos estudiantiles. En esta página puedes editarlas o eliminarlas.',
'budgets-index' => 'Esta página le muestra una visión general de sus presupuestos. La barra superior muestra la cantidad que está disponible para ser presupuestada. Esto se puede personalizar para cualquier período haciendo clic en la cantidad a la derecha. La cantidad que ha gastado hasta ahora se muestra en la barra de abajo. Debajo están los gastos por presupuesto y lo que ha presupuestado para ellos.',
'reports-index-start' => 'Firefly III da soporte a un buen numero de tipos de informes. Lea sobre ellos haciendo clic en el icono <i class="fa fa-question-circle"></i> en la esquina superior derecha.',
'reports-index-examples' => 'Asegúrese de revisar estos ejemplos: <a href=":one">un resumen financiero mensual</a>, <a href=":two">un resumen financiero anual</a> y <a href=":three">una vista general del presupuesto</a>.',
@@ -34,5 +34,5 @@ return [
'transactions-index' => 'Estos gastos, depósitos y transferencias no son particularmente imaginativos. Se han generado automáticamente.',
'piggy-banks-index' => 'Como puede ver, hay tres huchas. Utilice los botones más y menos para influir en la cantidad de dinero en cada hucha. Haga clic en el nombre de la hucha para ver la administración de cada una.',
'import-index' => 'Cualquier archivo CSV se puede importar en Firefly III. También soporta la importación de datos desde bunq y Spectre. Otros bancos y agregadores financieros se implementarán en el futuro. Sin embargo, como usuario de la demo, solo puede ver el "falso"-proveedor en acción. Generará algunas transacciones aleatorias para mostrarle cómo funciona el proceso.',
'profile-index' => 'Keep in mind that the demo site resets every four hours. Your access may be revoked at any time. This happens automatically and is not a bug.',
'profile-index' => 'Tenga en cuenta que el sitio de demostración se restablece cada cuatro horas. Su acceso puede ser revocado en cualquier momento. Esto ocurre automáticamente y no es un error.',
];

View File

@@ -29,10 +29,11 @@ return [
'edit' => 'Editar',
'delete' => 'Eliminar',
'split' => 'Separar',
'clone' => 'Clonar',
'clone' => 'Duplicar',
'last_seven_days' => 'Últimos siete días',
'last_thirty_days' => 'Últimos treinta días',
'welcomeBack' => '¿Qué está pasando?',
'welcome_back' => '¿Qué está pasando?',
'everything' => 'Todo',
'today' => 'hoy',
'customRange' => 'Rango personalizado',
@@ -41,7 +42,7 @@ return [
'cancel' => 'Cancelar',
'from' => 'Desde',
'to' => 'Hasta',
'structure' => 'Structure',
'structure' => 'Estructura',
'help_translating' => 'Este texto de ayuda no está disponible en tu idioma. <a href="https://crowdin.com/project/firefly-iii-help">¿Nos ayudaría a traducir?</a>',
'showEverything' => 'Mostrar todo',
'never' => 'Nunca',
@@ -59,7 +60,7 @@ return [
'go_to_bills' => 'Ir a tus cuentas',
'go_to_expense_accounts' => 'Ver tus cuentas de gastos',
'go_to_revenue_accounts' => 'Ver tus cuentas de ingresos',
'go_to_piggies' => 'Ir a tu alcancía',
'go_to_piggies' => 'Ir a tu hucha',
'new_deposit' => 'Nuevo depósito',
'new_transfer' => 'Nueva transferencia',
'new_transfers' => 'Nueva transferencia',
@@ -109,25 +110,25 @@ return [
'expenses_by_category' => 'Gastos por categoría',
'expenses_by_budget' => 'Gastos por presupuesto',
'income_by_category' => 'Ingresos por categoría',
'expenses_by_asset_account' => 'Gastos por cuenta de ingresos',
'expenses_by_expense_account' => 'Gastos por cuenta de egresos',
'cannot_redirect_to_account' => 'Firefly III no puede redirigirlo a la pagina correcta. Disculpas.',
'expenses_by_asset_account' => 'Gastos por cuenta de activos',
'expenses_by_expense_account' => 'Gastos por cuenta de gastos',
'cannot_redirect_to_account' => 'Firefly III no puede redirigirlo a la página correcta. Disculpas.',
'sum_of_expenses' => 'Total gastos',
'sum_of_income' => 'Total ingresos',
'liabilities' => 'Liabilities',
'liabilities' => 'Pasivos',
'spent_in_specific_budget' => 'Gastado en el presupuesto ":budget"',
'sum_of_expenses_in_budget' => 'Gastar todo en el presupuesto ":budget"',
'left_in_budget_limit' => 'Saldo para gastar acorde con el presupuesto',
'sum_of_expenses_in_budget' => 'Total gastado en el presupuesto ":budget"',
'left_in_budget_limit' => 'Saldo restante para gastar según presupuesto',
'current_period' => 'Período actual',
'show_the_current_period_and_overview' => 'Mostrar el período actual y el resumen',
'pref_languages_locale' => 'Para que un idioma distinto al inglés funcione correctamente, su sistema operativo debe disponer de la información regional correcta. Si no está disponible, los datos de divisas, fechas y cantidades pueden tener un formato incorrecto.',
'budget_in_period' => 'Todas las transacciones para presupuesto ":name"entre:start y :end',
'chart_budget_in_period' => 'Recuadro para todas las transacciones de presupuesto:name entre:start y:end',
'chart_account_in_period' => 'Recuadro para todas las transacciones de presupuesto ":name"entre :start y:end',
'chart_category_in_period' => 'Recuadro para todas las transacciones por categoria ":name"entre:start y :end',
'chart_category_all' => 'Recuadro para todas las transacciones por categoria ":name"',
'clone_withdrawal' => 'Clonar este retiro',
'clone_deposit' => 'Clonar este deposito',
'budget_in_period' => 'Todas las transacciones del presupuesto ":name" entre :start y :end',
'chart_budget_in_period' => 'Gráfico para las transacciones del presupuesto ":name" entre :start y :end',
'chart_account_in_period' => 'Gráfico para las transacciones de la cuenta ":name" entre :start y :end',
'chart_category_in_period' => 'Gráfico para las transacciones de la categoría ":name" entre :start y :end',
'chart_category_all' => 'Gráfico para las transacciones de la categoría ":name"',
'clone_withdrawal' => 'Duplicar este retiro',
'clone_deposit' => 'Duplicar este depósito',
'clone_transfer' => 'Duplicar esta transferencia',
'multi_select_no_selection' => 'Ninguno seleccionado',
'multi_select_select_all' => 'Seleccionar todo',
@@ -137,7 +138,7 @@ return [
'intro_next_label' => 'Siguiente',
'intro_prev_label' => 'Anterior',
'intro_skip_label' => 'Saltar',
'intro_done_label' => 'Listo',
'intro_done_label' => 'Hecho',
'between_dates_breadcrumb' => 'Entre :start y :end',
'all_journals_without_budget' => 'Todas las transacciones sin presupuesto',
'journals_without_budget' => 'Transacciones sin un presupuesto',
@@ -151,7 +152,7 @@ return [
'all_transactions' => 'Todas las transacciones',
'title_withdrawal_between' => 'Todos los gastos entre :start y :end',
'all_deposit' => 'Todos los ingresos',
'title_deposit_between' => 'Toda ganancia entre :start y :end',
'title_deposit_between' => 'Todos los ingresos entre :start y :end',
'all_transfers' => 'Todas las transferencias',
'title_transfers_between' => 'Todas las transferencias entre :start y :end',
'all_transfer' => 'Todas las transferencias',
@@ -178,11 +179,11 @@ return [
'button_reset_password' => 'Reestablecer contraseña',
'reset_button' => 'Restablecer',
'want_to_login' => 'Quiero entrar al sistema',
'login_page_title' => 'Login to Firefly III',
'register_page_title' => 'Register at Firefly III',
'forgot_pw_page_title' => 'Forgot your password for Firefly III',
'reset_pw_page_title' => 'Reset your password for Firefly III',
'cannot_reset_demo_user' => 'You cannot reset the password of the demo user.',
'login_page_title' => 'Iniciar sesión en Firefly III',
'register_page_title' => 'Registrarse en Firefly III',
'forgot_pw_page_title' => 'Olvidó su contraseña para Firefly III',
'reset_pw_page_title' => 'Restablecer contraseña para Firefly III',
'cannot_reset_demo_user' => 'No puedes restablecer la contraseña del usuario demo.',
'button_register' => 'Registrarse',
'authorization' => 'Autorización',
'active_bills_only' => 'sólo facturas activas',
@@ -217,7 +218,27 @@ return [
// search
'search' => 'Buscar',
'search_query' => 'Consulta',
'search_found_transactions' => 'Transacciones encontradas:',
'search_found_transactions' => 'Firefly III encontró :count transacción(es) en :time segundos.',
'search_for_query' => 'Firefly III está buscando transacciones que contengan todas estas palabras: <span class="text-info">:query</span>',
'search_modifier_amount_is' => 'Cantidad es exactamente :value',
'search_modifier_amount' => 'Cantidad es exactamente :value',
'search_modifier_amount_max' => 'Cantidad máxima :value',
'search_modifier_amount_min' => 'Cantidad mínima :value',
'search_modifier_amount_less' => 'Cantidad menor que :value',
'search_modifier_amount_more' => 'Cantidad es más de :value',
'search_modifier_source' => 'Cuenta de origen es :value',
'search_modifier_destination' => 'Cuenta de destino es :value',
'search_modifier_category' => 'Categoría es :value',
'search_modifier_budget' => 'Presupuesto es :value',
'search_modifier_bill' => 'Factura es :value',
'search_modifier_type' => 'Tipo de transacción es :value',
'search_modifier_date' => 'Fecha de transacción es :value',
'search_modifier_date_before' => 'Fecha de transacción es anterior a :value',
'search_modifier_date_after' => 'Fecha de transacción es posterior a :value',
'search_modifier_on' => 'Fecha de transacción es :value',
'search_modifier_before' => 'Fecha de transacción es anterior a :value',
'search_modifier_after' => 'Fecha de transacción es posterior a :value',
'modifiers_applies_are' => 'Los siguientes modificadores también se aplican a la búsqueda:',
'general_search_error' => 'Se ha producido un error durante la búsqueda. Por favor, compruebe los archivos de registro para obtener más información.',
'search_box' => 'Buscar',
'search_box_intro' => 'Bienvenido a la función de búsqueda de Firefly III. Introduce tu consulta de búsqueda en el cuadro. Asegúrate de revisar el archivo de ayuda porque el buscador es bastante avanzado.',
@@ -273,7 +294,7 @@ return [
'rule_priority_up' => 'Dar una regla mas prioritaria',
'rule_priority_down' => 'Dar una regla menos prioritaria',
'make_new_rule_group' => 'Hacer un nuevo grupo de reglas',
'store_new_rule_group' => 'Almacenar nuevo grupo de reglas',
'store_new_rule_group' => 'Crear grupo de reglas',
'created_new_rule_group' => 'Nuevo grupo de reglas ":title" guardado!',
'updated_rule_group' => 'Grupo de reglas actualizado exitosamente ":title".',
'edit_rule_group' => 'Editar grupo de reglas ":title"',
@@ -294,7 +315,7 @@ return [
'rule_help_active' => 'Las reglas inactivas nunca se ejecutan.',
'stored_new_rule' => 'Guardar la nueva regla con titulo ":title"',
'deleted_rule' => 'Regla eliminada con titulo ":title"',
'store_new_rule' => 'Almacenar nueva regla',
'store_new_rule' => 'Crear regla',
'updated_rule' => 'Regla eliminada con titulo ":title"',
'default_rule_group_name' => 'Reglaspredeterminada',
'default_rule_group_description' => 'Todas las reglas que no pertenecen a ningún grupo.',
@@ -314,7 +335,7 @@ return [
'add_rule_action' => 'Añadir nueva acción',
'edit_rule' => 'Editar regla ":title"',
'delete_rule' => 'Eliminar regla ":title"',
'update_rule' => 'Regla de actualización',
'update_rule' => 'Actualizar regla',
'test_rule_triggers' => 'Ver transacciones que coinciden',
'warning_transaction_subset' => 'Por razones de actuación esta lista esta limitada a :max_num_transactions y puede solo mostrar un subconjunto de transacciones coincidentes',
'warning_no_matching_transactions' => 'No se encontraron transacciones que coinciden. por favor tome nota por motivos de rendimiento, solo el ultimo :num_transactions transacciones han sido chequeadas.',
@@ -355,7 +376,7 @@ return [
'rule_trigger_amount_exactly_choice' => 'Cantidad es..',
'rule_trigger_amount_exactly' => 'Cantidad es :trigger_value',
'rule_trigger_amount_more_choice' => 'Cantidad es mas de..',
'rule_trigger_amount_more' => 'El monto es mas que :trigger_value',
'rule_trigger_amount_more' => 'Cantidad es más de :trigger_value',
'rule_trigger_description_starts_choice' => 'Descripción comienza con..',
'rule_trigger_description_starts' => 'La descripción comienza con ":trigger_value"',
'rule_trigger_description_ends_choice' => 'Descripción termina con..',
@@ -451,7 +472,7 @@ return [
'new_rule_for_bill_description' => 'Esta regla marca las transacciones para la cuenta ":name".',
// tags
'store_new_tag' => 'Almacenar nueva etiqueta',
'store_new_tag' => 'Crear etiqueta',
'update_tag' => 'Actualizar etiqueta',
'no_location_set' => 'Ubicación no establecida.',
'meta_data' => 'Meta Datos',
@@ -459,7 +480,7 @@ return [
'without_date' => 'Sin fecha',
'result' => 'Resultado',
'sums_apply_to_range' => 'Todas las sumas aplican al rango seleccionado',
'mapbox_api_key' => 'To use map, get an API key from <a href="https://www.mapbox.com/">Mapbox</a>. Open your <code>.env</code> file and enter this code after <code>MAPBOX_API_KEY=</code>.',
'mapbox_api_key' => 'Para usar el mapa, obtenga una clave API de <a href="https://www.mapbox.com/">Mapbox</a>Abra su<code>.env</code> y introduzca este código después de <code>MAPBOX_API_KEY=</code>.',
'press_tag_location' => 'Haga clic o pulse de forma prolongada para definir la ubicación de la etiqueta.',
'clear_location' => 'Eliminar ubicación',
@@ -541,13 +562,13 @@ return [
'invalid_password' => 'Contraseña invalida!',
'what_is_pw_security' => '¿Que es "verificar la seguridad de contraseña?',
'secure_pw_title' => 'Como escoger una contraseña segura',
'secure_pw_history' => 'Not a week goes by that you read in the news about a site losing the passwords of its users. Hackers and thieves use these passwords to try to steal your private information. This information is valuable.',
'secure_pw_ff' => 'Do you use the same password all over the internet? If one site loses your password, hackers have access to all your data. Firefly III relies on you to choose a strong and unique password to protect your financial records.',
'secure_pw_check_box' => 'To help you do that Firefly III can check if the password you want to use has been stolen in the past. If this is the case, Firefly III advises you NOT to use that password.',
'secure_pw_working_title' => 'How does it work?',
'secure_pw_working' => 'By checking the box, Firefly III will send the first five characters of the SHA1 hash of your password to <a href="https://www.troyhunt.com/introducing-306-million-freely-downloadable-pwned-passwords/">the website of Troy Hunt</a> to see if it is on the list. This will stop you from using unsafe passwords as is recommended in the latest <a href="https://pages.nist.gov/800-63-3/sp800-63b.html">NIST Special Publication</a> on this subject.',
'secure_pw_history' => 'Cada semana leemos en las noticias sobre un sitio que pierde las contraseñas de sus usuarios. Hackers y ladrones utilizan estas contraseñas para intentar robar tu información privada. Esta información es valiosa.',
'secure_pw_ff' => '¿Utiliza la misma contraseña a través de Internet? Si un sitio pierde su contraseña, los hackers tienen acceso a todos sus datos. Firefly III depende de usted para elegir una contraseña fuerte y única para proteger sus registros financieros.',
'secure_pw_check_box' => 'Para ayudarte a hacer eso Firefly III puede comprobar si la contraseña que quieres usar ha sido robada en el pasado. Si este es el caso, Firefly III te aconseja NO usar esa contraseña.',
'secure_pw_working_title' => '¿Cómo funciona?',
'secure_pw_working' => 'Marcando la casilla, Firefly III enviará los cinco primeros caracteres del hash SHA1 de su contraseña al <a href="https://www.troyhunt.com/introducing-306-million-freely-downloadable-pwned-passwords/">sitio web de Troy Hunt</a> para ver si esta en la lista. Esto le impedirá a usted usar contraseñas inseguras como se recomienda en la última <a href="https://pages.nist.gov/800-63-3/sp800-63b.html">Publicación Especial de NISH</a> sobre este tema.',
'secure_pw_should' => '¿Debo chequear la casilla?',
'secure_pw_long_password' => 'Yes. Always verify your password is safe.',
'secure_pw_long_password' => 'Sí. Verificar siempre que su contraseña es segura.',
'command_line_token' => 'Token de linea de comando',
'explain_command_line_token' => 'Necesita este token para realizar opciones de línea de comando, como importar o exportar datos. Sin él, dichos comandos confidenciales no funcionarán. No compartas tu token de línea de comando. Nadie te lo pedirá, ni siquiera a nosotros. Si crees que lo has perdido, o si estás paranoico, regenera tu token pulsando el botón.',
'regenerate_command_line_token' => 'Regenerar token de línea de comando',
@@ -557,8 +578,8 @@ return [
'email_changed_logout' => 'Hasta que usted verifique su dirección de correo electrónico, usted no puede iniciar sesión.',
'login_with_new_email' => 'Usted puede ahora iniciar sesión con su nueva dirección de correo electrónico.',
'login_with_old_email' => 'Usted puede ahora iniciar sesión con su vieja dirección de correo electrónico otra vez.',
'login_provider_local_only' => 'This action is not available when authenticating through ":login_provider".',
'delete_local_info_only' => 'Because you authenticate through ":login_provider", this will only delete local Firefly III information.',
'login_provider_local_only' => 'Esta acción no está disponible cuando se identifica a través de ":login_provider".',
'delete_local_info_only' => 'Debido a que se identificado a través de ":login_provider", sólo se eliminará la información local de Firefly III.',
// attachments
'nr_of_attachments' => 'Un archivo adjunto:count archivos adjuntos',
@@ -626,25 +647,25 @@ return [
// currencies:
'create_currency' => 'Crear nueva moneda',
'store_currency' => 'Almacenar nueva moneda',
'store_currency' => 'Crear moneda',
'update_currency' => 'Actualizar moneda',
'new_default_currency' => ':name es ahora moneda por defecto.',
'cannot_delete_currency' => 'No puede eliminar :name porque todavía esta en uso.',
'cannot_disable_currency' => 'Cannot disable :name because it is still in use.',
'cannot_disable_currency' => 'No se puede desactivar :name porque todavía está en uso.',
'deleted_currency' => 'Moneda :name eliminada',
'created_currency' => 'Moneda :name creada',
'could_not_store_currency' => 'No se puede almacenar la nueva moneda.',
'could_not_store_currency' => 'No se puede crear la nueva moneda.',
'updated_currency' => 'Moneda :name actualizada',
'ask_site_owner' => 'Por favor pregunte :owner por agregar,elimine o edite monedas.',
'currencies_intro' => 'Firefly III respalda varias monedas que usted puede establecer y habilitar aquí.',
'make_default_currency' => 'Make default',
'default_currency' => 'en mora',
'currency_is_disabled' => 'Disabled',
'enable_currency' => 'Enable',
'disable_currency' => 'Disable',
'currencies_default_disabled' => 'Most of these currencies are disabled by default. To use them, you must enable them first.',
'currency_is_now_enabled' => 'Currency ":name" has been enabled',
'currency_is_now_disabled' => 'Currency ":name" has been disabled',
'make_default_currency' => 'Establecer por defecto',
'default_currency' => 'por defecto',
'currency_is_disabled' => 'Deshabilitado',
'enable_currency' => 'Activar',
'disable_currency' => 'Desactivar',
'currencies_default_disabled' => 'La mayoría de estas monedas están desactivadas por defecto. Para usarlas, debes activarlas primero.',
'currency_is_now_enabled' => 'Moneda ":name" ha sido activada',
'currency_is_now_disabled' => 'Moneda ":name" ha sido desactivada',
// forms:
'mandatoryFields' => 'Campos obligatorios',
@@ -654,7 +675,7 @@ return [
// budgets:
'create_new_budget' => 'Crear un nuevo presupuesto',
'store_new_budget' => 'Almacene el nuevo presupuesto',
'stored_new_budget' => 'Almacenar el nuevo presupuesto ":name"',
'stored_new_budget' => 'Presupuesto ":name" creado',
'available_between' => 'Disponible entre :start y :end',
'transactionsWithoutBudget' => 'Gastos sin presupuesto',
'transactions_no_budget' => 'Gastos sin presupuesto entre :start y :end',
@@ -666,12 +687,12 @@ return [
'deleted_budget' => 'Presupuesto eliminado ":name"',
'edit_budget' => 'Editar presupuesto ":name"',
'updated_budget' => 'Presupuesto actualizado ":name"',
'update_amount' => 'Actualizar monto',
'update_amount' => 'Actualizar cantidad',
'update_budget' => 'Actualizar presupuesto',
'update_budget_amount_range' => 'Cantidad disponible (esperada) actualizada entre :start y :end',
'budget_period_navigator' => 'Periodo navegador',
'info_on_available_amount' => '¿ que tengo disponible?',
'available_amount_indication' => 'Use estos montos para obtener una indicación de cual podría ser el presupuesto total.',
'available_amount_indication' => 'Utilice estas cantidades para obtener una indicación de lo que podría ser su presupuesto total.',
'suggested' => 'Sugerido',
'average_between' => 'Promedio entre :start y :end',
'over_budget_warn' => '<i class="fa fa-money"></i> Normalmente usas de tu presupuesto, cerca de :amount por día. Se trata de :over_amount por día.',
@@ -691,12 +712,12 @@ return [
'rescan_old' => 'Ejecutar las reglas de nuevo, en todas las transacciones',
'update_bill' => 'Actualizar factura',
'updated_bill' => 'Actualizar factura ":name"',
'store_new_bill' => 'Almacenar nueva factura',
'stored_new_bill' => 'Almacenar nueva factura ":name"',
'store_new_bill' => 'Crear factura',
'stored_new_bill' => 'Factura ":name" creada',
'cannot_scan_inactive_bill' => 'Las facturas inactivas no pueden ser escaneadas.',
'rescanned_bill' => 'Se reescaneó todo y se linkearon :total transaccion(es) a la cuenta.',
'average_bill_amount_year' => 'Monto promedio de la factura (:year)',
'average_bill_amount_overall' => 'Monto promedio de la factura (sobretodo)',
'average_bill_amount_year' => 'Cantidad media de la factura (:year)',
'average_bill_amount_overall' => 'Cantidad media de las facturas (total)',
'bill_is_active' => 'Bill esta activo',
'bill_expected_between' => 'Esperado entre :start y :end',
'bill_will_automatch' => 'Bill se vinculara automáticamente a transacciones coincidentes',
@@ -710,9 +731,9 @@ return [
'details_for_expense' => 'Detalles para la cuenta de gastos ":name"',
'details_for_revenue' => 'Detalles para la cuenta de ingresos ":name"',
'details_for_cash' => 'Detalle para la cuenta de efectivo ":name"',
'store_new_asset_account' => 'Almacenar nueva cuenta de activos',
'store_new_expense_account' => 'Almacenar cuenta nueva de gastos',
'store_new_revenue_account' => 'Almacenar cuenta nueva de ingresos',
'store_new_asset_account' => 'Crear cuenta de activos',
'store_new_expense_account' => 'Crear cuenta de gastos',
'store_new_revenue_account' => 'Crear cuenta de ingresos',
'edit_asset_account' => 'Editar cuenta de activos ":name"',
'edit_expense_account' => 'Editar cuenta de gastos ":name"',
'edit_revenue_account' => 'Editar cuenta de ganancias ":name"',
@@ -741,7 +762,7 @@ return [
'overview_of_reconcile_modal' => 'Resumen de reconciliación',
'delete_reconciliation' => 'Eliminar reconciliacion',
'update_reconciliation' => 'Actualizar reconciliacion',
'amount_cannot_be_zero' => 'El monto no puede ser cero',
'amount_cannot_be_zero' => 'La cantidad no puede ser cero',
'end_of_reconcile_period' => 'Fin del periodo de reconciliacion::period',
'start_of_reconcile_period' => 'Inicio de periodo de reconciliación::period',
'start_balance' => 'Balance inicial',
@@ -765,12 +786,13 @@ return [
'updated_account' => 'Cuenta actualizada ":name"',
'credit_card_options' => 'Opciones de tarjeta de crédito',
'no_transactions_account' => 'No hay transacciones ( en este periodo) para cuenta de activos ":name".',
'no_transactions_period' => 'No hay transacciones (en este período).',
'no_data_for_chart' => 'No hay suficiente información (todavía) para generar este gráfico.',
'select_at_least_one_account' => 'Please select at least one asset account',
'select_at_least_one_category' => 'Please select at least one category',
'select_at_least_one_budget' => 'Please select at least one budget',
'select_at_least_one_tag' => 'Please select at least one tag',
'select_at_least_one_expense' => 'Please select at least one combination of expense/revenue accounts. If you have none (the list is empty) this report is not available.',
'select_at_least_one_account' => 'Por favor, seleccione al menos una cuenta',
'select_at_least_one_category' => 'Por favor, seleccione al menos una categoría',
'select_at_least_one_budget' => 'Por favor, seleccione al menos un presupuesto',
'select_at_least_one_tag' => 'Por favor, seleccione al menos una etiqueta',
'select_at_least_one_expense' => 'Por favor, seleccione al menos una combinación de cuentas de gastos/ingresos. Si no tiene ninguna (la lista está vacía) este informe no está disponible.',
'account_default_currency' => 'Esta será la moneda por defecto asociada a esta cuenta.',
'reconcile_has_more' => 'Su libro principal de Firefly III tiene mas dinero de lo que su banco afirma debería tener, Hay varias opciones. por favor elija que hacer. luego, presione "confirmar reconciliación".',
'reconcile_has_less' => 'Su libro principal de Firefly III tiene menos dinero de el que su banco dice que usted debería tener. hay varias opciones. Por favor elija que hacer, luego presione " Confirmar reconciliación".',
@@ -793,7 +815,7 @@ return [
'interest_calc_daily' => 'Por dia',
'interest_calc_monthly' => 'Por mes',
'interest_calc_yearly' => 'Por año',
'initial_balance_account' => 'Initial balance account of :name',
'initial_balance_account' => 'Balance inicial de la cuenta :name',
// categories:
'new_category' => 'Nueva categoría',
@@ -832,7 +854,7 @@ return [
'reconcile_selected' => 'Reconciliar',
'mass_delete_journals' => 'Eliminar un numero de transacciones',
'mass_edit_journals' => 'Editar un numero de transacciones',
'mass_bulk_journals' => 'Bulk editar un numero de transacciones',
'mass_bulk_journals' => 'Editar múltiples transacciones',
'mass_bulk_journals_explain' => 'Si usted no desea cambiar sus transacciones a una mediante la función de edición masiva, usted puede actualizarlas de una sola vez. simplemente seleccione la categoría, las etiquetas o el presupuesto preferidos en los campos de abajo, y todas las transacciones de la tabla se actualizaran.',
'bulk_set_new_values' => 'Use las entradas abajo para establecer nuevos valores. Si usted los deja vacíos, serán vacíos para todos. también, tenga en cuenta que solo los retiros tendrán un presupuesto.',
'no_bulk_category' => 'No actualizar la categoria',
@@ -847,7 +869,7 @@ return [
'mass_edited_transactions_success' => 'Actualizado :amount transacción (es)',
'opt_group_' => '(Sin tipo de cuenta)',
'opt_group_no_account_type' => '(Sin tipo de cuenta)',
'opt_group_defaultAsset' => 'Cuenta de ingresos por mora',
'opt_group_defaultAsset' => 'Cuentas de activos por defecto',
'opt_group_savingAsset' => 'Cuenta de ahorros',
'opt_group_sharedAsset' => 'Cuenta de activos compartidas',
'opt_group_ccAsset' => 'Tarjetas de credito',
@@ -858,8 +880,8 @@ return [
'opt_group_l_Credit card' => 'Pasivo: Tarjeta de crédito',
'notes' => 'Notas',
'unknown_journal_error' => 'No se pudo guardar la transacción. Por favor, revise los archivos de registro.',
'attachment_not_found' => 'This attachment could not be found.',
'journal_link_bill' => 'This transaction is linked to bill <a href=":route">:name</a>. To remove the connection, uncheck the checkbox. Use rules to connect it to another bill.',
'attachment_not_found' => 'No se pudo encontrar este adjunto.',
'journal_link_bill' => 'Esta transacción está vinculada a la factura <a href=":route">:name</a>. Para eliminar la conexión, desmarca la casilla de verificación. Usa reglas para conectarla a otra factura.',
// new user:
'welcome' => 'Bienvenido a Firefly III!',
@@ -867,9 +889,8 @@ return [
'submit_yes_really' => 'Enviar (Se lo que estoy haciendo)',
'getting_started' => 'Comenzando',
'to_get_started' => 'Es bueno ver que usted ha instalado con éxito Firefly III. Para comenzar con esta regla, por favor ingrese el nombre de su banco y el saldo de su cuenta de cheques principal. No se preocupe todavía si tiene varias cuentas. usted puede agregarlas luego. Es solo que Firefly III necesita algo para empezar.',
'savings_balance_text' => 'Firefly II creara automáticamente una cuenta de ahorros para usted. Por
defecto. No abra dinero en su cuenta de ahorros. pero si le dice a Firefly III el saldo se almacenara como tal.',
'finish_up_new_user' => 'Eso es! Usted puede continuar presionando<strong Enviar</strong>. Usted sera llevado al indice de Firefly III.',
'savings_balance_text' => 'Firefly II creará automáticamente una cuenta de ahorros. Por defecto, no habrá dinero en su cuenta de ahorros, pero si le dice a Firefly III el saldo se almacenará como tal.',
'finish_up_new_user' => '¡Eso es! Puedes continuar presionando <strong>Enviar</strong>. Será llevado al inicio de Firefly III.',
'stored_new_accounts_new_user' => 'Hurra! Sus nuevas cuentas han sido almacenadas.',
'set_preferred_language' => 'Si prefiere usar Firefly II en otro lenguaje, por favor indíquelo aquí.',
'language' => 'Idioma',
@@ -879,7 +900,13 @@ return [
// home page:
'yourAccounts' => 'Tus cuentas',
'your_accounts' => 'Resumen de su cuenta',
'category_overview' => 'Resumen de categorías',
'expense_overview' => 'Resumen de la cuenta de gastos',
'revenue_overview' => 'Resumen de la cuenta de ingresos',
'budgetsAndSpending' => 'Presupuestos y gastos',
'budgets_and_spending' => 'Presupuestos y gastos',
'go_to_budget' => 'Ir al presupuesto "{budget}"',
'savings' => 'Ahorros',
'newWithdrawal' => 'Nuevo gasto',
'newDeposit' => 'Nuevo deposito',
@@ -897,7 +924,10 @@ return [
'searchPlaceholder' => 'Buscar...',
'version' => 'Versión',
'dashboard' => 'Panel de control',
'available_budget' => 'Presupuesto disponible ({currency})',
'currencies' => 'Divisas',
'activity' => 'Actividad',
'usage' => 'Uso',
'accounts' => 'Cuentas',
'Asset account' => 'Cuenta de activos',
'Default account' => 'Cuenta de activos',
@@ -916,10 +946,11 @@ return [
'income' => 'Ingresos / salarios',
'transfers' => 'Transferencias',
'moneyManagement' => 'Gestión del dinero',
'money_management' => 'Money management',
'tools' => 'Tools',
'money_management' => 'Gestión del dinero',
'tools' => 'Herramientas',
'piggyBanks' => 'Huchas',
'piggy_banks' => 'Piggy banks',
'piggy_banks' => 'Huchas',
'amount_x_of_y' => '{current} de {total}',
'bills' => 'Facturas',
'withdrawal' => 'Retiro',
'opening_balance' => 'Saldo inicial',
@@ -943,8 +974,8 @@ return [
'debt_start_date' => 'Fecha de inicio de deuda',
'debt_start_amount' => 'Cantidad inicial de la deuda',
'debt_start_amount_help' => 'Introduce la cantidad original de este pasivo como un número positivo. También puede ingresar la cantidad actual. Asegúrese de editar la fecha de abajo para que coincida.',
'store_new_liabilities_account' => 'Store new liability',
'edit_liabilities_account' => 'Edit liability ":name"',
'store_new_liabilities_account' => 'Crear nuevo pasivo',
'edit_liabilities_account' => 'Editar pasivo ":name"',
// reports:
'report_default' => 'Reporte financiero por defecto entre :start y :end',
@@ -954,11 +985,11 @@ return [
'report_budget' => 'Reporte de presupuesto entre :start y :end',
'report_tag' => 'Reporte de etiqueta entre :start y :end',
'quick_link_reports' => 'Enlaces rápidos',
'quick_link_examples' => 'These are just some example links to get you started. Check out the help pages under the (?)-button for information on all reports and the magic words you can use.',
'quick_link_examples' => 'Estos son sólo algunos enlaces de ejemplo para empezar. Echa un vistazo a las páginas de ayuda bajo el botón (?)-para obtener información sobre todos los informes y las palabras mágicas que puedes usar.',
'quick_link_default_report' => 'Reporte financiero por defecto',
'quick_link_audit_report' => 'Resumen del historial de transacciones',
'report_this_month_quick' => 'Mes en curso, todas las cuentas',
'report_last_month_quick' => 'Last month, all accounts',
'report_last_month_quick' => 'Último mes, todas las cuentas',
'report_this_year_quick' => 'Año en curso, todas las cuentas',
'report_this_fiscal_year_quick' => 'Año fiscal en curso, todas las cuentas',
'report_all_time_quick' => 'Todo el tiempo, todas las cuentas',
@@ -982,7 +1013,7 @@ return [
'show_full_list' => 'Mostrar lista entera',
'show_only_top' => 'Mostrar solo tope :number',
'report_type' => 'Tipo de reporte',
'report_type_default' => 'Reporte financiero por mora',
'report_type_default' => 'Informe financiero predeterminado',
'report_type_audit' => 'Resumen del historial de transacciones (auditar)',
'report_type_category' => 'Reporte de categoría',
'report_type_budget' => 'Reporte de presupuesto',
@@ -1046,7 +1077,7 @@ return [
'select_expense_revenue' => 'Seleccione cuenta de gastos/ingresos',
'multi_currency_report_sum' => 'Como esta lista contiene cuentas con múltiples monedas, la(s) suma(s) que veas puede no tener sentido. El reporte siempre figurará en tu moneda predeterminada.',
'sum_in_default_currency' => 'La suma siempre estará en tu moneda predeterminada.',
'net_filtered_prefs' => 'This chart will never include accounts that have the "Include in net worth"-option unchecked.',
'net_filtered_prefs' => 'Este gráfico nunca incluirá cuentas que tengan la opción "Incluir en el valor neto" no marcada.',
// charts:
'chart' => 'Grafico',
@@ -1058,8 +1089,8 @@ return [
'earned' => 'Ganado',
'overspent' => 'Sobrepasadas',
'left' => 'Izquierda',
'max-amount' => 'Monto máximo',
'min-amount' => 'Monto minimo',
'max-amount' => 'Cantidad máxima',
'min-amount' => 'Cantidad mínima',
'journal-amount' => 'Entrada actual de factura',
'name' => 'Nombre',
'date' => 'Fecha',
@@ -1070,33 +1101,36 @@ return [
'period' => 'Período',
'balance' => 'Balance',
'sum' => 'Suma',
'summary' => 'Resumen',
'average' => 'Promedio',
'balanceFor' => 'Saldo por :name',
'no_tags_for_cloud' => 'No hay etiquetas para generar la nube',
'tag_cloud' => 'Nube de etiquetas',
// piggy banks:
'add_money_to_piggy' => 'Añadir dinero a la alcancía ":name"',
'piggy_bank' => 'Alcancía',
'new_piggy_bank' => 'Nueva alcancía',
'store_piggy_bank' => 'Archivar nueva alcancía',
'stored_piggy_bank' => 'Archivar nueva alcancía ":name"',
'add_money_to_piggy' => 'Añadir dinero a la hucha ":name"',
'piggy_bank' => 'Hucha',
'new_piggy_bank' => 'Nueva hucha',
'store_piggy_bank' => 'Crear hucha',
'stored_piggy_bank' => 'Crear hucha ":name"',
'account_status' => 'Estado de cuenta',
'left_for_piggy_banks' => 'Apartado para las huchas',
'sum_of_piggy_banks' => 'Total de huchas',
'saved_so_far' => 'Guardado hasta el momento',
'left_to_save' => 'Saldo para guardar',
'suggested_amount' => 'Sugerir monto mensual para guardar',
'add_money_to_piggy_title' => 'Añadir dinero a la alcancía ":name"',
'remove_money_from_piggy_title' => 'Quitar dinero de la alcancía ":name"',
'suggested_amount' => 'Cantidad mensual sugerida para ahorrar',
'add_money_to_piggy_title' => 'Añadir dinero a la hucha ":name"',
'remove_money_from_piggy_title' => 'Quitar dinero de la hucha ":name"',
'add' => 'Añadir',
'no_money_for_piggy' => 'Usted no tiene dinero para colocar en esta alcancía.',
'no_money_for_piggy' => 'Usted no tiene dinero para añadir a esta hucha.',
'suggested_savings_per_month' => 'Sugerido por mes',
'remove' => 'Eliminar',
'max_amount_add' => 'La cantidad máxima que usted puede agregar es',
'max_amount_remove' => 'La cantidad máxima que usted puede retirar es',
'update_piggy_button' => 'Actualizar alcancia',
'update_piggy_title' => 'Actualizar alcancía ":name"',
'updated_piggy_bank' => 'Actualizar alcancía ":name"',
'update_piggy_title' => 'Actualizar hucha ":name"',
'updated_piggy_bank' => 'Hucha ":name" actualizada',
'details' => 'Detalles',
'events' => 'Eventos',
'target_amount' => 'Cantidad objetivo',
@@ -1105,10 +1139,10 @@ return [
'target_date' => 'Fecha objetivo',
'no_target_date' => 'Sin fecha de objetivo',
'table' => 'Mesa',
'delete_piggy_bank' => 'Eliminar alcancía ":name"',
'delete_piggy_bank' => 'Eliminar hucha ":name"',
'cannot_add_amount_piggy' => 'No se pudo agregar :amount a ":name.".',
'cannot_remove_from_piggy' => 'No se pudo eliminar :amount de :name.',
'deleted_piggy_bank' => 'Eliminar alcancía ":name"',
'deleted_piggy_bank' => 'Hucha ":name" eliminada',
'added_amount_to_piggy' => 'Agregado :amount a ":name"',
'removed_amount_from_piggy' => 'Eliminado :amount de :name',
@@ -1122,7 +1156,7 @@ return [
'transaction_journal_information' => 'Información de transacción',
'transaction_journal_meta' => 'Información Meta',
'total_amount' => 'Monto total',
'total_amount' => 'Cantidad total',
'number_of_decimals' => 'Número de decimales',
// administration
@@ -1158,14 +1192,14 @@ return [
'delete_user' => 'Eliminar usuario :email',
'user_deleted' => 'El usuario ha sido eliminado',
'send_test_email' => 'Enviar mensaje de correo electrónico de prueba',
'send_test_email_text' => 'Para ver si su instalación es capaz de enviar correos electrónicos, presione este botón.Usted no vera un error aquí ( si hay)<strong>los archivos de registro reflejaran cualquier error </strong>. Usted puede presionar este botón tantas veces como lo desee. No hay control de spam. el mensaje sera enviado a <code>:email</code>y llegara en breve.',
'send_test_email_text' => 'Para ver si su instalación es capaz de enviar correos electrónicos, presione este botón. Usted no verá ningún error aquí (si los hubiera)<strong> los archivos de registro mostrarán cualquier error</strong>. Usted puede presionar este botón tantas veces como lo desee. No hay control de spam. El mensaje será enviado a <code>:email</code>y debería llegar en breve.',
'send_message' => 'Enviar mensaje',
'send_test_triggered' => 'La prueba fue disparada. Chequee su bandeja de entrada y archivos de registro.',
// links
'journal_link_configuration' => 'Configuración de enlaces de transacción',
'create_new_link_type' => 'Crear un nuevo tipo de enlace',
'store_new_link_type' => 'Almacenar nuevo tipo de enlace',
'store_new_link_type' => 'Crear tipo de enlace',
'update_link_type' => 'Actualizar tipo de enlace',
'edit_link_type' => 'Editar tipo de enlace ":name"',
'updated_link_type' => 'Actualizar tipo de enlace ":name"',
@@ -1178,8 +1212,8 @@ return [
'link_type_help_outward' => 'Ie."esta duplicado por"',
'save_connections_by_moving' => 'Guarde el enlace entre estas transacción (es) moviendolas a otro tipo de enlace:',
'do_not_save_connection' => '(no guarde la conexión)',
'link_transaction' => 'Transacción de enlace',
'link_to_other_transaction' => 'Enlace de transacción a otra transacción',
'link_transaction' => 'Enlazar transacción',
'link_to_other_transaction' => 'Enlazar esta transacción con otra',
'select_transaction_to_link' => 'Seleccione una transacción para enlazar esta transacción a',
'this_transaction' => 'Esta transacción',
'transaction' => 'Transaccion',
@@ -1206,7 +1240,7 @@ return [
'Reimbursement_name' => 'Reembolso',
'Related_name' => 'Relacionado',
'relates to_inward' => 'relacionado con',
'is (partially) refunded by_inward' => 'es (parcialmente) es devuelto por',
'is (partially) refunded by_inward' => 'es (parcialmente) devuelto por',
'is (partially) paid for by_inward' => 'es(parcialmente) pagado por',
'is (partially) reimbursed by_inward' => 'es(parcialmente) reembolsado por',
'inward_transaction' => 'Transacción interna',
@@ -1253,7 +1287,7 @@ return [
'no_accounts_imperative_revenue' => 'Las cuentas de ganancias se crean automáticamente cuando usted crea transacciones, pero usted puede crear una manualmente también, si usted quiere. vamos a crear una ahora:',
'no_accounts_create_revenue' => 'Crear una cuenta de ingresos',
'no_accounts_title_liabilities' => '¡Vamos a crear un pasivo!',
'no_accounts_intro_liabilities' => 'You have no liabilities yet. Liabilities are the accounts that register your (student) loans and other debts.',
'no_accounts_intro_liabilities' => 'Todavía no tienes pasivos. Los pasivos son las cuentas que registran sus préstamos y otras deudas.',
'no_accounts_imperative_liabilities' => 'No necesita usar esta función pero, puede ser muy útil si desea hacer un seguimiento de estas cosas.',
'no_accounts_create_liabilities' => 'Crear un pasivo',
'no_budgets_title_default' => 'Vamos a crear un presupuesto',
@@ -1280,10 +1314,10 @@ return [
'no_transactions_intro_transfers' => 'Usted no tiene transferencias aun. Cuando usted mueve dinero entre cuentas de activos, se registra como una transferencia.',
'no_transactions_imperative_transfers' => '¿Has movido algo de dinero? Entonces usted debería escribirlo:',
'no_transactions_create_transfers' => 'Crear una transferencia',
'no_piggies_title_default' => '¡Vamos a crear una alcancía!',
'no_piggies_intro_default' => 'Aún no tienes huchas. Puedes crear huchas para dividir tus ahorros y hacer un seguimiento de para qué estás ahorrando.',
'no_piggies_imperative_default' => '¿Usted tiene cosas para la cual usted esta ahorrando dinero? Cree una alcancía y haga seguimiento:',
'no_piggies_create_default' => 'Crear una nueva alcancía',
'no_piggies_title_default' => '¡Vamos a crear una hucha!',
'no_piggies_intro_default' => 'Aún no tienes huchas. Puedes crear huchas para dividir tus ahorros y hacer un seguimiento de lo que estés ahorrando.',
'no_piggies_imperative_default' => '¿Usted tiene cosas para las cuales está ahorrando dinero? Cree una hucha y haga su seguimiento:',
'no_piggies_create_default' => 'Crear una nueva hucha',
'no_bills_title_default' => '¡Vamos a crear una factura!',
'no_bills_intro_default' => 'Usted no tiene facturas aun. Usted puede crear facturas para hacer un seguimiento de los gastos regulares, como su alquiler o el seguro.',
'no_bills_imperative_default' => '¿Tienes facturas periódicas? Crea una factura y haz un seguimiento de tus pagos:',
@@ -1291,7 +1325,7 @@ return [
// recurring transactions
'recurrences' => 'Transacciones Recurrentes',
'recurring_calendar_view' => 'Calendar',
'recurring_calendar_view' => 'Calendario',
'no_recurring_title_default' => 'Vamos a crear una transacción recurrente!',
'no_recurring_intro_default' => 'Usted no tiene transacciones recurrentes aún. Puede usar esto para hacer que Firefly III cree transacciones por usted.',
'no_recurring_imperative_default' => 'Esta es una característica bastante avanzada pero, puede ser extremadamente útil. Asegúrese de haber leído la documentación (?- Icono en la esquina derecha) antes de continuar.',
@@ -1299,18 +1333,18 @@ return [
'make_new_recurring' => 'Crear una transacción recurrente',
'recurring_daily' => 'Diario',
'recurring_weekly' => 'Cada semana los :weekday',
'recurring_monthly' => 'Todos los meses el día: :dayOfMonth(st/nd/rd/th)',
'recurring_ndom' => 'Todos los meses el día: :dayOfMonth(st/nd/rd/th) :weekday',
'recurring_monthly' => 'Todos los meses, el :dayOfMonthº día',
'recurring_ndom' => 'Todos los meses, el :dayOfMonthº :weekday',
'recurring_yearly' => 'Cada año en :date',
'overview_for_recurrence' => 'Resumen de transacción recurrente ":title"',
'warning_duplicates_repetitions' => 'En algunas ocasiones, las fechas aparecen duplicadas en esta lista. Esto puede ocurrir porque múltiples repeticiones chocan. Firefly III siempre generará una transacción por día.',
'created_transactions' => 'Transacciones relacionadas',
'expected_withdrawals' => 'Expected withdrawals',
'expected_deposits' => 'Expected deposits',
'expected_transfers' => 'Expected transfers',
'created_withdrawals' => 'Created withdrawals',
'created_deposits' => 'Created deposits',
'created_transfers' => 'Created transfers',
'expected_withdrawals' => 'Extractos previstos',
'expected_deposits' => 'Ingresos previstos',
'expected_transfers' => 'Transferencias previstas',
'created_withdrawals' => 'Extractos creadas',
'created_deposits' => 'Depósitos creados',
'created_transfers' => 'Transferencias creadas',
'created_from_recurrence' => 'Creado a partir de transacción recurrente ":title" (#:id)',
'recurring_never_cron' => 'Al parecer, el cron job necesario para realizar las transacciones recurrentes nunca se ejecutó. Esto es normal por supuesto, cuando acabas de instalar Firefly III pero, es algo que deberías configurar lo antes posible. Por favor, revisa las páginas de ayuda usando el ícono-(?) en la esquina derecha de la página.',
'recurring_cron_long_ago' => 'Aparentemente han pasado mas de 36 horas desde que el cron job para dar soporte a las transacciones recurrentes se ha disparado por última vez. Está usted seguro que lo ha configurado correctamente? Por favor, revise las páginas de ayuda usando el ícono-(?) en la esquina derecha de la página.',
@@ -1335,7 +1369,7 @@ return [
'repeat_times' => 'Repetir un número de veces',
'recurring_skips_one' => 'Intercalado',
'recurring_skips_more' => 'Saltea :count ocurrencias',
'store_new_recurrence' => 'Almacenar transacción recurrente',
'store_new_recurrence' => 'Crear transacción recurrente',
'stored_new_recurrence' => 'Transacción recurrente ":title" almacenada con éxito.',
'edit_recurrence' => 'Editar transacción recurrente ":title"',
'recurring_repeats_until' => 'Repetir hasta :date',

View File

@@ -30,31 +30,31 @@ return [
'credit_card_limit' => 'Límite de la tarjeta de crédito',
'automatch' => 'Coinciden automáticamente',
'skip' => 'Saltar',
'enabled' => 'Enabled',
'enabled' => 'Habilitado',
'name' => 'Nombre',
'active' => 'Activo',
'amount_min' => 'Importe mínimo',
'amount_max' => 'Importe máximo',
'match' => 'Encuentros en',
'strict' => 'Strict mode',
'strict' => 'Modo estricto',
'repeat_freq' => 'Repetición',
'journal_currency_id' => 'Divisa',
'currency_id' => 'Divisa',
'transaction_currency_id' => 'Currency',
'external_ip' => 'Your server\'s external IP',
'transaction_currency_id' => 'Moneda',
'external_ip' => 'IP externa de su servidor',
'attachments' => 'Adjuntos',
'journal_amount' => 'Importe',
'journal_source_name' => 'Revenue account (source)',
'keep_bill_id' => 'Bill',
'journal_source_id' => 'Asset account (source)',
'journal_source_name' => 'Cuenta de ingresos (origen)',
'keep_bill_id' => 'Factura',
'journal_source_id' => 'Cuenta de activos (origen)',
'BIC' => 'BIC',
'verify_password' => 'Verificar la seguridad de contraseña',
'source_account' => 'Cuenta origen',
'destination_account' => 'Cuenta destino',
'journal_destination_id' => 'Asset account (destination)',
'asset_destination_account' => 'Destination account',
'include_net_worth' => 'Include in net worth',
'asset_source_account' => 'Source account',
'journal_destination_id' => 'Cuenta de activos (destino)',
'asset_destination_account' => 'Cuenta de destino',
'include_net_worth' => 'Incluir en valor neto',
'asset_source_account' => 'Cuenta de origen',
'journal_description' => 'Descripción',
'note' => 'Notas',
'split_journal' => 'Dividir esta transacción',
@@ -87,9 +87,9 @@ return [
'verification' => 'Verificación',
'api_key' => 'Clave de API',
'remember_me' => 'Recordarme',
'liability_type_id' => 'Liability type',
'interest' => 'Interest',
'interest_period' => 'Interest period',
'liability_type_id' => 'Tipo de pasivo',
'interest' => 'Interés',
'interest_period' => 'Período de interés',
'source_account_asset' => 'Cuenta de origen (cuenta de activos)',
'destination_account_expense' => 'Cuenta de destino (cuenta de gastos)',
@@ -101,8 +101,8 @@ return [
'convert_Transfer' => 'Convertir transferencia',
'amount' => 'Importe',
'foreign_amount' => 'Foreign amount',
'existing_attachments' => 'Existing attachments',
'foreign_amount' => 'Cantidad extranjera',
'existing_attachments' => 'Adjuntos existentes',
'date' => 'Fecha',
'interest_date' => 'Fecha de interés',
'book_date' => 'Fecha de registro',
@@ -156,7 +156,7 @@ return [
'delete_rule_group' => 'Eliminar grupo de reglas ":title"',
'delete_link_type' => 'Eliminar tipo de enlace ":name"',
'delete_user' => 'Eliminar usuario ":email"',
'delete_recurring' => 'Delete recurring transaction ":title"',
'delete_recurring' => 'Eliminar transacción recurrente ":title"',
'user_areYouSure' => 'Si elimina usuario ":email", todo desaparecerá. No hay deshacer, recuperar ni nada. Si te eliminas, perderás el acceso a esta instancia de Firefly III.',
'attachment_areYouSure' => '¿Seguro que quieres eliminar el archivo adjunto llamado "name"?',
'account_areYouSure' => '¿Seguro que quieres eliminar la cuenta llamada ":name"?',
@@ -165,7 +165,7 @@ return [
'ruleGroup_areYouSure' => '¿Seguro que quieres eliminar el grupo de reglas titulado ":title"?',
'budget_areYouSure' => '¿Seguro que quieres eliminar el presupuesto llamado ":name"?',
'category_areYouSure' => '¿Seguro que quieres eliminar la categoría llamada ":name"?',
'recurring_areYouSure' => 'Are you sure you want to delete the recurring transaction titled ":title"?',
'recurring_areYouSure' => '¿Está seguro de que desea eliminar la transacción recurrente ":title"?',
'currency_areYouSure' => '¿Está seguro que desea eliminar la moneda denominada ":name"?',
'piggyBank_areYouSure' => '¿Está seguro que desea eliminar la hucha llamada ":name"?',
'journal_areYouSure' => '¿Estás seguro de que deseas eliminar la transacción descrita ":description"?',
@@ -173,19 +173,19 @@ return [
'tag_areYouSure' => '¿Seguro que quieres eliminar la etiqueta ":tag"?',
'journal_link_areYouSure' => '¿Seguro que quieres eliminar el vínculo entre <a href=":source_link">:source</a> y <a href=":destination_link">:destination</a>?',
'linkType_areYouSure' => '¿Estás seguro de que deseas eliminar el tipo de vínculo ":name" (":inward" / ":outward")?',
'permDeleteWarning' => 'Deleting stuff from Firefly III is permanent and cannot be undone.',
'permDeleteWarning' => 'Eliminar cosas de Firefly III es permanente y no se puede deshacer.',
'mass_make_selection' => 'Aún puede evitar que se eliminen elementos quitando la casilla de verificación.',
'delete_all_permanently' => 'Eliminar selección permanentemente',
'update_all_journals' => 'Actualiza estas transacciones',
'also_delete_transactions' => 'La única transacción conectada a esta cuenta también se eliminará. | Todas las :count transacciones conectadas a esta cuenta también se eliminarán.',
'also_delete_connections' => 'La única transacción vinculada con este tipo de enlace perderá esta conexión. | Todas las :count transacciones vinculadas con este tipo de enlace perderán su conexión.',
'also_delete_rules' => 'La única regla conectada a este grupo de reglas también se eliminará. | Todas las :count reglas conectadas a este grupo de reglas también se eliminarán.',
'also_delete_piggyBanks' => 'La única alcancía conectada a esta cuenta también se eliminará. | Todas las :count alcancías conectadas a esta cuenta también se eliminará.',
'bill_keep_transactions' => 'The only transaction connected to this bill will not be deleted.|All :count transactions connected to this bill will be spared deletion.',
'budget_keep_transactions' => 'The only transaction connected to this budget will not be deleted.|All :count transactions connected to this budget will be spared deletion.',
'category_keep_transactions' => 'The only transaction connected to this category will not be deleted.|All :count transactions connected to this category will be spared deletion.',
'recurring_keep_transactions' => 'The only transaction created by this recurring transaction will not be deleted.|All :count transactions created by this recurring transaction will be spared deletion.',
'tag_keep_transactions' => 'The only transaction connected to this tag will not be deleted.|All :count transactions connected to this tag will be spared deletion.',
'also_delete_piggyBanks' => 'La hucha conectada a esta cuenta también se eliminará.|Las :count huchas conectadas a esta cuenta también se eliminarán.',
'bill_keep_transactions' => 'La transacción conectada a esta factura no será eliminada.|Las :count transacciones conectadas a esta factura serán eliminadas.',
'budget_keep_transactions' => 'La transacción conectada a este presupuesto no se eliminará.|Las :count transacciones conectadas a este presupuesto no serán eliminadas.',
'category_keep_transactions' => 'La transacción conectada a esta categoría no se eliminará.|Las :count transacciones conectadas a esta categoría no serán eliminadas.',
'recurring_keep_transactions' => 'La transacción conectada a esta transacción recurrente no se eliminará.|Las :count transacciones conectadas a esta transacción recurrente no serán eliminadas.',
'tag_keep_transactions' => 'La transacción conectada a esta etiqueta no se eliminará.|Las :count transacciones conectadas a esta etiqueta no serán eliminadas.',
'check_for_updates' => 'Ver actualizaciones',
'email' => 'Correo electrónico',
@@ -193,13 +193,13 @@ return [
'password_confirmation' => 'Contraseña (otra vez)',
'blocked' => '¿Está bloqueado?',
'blocked_code' => 'Razón del bloqueo',
'login_name' => 'Login',
'login_name' => 'Iniciar sesión',
// import
'apply_rules' => 'Apply rules',
'artist' => 'Artist',
'album' => 'Album',
'song' => 'Song',
'apply_rules' => 'Aplicar reglas',
'artist' => 'Artista',
'album' => 'Álbum',
'song' => 'Canción',
// admin
@@ -220,20 +220,20 @@ return [
'client_id' => 'Identificación del cliente',
'service_secret' => 'Servicio secreto',
'app_secret' => 'Secreto de aplicación',
'app_id' => 'App ID',
'secret' => 'Secret',
'app_id' => 'ID de la App',
'secret' => 'Secreto',
'public_key' => 'Llave pública',
'country_code' => 'Código del país',
'provider_code' => 'Banco o proveedor de datos',
'fints_url' => 'FinTS API URL',
'fints_port' => 'Port',
'fints_bank_code' => 'Bank code',
'fints_username' => 'Username',
'fints_password' => 'PIN / Password',
'fints_account' => 'FinTS account',
'local_account' => 'Firefly III account',
'from_date' => 'Date from',
'to_date' => 'Date to',
'fints_url' => 'URL de la API de FinTS',
'fints_port' => 'Puerto',
'fints_bank_code' => 'Código bancario',
'fints_username' => 'Usuario',
'fints_password' => 'PIN / Contraseña',
'fints_account' => 'Cuenta FinTS',
'local_account' => 'Cuenta Firefly III',
'from_date' => 'Fecha desde',
'to_date' => 'Fecha hasta',
'due_date' => 'Fecha de vencimiento',
@@ -243,17 +243,17 @@ return [
'inward' => 'Descripción interna',
'outward' => 'Descripción externa',
'rule_group_id' => 'Grupo de reglas',
'transaction_description' => 'Transaction description',
'first_date' => 'First date',
'transaction_type' => 'Transaction type',
'repeat_until' => 'Repeat until',
'recurring_description' => 'Recurring transaction description',
'repetition_type' => 'Type of repetition',
'foreign_currency_id' => 'Foreign currency',
'repetition_end' => 'Repetition ends',
'repetitions' => 'Repetitions',
'calendar' => 'Calendar',
'weekend' => 'Weekend',
'client_secret' => 'Client secret',
'transaction_description' => 'Descripción de la transacción',
'first_date' => 'Primera fecha',
'transaction_type' => 'Tipo de transacción',
'repeat_until' => 'Repetir hasta',
'recurring_description' => 'Descripción de transacción recurrente',
'repetition_type' => 'Tipo de repetición',
'foreign_currency_id' => 'Moneda extranjera',
'repetition_end' => 'Termina la repetición',
'repetitions' => 'Repeticiones',
'calendar' => 'Calendario',
'weekend' => 'Fin de semana',
'client_secret' => 'Secreto del cliente',
];

View File

@@ -25,9 +25,9 @@ declare(strict_types=1);
return [
// ALL breadcrumbs and subtitles:
'index_breadcrumb' => 'Importar datos a Firefly III',
'prerequisites_breadcrumb_fake' => 'Pre requisitos para el proveedor de importación falso',
'prerequisites_breadcrumb_spectre' => 'Pre requisitos para Spectre',
'prerequisites_breadcrumb_bunq' => 'Pre requisitos para bunq',
'prerequisites_breadcrumb_fake' => 'Requisitos para el proveedor de importación falso',
'prerequisites_breadcrumb_spectre' => 'Requisitos para bunq',
'prerequisites_breadcrumb_bunq' => 'Requisitos para bunq',
'prerequisites_breadcrumb_ynab' => 'Pre requisitos para YNAB',
'job_configuration_breadcrumb' => 'Configuración para ":key"',
'job_status_breadcrumb' => 'Estado de importación de ":key"',
@@ -91,7 +91,7 @@ return [
'job_config_fake_album_title' => 'Introduzca el nombre del álbum',
'job_config_fake_album_text' => 'Algunas rutinas de importación requieren datos adicionales a medio camino a través de la importación. En el caso del proveedor de importación falso, debe responder algunas preguntas extrañas. Entra en "Estación a estación" para continuar.',
// job configuration form the file provider
'job_config_file_upload_title' => 'Importar configuración (1/4) - Subir archivo',
'job_config_file_upload_title' => 'Configuración de importación (1/4) - Subir archivo',
'job_config_file_upload_text' => 'Esta rutina le ayudará a importar archivos de su banco en Firefly III. ',
'job_config_file_upload_help' => 'Seleccione su archivo. Por favor, asegúrese de que el archivo está codificado en UTF-8.',
'job_config_file_upload_config_help' => 'Si previamente ha importado datos en Firefly III, puede tener un archivo de configuración, el cual preestablecerá valores de configuración por usted. Para algunos bancos, otros usuarios han proporcionado amablemente sus <a href="https://github.com/firefly-iii/import-configurations/wiki">archivo de configuración</a>',
@@ -100,7 +100,7 @@ return [
'import_file_type_csv' => 'CSV (valores separados por comas)',
'import_file_type_ofx' => 'OFX',
'file_not_utf8' => 'El archivo que ha subido no es codificado como UTF-8 o ASCII. Firefly III no puede manejar este tipo de archivos. Utilice Notepad++ ó Sublime para convertir el archivo a UTF-8.',
'job_config_uc_title' => 'Importación de configuración (2/4) - Archivo de configuración básica',
'job_config_uc_title' => 'Configuración de importación (2/4) - Configuración básica de archivo',
'job_config_uc_text' => 'Para poder importar correctamente el archivo, por favor valide las opciones a continuación.',
'job_config_uc_header_help' => 'Marque esta casilla si la primera fila del archivo CSV son los títulos de columna.',
'job_config_uc_date_help' => 'Formato de fecha y hora en su archivo. Siga un formato como los que indica <a href="https://secure.php.net/manual/es/datetime.createfromformat.php#refsect1-datetime.createfromformat-parameters">esta página</a>. El valor por defecto interpretará fechas que se vean así: :dateExample.',
@@ -131,14 +131,14 @@ return [
// job configuration for bunq:
'job_config_bunq_accounts_title' => 'cuentas de bunq',
'job_config_bunq_accounts_text' => 'Estas son las cuentas asociadas a tu cuenta de bunq. Por favor, seleccione las cuentas desde las que desea importar, y en que cuenta deben importarse las transacciones.',
'job_config_bunq_accounts_text' => 'Estas son las cuentas asociadas a tu cuenta de bunq. Por favor, seleccione las cuentas desde las que desea importar, y en qué cuenta deben importarse las transacciones.',
'bunq_no_mapping' => 'Parece que no ha seleccionado ninguna cuenta.',
'should_download_config' => 'Debería descargar <a href=":route">el archivo de configuración</a> para este trabajo. Esto hará las importaciones futuras de manera más fácil.',
'share_config_file' => 'Si ha importado los datos de un banco público, debe <a href="https://github.com/firefly-iii/import-configurations/wiki">compartir su archivo de configuración</a> para que sea fácil para otros usuarios importar sus propios datos. Compartiendo su archivo de configuración no expondrá sus datos financieros.',
'job_config_bunq_apply_rules' => 'Aplicar reglas',
'job_config_bunq_apply_rules_text' => 'De forma predeterminada, sus reglas se aplicarán a las transacciones creadas durante esta rutina de importación. Si no desea que esto suceda, desactive esta casilla de verificación.',
'bunq_savings_goal' => 'Savings goal: :amount (:percentage%)',
'bunq_account_status_CANCELLED' => 'Closed bunq account',
'bunq_savings_goal' => 'Objetivo de ahorro: :amount (:percentage%)',
'bunq_account_status_CANCELLED' => 'Cuenta de bunq cerrada',
'ynab_account_closed' => '¡La cuenta ha sido cerrada!',
'ynab_account_deleted' => '¡La cuenta ha sido borrada!',
@@ -175,8 +175,8 @@ return [
'spectre_extra_key_account_name' => 'Nombre de la cuenta',
'spectre_extra_key_client_name' => 'Nombre del cliente',
'spectre_extra_key_account_number' => 'Número de cuenta',
'spectre_extra_key_blocked_amount' => 'Monto bloqueado',
'spectre_extra_key_available_amount' => 'Monto disponible',
'spectre_extra_key_blocked_amount' => 'Cantidad bloqueada',
'spectre_extra_key_available_amount' => 'Cantidad disponible',
'spectre_extra_key_credit_limit' => 'Limite de crédito',
'spectre_extra_key_interest_rate' => 'Tasa de interés',
'spectre_extra_key_expiry_date' => 'Fecha de vencimiento',
@@ -186,7 +186,7 @@ return [
'spectre_extra_key_cards' => 'Tarjetas',
'spectre_extra_key_units' => 'Unidades',
'spectre_extra_key_unit_price' => 'Precio unitario',
'spectre_extra_key_transactions_count' => 'Nro. de transacciones',
'spectre_extra_key_transactions_count' => 'Nº de transacciones',
//job configuration for finTS
'fints_connection_failed' => 'Se ha producido un error al intentar conectar a su banco. Por favor, asegúrese de que todos los datos que escribió son correctos. Mensaje de error original: :originalError',
@@ -208,7 +208,7 @@ return [
'specific_pres_name' => 'President\'s Choice Financial CA',
'specific_pres_descr' => 'Soluciona problemas potenciales con archivos de PC',
// job configuration for file provider (stage: roles)
'job_config_roles_title' => 'Importar configuración (3/4) - definir el papel de cada columna',
'job_config_roles_title' => 'Configuración de importación (3/4) - Definir el rol de cada columna',
'job_config_roles_text' => 'Cada columna en su archivo CSV contiene ciertos datos. Indique qué tipo de datos debe esperar el importador. La opción de "mapear" datos significa que enlazará cada entrada encontrada en la columna con un valor en su base de datos. Una columna a menudo mapeada es la columna que contiene el IBAN de la cuenta de contrapartida. Eso puede enlazarse fácilmente con cuentas IBAN ya presentes en su base de datos.',
'job_config_roles_submit' => 'Continuar',
'job_config_roles_column_name' => 'Nombre de la columna',
@@ -220,7 +220,7 @@ return [
'job_config_roles_rwarning' => 'Por lo menos, marque una columna como la columna de importe. También es aconsejable seleccionar una columna para la descripción. la fecha y la cuenta contraria.',
'job_config_roles_colum_count' => 'Columna',
// job config for the file provider (stage: mapping):
'job_config_map_title' => 'Importar configuración (4/4) - Conecta datos de importación a los datos de Firefly III',
'job_config_map_title' => 'Configuración de importación (4/4) - Conectar datos importados a datos de Firefly III',
'job_config_map_text' => 'En las siguientes tablas, el valor de la izquierda muestra información encontrada en el archivo cargado. Es su tarea mapear este valor, si es posible, a un valor ya presente en su base de datos. Firefly Iii respetará este mapeo. Si no hay un valor hacia el cual mapear o no se desea mapear un valor especifico, no seleccione ninguno.',
'job_config_map_nothing' => 'No hay datos presentes en su archivo que pueda asignar a los valores existentes. Por favor presione "comenzar la importación" para continuar.',
'job_config_field_value' => 'Valor del campo',
@@ -259,10 +259,10 @@ return [
'column_account-name' => 'Caja de ahorros (nombre)',
'column_account-bic' => 'Caja de ahorro (BIC)',
'column_amount' => 'Cantidad',
'column_amount_foreign' => 'Monto ( en moneda extranjera)',
'column_amount_foreign' => 'Cantidad (en moneda extranjera)',
'column_amount_debit' => 'Cantidad (columna de débito)',
'column_amount_credit' => 'Cantidad (columna de crédito)',
'column_amount_negated' => 'Amount (negated column)',
'column_amount_negated' => 'Cantidad (columna negada)',
'column_amount-comma-separated' => 'Cantidad (coma como decimal separador)',
'column_bill-id' => 'ID factura (coincide FF3)',
'column_bill-name' => 'Nombre de la factura',
@@ -279,8 +279,8 @@ return [
'column_date-book' => 'Fecha de registro de la transacción',
'column_date-process' => 'Fecha del proceso de transacción',
'column_date-transaction' => 'Fecha',
'column_date-due' => 'Transaction due date',
'column_date-payment' => 'Transaction payment date',
'column_date-due' => 'Fecha de vencimiento de la transacción',
'column_date-payment' => 'Fecha de pago de transacción',
'column_date-invoice' => 'Fecha de la factura de la transacción',
'column_description' => 'Descripción',
'column_opposing-iban' => 'Cuenta opuesta (IBAN)',
@@ -290,7 +290,7 @@ return [
'column_opposing-name' => 'Cuenta opuesta (nombre)',
'column_rabo-debit-credit' => 'Indicador especifico débito/crédito de Rabobank',
'column_ing-debit-credit' => 'Indicador especifico débito/crédito de ING',
'column_generic-debit-credit' => 'Generic bank debit/credit indicator',
'column_generic-debit-credit' => 'Indicador de débito/crédito de bancos genéricos',
'column_sepa-ct-id' => 'Identificador de end-to-end SEPA',
'column_sepa-ct-op' => 'Identificador de cuenta opuesta SEPA',
'column_sepa-db' => 'Identificador de mandato SEPA',
@@ -298,7 +298,7 @@ return [
'column_sepa-ci' => 'Identificador de acreedor SEPA',
'column_sepa-ep' => 'Propósito externo SEPA',
'column_sepa-country' => 'Código del país SEPA',
'column_sepa-batch-id' => 'SEPA Batch ID',
'column_sepa-batch-id' => 'ID de lote SEPA',
'column_tags-comma' => 'Etiquetas ( separadas por comas)',
'column_tags-space' => 'Etiquetas ( separadas por espacio)',
'column_account-number' => 'Cuenta de archivos ( numero de cuenta)',

View File

@@ -43,7 +43,7 @@ return [
'budgets_index_see_expenses_bar' => 'Gastar dinero irá llenando poco a poco esta barra.',
'budgets_index_navigate_periods' => 'Navega a través de períodos para configurar fácilmente presupuestos con anticipación.',
'budgets_index_new_budget' => 'Crea nuevos presupuestos como mejor te parezca.',
'budgets_index_list_of_budgets' => 'Use esta tabla para establecer el monto de cada presupuesto y ver como lo viene administrando.',
'budgets_index_list_of_budgets' => 'Use esta tabla para establecer las cantidades para cada presupuesto y ver cómo lo está haciendo.',
'budgets_index_outro' => 'Para aprender mas acerca de los presupuestos, revise el icono de ayuda en el tope de la esquina derecha.',
// reports (index)
@@ -79,9 +79,9 @@ return [
'transactions_create_transfer_ffInput_piggy_bank_id' => 'Seleccione una alcancía y vincule esta transferencia con sus ahorros.',
// piggy banks index:
'piggy-banks_index_saved' => 'Este campo le muestra cuanto ha ahorrado usted en cada alcancía.',
'piggy-banks_index_button' => 'Junto con esta barra de progreso hay dos botones (+ y -) para añadir o eliminar dinero de cada alcancía.',
'piggy-banks_index_accountStatus' => 'Para cada cuenta de activos con al menos una alcancía, el estado esta listado en esta tabla.',
'piggy-banks_index_saved' => 'Este campo le muestra cuánto ha ahorrado usted en cada hucha.',
'piggy-banks_index_button' => 'Junto con esta barra de progreso hay dos botones (+ y -) para añadir o quitar dinero de cada hucha.',
'piggy-banks_index_accountStatus' => 'Para cada cuenta de activos con al menos una hucha, el estado está listado en esta tabla.',
// create piggy
'piggy-banks_create_name' => '¿Cuál es tu meta? ¿Un nuevo sofá, una cámara, dinero para emergencias?',
@@ -89,7 +89,7 @@ return [
// show piggy
'piggy-banks_show_piggyChart' => 'Este informe le mostrara la historia de esta alcancía.',
'piggy-banks_show_piggyDetails' => 'Algunos detalles sobre tu alcancía',
'piggy-banks_show_piggyDetails' => 'Algunos detalles sobre tu hucha',
'piggy-banks_show_piggyEvents' => 'Cualquier adición o eliminación también se listan aquí.',
// bill index
@@ -106,7 +106,7 @@ return [
'bills_create_intro' => 'Use facturas para rastrear la cantidad de dinero correspondiente a cada período. Piense en gastos como renta, seguro o pagos de hipoteca.',
'bills_create_name' => 'Use un nombre descriptivo como "alquiler" o "seguro de salud".',
//'bills_create_match' => 'To match transactions, use terms from those transactions or the expense account involved. All words must match.',
'bills_create_amount_min_holder' => 'Seleccione un monto mínimo y uno máximo para esta factura.',
'bills_create_amount_min_holder' => 'Seleccione un importe mínimo y máximo para esta factura.',
'bills_create_repeat_freq_holder' => 'La mayoría de facturas se repiten mensualmente, pero usted puede establecer otra frecuencia aquí.',
'bills_create_skip_holder' => 'Si una cuenta se repite cada 2 semanas, el campo "saltar" debe estar marcado como "1" para saltar una semana y generar el gasto cada 2.',
@@ -130,8 +130,8 @@ return [
// currencies
'currencies_index_intro' => 'Firefly III da soporte a múltiples monedas, que usted puede cambiar en esta página.',
'currencies_index_default' => 'Firefly III has one default currency.',
'currencies_index_buttons' => 'Use these buttons to change the default currency or enable other currencies.',
'currencies_index_default' => 'Firefly III tiene una moneda por defecto.',
'currencies_index_buttons' => 'Utilice estos botones para cambiar la moneda por defecto o habilitar otras monedas.',
// create currency
'currencies_create_code' => 'Este código debe ser compatible con ISO (Googlee para su nueva moneda).',

View File

@@ -34,15 +34,15 @@ return [
'name' => 'Nombre',
'role' => 'Rol',
'currentBalance' => 'Balance actual',
'linked_to_rules' => 'Relevant rules',
'linked_to_rules' => 'Reglas asociadas',
'active' => '¿Está Activo?',
'lastActivity' => 'Actividad más reciente',
'balanceDiff' => 'Diferencia de equilibrio',
'balanceDiff' => 'Diferencia de saldo',
'matchesOn' => 'Encontrado en',
'account_type' => 'Tipo de cuenta',
'created_at' => 'Fecha de creación',
'account' => 'Cuenta',
'matchingAmount' => 'Monto',
'matchingAmount' => 'Cantidad',
'split_number' => 'División #',
'destination' => 'Destino',
'source' => 'Origen',
@@ -104,18 +104,18 @@ return [
'sum_transfers' => 'Suma de transferencias',
'reconcile' => 'Reconciliar',
'account_on_spectre' => 'Cuenta (espectro)',
'account_on_ynab' => 'Account (YNAB)',
'account_on_ynab' => 'Cuenta (YNAB)',
'do_import' => 'Importar desde esta cuenta',
'sepa-ct-id' => 'SEPA End to End Identifier',
'sepa-ct-op' => 'SEPA Opposing Account Identifier',
'sepa-db' => 'SEPA Mandate Identifier',
'sepa-country' => 'SEPA Country',
'sepa-cc' => 'SEPA Clearing Code',
'sepa-ep' => 'SEPA External Purpose',
'sepa-ci' => 'SEPA Creditor Identifier',
'sepa-batch-id' => 'SEPA Batch ID',
'sepa-ct-id' => 'Identificador de extremo a extremo SEPA',
'sepa-ct-op' => 'Identificador de cuenta opuesta SEPA',
'sepa-db' => 'Identificador de mandato SEPA',
'sepa-country' => 'País SEPA',
'sepa-cc' => 'Código de limpieza SEPA',
'sepa-ep' => 'Propósito externo SEPA',
'sepa-ci' => 'Identificador de acreedor SEPA',
'sepa-batch-id' => 'ID de lote SEPA',
'external_id' => 'ID Externo',
'account_at_bunq' => 'Account with bunq',
'account_at_bunq' => 'Cuenta con bunq',
'file_name' => 'Nombre de fichero',
'file_size' => 'Tamaño de fichero',
'file_type' => 'Tipo de fichero',
@@ -124,13 +124,13 @@ return [
'spectre_bank' => 'Banco',
'spectre_last_use' => 'Ultimó acceso',
'spectre_status' => 'Estado',
'bunq_payment_id' => 'bunq payment ID',
'bunq_payment_id' => 'ID de pago bunq',
'repetitions' => 'Repeticiones',
'title' => 'Título',
'transaction_s' => 'Transaction(s)',
'transaction_s' => 'Transacción(es)',
'field' => 'Campo',
'value' => 'Valor',
'interest' => 'Interés',
'interest_period' => 'interest period',
'liability_type' => 'Type of liability',
'interest_period' => 'período de interés',
'liability_type' => 'Tipo de pasivo',
];

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