From 3f050d3d0307b49eda04aa08fcf57156c448d640 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 26 Dec 2016 12:32:48 +0100 Subject: [PATCH 001/350] Some demo page text [skip ci] --- resources/lang/en_US/demo.php | 10 +++++++--- resources/views/demo/accounts/index.twig | 1 + resources/views/demo/budgets/index.twig | 1 + resources/views/demo/reports/index.twig | 7 +++++++ 4 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 resources/views/demo/accounts/index.twig create mode 100644 resources/views/demo/budgets/index.twig create mode 100644 resources/views/demo/reports/index.twig diff --git a/resources/lang/en_US/demo.php b/resources/lang/en_US/demo.php index ed6ae7e543..d6e1d79b87 100644 --- a/resources/lang/en_US/demo.php +++ b/resources/lang/en_US/demo.php @@ -8,9 +8,13 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', ]; \ No newline at end of file diff --git a/resources/views/demo/accounts/index.twig b/resources/views/demo/accounts/index.twig new file mode 100644 index 0000000000..1e42bbc675 --- /dev/null +++ b/resources/views/demo/accounts/index.twig @@ -0,0 +1 @@ +{{ trans('demo.accounts-index') }} \ No newline at end of file diff --git a/resources/views/demo/budgets/index.twig b/resources/views/demo/budgets/index.twig new file mode 100644 index 0000000000..737932b3df --- /dev/null +++ b/resources/views/demo/budgets/index.twig @@ -0,0 +1 @@ +{{ trans('demo.budgets-index') }} \ No newline at end of file diff --git a/resources/views/demo/reports/index.twig b/resources/views/demo/reports/index.twig new file mode 100644 index 0000000000..c7d5d9aab4 --- /dev/null +++ b/resources/views/demo/reports/index.twig @@ -0,0 +1,7 @@ +{{ trans('demo.reports-index-start')|raw }} +
+
+{{ trans('demo.reports-index-examples', { + one: route('reports.report.default', ['1,2,3','currentMonthStart','currentMonthEnd']), + two: route('reports.report.default', ['1,2,3','20160101','20161231']), + three: route('reports.report.budget', ['1,2,3','2,1','20160101','20161231'])})|raw }} \ No newline at end of file From 5442292d2360594b9d366299fa3bde18e338ebe5 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 26 Dec 2016 12:41:59 +0100 Subject: [PATCH 002/350] New translations --- resources/lang/zh_HK/demo.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/lang/zh_HK/demo.php b/resources/lang/zh_HK/demo.php index ed6ae7e543..d6e1d79b87 100644 --- a/resources/lang/zh_HK/demo.php +++ b/resources/lang/zh_HK/demo.php @@ -8,9 +8,13 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', ]; \ No newline at end of file From dd4991a4f8f9c54e3daecb0cf5736337852e71ae Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 26 Dec 2016 12:42:00 +0100 Subject: [PATCH 003/350] New translations --- resources/lang/zh_TW/demo.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/lang/zh_TW/demo.php b/resources/lang/zh_TW/demo.php index ed6ae7e543..d6e1d79b87 100644 --- a/resources/lang/zh_TW/demo.php +++ b/resources/lang/zh_TW/demo.php @@ -8,9 +8,13 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', ]; \ No newline at end of file From a08103f996ede7c5fd3b34913feafef4bbc5fca0 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 26 Dec 2016 12:42:03 +0100 Subject: [PATCH 004/350] New translations --- resources/lang/hr_HR/demo.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/lang/hr_HR/demo.php b/resources/lang/hr_HR/demo.php index ed6ae7e543..d6e1d79b87 100644 --- a/resources/lang/hr_HR/demo.php +++ b/resources/lang/hr_HR/demo.php @@ -8,9 +8,13 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', ]; \ No newline at end of file From 7d1e981bcaca77005733770af317880fbe14b691 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 26 Dec 2016 12:42:04 +0100 Subject: [PATCH 005/350] New translations --- resources/lang/nl_NL/demo.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/lang/nl_NL/demo.php b/resources/lang/nl_NL/demo.php index ed6ae7e543..d6e1d79b87 100644 --- a/resources/lang/nl_NL/demo.php +++ b/resources/lang/nl_NL/demo.php @@ -8,9 +8,13 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', ]; \ No newline at end of file From 7f025380f0dba15978251bca21640aff02628a50 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 26 Dec 2016 12:42:06 +0100 Subject: [PATCH 006/350] New translations --- resources/lang/es_ES/demo.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/lang/es_ES/demo.php b/resources/lang/es_ES/demo.php index ed6ae7e543..d6e1d79b87 100644 --- a/resources/lang/es_ES/demo.php +++ b/resources/lang/es_ES/demo.php @@ -8,9 +8,13 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', ]; \ No newline at end of file From 62d47ff7f0ecfb55c8cba3735a910a09ff7e8171 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 26 Dec 2016 12:42:07 +0100 Subject: [PATCH 007/350] New translations --- resources/lang/pt_BR/demo.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/lang/pt_BR/demo.php b/resources/lang/pt_BR/demo.php index ed6ae7e543..d6e1d79b87 100644 --- a/resources/lang/pt_BR/demo.php +++ b/resources/lang/pt_BR/demo.php @@ -8,9 +8,13 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', ]; \ No newline at end of file From 4e0b162f5f170873c445e6d5360ac399a38e43a1 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 26 Dec 2016 12:42:08 +0100 Subject: [PATCH 008/350] New translations --- resources/lang/de_DE/demo.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/lang/de_DE/demo.php b/resources/lang/de_DE/demo.php index ed6ae7e543..d6e1d79b87 100644 --- a/resources/lang/de_DE/demo.php +++ b/resources/lang/de_DE/demo.php @@ -8,9 +8,13 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', ]; \ No newline at end of file From b14adf8c3f8eccc38d092a029acdb6e5b09557dd Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 26 Dec 2016 12:42:09 +0100 Subject: [PATCH 009/350] New translations --- resources/lang/fr_FR/demo.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/lang/fr_FR/demo.php b/resources/lang/fr_FR/demo.php index ed6ae7e543..d6e1d79b87 100644 --- a/resources/lang/fr_FR/demo.php +++ b/resources/lang/fr_FR/demo.php @@ -8,9 +8,13 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', ]; \ No newline at end of file From b9d142c2b7829fd61bb2ec37ffe279c5806797fc Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 09:56:30 +0100 Subject: [PATCH 010/350] Small view updates [skip ci] --- resources/lang/en_US/firefly.php | 2 ++ resources/views/accounts/show.twig | 6 +++--- resources/views/categories/show.twig | 8 ++++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 1fb53a93b5..a6fdc22900 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -99,6 +99,8 @@ return [ 'cannot_change_demo' => 'You cannot change the password of the demonstration account.', 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', + 'per_period' => 'Per period', + 'all_periods' => 'All periods', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', diff --git a/resources/views/accounts/show.twig b/resources/views/accounts/show.twig index 37f19e9639..b52ca7227a 100644 --- a/resources/views/accounts/show.twig +++ b/resources/views/accounts/show.twig @@ -37,7 +37,7 @@
- +
@@ -49,7 +49,7 @@
- +
@@ -61,7 +61,7 @@
- +
diff --git a/resources/views/categories/show.twig b/resources/views/categories/show.twig index 92e130e683..31ecbdd26c 100644 --- a/resources/views/categories/show.twig +++ b/resources/views/categories/show.twig @@ -9,7 +9,7 @@
-

{{ 'overview'|_ }} ({{ 'month'|_ }})

+

{{ 'overview'|_ }} ({{ 'per_period'|_|lower }})

@@ -19,7 +19,7 @@
-

{{ 'overview'|_ }} ({{ 'all'|_ }})

+

{{ 'overview'|_ }} ({{ 'all_periods'|_|lower }})

@@ -28,7 +28,7 @@
-
+
@@ -39,7 +39,7 @@
-
+
{% for entry in entries %} {% if entry[2] != 0 or entry[3] != 0 %}
From 04c9b2a7a8d1b289090a62428f59b3f6963fe3ba Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:02:05 +0100 Subject: [PATCH 011/350] Approved. Step name: Proofread --- resources/lang/nl_NL/firefly.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/lang/nl_NL/firefly.php b/resources/lang/nl_NL/firefly.php index 44e5b43bff..b5ad7735d6 100644 --- a/resources/lang/nl_NL/firefly.php +++ b/resources/lang/nl_NL/firefly.php @@ -99,6 +99,8 @@ return [ 'cannot_change_demo' => 'Je kan het wachtwoord van de demonstratie-account niet wijzigen.', 'cannot_delete_demo' => 'Je kan de demonstratie-account niet verwijderen.', 'cannot_reset_demo_user' => 'Je kan het wachtwoord van de demonstratie-account niet resetten', + 'per_period' => 'Per period', + 'all_periods' => 'All periods', // repeat frequencies: 'repeat_freq_yearly' => 'jaarlijks', From 57bba2fd3f202669a23586fb33fd36fc143be65c Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:02:21 +0100 Subject: [PATCH 012/350] New translations --- resources/lang/es_ES/firefly.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/lang/es_ES/firefly.php b/resources/lang/es_ES/firefly.php index e9d4f2d538..e295ed5a59 100644 --- a/resources/lang/es_ES/firefly.php +++ b/resources/lang/es_ES/firefly.php @@ -99,6 +99,8 @@ return [ 'cannot_change_demo' => 'You cannot change the password of the demonstration account.', 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', + 'per_period' => 'Per period', + 'all_periods' => 'All periods', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', From c7964f7693df90550d2b1e79340f806c742e3a05 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:02:30 +0100 Subject: [PATCH 013/350] New translations --- resources/lang/hr_HR/firefly.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/lang/hr_HR/firefly.php b/resources/lang/hr_HR/firefly.php index e9d4f2d538..e295ed5a59 100644 --- a/resources/lang/hr_HR/firefly.php +++ b/resources/lang/hr_HR/firefly.php @@ -99,6 +99,8 @@ return [ 'cannot_change_demo' => 'You cannot change the password of the demonstration account.', 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', + 'per_period' => 'Per period', + 'all_periods' => 'All periods', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', From 3cd749753a0a6f1133a667765afe1b58bbe1f58c Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:02:37 +0100 Subject: [PATCH 014/350] New translations --- resources/lang/zh_TW/firefly.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/lang/zh_TW/firefly.php b/resources/lang/zh_TW/firefly.php index bab689aed8..96a9a8f43e 100644 --- a/resources/lang/zh_TW/firefly.php +++ b/resources/lang/zh_TW/firefly.php @@ -99,6 +99,8 @@ return [ 'cannot_change_demo' => 'You cannot change the password of the demonstration account.', 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', + 'per_period' => 'Per period', + 'all_periods' => 'All periods', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', From 004fb362ec3bb04a9c22ea5f3105282b4e8de486 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:02:42 +0100 Subject: [PATCH 015/350] New translations --- resources/lang/zh_HK/firefly.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/lang/zh_HK/firefly.php b/resources/lang/zh_HK/firefly.php index e9d4f2d538..e295ed5a59 100644 --- a/resources/lang/zh_HK/firefly.php +++ b/resources/lang/zh_HK/firefly.php @@ -99,6 +99,8 @@ return [ 'cannot_change_demo' => 'You cannot change the password of the demonstration account.', 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', + 'per_period' => 'Per period', + 'all_periods' => 'All periods', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', From df813dbac9df9876c3bc8e6e5e3f25d875a7e817 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:02:50 +0100 Subject: [PATCH 016/350] New translations --- resources/lang/pt_BR/firefly.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/lang/pt_BR/firefly.php b/resources/lang/pt_BR/firefly.php index 6ff5b76cca..52a4926b59 100644 --- a/resources/lang/pt_BR/firefly.php +++ b/resources/lang/pt_BR/firefly.php @@ -99,6 +99,8 @@ return [ 'cannot_change_demo' => 'You cannot change the password of the demonstration account.', 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', + 'per_period' => 'Per period', + 'all_periods' => 'All periods', // repeat frequencies: 'repeat_freq_yearly' => 'anual', From fd4b589a131d1f073063afc9e2ba2cb83509d497 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:03:00 +0100 Subject: [PATCH 017/350] New translations --- resources/lang/fr_FR/firefly.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/lang/fr_FR/firefly.php b/resources/lang/fr_FR/firefly.php index 6764415fef..f9b314fd90 100644 --- a/resources/lang/fr_FR/firefly.php +++ b/resources/lang/fr_FR/firefly.php @@ -99,6 +99,8 @@ return [ 'cannot_change_demo' => 'You cannot change the password of the demonstration account.', 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', + 'per_period' => 'Per period', + 'all_periods' => 'All periods', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', From c9112de8bab6208b2bf965cfa8fe99f1c04ac007 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:03:05 +0100 Subject: [PATCH 018/350] New translations --- resources/lang/de_DE/firefly.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/lang/de_DE/firefly.php b/resources/lang/de_DE/firefly.php index 1f95518770..96e3644cf7 100644 --- a/resources/lang/de_DE/firefly.php +++ b/resources/lang/de_DE/firefly.php @@ -99,6 +99,8 @@ return [ 'cannot_change_demo' => 'You cannot change the password of the demonstration account.', 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', + 'per_period' => 'Per period', + 'all_periods' => 'All periods', // repeat frequencies: 'repeat_freq_yearly' => 'Jährlich', From 5efdf53c064322622e5b1abda4b0b3a0b5009c6f Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:46:11 +0100 Subject: [PATCH 019/350] ShowAll method for category --- app/Http/Controllers/CategoryController.php | 155 ++++++++++++-------- public/js/ff/categories/show.js | 1 + resources/lang/en_US/firefly.php | 1 + resources/views/accounts/show.twig | 21 ++- resources/views/categories/show.twig | 123 ++++++++++------ routes/web.php | 1 + 6 files changed, 189 insertions(+), 113 deletions(-) diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index 4d7a67e64c..d199e64f13 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -20,7 +20,7 @@ use FireflyIII\Http\Requests\CategoryFormRequest; use FireflyIII\Models\AccountType; use FireflyIII\Models\Category; use FireflyIII\Repositories\Account\AccountRepositoryInterface; -use FireflyIII\Repositories\Category\CategoryRepositoryInterface as CRI; +use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; use Input; @@ -89,13 +89,14 @@ class CategoryController extends Controller return view('categories.delete', compact('category', 'subTitle')); } + /** - * @param CRI $repository - * @param Category $category + * @param CategoryRepositoryInterface $repository + * @param Category $category * - * @return \Illuminate\Http\RedirectResponse + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function destroy(CRI $repository, Category $category) + public function destroy(CategoryRepositoryInterface $repository, Category $category) { $name = $category->name; @@ -136,11 +137,11 @@ class CategoryController extends Controller } /** - * @param CRI $repository + * @param CategoryRepositoryInterface $repository * * @return View */ - public function index(CRI $repository) + public function index(CategoryRepositoryInterface $repository) { $categories = $repository->getCategories(); @@ -176,20 +177,15 @@ class CategoryController extends Controller } /** - * @param CRI $repository - * @param AccountRepositoryInterface $accountRepository - * @param Category $category + * @param Category $category * * @return View */ - public function show(CRI $repository, AccountRepositoryInterface $accountRepository, Category $category) + public function show(Category $category) { - $range = Preferences::get('viewRange', '1M')->data; - /** @var Carbon $start */ - $start = session('start', Navigation::startOfPeriod(new Carbon, $range)); - /** @var Carbon $end */ + $range = Preferences::get('viewRange', '1M')->data; + $start = session('start', Navigation::startOfPeriod(new Carbon, $range)); $end = session('end', Navigation::endOfPeriod(new Carbon, $range)); - $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); $hideCategory = true; // used in list. $page = intval(Input::get('page')) === 0 ? 1 : intval(Input::get('page')); $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); @@ -202,48 +198,38 @@ class CategoryController extends Controller $journals = $collector->getPaginatedJournals(); $journals->setPath('categories/show/' . $category->id); - // oldest transaction in category: + $entries = $this->getGroupedEntries($category); + + return view('categories.show', compact('category', 'journals', 'entries', 'hideCategory', 'subTitle', 'subTitleIcon', 'start', 'end')); + } + + /** + * @param CategoryRepositoryInterface $repository + * @param Category $category + * + * @return View + */ + public function showAll(CategoryRepositoryInterface $repository, Category $category) + { + $range = Preferences::get('viewRange', '1M')->data; $start = $repository->firstUseDate($category); if ($start->year == 1900) { $start = new Carbon; } - $range = Preferences::get('viewRange', '1M')->data; - $start = Navigation::startOfPeriod($start, $range); - $end = Navigation::endOfX(new Carbon, $range); - $entries = new Collection; + $end = Navigation::endOfPeriod(new Carbon, $range); + $subTitle = $category->name; + $subTitleIcon = 'fa-bar-chart'; + $hideCategory = true; // used in list. + $page = intval(Input::get('page')) === 0 ? 1 : intval(Input::get('page')); + $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); - // chart properties for cache: - $cache = new CacheProperties(); - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty('category-show'); - $cache->addProperty($category->id); + // new collector: + $collector = app(JournalCollectorInterface::class); + $collector->setPage($page)->setLimit($pageSize)->setAllAssetAccounts()->setRange($start, $end)->setCategory($category); + $journals = $collector->getPaginatedJournals(); + $journals->setPath('categories/show/' . $category->id . '/all'); - - if ($cache->has()) { - $entries = $cache->get(); - - return view('categories.show', compact('category', 'journals', 'entries', 'subTitleIcon', 'hideCategory', 'subTitle')); - } - - - $categoryCollection = new Collection([$category]); - - while ($end >= $start) { - $end = Navigation::startOfPeriod($end, $range); - $currentEnd = Navigation::endOfPeriod($end, $range); - $spent = $repository->spentInPeriod($categoryCollection, $accounts, $end, $currentEnd); - $earned = $repository->earnedInPeriod($categoryCollection, $accounts, $end, $currentEnd); - $dateStr = $end->format('Y-m-d'); - $dateName = Navigation::periodShow($end, $range); - $entries->push([$dateStr, $dateName, $spent, $earned]); - - $end = Navigation::subtractPeriod($end, $range, 1); - - } - $cache->store($entries); - - return view('categories.show', compact('category', 'journals', 'entries', 'hideCategory', 'subTitle', 'subTitleIcon')); + return view('categories.show', compact('category', 'journals', 'hideCategory', 'subTitle', 'subTitleIcon', 'start', 'end')); } /** @@ -259,6 +245,7 @@ class CategoryController extends Controller $start = Navigation::startOfPeriod($carbon, $range); $end = Navigation::endOfPeriod($carbon, $range); $subTitle = $category->name; + $subTitleIcon = 'fa-bar-chart'; $hideCategory = true; // used in list. $page = intval(Input::get('page')) === 0 ? 1 : intval(Input::get('page')); $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); @@ -269,16 +256,16 @@ class CategoryController extends Controller $journals = $collector->getPaginatedJournals(); $journals->setPath('categories/show/' . $category->id . '/' . $date); - return view('categories.show-by-date', compact('category', 'journals', 'hideCategory', 'subTitle', 'carbon')); + return view('categories.show', compact('category', 'journals', 'hideCategory', 'subTitle', 'subTitleIcon', 'start', 'end')); } /** - * @param CategoryFormRequest $request - * @param CRI $repository + * @param CategoryFormRequest $request + * @param CategoryRepositoryInterface $repository * - * @return \Illuminate\Http\RedirectResponse + * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function store(CategoryFormRequest $request, CRI $repository) + public function store(CategoryFormRequest $request, CategoryRepositoryInterface $repository) { $data = $request->getCategoryData(); $category = $repository->store($data); @@ -297,13 +284,13 @@ class CategoryController extends Controller /** - * @param CategoryFormRequest $request - * @param CRI $repository - * @param Category $category + * @param CategoryFormRequest $request + * @param CategoryRepositoryInterface $repository + * @param Category $category * - * @return \Illuminate\Http\RedirectResponse + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function update(CategoryFormRequest $request, CRI $repository, Category $category) + public function update(CategoryFormRequest $request, CategoryRepositoryInterface $repository, Category $category) { $data = $request->getCategoryData(); $repository->update($category, $data); @@ -322,4 +309,48 @@ class CategoryController extends Controller } + /** + * @param Category $category + * + * @return Collection + */ + private function getGroupedEntries(Category $category): Collection + { + $repository = app(CategoryRepositoryInterface::class); + $accountRepository = app(AccountRepositoryInterface::class); + $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $first = $repository->firstUseDate($category); + if ($first->year == 1900) { + $first = new Carbon; + } + $range = Preferences::get('viewRange', '1M')->data; + $first = Navigation::startOfPeriod($first, $range); + $end = Navigation::endOfX(new Carbon, $range); + $entries = new Collection; + + // properties for entries with their amounts. + $cache = new CacheProperties(); + $cache->addProperty($first); + $cache->addProperty($end); + $cache->addProperty('categories.entries'); + $cache->addProperty($category->id); + + if ($cache->has()) { + return $cache->get(); + } + while ($end >= $first) { + $end = Navigation::startOfPeriod($end, $range); + $currentEnd = Navigation::endOfPeriod($end, $range); + $spent = $repository->spentInPeriod(new Collection([$category]), $accounts, $end, $currentEnd); + $earned = $repository->earnedInPeriod(new Collection([$category]), $accounts, $end, $currentEnd); + $dateStr = $end->format('Y-m-d'); + $dateName = Navigation::periodShow($end, $range); + $entries->push([$dateStr, $dateName, $spent, $earned]); + $end = Navigation::subtractPeriod($end, $range, 1); + } + $cache->store($entries); + + return $entries; + } + } diff --git a/public/js/ff/categories/show.js b/public/js/ff/categories/show.js index 9d14bc1377..a53a5b3d94 100644 --- a/public/js/ff/categories/show.js +++ b/public/js/ff/categories/show.js @@ -12,4 +12,5 @@ $(function () { "use strict"; columnChart(all, 'all'); columnChart(current, 'period'); + columnChart(specific, 'period-specific-period'); }); \ No newline at end of file diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index a6fdc22900..d574aa9c98 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', diff --git a/resources/views/accounts/show.twig b/resources/views/accounts/show.twig index b52ca7227a..8fdf39fb68 100644 --- a/resources/views/accounts/show.twig +++ b/resources/views/accounts/show.twig @@ -76,12 +76,21 @@
{% include 'list.journals-tasker' with {sorting:true, hideBills:true, hideBudgets: true} %} -

- - - {{ 'show_all_no_filter'|_ }} - -

+ {% if entries %} +

+ + + {{ 'show_all_no_filter'|_ }} + +

+ {% else %} +

+ + + {{ 'show_the_current_period_and_overview'|_ }} + +

+ {% endif %}
diff --git a/resources/views/categories/show.twig b/resources/views/categories/show.twig index 31ecbdd26c..7aac600ed1 100644 --- a/resources/views/categories/show.twig +++ b/resources/views/categories/show.twig @@ -1,34 +1,49 @@ {% extends "./layout/default" %} {% block breadcrumbs %} - {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, category) }} + {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, category, start, end) }} {% endblock %} {% block content %}
-
-
-
-

{{ 'overview'|_ }} ({{ 'per_period'|_|lower }})

-
-
- + {% if entries %} + {# both charts #} +
+
+
+

{{ 'overview'|_ }} ({{ 'per_period'|_|lower }})

+
+
+ +
-
-
-
-
-

{{ 'overview'|_ }} ({{ 'all_periods'|_|lower }})

-
-
- +
+
+
+

{{ 'overview'|_ }} ({{ 'all_periods'|_|lower }})

+
+
+ +
-
+ {% else %} + {# single chart #} +
+
+
+

{{ 'overview'|_ }} ({{ 'current_period'|_|lower }})

+
+
+ +
+
+
+ {% endif %}
-
+
@@ -36,38 +51,55 @@
{% include 'list.journals-tasker' %} + {% if entries %} +

+ + + {{ 'show_all_no_filter'|_ }} + +

+ {% else %} +

+ + + {{ 'show_the_current_period_and_overview'|_ }} + +

+ {% endif %}
-
- {% for entry in entries %} - {% if entry[2] != 0 or entry[3] != 0 %} -
-
-

{{ entry[1] }} -

+ {% if entries %} +
+ {% for entry in entries %} + {% if entry[2] != 0 or entry[3] != 0 %} +
+ +
+ + {% if entry[2] != 0 %} + + + + + {% endif %} + {% if entry[3] != 0 %} + + + + + {% endif %} +
{{ 'spent'|_ }}{{ entry[2]|formatAmount }}
{{ 'earned'|_ }}{{ entry[3]|formatAmount }}
+
-
- - {% if entry[2] != 0 %} - - - - - {% endif %} - {% if entry[3] != 0 %} - - - - - {% endif %} -
{{ 'spent'|_ }}{{ entry[2]|formatAmount }}
{{ 'earned'|_ }}{{ entry[3]|formatAmount }}
-
-
- {% endif %} + {% endif %} - {% endfor %} -
+ {% endfor %} +
+ {% endif %}
{% endblock %} @@ -75,6 +107,7 @@ diff --git a/routes/web.php b/routes/web.php index e053bf6acd..ba46a250d9 100755 --- a/routes/web.php +++ b/routes/web.php @@ -177,6 +177,7 @@ Route::group( Route::get('delete/{category}', ['uses' => 'CategoryController@delete', 'as' => 'delete']); Route::get('show/{category}', ['uses' => 'CategoryController@show', 'as' => 'show']); + Route::get('show/{category}/all', ['uses' => 'CategoryController@showAll', 'as' => 'show.all']); Route::get('show/{category}/{date}', ['uses' => 'CategoryController@showByDate', 'as' => 'show.date']); Route::get('list/no-category', ['uses' => 'CategoryController@noCategory', 'as' => 'no-category']); From 3371bd2e040fc7aa87a1925b752134c36792fb24 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:52:01 +0100 Subject: [PATCH 020/350] New translations --- resources/lang/es_ES/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/es_ES/firefly.php b/resources/lang/es_ES/firefly.php index e295ed5a59..900cc6c6f7 100644 --- a/resources/lang/es_ES/firefly.php +++ b/resources/lang/es_ES/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', From afbcc79a068c6b376224d3458be9dfd368e56f26 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:52:12 +0100 Subject: [PATCH 021/350] New translations --- resources/lang/hr_HR/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/hr_HR/firefly.php b/resources/lang/hr_HR/firefly.php index e295ed5a59..900cc6c6f7 100644 --- a/resources/lang/hr_HR/firefly.php +++ b/resources/lang/hr_HR/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', From 80b5cc08bb3e222239e690bc14bfb3ea810a8485 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:52:21 +0100 Subject: [PATCH 022/350] New translations --- resources/lang/zh_TW/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/zh_TW/firefly.php b/resources/lang/zh_TW/firefly.php index 96a9a8f43e..bb07727fb9 100644 --- a/resources/lang/zh_TW/firefly.php +++ b/resources/lang/zh_TW/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', From ca4824adcd32ed7f92b969c7ca86cc5b09ab611a Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:52:27 +0100 Subject: [PATCH 023/350] New translations --- resources/lang/zh_HK/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/zh_HK/firefly.php b/resources/lang/zh_HK/firefly.php index e295ed5a59..900cc6c6f7 100644 --- a/resources/lang/zh_HK/firefly.php +++ b/resources/lang/zh_HK/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', From 6583a6d9c670d0edcf9441d366ae543110fd3f3e Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:52:36 +0100 Subject: [PATCH 024/350] New translations --- resources/lang/pt_BR/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/pt_BR/firefly.php b/resources/lang/pt_BR/firefly.php index 52a4926b59..57f4492b53 100644 --- a/resources/lang/pt_BR/firefly.php +++ b/resources/lang/pt_BR/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: 'repeat_freq_yearly' => 'anual', From 73844e223fb2f0245c3998c8194eaff87372c4f4 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:52:46 +0100 Subject: [PATCH 025/350] New translations --- resources/lang/de_DE/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/de_DE/firefly.php b/resources/lang/de_DE/firefly.php index 96e3644cf7..83ab8a37ee 100644 --- a/resources/lang/de_DE/firefly.php +++ b/resources/lang/de_DE/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: 'repeat_freq_yearly' => 'Jährlich', From e9e32eda3cc1335dff5ad561255b16f1acaef347 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:52:50 +0100 Subject: [PATCH 026/350] New translations --- resources/lang/nl_NL/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/nl_NL/firefly.php b/resources/lang/nl_NL/firefly.php index b5ad7735d6..8581e752b0 100644 --- a/resources/lang/nl_NL/firefly.php +++ b/resources/lang/nl_NL/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'Je kan het wachtwoord van de demonstratie-account niet resetten', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: 'repeat_freq_yearly' => 'jaarlijks', From f80e6c2efa3a6057ce1a5bb2c1eb5723212c1d64 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 10:52:55 +0100 Subject: [PATCH 027/350] New translations --- resources/lang/fr_FR/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/fr_FR/firefly.php b/resources/lang/fr_FR/firefly.php index f9b314fd90..ca76af2c36 100644 --- a/resources/lang/fr_FR/firefly.php +++ b/resources/lang/fr_FR/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', From 244972e0f8597e32c315a776d6853b9d4a92d71e Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 11:02:14 +0100 Subject: [PATCH 028/350] Better category overview [skip ci] --- app/Http/Controllers/CategoryController.php | 3 ++- resources/views/categories/show.twig | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index d199e64f13..bd6c9178da 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -222,6 +222,7 @@ class CategoryController extends Controller $hideCategory = true; // used in list. $page = intval(Input::get('page')) === 0 ? 1 : intval(Input::get('page')); $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); + $showAll = true; // new collector: $collector = app(JournalCollectorInterface::class); @@ -229,7 +230,7 @@ class CategoryController extends Controller $journals = $collector->getPaginatedJournals(); $journals->setPath('categories/show/' . $category->id . '/all'); - return view('categories.show', compact('category', 'journals', 'hideCategory', 'subTitle', 'subTitleIcon', 'start', 'end')); + return view('categories.show', compact('category', 'journals', 'hideCategory', 'subTitle', 'subTitleIcon', 'start', 'end', 'showAll')); } /** diff --git a/resources/views/categories/show.twig b/resources/views/categories/show.twig index 7aac600ed1..894a981e89 100644 --- a/resources/views/categories/show.twig +++ b/resources/views/categories/show.twig @@ -28,7 +28,8 @@
- {% else %} + {% endif %} + {% if not entries and not showAll %} {# single chart #}
@@ -41,6 +42,19 @@
{% endif %} + {% if not entries and showAll %} + {# all chart #} +
+
+
+

{{ 'overview'|_ }} ({{ 'all_periods'|_|lower }})

+
+
+ +
+
+
+ {% endif %}
From d2d5b1ac761b8cb32eda453d06a3d3019ec06e06 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 11:08:52 +0100 Subject: [PATCH 029/350] More subtle currency warning [skip ci] --- app/Http/Controllers/CurrencyController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/CurrencyController.php b/app/Http/Controllers/CurrencyController.php index c57e86b7ea..e003005e4e 100644 --- a/app/Http/Controllers/CurrencyController.php +++ b/app/Http/Controllers/CurrencyController.php @@ -170,7 +170,7 @@ class CurrencyController extends Controller if (!auth()->user()->hasRole('owner')) { - Session::flash('warning', trans('firefly.ask_site_owner', ['site_owner' => env('SITE_OWNER')])); + Session::flash('info', trans('firefly.ask_site_owner', ['owner' => env('SITE_OWNER')])); } From 50661bbb3bdd3f44e7829f94501ba1722132afa8 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 13:05:31 +0100 Subject: [PATCH 030/350] Some more demo text [skip ci] --- resources/lang/en_US/demo.php | 4 +++- resources/views/demo/currencies/index.twig | 1 + resources/views/demo/piggy-banks/index.twig | 1 + resources/views/demo/transactions/index.twig | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 resources/views/demo/currencies/index.twig create mode 100644 resources/views/demo/piggy-banks/index.twig create mode 100644 resources/views/demo/transactions/index.twig diff --git a/resources/lang/en_US/demo.php b/resources/lang/en_US/demo.php index d6e1d79b87..44ecbf26c9 100644 --- a/resources/lang/en_US/demo.php +++ b/resources/lang/en_US/demo.php @@ -15,6 +15,8 @@ return [ 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, I\'m saving up for three things. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', ]; \ No newline at end of file diff --git a/resources/views/demo/currencies/index.twig b/resources/views/demo/currencies/index.twig new file mode 100644 index 0000000000..9d155e1181 --- /dev/null +++ b/resources/views/demo/currencies/index.twig @@ -0,0 +1 @@ +{{ trans('demo.currencies-index') }} \ No newline at end of file diff --git a/resources/views/demo/piggy-banks/index.twig b/resources/views/demo/piggy-banks/index.twig new file mode 100644 index 0000000000..ea776d4f25 --- /dev/null +++ b/resources/views/demo/piggy-banks/index.twig @@ -0,0 +1 @@ +{{ trans('demo.piggy-banks-index') }} \ No newline at end of file diff --git a/resources/views/demo/transactions/index.twig b/resources/views/demo/transactions/index.twig new file mode 100644 index 0000000000..8a212172ce --- /dev/null +++ b/resources/views/demo/transactions/index.twig @@ -0,0 +1 @@ +{{ trans('demo.transactions-index') }} \ No newline at end of file From d520849ce131b5aa247aab6d3210b547d1cc7744 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 13:06:41 +0100 Subject: [PATCH 031/350] Some more demo text [skip ci] --- resources/lang/en_US/demo.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/lang/en_US/demo.php b/resources/lang/en_US/demo.php index 44ecbf26c9..e8da707bfa 100644 --- a/resources/lang/en_US/demo.php +++ b/resources/lang/en_US/demo.php @@ -17,6 +17,5 @@ return [ 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', - 'piggy-banks-index' => 'As you can see, I\'m saving up for three things. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', - + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', ]; \ No newline at end of file From f46cf5591262ca31397ea56184301db767fe8e97 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 13:12:13 +0100 Subject: [PATCH 032/350] New translations --- resources/lang/zh_HK/demo.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/lang/zh_HK/demo.php b/resources/lang/zh_HK/demo.php index d6e1d79b87..e8da707bfa 100644 --- a/resources/lang/zh_HK/demo.php +++ b/resources/lang/zh_HK/demo.php @@ -15,6 +15,7 @@ return [ 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - - + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', ]; \ No newline at end of file From 6b785e43180ef1bce85e07f4d0911689dea5bae2 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 13:12:14 +0100 Subject: [PATCH 033/350] New translations --- resources/lang/zh_TW/demo.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/lang/zh_TW/demo.php b/resources/lang/zh_TW/demo.php index d6e1d79b87..e8da707bfa 100644 --- a/resources/lang/zh_TW/demo.php +++ b/resources/lang/zh_TW/demo.php @@ -15,6 +15,7 @@ return [ 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - - + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', ]; \ No newline at end of file From 689d91e30fe25b4dd5db766017e4c960c6630c11 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 13:12:17 +0100 Subject: [PATCH 034/350] New translations --- resources/lang/hr_HR/demo.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/lang/hr_HR/demo.php b/resources/lang/hr_HR/demo.php index d6e1d79b87..e8da707bfa 100644 --- a/resources/lang/hr_HR/demo.php +++ b/resources/lang/hr_HR/demo.php @@ -15,6 +15,7 @@ return [ 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - - + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', ]; \ No newline at end of file From bdc72aee42d56be2eb31afe99a050f314df1964a Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 13:12:18 +0100 Subject: [PATCH 035/350] New translations --- resources/lang/nl_NL/demo.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/lang/nl_NL/demo.php b/resources/lang/nl_NL/demo.php index d6e1d79b87..e8da707bfa 100644 --- a/resources/lang/nl_NL/demo.php +++ b/resources/lang/nl_NL/demo.php @@ -15,6 +15,7 @@ return [ 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - - + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', ]; \ No newline at end of file From 0658c17adb0dc036be0b76200f67eb17e7aea5d1 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 13:12:20 +0100 Subject: [PATCH 036/350] New translations --- resources/lang/es_ES/demo.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/lang/es_ES/demo.php b/resources/lang/es_ES/demo.php index d6e1d79b87..e8da707bfa 100644 --- a/resources/lang/es_ES/demo.php +++ b/resources/lang/es_ES/demo.php @@ -15,6 +15,7 @@ return [ 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - - + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', ]; \ No newline at end of file From e4b83392be5623dc189fd54681e22e03c432bb2e Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 13:12:21 +0100 Subject: [PATCH 037/350] New translations --- resources/lang/pt_BR/demo.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/lang/pt_BR/demo.php b/resources/lang/pt_BR/demo.php index d6e1d79b87..e8da707bfa 100644 --- a/resources/lang/pt_BR/demo.php +++ b/resources/lang/pt_BR/demo.php @@ -15,6 +15,7 @@ return [ 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - - + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', ]; \ No newline at end of file From 4815602558c395f985143bc43ac2ff9a9a14681f Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 13:12:22 +0100 Subject: [PATCH 038/350] New translations --- resources/lang/de_DE/demo.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/lang/de_DE/demo.php b/resources/lang/de_DE/demo.php index d6e1d79b87..e8da707bfa 100644 --- a/resources/lang/de_DE/demo.php +++ b/resources/lang/de_DE/demo.php @@ -15,6 +15,7 @@ return [ 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - - + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', ]; \ No newline at end of file From 84a032fbb430fd811dd09ab3898fb638c0d618cc Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 13:12:24 +0100 Subject: [PATCH 039/350] New translations --- resources/lang/fr_FR/demo.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/lang/fr_FR/demo.php b/resources/lang/fr_FR/demo.php index d6e1d79b87..e8da707bfa 100644 --- a/resources/lang/fr_FR/demo.php +++ b/resources/lang/fr_FR/demo.php @@ -15,6 +15,7 @@ return [ 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - - + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', ]; \ No newline at end of file From be201e811dbf6d8a1801ddb4536df5b342772063 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 15:31:17 +0100 Subject: [PATCH 040/350] Clean up report code. --- .../Report/OperationsController.php | 25 ++++++--- .../views/reports/partials/expenses.twig | 41 -------------- .../reports/partials/income-expenses.twig | 55 +++++++++++++++++++ resources/views/reports/partials/income.twig | 41 -------------- 4 files changed, 72 insertions(+), 90 deletions(-) delete mode 100644 resources/views/reports/partials/expenses.twig create mode 100644 resources/views/reports/partials/income-expenses.twig delete mode 100644 resources/views/reports/partials/income.twig diff --git a/app/Http/Controllers/Report/OperationsController.php b/app/Http/Controllers/Report/OperationsController.php index a30954ec7b..f1abe0b96e 100644 --- a/app/Http/Controllers/Report/OperationsController.php +++ b/app/Http/Controllers/Report/OperationsController.php @@ -48,8 +48,9 @@ class OperationsController extends Controller if ($cache->has()) { return $cache->get(); } - $expenses = $this->getExpenseReport($start, $end, $accounts); - $result = view('reports.partials.expenses', compact('expenses'))->render(); + $entries = $this->getExpenseReport($start, $end, $accounts); + $type = 'expense-entry'; + $result = view('reports.partials.income-expenses', compact('entries', 'type'))->render(); $cache->store($result); return $result; @@ -74,9 +75,10 @@ class OperationsController extends Controller if ($cache->has()) { return $cache->get(); } - $income = $this->getIncomeReport($start, $end, $accounts); + $entries = $this->getIncomeReport($start, $end, $accounts); + $type = 'income-entry'; + $result = view('reports.partials.income-expenses', compact('entries', 'type'))->render(); - $result = view('reports.partials.income', compact('income'))->render(); $cache->store($result); return $result; @@ -227,15 +229,22 @@ class OperationsController extends Controller $name = $transaction->opposing_account_name; if (!isset($expenses[$opposingId])) { $expenses[$opposingId] = [ - 'id' => $opposingId, - 'name' => $name, - 'sum' => '0', - 'count' => 0, + 'id' => $opposingId, + 'name' => $name, + 'sum' => '0', + 'average' => '0', + 'count' => 0, ]; } $expenses[$opposingId]['sum'] = bcadd($expenses[$opposingId]['sum'], $transaction->transaction_amount); $expenses[$opposingId]['count']++; } + // do averages: + foreach ($expenses as $key => $entry) { + if ($expenses[$key]['count'] > 1) { + $expenses[$key]['average'] = bcdiv($expenses[$key]['sum'], strval($expenses[$key]['count'])); + } + } return $expenses; diff --git a/resources/views/reports/partials/expenses.twig b/resources/views/reports/partials/expenses.twig deleted file mode 100644 index e1d7956087..0000000000 --- a/resources/views/reports/partials/expenses.twig +++ /dev/null @@ -1,41 +0,0 @@ - - - {% set sum = 0 %} - {% for expense in expenses %} - {% set sum = sum + expense.sum %} - {% if loop.index > listLength %} - - {% else %} - - {% endif %} - - - - {% endfor %} - - - {% if expenses|length > listLength %} - - - - {% endif %} - - - - - -
- {{ expense.name }} - {% if expense.count > 1 %} -
- - {{ expense.count }} {{ 'transactions'|_|lower }} - - - {% endif %} -
- {{ (expense.sum)|formatAmount }} -
- {{ trans('firefly.show_full_list',{number:incomeTopLength}) }} -
{{ 'sum'|_ }}{{ (sum)|formatAmount }}
diff --git a/resources/views/reports/partials/income-expenses.twig b/resources/views/reports/partials/income-expenses.twig new file mode 100644 index 0000000000..de978da6fc --- /dev/null +++ b/resources/views/reports/partials/income-expenses.twig @@ -0,0 +1,55 @@ + + + + + + + + + + {% set sum = 0 %} + {% for entry in entries %} + {% set sum = sum + entry.sum %} + {% if loop.index > listLength %} + + {% else %} + + {% endif %} + + + + + {% endfor %} + + + {% if entries|length > listLength %} + + + + {% endif %} + + + + + +
{{ 'name'|_ }}{{ 'total'|_ }}
+ {{ entry.name }} + {% if entry.count > 1 %} +
+ + {{ entry.count }} {{ 'transactions'|_|lower }} + + + {% endif %} +
+ {{ (entry.sum)|formatAmount }} +
+ {{ trans('firefly.show_full_list',{number:incomeTopLength}) }} +
{{ 'sum'|_ }}{{ (sum)|formatAmount }}
diff --git a/resources/views/reports/partials/income.twig b/resources/views/reports/partials/income.twig deleted file mode 100644 index be2e37dcd0..0000000000 --- a/resources/views/reports/partials/income.twig +++ /dev/null @@ -1,41 +0,0 @@ - - - {% set sum = 0 %} - {% for row in income %} - {% set sum = sum + row.sum %} - {% if loop.index > listLength %} - - {% else %} - - {% endif %} - - - - - {% endfor %} - - - {% if income|length > listLength %} - - - - {% endif %} - - - - - -
- {{ row.name }} - {% if row.count > 1 %} -
- - {{ row.count }} {{ 'transactions'|_|lower }} - - - - {% endif %} -
{{ row.sum|formatAmount }}
- {{ trans('firefly.show_full_list',{ number:listLength } ) }} -
{{ 'sum'|_ }}{{ sum|formatAmount }}
From 349d254193ae381cecd29a3a4b8df40b275d91ce Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 15:46:52 +0100 Subject: [PATCH 041/350] This fixes the tests. --- app/Http/Controllers/ExportController.php | 30 +++++++++---------- .../ExportJob/ExportJobRepository.php | 13 ++++++++ .../ExportJobRepositoryInterface.php | 8 +++++ app/Support/FireflyConfig.php | 3 -- test.sh | 1 + .../Controllers/ExportControllerTest.php | 5 ++++ 6 files changed, 41 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/ExportController.php b/app/Http/Controllers/ExportController.php index f081736c93..7f9d29eb7f 100644 --- a/app/Http/Controllers/ExportController.php +++ b/app/Http/Controllers/ExportController.php @@ -26,7 +26,6 @@ use FireflyIII\Repositories\ExportJob\ExportJobRepositoryInterface; use FireflyIII\Repositories\ExportJob\ExportJobRepositoryInterface as EJRI; use Preferences; use Response; -use Storage; use View; /** @@ -145,7 +144,7 @@ class ExportController extends Controller 'job' => $job, ]; - $job->change('export_status_make_exporter'); + $jobs->changeStatus($job, 'export_status_make_exporter'); /** @var ProcessorInterface $processor */ $processor = app(ProcessorInterface::class, [$settings]); @@ -153,47 +152,46 @@ class ExportController extends Controller /* * Collect journals: */ - $job->change('export_status_collecting_journals'); + $jobs->changeStatus($job, 'export_status_collecting_journals'); $processor->collectJournals(); - $job->change('export_status_collected_journals'); + $jobs->changeStatus($job, 'export_status_collected_journals'); /* * Transform to exportable entries: */ - $job->change('export_status_converting_to_export_format'); + $jobs->changeStatus($job, 'export_status_converting_to_export_format'); $processor->convertJournals(); - $job->change('export_status_converted_to_export_format'); + $jobs->changeStatus($job, 'export_status_converted_to_export_format'); /* * Transform to (temporary) file: */ - $job->change('export_status_creating_journal_file'); + $jobs->changeStatus($job, 'export_status_creating_journal_file'); $processor->exportJournals(); - $job->change('export_status_created_journal_file'); + $jobs->changeStatus($job, 'export_status_created_journal_file'); /* * Collect attachments, if applicable. */ if ($settings['includeAttachments']) { - $job->change('export_status_collecting_attachments'); + $jobs->changeStatus($job, 'export_status_collecting_attachments'); $processor->collectAttachments(); - $job->change('export_status_collected_attachments'); + $jobs->changeStatus($job, 'export_status_collected_attachments'); } /* * Collect old uploads */ if ($settings['includeOldUploads']) { - $job->change('export_status_collecting_old_uploads'); + $jobs->changeStatus($job, 'export_status_collecting_old_uploads'); $processor->collectOldUploads(); - $job->change('export_status_collected_old_uploads'); + $jobs->changeStatus($job, 'export_status_collected_old_uploads'); } /* * Create ZIP file: */ - $job->change('export_status_creating_zip_file'); + $jobs->changeStatus($job, 'export_status_creating_zip_file'); $processor->createZipFile(); - $job->change('export_status_created_zip_file'); - - $job->change('export_status_finished'); + $jobs->changeStatus($job, 'export_status_created_zip_file'); + $jobs->changeStatus($job, 'export_status_finished'); return Response::json('ok'); } diff --git a/app/Repositories/ExportJob/ExportJobRepository.php b/app/Repositories/ExportJob/ExportJobRepository.php index acb8999786..66458230ec 100644 --- a/app/Repositories/ExportJob/ExportJobRepository.php +++ b/app/Repositories/ExportJob/ExportJobRepository.php @@ -39,6 +39,19 @@ class ExportJobRepository implements ExportJobRepositoryInterface $this->user = $user; } + /** + * @param ExportJob $job + * @param string $status + * + * @return bool + */ + public function changeStatus(ExportJob $job, string $status): bool + { + $job->change($status); + + return true; + } + /** * @return bool */ diff --git a/app/Repositories/ExportJob/ExportJobRepositoryInterface.php b/app/Repositories/ExportJob/ExportJobRepositoryInterface.php index 650aac15a6..f9e7a4402d 100644 --- a/app/Repositories/ExportJob/ExportJobRepositoryInterface.php +++ b/app/Repositories/ExportJob/ExportJobRepositoryInterface.php @@ -32,6 +32,14 @@ interface ExportJobRepositoryInterface */ public function create(): ExportJob; + /** + * @param ExportJob $job + * @param string $status + * + * @return bool + */ + public function changeStatus(ExportJob $job, string $status): bool; + /** * @param ExportJob $job * diff --git a/app/Support/FireflyConfig.php b/app/Support/FireflyConfig.php index 9e42c6de17..18f8754b55 100644 --- a/app/Support/FireflyConfig.php +++ b/app/Support/FireflyConfig.php @@ -49,11 +49,8 @@ class FireflyConfig */ public function get($name, $default = null) { - Log::debug('Now in FFConfig::get()', ['name' => $name]); $fullName = 'ff-config-' . $name; if (Cache::has($fullName)) { - Log::debug('Return cache.'); - return Cache::get($fullName); } diff --git a/test.sh b/test.sh index befdb1c714..3c06c5acec 100755 --- a/test.sh +++ b/test.sh @@ -81,6 +81,7 @@ then echo "Will not reset database" fi +echo "Copy test database over original" # take database from copy: cp $DATABASECOPY $DATABASE diff --git a/tests/acceptance/Controllers/ExportControllerTest.php b/tests/acceptance/Controllers/ExportControllerTest.php index ee94794c22..f0eb8d5716 100644 --- a/tests/acceptance/Controllers/ExportControllerTest.php +++ b/tests/acceptance/Controllers/ExportControllerTest.php @@ -9,6 +9,7 @@ * See the LICENSE file for details. */ use FireflyIII\Export\Processor; +use FireflyIII\Models\ExportJob; use FireflyIII\Repositories\ExportJob\ExportJobRepositoryInterface; /** @@ -83,6 +84,10 @@ class ExportControllerTest extends TestCase $processor->shouldReceive('exportJournals')->once(); $processor->shouldReceive('createZipFile')->once(); + $repository = $this->mock(ExportJobRepositoryInterface::class); + $repository->shouldReceive('changeStatus')->andReturn(true); + $repository->shouldReceive('findByKey')->andReturn(new ExportJob); + $this->be($this->user()); $this->call('post', route('export.export'), $data); From 0f3d4062d7f97845582ce56b5f7930afd6750ac8 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 15:51:14 +0100 Subject: [PATCH 042/350] Translated --- resources/lang/nl_NL/firefly.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/lang/nl_NL/firefly.php b/resources/lang/nl_NL/firefly.php index 8581e752b0..7979bdc82b 100644 --- a/resources/lang/nl_NL/firefly.php +++ b/resources/lang/nl_NL/firefly.php @@ -99,9 +99,9 @@ return [ 'cannot_change_demo' => 'Je kan het wachtwoord van de demonstratie-account niet wijzigen.', 'cannot_delete_demo' => 'Je kan de demonstratie-account niet verwijderen.', 'cannot_reset_demo_user' => 'Je kan het wachtwoord van de demonstratie-account niet resetten', - 'per_period' => 'Per period', - 'all_periods' => 'All periods', - 'show_the_current_period_and_overview' => 'Show the current period and overview', + 'per_period' => 'Per periode', + 'all_periods' => 'Alle perioden', + 'show_the_current_period_and_overview' => 'Bekijk de huidige periode en overzicht', // repeat frequencies: 'repeat_freq_yearly' => 'jaarlijks', From fc0024faa2953f2065c0485378c7c1a6053401cc Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 15:54:36 +0100 Subject: [PATCH 043/350] Can now inform about the lack of certain charts [skip ci] --- public/js/ff/charts.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/public/js/ff/charts.js b/public/js/ff/charts.js index 7180a9c131..de470ba9e4 100644 --- a/public/js/ff/charts.js +++ b/public/js/ff/charts.js @@ -180,7 +180,6 @@ function doubleYNonStackedChart(URI, container) { } - /** * * @param URI @@ -253,11 +252,17 @@ function drawAChart(URI, container, chartType, options, colorData) { console.log(chartType + " chart in " + container + " has no data."); // remove the chart container + parent var holder = $('#' + container).parent().parent(); - if (holder.hasClass('box')) { + if (holder.hasClass('box') || holder.hasClass('box-body')) { // find box-body: - var boxBody = holder.find('.box-body'); + var boxBody; + if (!holder.hasClass('box-body')) { + boxBody = holder.find('.box-body'); + } else { + boxBody = holder; + } boxBody.empty().append($('

').append($('').text(noDataForChart))); - //holder.remove(); + } else { + console.log("Want to add text but holder has classes: " + holder.attr("class")); } return; } From cbbadc3d6d382a17c53bab76ed035d41bf0264dd Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 15:54:49 +0100 Subject: [PATCH 044/350] Less logging in often used class. --- app/Support/FireflyConfig.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/Support/FireflyConfig.php b/app/Support/FireflyConfig.php index 18f8754b55..743dc40c2a 100644 --- a/app/Support/FireflyConfig.php +++ b/app/Support/FireflyConfig.php @@ -58,22 +58,15 @@ class FireflyConfig if ($config) { Cache::forever($fullName, $config); - Log::debug('Return found one.'); return $config; } // no preference found and default is null: if (is_null($default)) { - // return NULL - Log::debug('Return null.'); - return null; } - Log::debug('Return this->set().'); - return $this->set($name, $default); - } /** From 3e61a1e12b37aa5bbec6e6513cc7e4970a136e76 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 17:51:45 +0100 Subject: [PATCH 045/350] New translations --- resources/lang/ru_RU/csv.php | 80 ++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 resources/lang/ru_RU/csv.php diff --git a/resources/lang/ru_RU/csv.php b/resources/lang/ru_RU/csv.php new file mode 100644 index 0000000000..4acb52efdc --- /dev/null +++ b/resources/lang/ru_RU/csv.php @@ -0,0 +1,80 @@ + 'Configure your import', + 'import_configure_intro' => 'There are some options for your CSV import. Please indicate if your CSV file contains headers on the first column, and what the date format of your date-fields is. That might require some experimentation. The field delimiter is usually a ",", but could also be a ";". Check this carefully.', + 'import_configure_form' => 'Basic CSV import options', + 'header_help' => 'Check this if the first row of your CSV file are the column titles', + 'date_help' => 'Date time format in your CSV. Follow the format like this page indicates. The default value will parse dates that look like this: :dateExample.', + 'delimiter_help' => 'Choose the field delimiter that is used in your input file. If not sure, comma is the safest option.', + 'import_account_help' => 'If your CSV file does NOT contain information about your asset account(s), use this dropdown to select to which account the transactions in the CSV belong to.', + 'upload_not_writeable' => 'The grey box contains a file path. It should be writeable. Please make sure it is.', + + // roles + 'column_roles_title' => 'Define column roles', + 'column_roles_table' => 'Table', + 'column_name' => 'Name of column', + 'column_example' => 'Column example data', + 'column_role' => 'Column data meaning', + 'do_map_value' => 'Map these values', + 'column' => 'Column', + 'no_example_data' => 'No example data available', + 'store_column_roles' => 'Continue import', + 'do_not_map' => '(do not map)', + 'map_title' => 'Connect import data to Firefly III data', + 'map_text' => 'In the following tables, the left value shows you information found in your uploaded CSV file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.', + + 'field_value' => 'Field value', + 'field_mapped_to' => 'Mapped to', + 'store_column_mapping' => 'Store mapping', + + // map things. + + + 'column__ignore' => '(ignore this column)', + 'column_account-iban' => 'Asset account (IBAN)', + 'column_account-id' => 'Asset account ID (matching Firefly)', + 'column_account-name' => 'Asset account (name)', + 'column_amount' => 'Amount', + 'column_amount-comma-separated' => 'Amount (comma as decimal separator)', + 'column_bill-id' => 'Bill ID (matching Firefly)', + 'column_bill-name' => 'Bill name', + 'column_budget-id' => 'Budget ID (matching Firefly)', + 'column_budget-name' => 'Budget name', + 'column_category-id' => 'Category ID (matching Firefly)', + 'column_category-name' => 'Category name', + 'column_currency-code' => 'Currency code (ISO 4217)', + 'column_currency-id' => 'Currency ID (matching Firefly)', + 'column_currency-name' => 'Currency name (matching Firefly)', + 'column_currency-symbol' => 'Currency symbol (matching Firefly)', + 'column_date-interest' => 'Interest calculation date', + 'column_date-book' => 'Transaction booking date', + 'column_date-process' => 'Transaction process date', + 'column_date-transaction' => 'Date', + 'column_description' => 'Description', + 'column_opposing-iban' => 'Opposing account (IBAN)', + 'column_opposing-id' => 'Opposing account ID (matching Firefly)', + 'column_external-id' => 'External ID', + 'column_opposing-name' => 'Opposing account (name)', + 'column_rabo-debet-credit' => 'Rabobank specific debet/credit indicator', + 'column_ing-debet-credit' => 'ING specific debet/credit indicator', + 'column_sepa-ct-id' => 'SEPA Credit Transfer end-to-end ID', + 'column_sepa-ct-op' => 'SEPA Credit Transfer opposing account', + 'column_sepa-db' => 'SEPA Direct Debet', + 'column_tags-comma' => 'Tags (comma separated)', + 'column_tags-space' => 'Tags (space separated)', + 'column_account-number' => 'Asset account (account number)', + 'column_opposing-number' => 'Opposing account (account number)', +]; \ No newline at end of file From 85dae15a0d2aab348538b857c77c00c62b79d9a6 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 17:51:49 +0100 Subject: [PATCH 046/350] New translations --- resources/lang/ru_RU/firefly.php | 956 +++++++++++++++++++++++++++++++ 1 file changed, 956 insertions(+) create mode 100644 resources/lang/ru_RU/firefly.php diff --git a/resources/lang/ru_RU/firefly.php b/resources/lang/ru_RU/firefly.php new file mode 100644 index 0000000000..900cc6c6f7 --- /dev/null +++ b/resources/lang/ru_RU/firefly.php @@ -0,0 +1,956 @@ + 'incomplete translation', + 'close' => 'Close', + 'actions' => 'Actions', + 'edit' => 'Edit', + 'delete' => 'Delete', + 'welcomeBack' => 'What\'s playing?', + 'everything' => 'Everything', + 'customRange' => 'Custom range', + 'apply' => 'Apply', + 'cancel' => 'Cancel', + 'from' => 'From', + 'to' => 'To', + 'showEverything' => 'Show everything', + 'never' => 'Never', + 'search_results_for' => 'Search results for ":query"', + 'bounced_error' => 'The message sent to :email bounced, so no access for you.', + 'deleted_error' => 'These credentials do not match our records.', + 'general_blocked_error' => 'Your account has been disabled, so you cannot login.', + 'expired_error' => 'Your account has expired, and can no longer be used.', + 'removed_amount' => 'Removed :amount', + 'added_amount' => 'Added :amount', + 'asset_account_role_help' => 'Any extra options resulting from your choice can be set later.', + 'Opening balance' => 'Opening balance', + 'create_new_stuff' => 'Create new stuff', + 'new_withdrawal' => 'New withdrawal', + 'new_deposit' => 'New deposit', + 'new_transfer' => 'New transfer', + 'new_asset_account' => 'New asset account', + 'new_expense_account' => 'New expense account', + 'new_revenue_account' => 'New revenue account', + 'new_budget' => 'New budget', + 'new_bill' => 'New bill', + 'block_account_logout' => 'You have been logged out. Blocked accounts cannot use this site. Did you register with a valid email address?', + 'flash_success' => 'Success!', + 'flash_info' => 'Message', + 'flash_warning' => 'Warning!', + 'flash_error' => 'Error!', + 'flash_info_multiple' => 'There is one message|There are :count messages', + 'flash_error_multiple' => 'There is one error|There are :count errors', + 'net_worth' => 'Net worth', + 'route_has_no_help' => 'There is no help for this route.', + 'help_may_not_be_your_language' => 'This help text is in English. It is not yet available in your language', + 'two_factor_welcome' => 'Hello, :user!', + 'two_factor_enter_code' => 'To continue, please enter your two factor authentication code. Your application can generate it for you.', + 'two_factor_code_here' => 'Enter code here', + 'two_factor_title' => 'Two factor authentication', + 'authenticate' => 'Authenticate', + 'two_factor_forgot_title' => 'Lost two factor authentication', + 'two_factor_forgot' => 'I forgot my two-factor thing.', + 'two_factor_lost_header' => 'Lost your two factor authentication?', + 'two_factor_lost_intro' => 'Unfortunately, this is not something you can reset from the web interface. You have two choices.', + 'two_factor_lost_fix_self' => 'If you run your own instance of Firefly III, check the logs in storage/logs for instructions.', + 'two_factor_lost_fix_owner' => 'Otherwise, email the site owner, :site_owner and ask them to reset your two factor authentication.', + 'warning_much_data' => ':days days of data may take a while to load.', + 'registered' => 'You have registered successfully!', + 'search' => 'Search', + 'search_found_accounts' => 'Found :count account(s) for your query.', + 'search_found_categories' => 'Found :count category(ies) for your query.', + 'search_found_budgets' => 'Found :count budget(s) for your query.', + 'search_found_tags' => 'Found :count tag(s) for your query.', + 'search_found_transactions' => 'Found :count transaction(s) for your query.', + 'results_limited' => 'The results are limited to :count entries.', + 'tagbalancingAct' => 'Balancing act', + 'tagadvancePayment' => 'Advance payment', + 'tagnothing' => '', + 'Default asset account' => 'Default asset account', + 'no_budget_pointer' => 'You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.', + 'Savings account' => 'Savings account', + 'Credit card' => 'Credit card', + 'source_accounts' => 'Source account(s)', + 'destination_accounts' => 'Destination account(s)', + 'user_id_is' => 'Your user id is :user', + 'field_supports_markdown' => 'This field supports Markdown.', + 'need_more_help' => 'If you need more help using Firefly III, please open a ticket on Github.', + 'nothing_to_display' => 'There are no transactions to show you', + 'show_all_no_filter' => 'Show all transactions without grouping them by date.', + 'expenses_by_category' => 'Expenses by category', + 'expenses_by_budget' => 'Expenses by budget', + 'income_by_category' => 'Income by category', + 'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.', + 'sum_of_expenses' => 'Sum of expenses', + 'sum_of_income' => 'Sum of income', + 'spent_in_specific_budget' => 'Spent in budget ":budget"', + 'sum_of_expenses_in_budget' => 'Spent total in budget ":budget"', + 'left_in_budget_limit' => 'Left to spend according to budgeting', + 'cannot_change_demo' => 'You cannot change the password of the demonstration account.', + 'cannot_delete_demo' => 'You cannot remove the demonstration account.', + 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', + 'per_period' => 'Per period', + 'all_periods' => 'All periods', + 'show_the_current_period_and_overview' => 'Show the current period and overview', + + // repeat frequencies: + 'repeat_freq_yearly' => 'yearly', + 'repeat_freq_monthly' => 'monthly', + 'weekly' => 'weekly', + 'quarterly' => 'quarterly', + 'half-year' => 'every half year', + 'yearly' => 'yearly', + // account confirmation: + 'confirm_account_header' => 'Please confirm your account', + 'confirm_account_intro' => 'An email has been sent to the address you used during your registration. Please check it out for further instructions. If you did not get this message, you can have Firefly send it again.', + 'confirm_account_resend_email' => 'Send me the confirmation message I need to activate my account.', + 'account_is_confirmed' => 'Your account has been confirmed!', + 'invalid_activation_code' => 'It seems the code you are using is not valid, or has expired.', + 'confirm_account_is_resent_header' => 'The confirmation has been resent', + 'confirm_account_is_resent_text' => 'The confirmation message has been resent. If you still did not receive the confirmation message, please contact the site owner at :owner or check the log files to see what went wrong.', + 'confirm_account_is_resent_go_home' => 'Go to the index page of Firefly', + 'confirm_account_not_resent_header' => 'Something went wrong :(', + 'confirm_account_not_resent_intro' => 'The confirmation message has been not resent. If you still did not receive the confirmation message, please contact the site owner at :owner instead. Possibly, you have tried to resend the activation message too often. You can have Firefly III try to resend the confirmation message every hour.', + 'confirm_account_not_resent_go_home' => 'Go to the index page of Firefly', + + // export data: + 'import_and_export' => 'Import and export', + 'export_data' => 'Export data', + 'export_data_intro' => 'For backup purposes, when migrating to another system or when migrating to another Firefly III installation.', + 'export_format' => 'Export format', + 'export_format_csv' => 'Comma separated values (CSV file)', + 'export_format_mt940' => 'MT940 compatible format', + 'export_included_accounts' => 'Export transactions from these accounts', + 'include_old_uploads_help' => 'Firefly III does not throw away the original CSV files you have imported in the past. You can include them in your export.', + 'do_export' => 'Export', + 'export_status_never_started' => 'The export has not started yet', + 'export_status_make_exporter' => 'Creating exporter thing...', + 'export_status_collecting_journals' => 'Collecting your transactions...', + 'export_status_collected_journals' => 'Collected your transactions!', + 'export_status_converting_to_export_format' => 'Converting your transactions...', + 'export_status_converted_to_export_format' => 'Converted your transactions!', + 'export_status_creating_journal_file' => 'Creating the export file...', + 'export_status_created_journal_file' => 'Created the export file!', + 'export_status_collecting_attachments' => 'Collecting all your attachments...', + 'export_status_collected_attachments' => 'Collected all your attachments!', + 'export_status_collecting_old_uploads' => 'Collecting all your previous uploads...', + 'export_status_collected_old_uploads' => 'Collected all your previous uploads!', + 'export_status_creating_config_file' => 'Creating a configuration file...', + 'export_status_created_config_file' => 'Created a configuration file!', + 'export_status_creating_zip_file' => 'Creating a zip file...', + 'export_status_created_zip_file' => 'Created a zip file!', + 'export_status_finished' => 'Export has succesfully finished! Yay!', + 'export_data_please_wait' => 'Please wait...', + 'attachment_explanation' => 'The file called \':attachment_name\' (#:attachment_id) was originally uploaded to :type \':description\' (#:journal_id) dated :date for the amount of :amount.', + + // rules + 'rules' => 'Rules', + 'rules_explanation' => 'Here you can manage rules. Rules are triggered when a transaction is created or updated. Then, if the transaction has certain properties (called "triggers") Firefly will execute the "actions". Combined, you can make Firefly respond in a certain way to new transactions.', + 'rule_name' => 'Name of rule', + 'rule_triggers' => 'Rule triggers when', + 'rule_actions' => 'Rule will', + 'new_rule' => 'New rule', + 'new_rule_group' => 'New rule group', + 'rule_priority_up' => 'Give rule more priority', + 'rule_priority_down' => 'Give rule less priority', + 'make_new_rule_group' => 'Make new rule group', + 'store_new_rule_group' => 'Store new rule group', + 'created_new_rule_group' => 'New rule group ":title" stored!', + 'updated_rule_group' => 'Successfully updated rule group ":title".', + 'edit_rule_group' => 'Edit rule group ":title"', + 'delete_rule_group' => 'Delete rule group ":title"', + 'deleted_rule_group' => 'Deleted rule group ":title"', + 'update_rule_group' => 'Update rule group', + 'no_rules_in_group' => 'There are no rules in this group', + 'move_rule_group_up' => 'Move rule group up', + 'move_rule_group_down' => 'Move rule group down', + 'save_rules_by_moving' => 'Save these rule(s) by moving them to another rule group:', + 'make_new_rule' => 'Make new rule in rule group ":title"', + 'rule_help_stop_processing' => 'When you check this box, later rules in this group will not be executed.', + 'rule_help_active' => 'Inactive rules will never fire.', + 'stored_new_rule' => 'Stored new rule with title ":title"', + 'deleted_rule' => 'Deleted rule with title ":title"', + 'store_new_rule' => 'Store new rule', + 'updated_rule' => 'Updated rule with title ":title"', + 'default_rule_group_name' => 'Default rules', + 'default_rule_group_description' => 'All your rules not in a particular group.', + 'default_rule_name' => 'Your first default rule', + 'default_rule_description' => 'This rule is an example. You can safely delete it.', + 'default_rule_trigger_description' => 'The Man Who Sold the World', + 'default_rule_trigger_from_account' => 'David Bowie', + 'default_rule_action_prepend' => 'Bought the world from ', + 'default_rule_action_set_category' => 'Large expenses', + 'trigger' => 'Trigger', + 'trigger_value' => 'Trigger on value', + 'stop_processing_other_triggers' => 'Stop processing other triggers', + 'add_rule_trigger' => 'Add new trigger', + 'action' => 'Action', + 'action_value' => 'Action value', + 'stop_executing_other_actions' => 'Stop executing other actions', + 'add_rule_action' => 'Add new action', + 'edit_rule' => 'Edit rule ":title"', + 'delete_rule' => 'Delete rule ":title"', + 'update_rule' => 'Update rule', + 'test_rule_triggers' => 'See matching transactions', + 'warning_transaction_subset' => 'For performance reasons this list is limited to :max_num_transactions and may only show a subset of matching transactions', + 'warning_no_matching_transactions' => 'No matching transactions found. Please note that for performance reasons, only the last :num_transactions transactions have been checked.', + 'warning_no_valid_triggers' => 'No valid triggers provided.', + 'execute_on_existing_transactions' => 'Execute for existing transactions', + 'rule_group_select_transactions' => 'Execute rule group ":title" on existing transactions', + 'execute_on_existing_transactions_intro' => 'When a rule or group has been changed or added, you can execute it for existing transactions', + 'execute_on_existing_transactions_short' => 'Existing transactions', + 'executed_group_on_existing_transactions' => 'Executed group ":title" for existing transactions', + 'execute_group_on_existing_transactions' => 'Execute group ":title" for existing transactions', + 'include_transactions_from_accounts' => 'Include transactions from these accounts', + 'execute' => 'Execute', + + // actions and triggers + 'rule_trigger_user_action' => 'User action is ":trigger_value"', + 'rule_trigger_from_account_starts' => 'Source account starts with ":trigger_value"', + 'rule_trigger_from_account_ends' => 'Source account ends with ":trigger_value"', + 'rule_trigger_from_account_is' => 'Source account is ":trigger_value"', + 'rule_trigger_from_account_contains' => 'Source account contains ":trigger_value"', + 'rule_trigger_to_account_starts' => 'Destination account starts with ":trigger_value"', + 'rule_trigger_to_account_ends' => 'Destination account ends with ":trigger_value"', + 'rule_trigger_to_account_is' => 'Destination account is ":trigger_value"', + 'rule_trigger_to_account_contains' => 'Destination account contains ":trigger_value"', + 'rule_trigger_transaction_type' => 'Transaction is of type ":trigger_value"', + 'rule_trigger_amount_less' => 'Amount is less than :trigger_value', + 'rule_trigger_amount_exactly' => 'Amount is :trigger_value', + 'rule_trigger_amount_more' => 'Amount is more than :trigger_value', + 'rule_trigger_description_starts' => 'Description starts with ":trigger_value"', + 'rule_trigger_description_ends' => 'Description ends with ":trigger_value"', + 'rule_trigger_description_contains' => 'Description contains ":trigger_value"', + 'rule_trigger_description_is' => 'Description is ":trigger_value"', + 'rule_trigger_from_account_starts_choice' => 'Source account starts with..', + 'rule_trigger_from_account_ends_choice' => 'Source account ends with..', + 'rule_trigger_from_account_is_choice' => 'Source account is..', + 'rule_trigger_from_account_contains_choice' => 'Source account contains..', + 'rule_trigger_to_account_starts_choice' => 'Destination account starts with..', + 'rule_trigger_to_account_ends_choice' => 'Destination account ends with..', + 'rule_trigger_to_account_is_choice' => 'Destination account is..', + 'rule_trigger_to_account_contains_choice' => 'Destination account contains..', + 'rule_trigger_transaction_type_choice' => 'Transaction is of type..', + 'rule_trigger_amount_less_choice' => 'Amount is less than..', + 'rule_trigger_amount_exactly_choice' => 'Amount is..', + 'rule_trigger_amount_more_choice' => 'Amount is more than..', + 'rule_trigger_description_starts_choice' => 'Description starts with..', + 'rule_trigger_description_ends_choice' => 'Description ends with..', + 'rule_trigger_description_contains_choice' => 'Description contains..', + 'rule_trigger_description_is_choice' => 'Description is..', + 'rule_trigger_store_journal' => 'When a transaction is created', + 'rule_trigger_update_journal' => 'When a transaction is updated', + 'rule_action_set_category' => 'Set category to ":action_value"', + 'rule_action_clear_category' => 'Clear category', + 'rule_action_set_budget' => 'Set budget to ":action_value"', + 'rule_action_clear_budget' => 'Clear budget', + 'rule_action_add_tag' => 'Add tag ":action_value"', + 'rule_action_remove_tag' => 'Remove tag ":action_value"', + 'rule_action_remove_all_tags' => 'Remove all tags', + 'rule_action_set_description' => 'Set description to ":action_value"', + 'rule_action_append_description' => 'Append description with ":action_value"', + 'rule_action_prepend_description' => 'Prepend description with ":action_value"', + 'rule_action_set_category_choice' => 'Set category to..', + 'rule_action_clear_category_choice' => 'Clear any category', + 'rule_action_set_budget_choice' => 'Set budget to..', + 'rule_action_clear_budget_choice' => 'Clear any budget', + 'rule_action_add_tag_choice' => 'Add tag..', + 'rule_action_remove_tag_choice' => 'Remove tag..', + 'rule_action_remove_all_tags_choice' => 'Remove all tags', + 'rule_action_set_description_choice' => 'Set description to..', + 'rule_action_append_description_choice' => 'Append description with..', + 'rule_action_prepend_description_choice' => 'Prepend description with..', + 'rule_action_set_source_account_choice' => 'Set source account to...', + 'rule_action_set_source_account' => 'Set source account to :action_value', + 'rule_action_set_destination_account_choice' => 'Set destination account to...', + 'rule_action_set_destination_account' => 'Set destination account to :action_value', + + // tags + 'store_new_tag' => 'Store new tag', + 'update_tag' => 'Update tag', + 'no_location_set' => 'No location set.', + 'meta_data' => 'Meta data', + 'location' => 'Location', + + // preferences + 'pref_home_screen_accounts' => 'Home screen accounts', + 'pref_home_screen_accounts_help' => 'Which accounts should be displayed on the home page?', + 'pref_view_range' => 'View range', + 'pref_view_range_help' => 'Some charts are automatically grouped in periods. What period would you prefer?', + 'pref_1D' => 'One day', + 'pref_1W' => 'One week', + 'pref_1M' => 'One month', + 'pref_3M' => 'Three months (quarter)', + 'pref_6M' => 'Six months', + 'pref_1Y' => 'One year', + 'pref_languages' => 'Languages', + 'pref_languages_help' => 'Firefly III supports several languages. Which one do you prefer?', + 'pref_custom_fiscal_year' => 'Fiscal year settings', + 'pref_custom_fiscal_year_label' => 'Enabled', + 'pref_custom_fiscal_year_help' => 'In countries that use a financial year other than January 1 to December 31, you can switch this on and specify start / end days of the fiscal year', + 'pref_fiscal_year_start_label' => 'Fiscal year start date', + 'pref_two_factor_auth' => '2-step verification', + 'pref_two_factor_auth_help' => 'When you enable 2-step verification (also known as two-factor authentication), you add an extra layer of security to your account. You sign in with something you know (your password) and something you have (a verification code). Verification codes are generated by an application on your phone, such as Authy or Google Authenticator.', + 'pref_enable_two_factor_auth' => 'Enable 2-step verification', + 'pref_two_factor_auth_disabled' => '2-step verification code removed and disabled', + 'pref_two_factor_auth_remove_it' => 'Don\'t forget to remove the account from your authentication app!', + 'pref_two_factor_auth_code' => 'Verify code', + 'pref_two_factor_auth_code_help' => 'Scan the QR code with an application on your phone such as Authy or Google Authenticator and enter the generated code.', + 'pref_two_factor_auth_reset_code' => 'Reset verification code', + 'pref_two_factor_auth_remove_code' => 'Remove verification code', + 'pref_two_factor_auth_remove_will_disable' => '(this will also disable two-factor authentication)', + 'pref_save_settings' => 'Save settings', + 'saved_preferences' => 'Preferences saved!', + 'preferences_general' => 'General', + 'preferences_frontpage' => 'Home screen', + 'preferences_security' => 'Security', + 'preferences_layout' => 'Layout', + 'pref_home_show_deposits' => 'Show deposits on the home screen', + 'pref_home_show_deposits_info' => 'The home screen already shows your expense accounts. Should it also show your revenue accounts?', + 'pref_home_do_show_deposits' => 'Yes, show them', + 'successful_count' => 'of which :count successful', + 'transaction_page_size_title' => 'Page size', + 'transaction_page_size_help' => 'Any list of transactions shows at most this many transactions', + 'transaction_page_size_label' => 'Page size', + 'between_dates' => '(:start and :end)', + 'pref_optional_fields_transaction' => 'Optional fields for transactions', + 'pref_optional_fields_transaction_help' => 'By default not all fields are enabled when creating a new transaction (because of the clutter). Below, you can enable these fields if you think they could be useful for you. Of course, any field that is disabled, but already filled in, will be visible regardless of the setting.', + 'optional_tj_date_fields' => 'Date fields', + 'optional_tj_business_fields' => 'Business fields', + 'optional_tj_attachment_fields' => 'Attachment fields', + 'pref_optional_tj_interest_date' => 'Interest date', + 'pref_optional_tj_book_date' => 'Book date', + 'pref_optional_tj_process_date' => 'Processing date', + 'pref_optional_tj_due_date' => 'Due date', + 'pref_optional_tj_payment_date' => 'Payment date', + 'pref_optional_tj_invoice_date' => 'Invoice date', + 'pref_optional_tj_internal_reference' => 'Internal reference', + 'pref_optional_tj_notes' => 'Notes', + 'pref_optional_tj_attachments' => 'Attachments', + 'optional_field_meta_dates' => 'Dates', + 'optional_field_meta_business' => 'Business', + 'optional_field_attachments' => 'Attachments', + 'optional_field_meta_data' => 'Optional meta data', + + + // profile: + 'change_your_password' => 'Change your password', + 'delete_account' => 'Delete account', + 'current_password' => 'Current password', + 'new_password' => 'New password', + 'new_password_again' => 'New password (again)', + 'delete_your_account' => 'Delete your account', + 'delete_your_account_help' => 'Deleting your account will also delete any accounts, transactions, anything you might have saved into Firefly III. It\'ll be GONE.', + 'delete_your_account_password' => 'Enter your password to continue.', + 'password' => 'Password', + 'are_you_sure' => 'Are you sure? You cannot undo this.', + 'delete_account_button' => 'DELETE your account', + 'invalid_current_password' => 'Invalid current password!', + 'password_changed' => 'Password changed!', + 'should_change' => 'The idea is to change your password.', + 'invalid_password' => 'Invalid password!', + + + // attachments + 'nr_of_attachments' => 'One attachment|:count attachments', + 'attachments' => 'Attachments', + 'edit_attachment' => 'Edit attachment ":name"', + 'update_attachment' => 'Update attachment', + 'delete_attachment' => 'Delete attachment ":name"', + 'attachment_deleted' => 'Deleted attachment ":name"', + 'attachment_updated' => 'Updated attachment ":name"', + 'upload_max_file_size' => 'Maximum file size: :size', + + // tour: + 'prev' => 'Prev', + 'next' => 'Next', + 'end-tour' => 'End tour', + 'pause' => 'Pause', + + // transaction index + 'title_expenses' => 'Expenses', + 'title_withdrawal' => 'Expenses', + 'title_revenue' => 'Revenue / income', + 'title_deposit' => 'Revenue / income', + 'title_transfer' => 'Transfers', + 'title_transfers' => 'Transfers', + + // convert stuff: + 'convert_is_already_type_Withdrawal' => 'This transaction is already a withdrawal', + 'convert_is_already_type_Deposit' => 'This transaction is already a deposit', + 'convert_is_already_type_Transfer' => 'This transaction is already a transfer', + 'convert_to_Withdrawal' => 'Convert ":description" to a withdrawal', + 'convert_to_Deposit' => 'Convert ":description" to a deposit', + 'convert_to_Transfer' => 'Convert ":description" to a transfer', + 'convert_options_WithdrawalDeposit' => 'Convert a withdrawal into a deposit', + 'convert_options_WithdrawalTransfer' => 'Convert a withdrawal into a transfer', + 'convert_options_DepositTransfer' => 'Convert a deposit into a transfer', + 'convert_options_DepositWithdrawal' => 'Convert a deposit into a withdrawal', + 'convert_options_TransferWithdrawal' => 'Convert a transfer into a withdrawal', + 'convert_options_TransferDeposit' => 'Convert a transfer into a deposit', + 'transaction_journal_convert_options' => 'Convert this transaction', + 'convert_Withdrawal_to_deposit' => 'Convert this withdrawal to a deposit', + 'convert_Withdrawal_to_transfer' => 'Convert this withdrawal to a transfer', + 'convert_Deposit_to_withdrawal' => 'Convert this deposit to a withdrawal', + 'convert_Deposit_to_transfer' => 'Convert this deposit to a transfer', + 'convert_Transfer_to_deposit' => 'Convert this transfer to a deposit', + 'convert_Transfer_to_withdrawal' => 'Convert this transfer to a withdrawal', + 'convert_please_set_revenue_source' => 'Please pick the revenue account where the money will come from.', + 'convert_please_set_asset_destination' => 'Please pick the asset account where the money will go to.', + 'convert_please_set_expense_destination' => 'Please pick the expense account where the money will go to.', + 'convert_please_set_asset_source' => 'Please pick the asset account where the money will come from.', + 'convert_explanation_withdrawal_deposit' => 'If you convert this withdrawal into a deposit, :amount will be deposited into :sourceName instead of taken from it.', + 'convert_explanation_withdrawal_transfer' => 'If you convert this withdrawal into a transfer, :amount will be transferred from :sourceName to a new asset account, instead of being paid to :destinationName.', + 'convert_explanation_deposit_withdrawal' => 'If you convert this deposit into a withdrawal, :amount will be removed from :destinationName instead of added to it.', + 'convert_explanation_deposit_transfer' => 'If you convert this deposit into a transfer, :amount will be transferred from an asset account of your choice into :destinationName.', + 'convert_explanation_transfer_withdrawal' => 'If you convert this transfer into a withdrawal, :amount will go from :sourceName to a new destination as an expense, instead of to :destinationName as a transfer.', + 'convert_explanation_transfer_deposit' => 'If you convert this transfer into a deposit, :amount will be deposited into account :destinationName instead of being transferred there.', + 'converted_to_Withdrawal' => 'The transaction has been converted to a withdrawal', + 'converted_to_Deposit' => 'The transaction has been converted to a deposit', + 'converted_to_Transfer' => 'The transaction has been converted to a transfer', + + + // create new stuff: + 'create_new_withdrawal' => 'Create new withdrawal', + 'create_new_deposit' => 'Create new deposit', + 'create_new_transfer' => 'Create new transfer', + 'create_new_asset' => 'Create new asset account', + 'create_new_expense' => 'Create new expense account', + 'create_new_revenue' => 'Create new revenue account', + 'create_new_piggy_bank' => 'Create new piggy bank', + 'create_new_bill' => 'Create new bill', + + // currencies: + 'create_currency' => 'Create a new currency', + 'store_currency' => 'Store new currency', + 'update_currency' => 'Update currency', + 'new_default_currency' => ':name is now the default currency.', + 'cannot_delete_currency' => 'Cannot delete :name because it is still in use.', + 'deleted_currency' => 'Currency :name deleted', + 'created_currency' => 'Currency :name created', + 'updated_currency' => 'Currency :name updated', + 'ask_site_owner' => 'Please ask :owner to add, remove or edit currencies.', + 'currencies_intro' => 'Firefly III supports various currencies which you can set and enable here.', + 'make_default_currency' => 'make default', + 'default_currency' => 'default', + + // new user: + 'submit' => 'Submit', + 'getting_started' => 'Getting started', + 'to_get_started' => 'To get started with Firefly, please enter your current bank\'s name, and the balance of your checking account:', + 'savings_balance_text' => 'If you have a savings account, please enter the current balance of your savings account:', + 'cc_balance_text' => 'If you have a credit card, please enter your credit card\'s limit.', + 'stored_new_account_new_user' => 'Yay! Your new account has been stored.', + 'stored_new_accounts_new_user' => 'Yay! Your new accounts have been stored.', + + // forms: + 'mandatoryFields' => 'Mandatory fields', + 'optionalFields' => 'Optional fields', + 'options' => 'Options', + + // budgets: + 'create_new_budget' => 'Create a new budget', + 'store_new_budget' => 'Store new budget', + 'stored_new_budget' => 'Stored new budget ":name"', + 'available_between' => 'Available between :start and :end', + 'transactionsWithoutBudget' => 'Expenses without budget', + 'transactions_no_budget' => 'Expenses without budget between :start and :end', + 'spent_between' => 'Spent between :start and :end', + 'createBudget' => 'New budget', + 'inactiveBudgets' => 'Inactive budgets', + 'without_budget_between' => 'Transactions without a budget between :start and :end', + 'budget_in_month' => ':name in :month', + 'delete_budget' => 'Delete budget ":name"', + 'deleted_budget' => 'Deleted budget ":name"', + 'edit_budget' => 'Edit budget ":name"', + 'updated_budget' => 'Updated budget ":name"', + 'update_amount' => 'Update amount', + 'update_budget' => 'Update budget', + 'update_budget_amount_range' => 'Update (expected) available amount between :start and :end', + + // bills: + 'matching_on' => 'Matching on', + 'between_amounts' => 'between :low and :high.', + 'repeats' => 'Repeats', + 'connected_journals' => 'Connected transactions', + 'auto_match_on' => 'Automatically matched by Firefly', + 'auto_match_off' => 'Not automatically matched by Firefly', + 'next_expected_match' => 'Next expected match', + 'delete_bill' => 'Delete bill ":name"', + 'deleted_bill' => 'Deleted bill ":name"', + 'edit_bill' => 'Edit bill ":name"', + 'more' => 'More', + 'rescan_old' => 'Rescan old transactions', + 'update_bill' => 'Update bill', + 'updated_bill' => 'Updated bill ":name"', + 'store_new_bill' => 'Store new bill', + 'stored_new_bill' => 'Stored new bill ":name"', + 'cannot_scan_inactive_bill' => 'Inactive bills cannot be scanned.', + 'rescanned_bill' => 'Rescanned everything.', + 'average_bill_amount_year' => 'Average bill amount (:year)', + 'average_bill_amount_overall' => 'Average bill amount (overall)', + 'not_or_not_yet' => 'Not (yet)', + 'not_expected_period' => 'Not expected this period', + // accounts: + 'details_for_asset' => 'Details for asset account ":name"', + 'details_for_expense' => 'Details for expense account ":name"', + 'details_for_revenue' => 'Details for revenue account ":name"', + 'details_for_cash' => 'Details for cash account ":name"', + 'store_new_asset_account' => 'Store new asset account', + 'store_new_expense_account' => 'Store new expense account', + 'store_new_revenue_account' => 'Store new revenue account', + 'edit_asset_account' => 'Edit asset account ":name"', + 'edit_expense_account' => 'Edit expense account ":name"', + 'edit_revenue_account' => 'Edit revenue account ":name"', + 'delete_asset_account' => 'Delete asset account ":name"', + 'delete_expense_account' => 'Delete expense account ":name"', + 'delete_revenue_account' => 'Delete revenue account ":name"', + 'asset_deleted' => 'Successfully deleted asset account ":name"', + 'expense_deleted' => 'Successfully deleted expense account ":name"', + 'revenue_deleted' => 'Successfully deleted revenue account ":name"', + 'update_asset_account' => 'Update asset account', + 'update_expense_account' => 'Update expense account', + 'update_revenue_account' => 'Update revenue account', + 'make_new_asset_account' => 'Create a new asset account', + 'make_new_expense_account' => 'Create a new expense account', + 'make_new_revenue_account' => 'Create a new revenue account', + 'asset_accounts' => 'Asset accounts', + 'expense_accounts' => 'Expense accounts', + 'revenue_accounts' => 'Revenue accounts', + 'cash_accounts' => 'Cash accounts', + 'Cash account' => 'Cash account', + 'account_type' => 'Account type', + 'save_transactions_by_moving' => 'Save these transaction(s) by moving them to another account:', + 'stored_new_account' => 'New account ":name" stored!', + '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_data_for_chart' => 'There is not enough information (yet) to generate this chart.', + 'select_more_than_one_account' => 'Please select more than one account', + 'select_more_than_one_category' => 'Please select more than one category', + 'select_more_than_one_budget' => 'Please select more than one budget', + 'from_to' => 'From :start to :end', + + // categories: + 'new_category' => 'New category', + 'create_new_category' => 'Create a new category', + 'without_category' => 'Without a category', + 'update_category' => 'Update category', + 'updated_category' => 'Updated category ":name"', + 'categories' => 'Categories', + 'edit_category' => 'Edit category ":name"', + 'no_category' => '(no category)', + 'category' => 'Category', + 'delete_category' => 'Delete category ":name"', + 'deleted_category' => 'Deleted category ":name"', + 'store_category' => 'Store new category', + 'stored_category' => 'Stored new category ":name"', + 'without_category_between' => 'Without category between :start and :end', + + // transactions: + 'update_withdrawal' => 'Update withdrawal', + 'update_deposit' => 'Update deposit', + 'update_transfer' => 'Update transfer', + 'updated_withdrawal' => 'Updated withdrawal ":description"', + 'updated_deposit' => 'Updated deposit ":description"', + 'updated_transfer' => 'Updated transfer ":description"', + 'delete_withdrawal' => 'Delete withdrawal ":description"', + 'delete_deposit' => 'Delete deposit ":description"', + 'delete_transfer' => 'Delete transfer ":description"', + 'deleted_withdrawal' => 'Successfully deleted withdrawal ":description"', + 'deleted_deposit' => 'Successfully deleted deposit ":description"', + 'deleted_transfer' => 'Successfully deleted transfer ":description"', + 'stored_journal' => 'Successfully created new transaction ":description"', + 'select_transactions' => 'Select transactions', + 'stop_selection' => 'Stop selecting transactions', + 'edit_selected' => 'Edit selected', + 'delete_selected' => 'Delete selected', + 'mass_delete_journals' => 'Delete a number of transactions', + 'mass_edit_journals' => 'Edit a number of transactions', + 'cannot_edit_other_fields' => 'You cannot mass-edit other fields than the ones here, because there is no room to show them. Please follow the link and edit them by one-by-one, if you need to edit these fields.', + 'perm-delete-many' => 'Deleting many items in one go can be very disruptive. Please be cautious.', + 'mass_deleted_transactions_success' => 'Deleted :amount transaction(s).', + 'mass_edited_transactions_success' => 'Updated :amount transaction(s)', + + + // new user: + 'welcome' => 'Welcome to Firefly!', + + // home page: + 'yourAccounts' => 'Your accounts', + 'budgetsAndSpending' => 'Budgets and spending', + 'savings' => 'Savings', + 'markAsSavingsToContinue' => 'Mark your asset accounts as "Savings account" to fill this panel', + 'createPiggyToContinue' => 'Create piggy banks to fill this panel.', + 'newWithdrawal' => 'New expense', + 'newDeposit' => 'New deposit', + 'newTransfer' => 'New transfer', + 'moneyIn' => 'Money in', + 'moneyOut' => 'Money out', + 'billsToPay' => 'Bills to pay', + 'billsPaid' => 'Bills paid', + 'divided' => 'divided', + 'toDivide' => 'left to divide', + + // menu and titles, should be recycled as often as possible: + 'currency' => 'Currency', + 'preferences' => 'Preferences', + 'logout' => 'Logout', + 'searchPlaceholder' => 'Search...', + 'dashboard' => 'Dashboard', + 'currencies' => 'Currencies', + 'accounts' => 'Accounts', + 'Asset account' => 'Asset account', + 'Default account' => 'Asset account', + 'Expense account' => 'Expense account', + 'Revenue account' => 'Revenue account', + 'Initial balance account' => 'Initial balance account', + 'budgets' => 'Budgets', + 'tags' => 'Tags', + 'reports' => 'Reports', + 'transactions' => 'Transactions', + 'expenses' => 'Expenses', + 'income' => 'Revenue / income', + 'transfers' => 'Transfers', + 'moneyManagement' => 'Money management', + 'piggyBanks' => 'Piggy banks', + 'bills' => 'Bills', + 'withdrawal' => 'Withdrawal', + 'deposit' => 'Deposit', + 'account' => 'Account', + 'transfer' => 'Transfer', + 'Withdrawal' => 'Withdrawal', + 'Deposit' => 'Deposit', + 'Transfer' => 'Transfer', + 'bill' => 'Bill', + 'yes' => 'Yes', + 'no' => 'No', + 'amount' => 'Amount', + 'overview' => 'Overview', + 'saveOnAccount' => 'Save on account', + 'unknown' => 'Unknown', + 'daily' => 'Daily', + 'monthly' => 'Monthly', + 'profile' => 'Profile', + 'errors' => 'Errors', + + // reports: + 'report_default' => 'Default financial report between :start and :end', + 'report_audit' => 'Transaction history overview between :start and :end', + 'report_category' => 'Category report between :start and :end', + 'report_budget' => 'Budget report between :start and :end', + 'quick_link_reports' => 'Quick links', + 'quick_link_default_report' => 'Default financial report', + 'quick_link_audit_report' => 'Transaction history overview', + 'report_this_month_quick' => 'Current month, all accounts', + 'report_this_year_quick' => 'Current year, all accounts', + 'report_this_fiscal_year_quick' => 'Current fiscal year, all accounts', + 'report_all_time_quick' => 'All-time, all accounts', + 'reports_can_bookmark' => 'Remember that reports can be bookmarked.', + 'incomeVsExpenses' => 'Income vs. expenses', + 'accountBalances' => 'Account balances', + 'balanceStartOfYear' => 'Balance at start of year', + 'balanceEndOfYear' => 'Balance at end of year', + 'balanceStartOfMonth' => 'Balance at start of month', + 'balanceEndOfMonth' => 'Balance at end of month', + 'balanceStart' => 'Balance at start of period', + 'balanceEnd' => 'Balance at end of period', + 'reportsOwnAccounts' => 'Reports for your own accounts', + 'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts', + 'splitByAccount' => 'Split by account', + 'balancedByTransfersAndTags' => 'Balanced by transfers and tags', + 'coveredWithTags' => 'Covered with tags', + 'leftUnbalanced' => 'Left unbalanced', + 'expectedBalance' => 'Expected balance', + 'outsideOfBudgets' => 'Outside of budgets', + 'leftInBudget' => 'Left in budget', + 'sumOfSums' => 'Sum of sums', + 'noCategory' => '(no category)', + 'notCharged' => 'Not charged (yet)', + 'inactive' => 'Inactive', + 'active' => 'Active', + 'difference' => 'Difference', + 'in' => 'In', + 'out' => 'Out', + 'topX' => 'top :number', + 'show_full_list' => 'Show entire list', + 'show_only_top' => 'Show only top :number', + 'sum_of_year' => 'Sum of year', + 'sum_of_years' => 'Sum of years', + 'average_of_year' => 'Average of year', + 'average_of_years' => 'Average of years', + 'categories_earned_in_year' => 'Categories (by earnings)', + 'categories_spent_in_year' => 'Categories (by spendings)', + 'report_type' => 'Report type', + 'report_type_default' => 'Default financial report', + 'report_type_audit' => 'Transaction history overview (audit)', + 'report_type_category' => 'Category report', + 'report_type_budget' => 'Budget report', + 'report_type_meta-history' => 'Categories, budgets and bills overview', + 'more_info_help' => 'More information about these types of reports can be found in the help pages. Press the (?) icon in the top right corner.', + 'report_included_accounts' => 'Included accounts', + 'report_date_range' => 'Date range', + 'report_preset_ranges' => 'Pre-set ranges', + 'shared' => 'Shared', + 'fiscal_year' => 'Fiscal year', + 'income_entry' => 'Income from account ":name" between :start and :end', + 'expense_entry' => 'Expenses to account ":name" between :start and :end', + 'category_entry' => 'Expenses in category ":name" between :start and :end', + 'budget_spent_amount' => 'Expenses in budget ":budget" between :start and :end', + 'balance_amount' => 'Expenses in budget ":budget" paid from account ":account" between :start and :end', + 'no_audit_activity' => 'No activity was recorded on account :account_name between :start and :end.', + 'audit_end_balance' => 'Account balance of :account_name at the end of :end was: :balance', + 'reports_extra_options' => 'Extra options', + 'report_has_no_extra_options' => 'This report has no extra options', + 'reports_submit' => 'View report', + 'end_after_start_date' => 'End date of report must be after start date.', + 'select_category' => 'Select one or more categories.', + 'select_budget' => 'Select one or more budgets.', + 'income_per_category' => 'Income per category', + 'expense_per_category' => 'Expense per category', + 'expense_per_budget' => 'Expense per budget', + 'income_per_account' => 'Income per account', + 'expense_per_account' => 'Expense per account', + 'include_not_in_category' => 'Include categories not selected for this report', + 'include_not_in_budget' => 'Include budgets not selected for this report', + 'everything_else' => 'Everything else', + 'income_and_expenses' => 'Income and expenses', + 'spent_average' => 'Spent (average)', + 'income_average' => 'Income (average)', + 'transaction_count' => 'Transaction count', + 'average_spending_per_account' => 'Average spending per account', + 'average_income_per_account' => 'Average income per account', + 'total' => 'Total', + 'description' => 'Description', + 'sum_of_period' => 'Sum of period', + 'average_in_period' => 'Average in period', + + + // charts: + 'chart' => 'Chart', + 'dayOfMonth' => 'Day of the month', + 'month' => 'Month', + 'budget' => 'Budget', + 'spent' => 'Spent', + 'spent_in_budget' => 'Spent in budget', + 'left_to_spend' => 'Left to spend', + 'earned' => 'Earned', + 'overspent' => 'Overspent', + 'left' => 'Left', + 'no_budget' => '(no budget)', + 'max-amount' => 'Maximum amount', + 'min-amount' => 'Minumum amount', + 'journal-amount' => 'Current bill entry', + 'name' => 'Name', + 'date' => 'Date', + 'paid' => 'Paid', + 'unpaid' => 'Unpaid', + 'day' => 'Day', + 'budgeted' => 'Budgeted', + 'period' => 'Period', + 'balance' => 'Balance', + 'summary' => 'Summary', + 'sum' => 'Sum', + 'average' => 'Average', + 'balanceFor' => 'Balance for :name', + + // piggy banks: + 'add_money_to_piggy' => 'Add money to piggy bank ":name"', + 'piggy_bank' => 'Piggy bank', + 'new_piggy_bank' => 'Create new piggy bank', + 'store_piggy_bank' => 'Store new piggy bank', + 'stored_piggy_bank' => 'Store new piggy bank ":name"', + 'account_status' => 'Account status', + 'left_for_piggy_banks' => 'Left for piggy banks', + 'sum_of_piggy_banks' => 'Sum of piggy banks', + 'saved_so_far' => 'Saved so far', + 'left_to_save' => 'Left to save', + 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"', + 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"', + 'add' => 'Add', + + 'remove' => 'Remove', + 'max_amount_add' => 'The maximum amount you can add is', + 'max_amount_remove' => 'The maximum amount you can remove is', + 'update_piggy_button' => 'Update piggy bank', + 'update_piggy_title' => 'Update piggy bank ":name"', + 'updated_piggy_bank' => 'Updated piggy bank ":name"', + 'details' => 'Details', + 'events' => 'Events', + 'target_amount' => 'Target amount', + 'start_date' => 'Start date', + 'target_date' => 'Target date', + 'no_target_date' => 'No target date', + 'todo' => 'to do', + 'table' => 'Table', + 'piggy_bank_not_exists' => 'Piggy bank no longer exists.', + 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.', + 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', + 'delete_piggy_bank' => 'Delete piggy bank ":name"', + 'cannot_add_amount_piggy' => 'Could not add :amount to ":name".', + 'deleted_piggy_bank' => 'Deleted piggy bank ":name"', + 'added_amount_to_piggy' => 'Added :amount to ":name"', + 'removed_amount_from_piggy' => 'Removed :amount from ":name"', + 'cannot_remove_amount_piggy' => 'Could not remove :amount from ":name".', + + // tags + 'regular_tag' => 'Just a regular tag.', + 'balancing_act' => 'The tag takes at most two transactions; an expense and a transfer. They\'ll balance each other out.', + 'advance_payment' => 'The tag accepts one expense and any number of deposits aimed to repay the original expense.', + 'delete_tag' => 'Delete tag ":tag"', + 'deleted_tag' => 'Deleted tag ":tag"', + 'new_tag' => 'Make new tag', + 'edit_tag' => 'Edit tag ":tag"', + 'updated_tag' => 'Updated tag ":tag"', + 'created_tag' => 'Tag ":tag" has been created!', + 'no_year' => 'No year set', + 'no_month' => 'No month set', + 'tag_title_nothing' => 'Default tags', + 'tag_title_balancingAct' => 'Balancing act tags', + 'tag_title_advancePayment' => 'Advance payment tags', + 'tags_introduction' => 'Usually tags are singular words, designed to quickly band items together using things like expensive, bill or for-party. In Firefly III, tags can have more properties such as a date, description and location. This allows you to join transactions together in a more meaningful way. For example, you could make a tag called Christmas dinner with friends and add information about the restaurant. Such tags are "singular", you would only use them for a single occasion, perhaps with multiple transactions.', + 'tags_group' => 'Tags group transactions together, which makes it possible to store reimbursements (in case you front money for others) and other "balancing acts" where expenses are summed up (the payments on your new TV) or where expenses and deposits are cancelling each other out (buying something with saved money). It\'s all up to you. Using tags the old-fashioned way is of course always possible.', + 'tags_start' => 'Create a tag to get started or enter tags when creating new transactions.', + + 'transaction_journal_information' => 'Transaction information', + 'transaction_journal_meta' => 'Meta information', + 'total_amount' => 'Total amount', + + // administration + 'administration' => 'Administration', + 'user_administration' => 'User administration', + 'list_all_users' => 'All users', + 'all_users' => 'All users', + 'all_blocked_domains' => 'All blocked domains', + 'blocked_domains' => 'Blocked domains', + 'no_domains_banned' => 'No domains blocked', + 'all_user_domains' => 'All user email address domains', + 'all_domains_is_filtered' => 'This list does not include already blocked domains.', + 'domain_now_blocked' => 'Domain :domain is now blocked', + 'domain_now_unblocked' => 'Domain :domain is now unblocked', + 'manual_block_domain' => 'Block a domain by hand', + 'block_domain' => 'Block domain', + 'no_domain_filled_in' => 'No domain filled in', + 'domain_already_blocked' => 'Domain :domain is already blocked', + 'domain_is_now_blocked' => 'Domain :domain is now blocked', + 'instance_configuration' => 'Configuration', + 'firefly_instance_configuration' => 'Configuration options for Firefly III', + 'setting_single_user_mode' => 'Single user mode', + 'setting_single_user_mode_explain' => 'By default, Firefly III only accepts one (1) registration: you. This is a security measure, preventing others from using your instance unless you allow them to. Future registrations are blocked. When you uncheck this box, others can use your instance as wel, assuming they can reach it (when it is connected to the internet).', + 'store_configuration' => 'Store configuration', + 'single_user_administration' => 'User administration for :email', + 'edit_user' => 'Edit user :email', + 'hidden_fields_preferences' => 'Not all fields are visible right now. You must enable them in your settings.', + 'user_data_information' => 'User data', + 'user_information' => 'User information', + 'total_size' => 'total size', + 'budget_or_budgets' => 'budget(s)', + 'budgets_with_limits' => 'budget(s) with configured amount', + 'rule_or_rules' => 'rule(s)', + 'rulegroup_or_groups' => 'rule group(s)', + 'setting_must_confirm_account' => 'Account confirmation', + 'setting_must_confirm_account_explain' => 'When this setting is enabled, users must activate their account before it can be used.', + 'configuration_updated' => 'The configuration has been updated', + 'setting_is_demo_site' => 'Demo site', + 'setting_is_demo_site_explain' => 'If you check this box, this installation will behave as if it is the demo site, which can have weird side effects.', + 'setting_send_email_notifications' => 'Send email notifications', + 'setting_send_email_explain' => 'Firefly III can send you email notifications about certain events. They will be sent to :site_owner. This email address can be set in the .env file.', + 'mail_for_lockout_help' => 'When a user is locked out', + 'mail_for_blocked_domain_help' => 'When a user tries to register using a blocked domain', + 'mail_for_blocked_email_help' => 'When a user tries to register using a blocked email address', + 'mail_for_bad_login_help' => 'When a user fails to login', + 'mail_for_blocked_login_help' => 'When a blocked user tries to login', + 'block_code_bounced' => 'Email message(s) bounced', + 'block_code_expired' => 'Demo account expired', + 'no_block_code' => 'No reason for block or user not blocked', + + + // split a transaction: + 'transaction_meta_data' => 'Transaction meta-data', + 'transaction_dates' => 'Transaction dates', + 'splits' => 'Splits', + 'split_title_withdrawal' => 'Split your new withdrawal', + 'split_intro_one_withdrawal' => 'Firefly supports the "splitting" of a withdrawal.', + 'split_intro_two_withdrawal' => 'It means that the amount of money you\'ve spent is divided between several destination expense accounts, budgets or categories.', + 'split_intro_three_withdrawal' => 'For example: you could split your :total groceries so you pay :split_one from your "daily groceries" budget and :split_two from your "cigarettes" budget.', + 'split_table_intro_withdrawal' => 'Split your withdrawal in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', + 'store_splitted_withdrawal' => 'Store splitted withdrawal', + 'update_splitted_withdrawal' => 'Update splitted withdrawal', + 'split_title_deposit' => 'Split your new deposit', + 'split_intro_one_deposit' => 'Firefly supports the "splitting" of a deposit.', + 'split_intro_two_deposit' => 'It means that the amount of money you\'ve earned is divided between several source revenue accounts or categories.', + 'split_intro_three_deposit' => 'For example: you could split your :total salary so you get :split_one as your base salary and :split_two as a reimbursment for expenses made.', + 'split_table_intro_deposit' => 'Split your deposit in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', + 'store_splitted_deposit' => 'Store splitted deposit', + 'split_title_transfer' => 'Split your new transfer', + 'split_intro_one_transfer' => 'Firefly supports the "splitting" of a transfer.', + 'split_intro_two_transfer' => 'It means that the amount of money you\'re moving is divided between several categories or piggy banks.', + 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', + 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', + 'store_splitted_transfer' => 'Store splitted transfer', + 'add_another_split' => 'Add another split', + 'split-transactions' => 'Split transactions', + 'split-new-transaction' => 'Split a new transaction', + 'do_split' => 'Do a split', + 'split_this_withdrawal' => 'Split this withdrawal', + 'split_this_deposit' => 'Split this deposit', + 'split_this_transfer' => 'Split this transfer', + 'cannot_edit_multiple_source' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple source accounts.', + 'cannot_edit_multiple_dest' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple destination accounts.', + 'no_edit_multiple_left' => 'You have selected no valid transactions to edit.', + + // import + 'configuration_file_help' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file.', + 'import_data_index' => 'Index', + 'import_file_type_csv' => 'CSV (comma separated values)', + 'import_file_type_help' => 'Select the type of file you will upload', + 'import_start' => 'Start the import', + 'configure_import' => 'Further configure your import', + 'import_finish_configuration' => 'Finish configuration', + 'settings_for_import' => 'Settings', + 'import_status' => 'Import status', + 'import_status_text' => 'The import is currently running, or will start momentarily.', + 'import_complete' => 'Import configuration complete!', + 'import_complete_text' => 'The import is ready to start. All the configuration you needed to do has been done. Please download the configuration file. It will help you with the import should it not go as planned. To actually run the import, you can either execute the following command in your console, or run the web-based import. Depending on your configuration, the console import will give you more feedback.', + 'import_download_config' => 'Download configuration', + 'import_start_import' => 'Start import', + 'import_data' => 'Import data', + 'import_data_full' => 'Import data into Firefly III', + 'import' => 'Import', + 'import_file_help' => 'Select your file', + 'import_status_settings_complete' => 'The import is ready to start.', + 'import_status_import_complete' => 'The import has completed.', + 'import_status_import_running' => 'The import is currently running. Please be patient.', + 'import_status_header' => 'Import status and progress', + 'import_status_errors' => 'Import errors', + 'import_status_report' => 'Import report', + 'import_finished' => 'Import has finished', + 'import_error_single' => 'An error has occured during the import.', + 'import_error_multi' => 'Some errors occured during the import.', + 'import_error_fatal' => 'There was an error during the import routine. Please check the log files. The error seems to be:', + 'import_error_timeout' => 'The import seems to have timed out. If this error persists, please import your data using the console command.', + 'import_double' => 'Row #:row: This row has been imported before, and is stored in :description.', + 'import_finished_all' => 'The import has finished. Please check out the results below.', + 'import_with_key' => 'Import with key \':key\'', + 'import_share_configuration' => 'Please consider downloading your configuration and sharing it at the import configuration center. This will allow other users of Firefly III to import their files more easily.', + 'import_finished_report' => 'The import has finished. Please note any errors in the block above this line. All transactions imported during this particular session have been tagged, and you can check them out below. ', + 'import_finished_link' => 'The transactions imported can be found in tag :tag.', + 'need_at_least_one_account' => 'You need at least one asset account to be able to create piggy banks', + 'see_help_top_right' => 'For more information, please check out the help pages using the icon in the top right corner of the page.', + 'bread_crumb_import_complete' => 'Import ":key" complete', + 'bread_crumb_configure_import' => 'Configure import ":key"', + 'bread_crumb_import_finished' => 'Import ":key" finished', + 'import_finished_intro' => 'The import has finished! You can now see the new transactions in Firefly.', + 'import_finished_text_without_link' => 'It seems there is no tag that points to all your imported transactions. Please look for your imported data in the menu on the left, under "Transactions".', + 'import_finished_text_with_link' => 'You can find a list of your imported transactions on the page of the tag that was created for this import.', +]; \ No newline at end of file From db95185eee279e472aa85630f639fae7f8f2b03b Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 17:51:50 +0100 Subject: [PATCH 047/350] New translations --- resources/lang/ru_RU/config.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 resources/lang/ru_RU/config.php diff --git a/resources/lang/ru_RU/config.php b/resources/lang/ru_RU/config.php new file mode 100644 index 0000000000..58220429bf --- /dev/null +++ b/resources/lang/ru_RU/config.php @@ -0,0 +1,23 @@ + 'en, English, en_US, en_US.utf8', + 'month' => '%B %Y', + 'month_and_day' => '%B %e, %Y', + 'date_time' => '%B %e, %Y, @ %T', + 'specific_day' => '%e %B %Y', + 'week_in_year' => 'Week %W, %Y', + 'quarter_of_year' => '%B %Y', + 'year' => '%Y', + 'half_year' => '%B %Y', + +]; \ No newline at end of file From 248a4ed52740cda9ea17fd2233bc9b275873d22e Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 17:51:52 +0100 Subject: [PATCH 048/350] New translations --- resources/lang/ru_RU/breadcrumbs.php | 41 ++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 resources/lang/ru_RU/breadcrumbs.php diff --git a/resources/lang/ru_RU/breadcrumbs.php b/resources/lang/ru_RU/breadcrumbs.php new file mode 100644 index 0000000000..6bcf9b862d --- /dev/null +++ b/resources/lang/ru_RU/breadcrumbs.php @@ -0,0 +1,41 @@ + 'Home', + 'edit_currency' => 'Edit currency ":name"', + 'delete_currency' => 'Delete currency ":name"', + 'newPiggyBank' => 'Create a new piggy bank', + 'edit_piggyBank' => 'Edit piggy bank ":name"', + 'preferences' => 'Preferences', + 'profile' => 'Profile', + 'changePassword' => 'Change your password', + 'bills' => 'Bills', + 'newBill' => 'New bill', + 'edit_bill' => 'Edit bill ":name"', + 'delete_bill' => 'Delete bill ":name"', + 'reports' => 'Reports', + 'searchResult' => 'Search for ":query"', + 'withdrawal_list' => 'Expenses', + 'deposit_list' => 'Revenue, income and deposits', + 'transfer_list' => 'Transfers', + 'transfers_list' => 'Transfers', + 'create_withdrawal' => 'Create new withdrawal', + 'create_deposit' => 'Create new deposit', + 'create_transfer' => 'Create new transfer', + 'edit_journal' => 'Edit transaction ":description"', + 'delete_journal' => 'Delete transaction ":description"', + 'tags' => 'Tags', + 'createTag' => 'Create new tag', + 'edit_tag' => 'Edit tag ":tag"', + 'delete_tag' => 'Delete tag ":tag"', +]; \ No newline at end of file From 5dc727580f206ba9cf5af691a46e657267c69206 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 17:51:53 +0100 Subject: [PATCH 049/350] New translations --- resources/lang/ru_RU/auth.php | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 resources/lang/ru_RU/auth.php diff --git a/resources/lang/ru_RU/auth.php b/resources/lang/ru_RU/auth.php new file mode 100644 index 0000000000..5d833b3d68 --- /dev/null +++ b/resources/lang/ru_RU/auth.php @@ -0,0 +1,28 @@ + 'These credentials do not match our records.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + +]; \ No newline at end of file From 09c7a69050dced12b50d54aed77b5d6c505f8b14 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 17:51:54 +0100 Subject: [PATCH 050/350] New translations --- resources/lang/ru_RU/form.php | 188 ++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 resources/lang/ru_RU/form.php diff --git a/resources/lang/ru_RU/form.php b/resources/lang/ru_RU/form.php new file mode 100644 index 0000000000..af698dcb73 --- /dev/null +++ b/resources/lang/ru_RU/form.php @@ -0,0 +1,188 @@ + 'Bank name', + 'bank_balance' => 'Balance', + 'savings_balance' => 'Savings balance', + 'credit_card_limit' => 'Credit card limit', + 'automatch' => 'Match automatically', + 'skip' => 'Skip', + 'name' => 'Name', + 'active' => 'Active', + 'amount_min' => 'Minimum amount', + 'amount_max' => 'Maximum amount', + 'match' => 'Matches on', + 'repeat_freq' => 'Repeats', + 'journal_currency_id' => 'Currency', + 'currency_id' => 'Currency', + 'attachments' => 'Attachments', + 'journal_amount' => 'Amount', + 'journal_asset_source_account' => 'Asset account (source)', + 'journal_source_account_name' => 'Revenue account (source)', + 'journal_source_account_id' => 'Asset account (source)', + 'BIC' => 'BIC', + 'account_from_id' => 'From account', + 'account_to_id' => 'To account', + 'source_account' => 'Source account', + 'destination_account' => 'Destination account', + 'journal_destination_account_id' => 'Asset account (destination)', + 'asset_destination_account' => 'Asset account (destination)', + 'asset_source_account' => 'Asset account (source)', + 'journal_description' => 'Description', + 'note' => 'Notes', + 'split_journal' => 'Split this transaction', + 'split_journal_explanation' => 'Split this transaction in multiple parts', + 'currency' => 'Currency', + 'account_id' => 'Asset account', + 'budget_id' => 'Budget', + 'openingBalance' => 'Opening balance', + 'tagMode' => 'Tag mode', + 'tagPosition' => 'Tag location', + 'virtualBalance' => 'Virtual balance', + 'longitude_latitude' => 'Location', + 'targetamount' => 'Target amount', + 'accountRole' => 'Account role', + 'openingBalanceDate' => 'Opening balance date', + 'ccType' => 'Credit card payment plan', + 'ccMonthlyPaymentDate' => 'Credit card monthly payment date', + 'piggy_bank_id' => 'Piggy bank', + 'returnHere' => 'Return here', + 'returnHereExplanation' => 'After storing, return here to create another one.', + 'returnHereUpdateExplanation' => 'After updating, return here.', + 'description' => 'Description', + 'expense_account' => 'Expense account', + 'revenue_account' => 'Revenue account', + + 'revenue_account_source' => 'Revenue account (source)', + 'source_account_asset' => 'Source account (asset account)', + 'destination_account_expense' => 'Destination account (expense account)', + 'destination_account_asset' => 'Destination account (asset account)', + 'source_account_revenue' => 'Source account (revenue account)', + 'type' => 'Type', + 'convert_Withdrawal' => 'Convert withdrawal', + 'convert_Deposit' => 'Convert deposit', + 'convert_Transfer' => 'Convert transfer', + + + 'amount' => 'Amount', + 'date' => 'Date', + 'interest_date' => 'Interest date', + 'book_date' => 'Book date', + 'process_date' => 'Processing date', + 'category' => 'Category', + 'tags' => 'Tags', + 'deletePermanently' => 'Delete permanently', + 'cancel' => 'Cancel', + 'targetdate' => 'Target date', + 'tag' => 'Tag', + 'under' => 'Under', + 'symbol' => 'Symbol', + 'code' => 'Code', + 'iban' => 'IBAN', + 'accountNumber' => 'Account number', + 'has_headers' => 'Headers', + 'date_format' => 'Date format', + 'specifix' => 'Bank- or file specific fixes', + 'attachments[]' => 'Attachments', + 'store_new_withdrawal' => 'Store new withdrawal', + 'store_new_deposit' => 'Store new deposit', + 'store_new_transfer' => 'Store new transfer', + 'add_new_withdrawal' => 'Add a new withdrawal', + 'add_new_deposit' => 'Add a new deposit', + 'add_new_transfer' => 'Add a new transfer', + 'noPiggybank' => '(no piggy bank)', + 'title' => 'Title', + 'notes' => 'Notes', + 'filename' => 'File name', + 'mime' => 'Mime type', + 'size' => 'Size', + 'trigger' => 'Trigger', + 'stop_processing' => 'Stop processing', + 'start_date' => 'Start of range', + 'end_date' => 'End of range', + 'export_start_range' => 'Start of export range', + 'export_end_range' => 'End of export range', + 'export_format' => 'File format', + 'include_attachments' => 'Include uploaded attachments', + 'include_old_uploads' => 'Include imported data', + 'accounts' => 'Export transactions from these accounts', + 'delete_account' => 'Delete account ":name"', + 'delete_bill' => 'Delete bill ":name"', + 'delete_budget' => 'Delete budget ":name"', + 'delete_category' => 'Delete category ":name"', + 'delete_currency' => 'Delete currency ":name"', + 'delete_journal' => 'Delete transaction with description ":description"', + 'delete_attachment' => 'Delete attachment ":name"', + 'delete_rule' => 'Delete rule ":title"', + 'delete_rule_group' => 'Delete rule group ":title"', + 'attachment_areYouSure' => 'Are you sure you want to delete the attachment named ":name"?', + 'account_areYouSure' => 'Are you sure you want to delete the account named ":name"?', + 'bill_areYouSure' => 'Are you sure you want to delete the bill named ":name"?', + 'rule_areYouSure' => 'Are you sure you want to delete the rule titled ":title"?', + 'ruleGroup_areYouSure' => 'Are you sure you want to delete the rule group titled ":title"?', + 'budget_areYouSure' => 'Are you sure you want to delete the budget named ":name"?', + 'category_areYouSure' => 'Are you sure you want to delete the category named ":name"?', + 'currency_areYouSure' => 'Are you sure you want to delete the currency named ":name"?', + 'piggyBank_areYouSure' => 'Are you sure you want to delete the piggy bank named ":name"?', + 'journal_areYouSure' => 'Are you sure you want to delete the transaction described ":description"?', + 'mass_journal_are_you_sure' => 'Are you sure you want to delete these transactions?', + 'tag_areYouSure' => 'Are you sure you want to delete the tag ":tag"?', + 'permDeleteWarning' => 'Deleting stuff from Firely is permanent and cannot be undone.', + 'mass_make_selection' => 'You can still prevent items from being deleted by removing the checkbox.', + 'delete_all_permanently' => 'Delete selected permanently', + 'update_all_journals' => 'Update these transactions', + 'also_delete_transactions' => 'The only transaction connected to this account will be deleted as well.|All :count transactions connected to this account will be deleted as well.', + 'also_delete_rules' => 'The only rule connected to this rule group will be deleted as well.|All :count rules connected to this rule group will be deleted as well.', + 'also_delete_piggyBanks' => 'The only piggy bank connected to this account will be deleted as well.|All :count piggy bank connected to this account will be deleted as well.', + 'bill_keep_transactions' => 'The only transaction connected to this bill will not be deleted.|All :count transactions connected to this bill will spared deletion.', + 'budget_keep_transactions' => 'The only transaction connected to this budget will not be deleted.|All :count transactions connected to this budget will spared deletion.', + 'category_keep_transactions' => 'The only transaction connected to this category will not be deleted.|All :count transactions connected to this category will spared deletion.', + 'tag_keep_transactions' => 'The only transaction connected to this tag will not be deleted.|All :count transactions connected to this tag will spared deletion.', + + 'email' => 'Email address', + 'password' => 'Password', + 'password_confirmation' => 'Password (again)', + 'blocked' => 'Is blocked?', + 'blocked_code' => 'Reason for block', + + + // admin + 'domain' => 'Domain', + 'single_user_mode' => 'Single user mode', + 'must_confirm_account' => 'New users must activate account', + 'is_demo_site' => 'Is demo site', + 'mail_for_lockout' => 'Locked out', + 'mail_for_blocked_domain' => 'Blocked domain', + 'mail_for_blocked_email' => 'Blocked email address', + 'mail_for_bad_login' => 'Login failure', + 'mail_for_blocked_login' => 'Blocked user', + + + // import + 'import_file' => 'Import file', + 'configuration_file' => 'Configuration file', + 'import_file_type' => 'Import file type', + 'csv_comma' => 'A comma (,)', + 'csv_semicolon' => 'A semicolon (;)', + 'csv_tab' => 'A tab (invisible)', + 'csv_delimiter' => 'CSV field delimiter', + 'csv_import_account' => 'Default import account', + 'csv_config' => 'CSV import configuration', + + + 'due_date' => 'Due date', + 'payment_date' => 'Payment date', + 'invoice_date' => 'Invoice date', + 'internal_reference' => 'Internal reference', +]; \ No newline at end of file From 6c5499e8489efca8acb0782eb8d87601a7c8e665 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:34:05 +0100 Subject: [PATCH 051/350] Small code cleanup. --- .../Commands/UpgradeFireflyInstructions.php | 17 +++++++++-------- app/Console/Commands/VerifyDatabase.php | 2 -- app/Events/BlockedBadLogin.php | 4 ++-- app/Events/BlockedUseOfDomain.php | 2 ++ 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/Console/Commands/UpgradeFireflyInstructions.php b/app/Console/Commands/UpgradeFireflyInstructions.php index df007ab40f..866884de56 100644 --- a/app/Console/Commands/UpgradeFireflyInstructions.php +++ b/app/Console/Commands/UpgradeFireflyInstructions.php @@ -63,20 +63,21 @@ class UpgradeFireflyInstructions extends Command } - if (is_null($text)) { $this->line(sprintf('Thank you for installing Firefly III, v%s', $version)); $this->info('There are no extra upgrade instructions.'); $this->line('Firefly III should be ready for use.'); - } else { - $this->line('+------------------------------------------------------------------------------+'); - $this->line(''); - $this->line(sprintf('Thank you for installing Firefly III, v%s', $version)); - $this->info(wordwrap($text)); - $this->line(''); - $this->line('+------------------------------------------------------------------------------+'); + + return; } + $this->line('+------------------------------------------------------------------------------+'); + $this->line(''); + $this->line(sprintf('Thank you for installing Firefly III, v%s', $version)); + $this->info(wordwrap($text)); + $this->line(''); + $this->line('+------------------------------------------------------------------------------+'); + } } diff --git a/app/Console/Commands/VerifyDatabase.php b/app/Console/Commands/VerifyDatabase.php index 47b40ca69f..7ed6b8f990 100644 --- a/app/Console/Commands/VerifyDatabase.php +++ b/app/Console/Commands/VerifyDatabase.php @@ -174,10 +174,8 @@ class VerifyDatabase extends Command $configuration = [ // a withdrawal can not have revenue account: TransactionType::WITHDRAWAL => [AccountType::REVENUE], - // deposit cannot have an expense account: TransactionType::DEPOSIT => [AccountType::EXPENSE], - // transfer cannot have either: TransactionType::TRANSFER => [AccountType::EXPENSE, AccountType::REVENUE], ]; diff --git a/app/Events/BlockedBadLogin.php b/app/Events/BlockedBadLogin.php index fb984abd04..f3239bd7f8 100644 --- a/app/Events/BlockedBadLogin.php +++ b/app/Events/BlockedBadLogin.php @@ -16,7 +16,7 @@ namespace FireflyIII\Events; use Illuminate\Queue\SerializesModels; /** - * Class LockedOutUser + * Class BlockedBadLogin * * @package FireflyIII\Events */ @@ -28,7 +28,7 @@ class BlockedBadLogin extends Event public $ipAddress; /** - * Create a new event instance. This event is triggered when a user gets themselves locked out. + * Create a new event instance. This event is triggered when a bad login is blocked. * * @param string $email * @param string $ipAddress diff --git a/app/Events/BlockedUseOfDomain.php b/app/Events/BlockedUseOfDomain.php index 0ccacea749..2cb252a385 100644 --- a/app/Events/BlockedUseOfDomain.php +++ b/app/Events/BlockedUseOfDomain.php @@ -19,6 +19,7 @@ use Illuminate\Queue\SerializesModels; /** * Class BlockedUseOfDomain * + * @deprecated * @package FireflyIII\Events */ class BlockedUseOfDomain extends Event @@ -31,6 +32,7 @@ class BlockedUseOfDomain extends Event /** * Create a new event instance. This event is triggered when a user tries to register with a banned domain (on blocked domain list). * + * @deprecated * @param string $email * @param string $ipAddress */ From 9ff9385c4712e244516a24e2a50774d916f26a94 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:34:27 +0100 Subject: [PATCH 052/350] Demo user is no longer capable of uploading files. --- app/Http/Controllers/ImportController.php | 31 ++++++++++++++++++----- config/filesystems.php | 5 ++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/ImportController.php b/app/Http/Controllers/ImportController.php index 7c19bde59e..9b78b82995 100644 --- a/app/Http/Controllers/ImportController.php +++ b/app/Http/Controllers/ImportController.php @@ -368,14 +368,30 @@ class ImportController extends Controller $content = $uploaded->fread($uploaded->getSize()); $contentEncrypted = Crypt::encrypt($content); $disk = Storage::disk('upload'); - $disk->put($newName, $contentEncrypted); - Log::debug('Uploaded file', ['name' => $upload->getClientOriginalName(), 'size' => $upload->getSize(), 'mime' => $upload->getClientMimeType()]); + // user is demo user, replace upload with prepared file. + if (auth()->user()->hasRole('demo')) { + $stubsDisk = Storage::disk('stubs'); + $content = $stubsDisk->get('demo-import.csv'); + $contentEncrypted = Crypt::encrypt($content); + $disk->put($newName, $contentEncrypted); + Log::debug('Replaced upload with demo file.'); - // store configuration file's content into the job's configuration - // thing. - // otherwise, leave it empty. - if ($request->files->has('configuration_file')) { + // also set up prepared configuration. + $configuration = json_decode($stubsDisk->get('demo-configuration.json'), true); + $job->configuration = $configuration; + $job->save(); + Log::debug('Set configuration for demo user', $configuration); + } + if (!auth()->user()->hasRole('demo')) { + // user is not demo, process original upload: + $disk->put($newName, $contentEncrypted); + Log::debug('Uploaded file', ['name' => $upload->getClientOriginalName(), 'size' => $upload->getSize(), 'mime' => $upload->getClientMimeType()]); + } + + // store configuration file's content into the job's configuration thing. Otherwise, leave it empty. + // demo user's configuration upload is ignored completely. + if ($request->files->has('configuration_file') && !auth()->user()->hasRole('demo')) { /** @var UploadedFile $configFile */ $configFile = $request->files->get('configuration_file'); Log::debug( @@ -394,6 +410,9 @@ class ImportController extends Controller } } + // if user is demo user, replace config with prepared config: + + return redirect(route('import.configure', [$job->key])); } diff --git a/config/filesystems.php b/config/filesystems.php index cac819789e..ba8b6b6eb9 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -73,6 +73,11 @@ return [ 'driver' => 'local', 'root' => base_path('resources/seeds'), ], + 'stubs' => [ + 'driver' => 'local', + 'root' => base_path('resources/stubs'), + ], + 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), From 30447bcf702cac3d98dcf50d21ba17dcb7938623 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:34:39 +0100 Subject: [PATCH 053/350] New stubs for demo user. --- resources/stubs/demo-configuration.json | 37 +++++++++++++++++++++++++ resources/stubs/demo-import.csv | 24 ++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 resources/stubs/demo-configuration.json create mode 100644 resources/stubs/demo-import.csv diff --git a/resources/stubs/demo-configuration.json b/resources/stubs/demo-configuration.json new file mode 100644 index 0000000000..c69c8bfe71 --- /dev/null +++ b/resources/stubs/demo-configuration.json @@ -0,0 +1,37 @@ +{ + "has-headers": true, + "date-format": "Y-m-d", + "delimiter": ",", + "import-account": 1, + "specifics": [], + "column-count": 7, + "column-roles": [ + "account-iban", + "opposing-name", + "amount", + "date-transaction", + "description", + "category-name", + "budget-name" + ], + "column-do-mapping": [ + true, + true, + false, + false, + false, + false, + false + ], + "column-roles-complete": false, + "column-mapping-config": { + "0": { + "NL11XOLA6707795988": 1, + "NL81RCQZ7160379858": 3 + }, + "1": [], + "5": [], + "6": [] + }, + "column-mapping-complete": false +} \ No newline at end of file diff --git a/resources/stubs/demo-import.csv b/resources/stubs/demo-import.csv new file mode 100644 index 0000000000..08aa67f0cb --- /dev/null +++ b/resources/stubs/demo-import.csv @@ -0,0 +1,24 @@ +from-account,to-account,amount,date,description,category,budget +NL11XOLA6707795988,Adobe,120.00,2016-10-10,Money back from internet subscription,Reimbursements, +NL11XOLA6707795988,KPN Phone Provider,180.00,2016-11-11,Discount from new service subscription,Reimbursements, +NL81RCQZ7160379858,Taxes and Revenues Government service,200.00,2016-12-12,Tax break for 2016,Reimbursements, +NL11XOLA6707795988,Alibaba,-15.00,2016-02-12,Bought some weird Chinese stuff,Internet +NL11XOLA6707795988,amazon.com,-110.00,2016-02-24,Bought some books,Internet +NL11XOLA6707795988,Baker Bob,-3.40,2016-03-11,Bread,Daily Groceries,Groceries +NL11XOLA6707795988,Buy and Large,-45.00,2016-03-22,Car parts,Car,Car +NL11XOLA6707795988,Halfords Car Parts,-20.00,2016-04-10,Oil for car,Car,Car +NL11XOLA6707795988,iCentre Mac Store,-34.00,2016-04-20,Apple brand batteries for Magic Mouse,Electronics +NL11XOLA6707795988,Jumper Pet Food Store,-30.00,2016-05-09,Expensive pet food,Cats +NL11XOLA6707795988,McDonalds,-8.00,2016-05-18,McBurger with fries,Junk food,Groceries +NL11XOLA6707795988,Student Loan Organization,-200.00,2016-06-08,Paid back first part of one million of student loans,Student loans,Bills +NL11XOLA6707795988,SuperMarket,-14.90,2016-06-16,Did some groceries,Daily groceries,Groceries +NL11XOLA6707795988,XS4All ISP,-50.00,2016-07-07,Forgot a bill,Internet,Bills +NL11XOLA6707795988,Cafe Central,-34.23,2016-07-14,Drinks with friends,Drinks +NL11XOLA6707795988,Student Loan Organization,-200.00,2016-08-06,Paid back the second part,Student loans,Bills +NL11XOLA6707795988,The Water Company,-10.00,2016-08-12,Water bill,House,Bills +NL11XOLA6707795988,SuperMarket,-15.30,2016-09-05,Did some groceries,Daily groceries,Groceries +NL11XOLA6707795988,Student Loan Organization,-200.00,2016-09-10,Paid back third part,Student loans +NL11XOLA6707795988,Cafe Central,-31.10,2016-11-04,Drinks with friends,Going out,Going out +NL11XOLA6707795988,SuperMarket,-14.33,2016-11-08,Did some groceries,Daily groceries,Groceries +NL11XOLA6707795988,Shell,-30.10,2016-12-03,Got gas for the car,Car,Car +NL11XOLA6707795988,Shell,-22.91,2016-12-06,Got gas for the car,Car,Car \ No newline at end of file From 10f430455924a707acc6a1aeea00f3174aa3753a Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:37:05 +0100 Subject: [PATCH 054/350] New demo text for the import routine. --- resources/lang/en_US/demo.php | 23 ++++++++++++---------- resources/views/demo/import/configure.twig | 3 +++ resources/views/demo/import/index.twig | 1 + 3 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 resources/views/demo/import/configure.twig create mode 100644 resources/views/demo/import/index.twig diff --git a/resources/lang/en_US/demo.php b/resources/lang/en_US/demo.php index e8da707bfa..6cd5476b57 100644 --- a/resources/lang/en_US/demo.php +++ b/resources/lang/en_US/demo.php @@ -8,14 +8,17 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', - 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', - 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', - 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', - 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', - 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'import-index' => 'Of course, any CSV file can be imported into Firefly III ', + 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.', + 'import-configure-configuration' => 'The configuration you see below is correct for the local file.', ]; \ No newline at end of file diff --git a/resources/views/demo/import/configure.twig b/resources/views/demo/import/configure.twig new file mode 100644 index 0000000000..1d5adc6a31 --- /dev/null +++ b/resources/views/demo/import/configure.twig @@ -0,0 +1,3 @@ +{{ trans('demo.import-configure-security') }} +

+{{ trans('demo.import-configure-configuration') }} \ No newline at end of file diff --git a/resources/views/demo/import/index.twig b/resources/views/demo/import/index.twig new file mode 100644 index 0000000000..00e5a8d4ce --- /dev/null +++ b/resources/views/demo/import/index.twig @@ -0,0 +1 @@ +{{ trans('demo.import-index') }} \ No newline at end of file From c29180a0949020f2a35ac64712b8320478dda211 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:39:39 +0100 Subject: [PATCH 055/350] Add support for Russian [skip ci] --- config/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/config/firefly.php b/config/firefly.php index ef2ff2280b..402ea01558 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -119,6 +119,7 @@ return [ 'hr_HR' => ['name_locale' => 'hrvatski', 'name_english' => 'Croatian', 'complete' => false], 'nl_NL' => ['name_locale' => 'Nederlands', 'name_english' => 'Dutch', 'complete' => true], 'pt_BR' => ['name_locale' => 'Português do Brasil', 'name_english' => 'Portuguese (Brazil)', 'complete' => true], + 'ru-RU' => ['name_locale' => 'Russian', 'name_english' => 'Russian', 'complete' => false], 'zh-HK' => ['name_locale' => '繁體中文(香港)', 'name_english' => 'Chinese Traditional, Hong Kong', 'complete' => false], 'zh-TW' => ['name_locale' => '正體中文', 'name_english' => 'Chinese Traditional', 'complete' => false], ], From cf52a4c5c26a35e37cfce9963accc4e9e518dfb4 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:21 +0100 Subject: [PATCH 056/350] New translations --- resources/lang/ru_RU/help.php | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 resources/lang/ru_RU/help.php diff --git a/resources/lang/ru_RU/help.php b/resources/lang/ru_RU/help.php new file mode 100644 index 0000000000..61210ffe41 --- /dev/null +++ b/resources/lang/ru_RU/help.php @@ -0,0 +1,33 @@ + 'Welcome to Firefly III', + 'main-content-text' => 'Do yourself a favor and follow this short guide to make sure you know your way around.', + 'sidebar-toggle-title' => 'Sidebar to create stuff', + 'sidebar-toggle-text' => 'Hidden under the plus icon are all the buttons to create new stuff. Accounts, transactions, everything!', + 'account-menu-title' => 'All your accounts', + 'account-menu-text' => 'Here you can find all the accounts you\'ve made.', + 'budget-menu-title' => 'Budgets', + 'budget-menu-text' => 'Use this page to organise your finances and limit spending.', + 'report-menu-title' => 'Reports', + 'report-menu-text' => 'Check this out when you want a solid overview of your finances.', + 'transaction-menu-title' => 'Transactions', + 'transaction-menu-text' => 'All transactions you\'ve created can be found here.', + 'option-menu-title' => 'Options', + 'option-menu-text' => 'This is pretty self-explanatory.', + 'main-content-end-title' => 'The end!', + 'main-content-end-text' => 'Remember that every page has a small question mark at the right top. Click it to get help about the page you\'re on.', + 'index' => 'index', + 'home' => 'home', +]; \ No newline at end of file From 597a8d36afef99c3c600a619d7d319b3e042be8d Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:22 +0100 Subject: [PATCH 057/350] New translations --- resources/lang/ru_RU/validation.php | 90 +++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 resources/lang/ru_RU/validation.php diff --git a/resources/lang/ru_RU/validation.php b/resources/lang/ru_RU/validation.php new file mode 100644 index 0000000000..6d412f04fe --- /dev/null +++ b/resources/lang/ru_RU/validation.php @@ -0,0 +1,90 @@ + 'This is not a valid IBAN.', + 'unique_account_number_for_user' => 'It looks like this account number is already in use.', + 'deleted_user' => 'Due to security constraints, you cannot register using this email address.', + 'rule_trigger_value' => 'This value is invalid for the selected trigger.', + 'rule_action_value' => 'This value is invalid for the selected action.', + 'invalid_domain' => 'Due to security constraints, you cannot register from this domain.', + 'file_already_attached' => 'Uploaded file ":name" is already attached to this object.', + 'file_attached' => 'Succesfully uploaded file ":name".', + 'file_invalid_mime' => 'File ":name" is of type ":mime" which is not accepted as a new upload.', + 'file_too_large' => 'File ":name" is too large.', + 'belongs_to_user' => 'The value of :attribute is unknown', + 'accepted' => 'The :attribute must be accepted.', + 'bic' => 'This is not a valid BIC.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'unique_for_user' => 'There already is an entry with this :attribute.', + 'before' => 'The :attribute must be a date before :date.', + 'unique_object_for_user' => 'This name is already in use', + 'unique_account_for_user' => 'This account name is already in use', + 'between.numeric' => 'The :attribute must be between :min and :max.', + 'between.file' => 'The :attribute must be between :min and :max kilobytes.', + 'between.string' => 'The :attribute must be between :min and :max characters.', + 'between.array' => 'The :attribute must have between :min and :max items.', + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'date' => 'The :attribute is not a valid date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'email' => 'The :attribute must be a valid email address.', + 'filled' => 'The :attribute field is required.', + 'exists' => 'The selected :attribute is invalid.', + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'max.numeric' => 'The :attribute may not be greater than :max.', + 'max.file' => 'The :attribute may not be greater than :max kilobytes.', + 'max.string' => 'The :attribute may not be greater than :max characters.', + 'max.array' => 'The :attribute may not have more than :max items.', + 'mimes' => 'The :attribute must be a file of type: :values.', + 'min.numeric' => 'The :attribute must be at least :min.', + 'min.file' => 'The :attribute must be at least :min kilobytes.', + 'min.string' => 'The :attribute must be at least :min characters.', + 'min.array' => 'The :attribute must have at least :min items.', + 'not_in' => 'The selected :attribute is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values is present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', + 'size.numeric' => 'The :attribute must be :size.', + 'size.file' => 'The :attribute must be :size kilobytes.', + 'size.string' => 'The :attribute must be :size characters.', + 'size.array' => 'The :attribute must contain :size items.', + 'unique' => 'The :attribute has already been taken.', + 'string' => 'The :attribute must be a string.', + 'url' => 'The :attribute format is invalid.', + 'timezone' => 'The :attribute must be a valid zone.', + '2fa_code' => 'The :attribute field is invalid.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'file' => 'The :attribute must be a file.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'present' => 'The :attribute field must be present.', + 'amount_zero' => 'The total amount cannot be zero', +]; \ No newline at end of file From 4f240c004cc3f1781afc0b193ad1302c34aa2513 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:24 +0100 Subject: [PATCH 058/350] New translations --- resources/lang/ru_RU/demo.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 resources/lang/ru_RU/demo.php diff --git a/resources/lang/ru_RU/demo.php b/resources/lang/ru_RU/demo.php new file mode 100644 index 0000000000..6cd5476b57 --- /dev/null +++ b/resources/lang/ru_RU/demo.php @@ -0,0 +1,24 @@ + 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'import-index' => 'Of course, any CSV file can be imported into Firefly III ', + 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.', + 'import-configure-configuration' => 'The configuration you see below is correct for the local file.', +]; \ No newline at end of file From 997b3c3061e2e28c5fbe33fdf7a91c995caa2578 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:26 +0100 Subject: [PATCH 059/350] New translations --- resources/lang/ru_RU/passwords.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 resources/lang/ru_RU/passwords.php diff --git a/resources/lang/ru_RU/passwords.php b/resources/lang/ru_RU/passwords.php new file mode 100644 index 0000000000..2e11aa92dc --- /dev/null +++ b/resources/lang/ru_RU/passwords.php @@ -0,0 +1,19 @@ + 'Passwords must be at least six characters and match the confirmation.', + 'user' => 'We can\'t find a user with that e-mail address.', + 'token' => 'This password reset token is invalid.', + 'sent' => 'We have e-mailed your password reset link!', + 'reset' => 'Your password has been reset!', + 'blocked' => 'Nice try though.', +]; \ No newline at end of file From 50bb8a0d917ce57dfbc3c800a37b0c402df8fc4f Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:27 +0100 Subject: [PATCH 060/350] New translations --- resources/lang/ru_RU/pagination.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 resources/lang/ru_RU/pagination.php diff --git a/resources/lang/ru_RU/pagination.php b/resources/lang/ru_RU/pagination.php new file mode 100644 index 0000000000..4eeab21dee --- /dev/null +++ b/resources/lang/ru_RU/pagination.php @@ -0,0 +1,17 @@ + '« Previous', + 'next' => 'Next »', + +]; \ No newline at end of file From 84458fa46f97715145c75267bccebdc24eedb861 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:29 +0100 Subject: [PATCH 061/350] New translations --- resources/lang/ru_RU/list.php | 89 +++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 resources/lang/ru_RU/list.php diff --git a/resources/lang/ru_RU/list.php b/resources/lang/ru_RU/list.php new file mode 100644 index 0000000000..90625d54e6 --- /dev/null +++ b/resources/lang/ru_RU/list.php @@ -0,0 +1,89 @@ + 'Buttons', + 'icon' => 'Icon', + 'id' => 'ID', + 'create_date' => 'Created at', + 'update_date' => 'Updated at', + 'balance_before' => 'Balance before', + 'balance_after' => 'Balance after', + 'name' => 'Name', + 'role' => 'Role', + 'currentBalance' => 'Current balance', + 'active' => 'Is active?', + 'lastActivity' => 'Last activity', + 'balanceDiff' => 'Balance difference between :start and :end', + 'matchedOn' => 'Matched on', + 'matchesOn' => 'Matched on', + 'account_type' => 'Account type', + 'created_at' => 'Created at', + 'new_balance' => 'New balance', + 'account' => 'Account', + 'matchingAmount' => 'Amount', + 'lastMatch' => 'Last match', + 'split_number' => 'Split #', + 'destination' => 'Destination', + 'source' => 'Source', + 'next_expected_match' => 'Next expected match', + 'automatch' => 'Auto match?', + 'repeat_freq' => 'Repeats', + 'description' => 'Description', + 'amount' => 'Amount', + 'internal_reference' => 'Internal reference', + 'date' => 'Date', + 'interest_date' => 'Interest date', + 'book_date' => 'Book date', + 'process_date' => 'Processing date', + 'due_date' => 'Due date', + 'payment_date' => 'Payment date', + 'invoice_date' => 'Invoice date', + 'interal_reference' => 'Internal reference', + 'notes' => 'Notes', + 'from' => 'From', + 'piggy_bank' => 'Piggy bank', + 'to' => 'To', + 'budget' => 'Budget', + 'category' => 'Category', + 'bill' => 'Bill', + 'withdrawal' => 'Withdrawal', + 'deposit' => 'Deposit', + 'transfer' => 'Transfer', + 'type' => 'Type', + 'completed' => 'Completed', + 'iban' => 'IBAN', + 'paid_current_period' => 'Paid this period', + 'email' => 'Email', + 'registered_at' => 'Registered at', + 'is_activated' => 'Is activated', + 'is_blocked' => 'Is blocked', + 'is_admin' => 'Is admin', + 'has_two_factor' => 'Has 2FA', + 'confirmed_from' => 'Confirmed from', + 'registered_from' => 'Registered from', + 'blocked_code' => 'Block code', + 'domain' => 'Domain', + 'registration_attempts' => 'Registration attempts', + 'source_account' => 'Source account', + 'destination_account' => 'Destination account', + + 'accounts_count' => 'Number of accounts', + 'journals_count' => 'Number of transactions', + 'attachments_count' => 'Number of attachments', + 'bills_count' => 'Number of bills', + 'categories_count' => 'Number of categories', + 'export_jobs_count' => 'Number of export jobs', + 'import_jobs_count' => 'Number of import jobs', + 'budget_count' => 'Number of budgets', + 'rule_and_groups_count' => 'Number of rules and rule groups', + 'tags_count' => 'Number of tags', +]; \ No newline at end of file From 448dc6b7c6fbe80af66bb21641152bfa1d0237eb Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:30 +0100 Subject: [PATCH 062/350] New translations --- resources/lang/es_ES/demo.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/resources/lang/es_ES/demo.php b/resources/lang/es_ES/demo.php index e8da707bfa..6cd5476b57 100644 --- a/resources/lang/es_ES/demo.php +++ b/resources/lang/es_ES/demo.php @@ -8,14 +8,17 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', - 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', - 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', - 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', - 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', - 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'import-index' => 'Of course, any CSV file can be imported into Firefly III ', + 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.', + 'import-configure-configuration' => 'The configuration you see below is correct for the local file.', ]; \ No newline at end of file From 997e951aca24b74aec89c2424fe322880fcede9f Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:32 +0100 Subject: [PATCH 063/350] New translations --- resources/lang/pt_BR/demo.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/resources/lang/pt_BR/demo.php b/resources/lang/pt_BR/demo.php index e8da707bfa..6cd5476b57 100644 --- a/resources/lang/pt_BR/demo.php +++ b/resources/lang/pt_BR/demo.php @@ -8,14 +8,17 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', - 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', - 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', - 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', - 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', - 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'import-index' => 'Of course, any CSV file can be imported into Firefly III ', + 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.', + 'import-configure-configuration' => 'The configuration you see below is correct for the local file.', ]; \ No newline at end of file From 851b05c110d30701174ed0f00e061f7400d76ca0 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:38 +0100 Subject: [PATCH 064/350] New translations --- resources/lang/zh_TW/demo.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/resources/lang/zh_TW/demo.php b/resources/lang/zh_TW/demo.php index e8da707bfa..6cd5476b57 100644 --- a/resources/lang/zh_TW/demo.php +++ b/resources/lang/zh_TW/demo.php @@ -8,14 +8,17 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', - 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', - 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', - 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', - 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', - 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'import-index' => 'Of course, any CSV file can be imported into Firefly III ', + 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.', + 'import-configure-configuration' => 'The configuration you see below is correct for the local file.', ]; \ No newline at end of file From 32761aeda0e822cd7f9fef656cdc3928d747ea25 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:40 +0100 Subject: [PATCH 065/350] New translations --- resources/lang/zh_HK/demo.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/resources/lang/zh_HK/demo.php b/resources/lang/zh_HK/demo.php index e8da707bfa..6cd5476b57 100644 --- a/resources/lang/zh_HK/demo.php +++ b/resources/lang/zh_HK/demo.php @@ -8,14 +8,17 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', - 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', - 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', - 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', - 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', - 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'import-index' => 'Of course, any CSV file can be imported into Firefly III ', + 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.', + 'import-configure-configuration' => 'The configuration you see below is correct for the local file.', ]; \ No newline at end of file From 36b44f181441753db8516e1a07a3cbc3a900edd1 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:42 +0100 Subject: [PATCH 066/350] New translations --- resources/lang/de_DE/demo.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/resources/lang/de_DE/demo.php b/resources/lang/de_DE/demo.php index e8da707bfa..6cd5476b57 100644 --- a/resources/lang/de_DE/demo.php +++ b/resources/lang/de_DE/demo.php @@ -8,14 +8,17 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', - 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', - 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', - 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', - 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', - 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'import-index' => 'Of course, any CSV file can be imported into Firefly III ', + 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.', + 'import-configure-configuration' => 'The configuration you see below is correct for the local file.', ]; \ No newline at end of file From 4d3132f1c9126863939b0a901fcc7bb2eecad3fd Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:43 +0100 Subject: [PATCH 067/350] New translations --- resources/lang/fr_FR/demo.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/resources/lang/fr_FR/demo.php b/resources/lang/fr_FR/demo.php index e8da707bfa..6cd5476b57 100644 --- a/resources/lang/fr_FR/demo.php +++ b/resources/lang/fr_FR/demo.php @@ -8,14 +8,17 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', - 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', - 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', - 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', - 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', - 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'import-index' => 'Of course, any CSV file can be imported into Firefly III ', + 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.', + 'import-configure-configuration' => 'The configuration you see below is correct for the local file.', ]; \ No newline at end of file From 8d709f9cf4bcc4e01f8290533c421447d70f372f Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:45 +0100 Subject: [PATCH 068/350] New translations --- resources/lang/nl_NL/demo.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/resources/lang/nl_NL/demo.php b/resources/lang/nl_NL/demo.php index e8da707bfa..6cd5476b57 100644 --- a/resources/lang/nl_NL/demo.php +++ b/resources/lang/nl_NL/demo.php @@ -8,14 +8,17 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', - 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', - 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', - 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', - 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', - 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'import-index' => 'Of course, any CSV file can be imported into Firefly III ', + 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.', + 'import-configure-configuration' => 'The configuration you see below is correct for the local file.', ]; \ No newline at end of file From 67f2e3a32a0513430acff505a3158068fffb9216 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:42:47 +0100 Subject: [PATCH 069/350] New translations --- resources/lang/hr_HR/demo.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/resources/lang/hr_HR/demo.php b/resources/lang/hr_HR/demo.php index e8da707bfa..6cd5476b57 100644 --- a/resources/lang/hr_HR/demo.php +++ b/resources/lang/hr_HR/demo.php @@ -8,14 +8,17 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', - 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', - 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', - 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', - 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', - 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', + 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', + 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', + 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', + 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', + 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', + 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', + 'import-index' => 'Of course, any CSV file can be imported into Firefly III ', + 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.', + 'import-configure-configuration' => 'The configuration you see below is correct for the local file.', ]; \ No newline at end of file From 4804257fd1a0df44419218261f140d86b62bd110 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 19:59:56 +0100 Subject: [PATCH 070/350] Various code cleanup --- app/Console/Commands/UpgradeDatabase.php | 80 ++++++++++--------- app/Console/Kernel.php | 11 --- app/Exceptions/Handler.php | 5 +- .../Collector/JournalExportCollector.php | 2 +- app/Export/Entry/Entry.php | 56 +++++++------ 5 files changed, 78 insertions(+), 76 deletions(-) diff --git a/app/Console/Commands/UpgradeDatabase.php b/app/Console/Commands/UpgradeDatabase.php index 07cebe2fdf..a526e31a5a 100644 --- a/app/Console/Commands/UpgradeDatabase.php +++ b/app/Console/Commands/UpgradeDatabase.php @@ -57,8 +57,6 @@ class UpgradeDatabase extends Command public function handle() { $this->setTransactionIdentifier(); - - } /** @@ -85,42 +83,52 @@ class UpgradeDatabase extends Command $journalIds = array_unique($result->pluck('id')->toArray()); foreach ($journalIds as $journalId) { - // grab all positive transactiosn from this journal that are not deleted. - // for each one, grab the negative opposing one which has 0 as an identifier and give it the same identifier. - $identifier = 0; - $processed = []; - $transactions = Transaction::where('transaction_journal_id', $journalId)->where('amount', '>', 0)->get(); - /** @var Transaction $transaction */ - foreach ($transactions as $transaction) { - // find opposing: - $amount = bcmul(strval($transaction->amount), '-1'); + $this->updateJournal($journalId); + } + } - try { - /** @var Transaction $opposing */ - $opposing = Transaction::where('transaction_journal_id', $journalId) - ->where('amount', $amount)->where('identifier', '=', 0) - ->whereNotIn('id', $processed) - ->first(); - } catch (QueryException $e) { - Log::error($e->getMessage()); - $this->error('Firefly III could not find the "identifier" field in the "transactions" table.'); - $this->error(sprintf('This field is required for Firefly III version %s to run.', config('firefly.version'))); - $this->error('Please run "php artisan migrate" to add this field to the table.'); - $this->info('Then, run "php artisan firefly:upgrade-database" to try again.'); - break 2; - } - if (!is_null($opposing)) { - // give both a new identifier: - $transaction->identifier = $identifier; - $transaction->save(); - $opposing->identifier = $identifier; - $opposing->save(); - $processed[] = $transaction->id; - $processed[] = $opposing->id; - $this->line(sprintf('Database upgrade for journal #%d, transactions #%d and #%d', $journalId, $transaction->id, $opposing->id)); - } - $identifier++; + /** + * grab all positive transactiosn from this journal that are not deleted. for each one, grab the negative opposing one + * which has 0 as an identifier and give it the same identifier. + * + * @param int $journalId + */ + private function updateJournal(int $journalId) + { + $identifier = 0; + $processed = []; + $transactions = Transaction::where('transaction_journal_id', $journalId)->where('amount', '>', 0)->get(); + /** @var Transaction $transaction */ + foreach ($transactions as $transaction) { + // find opposing: + $amount = bcmul(strval($transaction->amount), '-1'); + + try { + /** @var Transaction $opposing */ + $opposing = Transaction::where('transaction_journal_id', $journalId) + ->where('amount', $amount)->where('identifier', '=', 0) + ->whereNotIn('id', $processed) + ->first(); + } catch (QueryException $e) { + Log::error($e->getMessage()); + $this->error('Firefly III could not find the "identifier" field in the "transactions" table.'); + $this->error(sprintf('This field is required for Firefly III version %s to run.', config('firefly.version'))); + $this->error('Please run "php artisan migrate" to add this field to the table.'); + $this->info('Then, run "php artisan firefly:upgrade-database" to try again.'); + + return; } + if (!is_null($opposing)) { + // give both a new identifier: + $transaction->identifier = $identifier; + $transaction->save(); + $opposing->identifier = $identifier; + $opposing->save(); + $processed[] = $transaction->id; + $processed[] = $opposing->id; + $this->line(sprintf('Database upgrade for journal #%d, transactions #%d and #%d', $journalId, $transaction->id, $opposing->id)); + } + $identifier++; } } } diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 7c9c52fc01..aa2805e9ae 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -76,15 +76,4 @@ class Kernel extends ConsoleKernel { require base_path('routes/console.php'); } - - /** - * Define the application's command schedule. - * - * @param \Illuminate\Console\Scheduling\Schedule $schedule - * - * @return void - */ - protected function schedule(Schedule $schedule) - { - } } diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index c8b15f984d..2d1a846044 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -72,6 +72,7 @@ class Handler extends ExceptionHandler * This is a great spot to send exceptions to Sentry, Bugsnag, etc. * * @param Exception $exception + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's exactly five. * * @return void */ @@ -98,8 +99,8 @@ class Handler extends ExceptionHandler ]; // create job that will mail. - $ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; - $job = new MailError($userData, env('SITE_OWNER', ''), $ip, $data); + $ipAddress = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; + $job = new MailError($userData, env('SITE_OWNER', ''), $ipAddress, $data); dispatch($job); } diff --git a/app/Export/Collector/JournalExportCollector.php b/app/Export/Collector/JournalExportCollector.php index 57d65fc4e7..e9bfbca879 100644 --- a/app/Export/Collector/JournalExportCollector.php +++ b/app/Export/Collector/JournalExportCollector.php @@ -287,7 +287,7 @@ class JournalExportCollector extends BasicCollector implements CollectorInterfac } /** - * + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ private function getWorkSet() { diff --git a/app/Export/Entry/Entry.php b/app/Export/Entry/Entry.php index 259dd675ab..c29467a178 100644 --- a/app/Export/Entry/Entry.php +++ b/app/Export/Entry/Entry.php @@ -29,6 +29,7 @@ use Crypt; * * * Class Entry + * @SuppressWarnings(PHPMD.LongVariable) * * @package FireflyIII\Export\Entry */ @@ -71,33 +72,21 @@ final class Entry */ public static function fromObject($object): Entry { - $entry = new self; - - // journal information: - $entry->journal_id = $object->transaction_journal_id; - $entry->description = $object->journal_encrypted === 1 ? Crypt::decrypt($object->journal_description) : $object->journal_description; - $entry->amount = round($object->amount, 2); // always positive - $entry->date = $object->date; - $entry->transaction_type = $object->transaction_type; - $entry->currency_code = $object->transaction_currency_code; - - // source information: - $entry->source_account_id = $object->account_id; - $entry->source_account_name = $object->account_name_encrypted === 1 ? Crypt::decrypt($object->account_name) : $object->account_name; - - - // destination information + $entry = new self; + $entry->journal_id = $object->transaction_journal_id; + $entry->description = self::decrypt($object->journal_encrypted, $object->journal_description); + $entry->amount = round($object->amount, 2); // always positive + $entry->date = $object->date; + $entry->transaction_type = $object->transaction_type; + $entry->currency_code = $object->transaction_currency_code; + $entry->source_account_id = $object->account_id; + $entry->source_account_name = self::decrypt($object->account_name_encrypted, $object->account_name); $entry->destination_account_id = $object->opposing_account_id; - $entry->destination_account_name = $object->opposing_account_encrypted === 1 ? Crypt::decrypt($object->opposing_account_name) - : $object->opposing_account_name; - - - // category and budget - $entry->category_id = $object->category_id ?? ''; - $entry->category_name = $object->category_name ?? ''; - $entry->budget_id = $object->budget_id ?? ''; - $entry->budget_name = $object->budget_name ?? ''; - + $entry->destination_account_name = self::decrypt($object->opposing_account_encrypted, $object->opposing_account_name); + $entry->category_id = $object->category_id ?? ''; + $entry->category_name = $object->category_name ?? ''; + $entry->budget_id = $object->budget_id ?? ''; + $entry->budget_name = $object->budget_name ?? ''; // update description when transaction description is different: if (!is_null($object->description) && $object->description != $entry->description) { @@ -107,4 +96,19 @@ final class Entry return $entry; } + /** + * @param int $isEncrypted + * @param $value + * + * @return string + */ + protected static function decrypt(int $isEncrypted, $value) + { + if ($isEncrypted === 1) { + return Crypt::decrypt($value); + } + + return $value; + } + } From 7405138489b885f73c80147dea6491f8a1a24fd2 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 20:07:28 +0100 Subject: [PATCH 071/350] Various code cleanup --- .../Report/Audit/MonthReportGenerator.php | 69 +++++++++++-------- .../Report/Category/MonthReportGenerator.php | 1 + 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/app/Generator/Report/Audit/MonthReportGenerator.php b/app/Generator/Report/Audit/MonthReportGenerator.php index a5f30e9a10..f5a5abd56c 100644 --- a/app/Generator/Report/Audit/MonthReportGenerator.php +++ b/app/Generator/Report/Audit/MonthReportGenerator.php @@ -49,33 +49,8 @@ class MonthReportGenerator implements ReportGeneratorInterface /** @var Account $account */ foreach ($this->accounts as $account) { // balance the day before: - $id = $account->id; - $dayBeforeBalance = Steam::balance($account, $dayBefore); - $collector = new JournalCollector(auth()->user()); - $collector->setAccounts(new Collection([$account]))->setRange($this->start, $this->end); - $journals = $collector->getJournals(); - $journals = $journals->reverse(); - $startBalance = $dayBeforeBalance; - - - /** @var Transaction $journal */ - foreach ($journals as $transaction) { - $transaction->before = $startBalance; - $transactionAmount = $transaction->transaction_amount; - $newBalance = bcadd($startBalance, $transactionAmount); - $transaction->after = $newBalance; - $startBalance = $newBalance; - } - - /* - * Reverse set again. - */ - $auditData[$id]['journals'] = $journals->reverse(); - $auditData[$id]['exists'] = $journals->count() > 0; - $auditData[$id]['end'] = $this->end->formatLocalized(strval(trans('config.month_and_day'))); - $auditData[$id]['endBalance'] = Steam::balance($account, $this->end); - $auditData[$id]['dayBefore'] = $dayBefore->formatLocalized(strval(trans('config.month_and_day'))); - $auditData[$id]['dayBeforeBalance'] = $dayBeforeBalance; + $id = $account->id; + $auditData[$id] = $this->getAuditReport($account, $dayBefore); } $defaultShow = ['icon', 'description', 'balance_before', 'amount', 'balance_after', 'date', 'to']; @@ -153,4 +128,44 @@ class MonthReportGenerator implements ReportGeneratorInterface return $this; } + + /** + * @param Account $account + * @param Carbon $date + * + * @return array + */ + private function getAuditReport(Account $account, Carbon $date): array + { + $dayBeforeBalance = Steam::balance($account, $date); + $collector = new JournalCollector(auth()->user()); + $collector->setAccounts(new Collection([$account]))->setRange($this->start, $this->end); + $journals = $collector->getJournals(); + $journals = $journals->reverse(); + $startBalance = $dayBeforeBalance; + + + /** @var Transaction $journal */ + foreach ($journals as $transaction) { + $transaction->before = $startBalance; + $transactionAmount = $transaction->transaction_amount; + $newBalance = bcadd($startBalance, $transactionAmount); + $transaction->after = $newBalance; + $startBalance = $newBalance; + } + + /* + * Reverse set again. + */ + $return = [ + 'journals' => $journals->reverse(), + 'exists' => $journals->count() > 0, + 'end' => $this->end->formatLocalized(strval(trans('config.month_and_day'))), + 'endBalance' => Steam::balance($account, $this->end), + 'dayBefore' => $date->formatLocalized(strval(trans('config.month_and_day'))), + 'dayBeforeBalance' => $dayBeforeBalance, + ]; + + return $return; + } } diff --git a/app/Generator/Report/Category/MonthReportGenerator.php b/app/Generator/Report/Category/MonthReportGenerator.php index 53aa790e28..a11bbc7460 100644 --- a/app/Generator/Report/Category/MonthReportGenerator.php +++ b/app/Generator/Report/Category/MonthReportGenerator.php @@ -229,6 +229,7 @@ class MonthReportGenerator extends Support implements ReportGeneratorInterface } /** + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's exactly five. * @param array $spent * @param array $earned * From 02695d852c25f86617ba8ae03285a3d099ab4897 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 20:45:23 +0100 Subject: [PATCH 072/350] Various code cleanup --- .../Events/StoredJournalEventHandler.php | 150 +++++++++++------- 1 file changed, 93 insertions(+), 57 deletions(-) diff --git a/app/Handlers/Events/StoredJournalEventHandler.php b/app/Handlers/Events/StoredJournalEventHandler.php index ade9536765..2378bcf70d 100644 --- a/app/Handlers/Events/StoredJournalEventHandler.php +++ b/app/Handlers/Events/StoredJournalEventHandler.php @@ -16,6 +16,7 @@ namespace FireflyIII\Handlers\Events; use FireflyIII\Events\StoredTransactionJournal; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBankEvent; +use FireflyIII\Models\PiggyBankRepetition; use FireflyIII\Models\Rule; use FireflyIII\Models\RuleGroup; use FireflyIII\Models\TransactionJournal; @@ -33,79 +34,40 @@ class StoredJournalEventHandler /** * This method connects a new transfer to a piggy bank. * - * @param StoredTransactionJournal $storedJournalEvent + * @param StoredTransactionJournal $event * * @return bool */ - public function connectToPiggyBank(StoredTransactionJournal $storedJournalEvent): bool + public function connectToPiggyBank(StoredTransactionJournal $event): bool { /** @var TransactionJournal $journal */ - $journal = $storedJournalEvent->journal; - $piggyBankId = $storedJournalEvent->piggyBankId; - + $journal = $event->journal; + $piggyBankId = $event->piggyBankId; Log::debug(sprintf('Trying to connect journal %d to piggy bank %d.', $journal->id, $piggyBankId)); - /** @var PiggyBank $piggyBank */ - $piggyBank = $journal->user->piggyBanks()->where('piggy_banks.id', $piggyBankId)->first(['piggy_banks.*']); - - if (is_null($piggyBank)) { - Log::error('No such piggy bank!'); - - return true; - } - Log::debug(sprintf('Found piggy bank #%d: "%s"', $piggyBank->id, $piggyBank->name)); - // update piggy bank rep for date of transaction journal. - $repetition = $piggyBank->piggyBankRepetitions()->relevantOnDate($journal->date)->first(); - if (is_null($repetition)) { - Log::error(sprintf('No piggy bank repetition on %s!', $journal->date->format('Y-m-d'))); + /* + * Verify existence of piggy bank: + */ + if (!$this->verifyExistence($event)) { + Log::error('No such piggy bank or no repetition on %s', $journal->date->format('Y-m-d')); return true; } - $amount = TransactionJournal::amountPositive($journal); - Log::debug(sprintf('Will add/remove %f to piggy bank #%d ("%s")', $amount, $piggyBank->id, $piggyBank->name)); - // if piggy account matches source account, the amount is positive - $sources = TransactionJournal::sourceAccountList($journal)->pluck('id')->toArray(); - if (in_array($piggyBank->account_id, $sources)) { - $amount = bcmul($amount, '-1'); - Log::debug(sprintf('Account #%d is the source, so will remove amount from piggy bank.', $piggyBank->account_id)); - } - - // if the amount is positive: - // make sure it fits in piggy bank: - if (bccomp($amount, '0') === 1) { - // amount is positive - $room = bcsub(strval($piggyBank->targetamount), strval($repetition->currentamount)); - Log::debug(sprintf('Room in piggy bank for extra money is %f', $room)); - if (bccomp($room, $amount) === -1) { - // $room is smaller than $amount - Log::debug(sprintf('There is NO room to add %f to piggy bank #%d ("%s")', $amount, $piggyBank->id, $piggyBank->name)); - Log::debug(sprintf('New amount is %f', $room)); - $amount = $room; - } - } - - if (bccomp($amount, '0') === -1) { - // amount is negative - Log::debug(sprintf('Max amount to remove is %f', $repetition->currentamount)); - $compare = bcmul($repetition->currentamount, '-1'); - if (bccomp($compare, $amount) === 1) { - // $currentamount is smaller than $amount - Log::debug(sprintf('Cannot remove %f from piggy bank #%d ("%s")', $amount, $piggyBank->id, $piggyBank->name)); - Log::debug(sprintf('New amount is %f', $compare)); - $amount = $compare; - } - } - - + /* + * Get relevant data: + */ + $piggyBank = $journal->user->piggyBanks()->where('piggy_banks.id', $piggyBankId)->first(['piggy_banks.*']); + $repetition = $piggyBank->piggyBankRepetitions()->relevantOnDate($journal->date)->first(); + $amount = $this->getExactAmount($journal, $piggyBank, $repetition); $repetition->currentamount = bcadd($repetition->currentamount, $amount); $repetition->save(); - /** @var PiggyBankEvent $storedJournalEvent */ - $storedJournalEvent = PiggyBankEvent::create( + /** @var PiggyBankEvent $event */ + $event = PiggyBankEvent::create( ['piggy_bank_id' => $piggyBank->id, 'transaction_journal_id' => $journal->id, 'date' => $journal->date, 'amount' => $amount] ); - Log::debug(sprintf('Created piggy bank event #%d', $storedJournalEvent->id)); + Log::debug(sprintf('Created piggy bank event #%d', $event->id)); return true; } @@ -161,4 +123,78 @@ class StoredJournalEventHandler return true; } + + /** + * @param TransactionJournal $journal + * @param PiggyBank $piggyBank + * @param PiggyBankRepetition $repetition + * + * @return string + */ + private function getExactAmount(TransactionJournal $journal, PiggyBank $piggyBank, PiggyBankRepetition $repetition): string + { + $amount = TransactionJournal::amountPositive($journal); + $sources = TransactionJournal::sourceAccountList($journal)->pluck('id')->toArray(); + $room = bcsub(strval($piggyBank->targetamount), strval($repetition->currentamount)); + $compare = bcmul($repetition->currentamount, '-1'); + + Log::debug(sprintf('Will add/remove %f to piggy bank #%d ("%s")', $amount, $piggyBank->id, $piggyBank->name)); + + // if piggy account matches source account, the amount is positive + if (in_array($piggyBank->account_id, $sources)) { + $amount = bcmul($amount, '-1'); + Log::debug(sprintf('Account #%d is the source, so will remove amount from piggy bank.', $piggyBank->account_id)); + } + + + // if the amount is positive, make sure it fits in piggy bank: + if (bccomp($amount, '0') === 1 && bccomp($room, $amount) === -1) { + // amount is positive and $room is smaller than $amount + Log::debug(sprintf('Room in piggy bank for extra money is %f', $room)); + Log::debug(sprintf('There is NO room to add %f to piggy bank #%d ("%s")', $amount, $piggyBank->id, $piggyBank->name)); + Log::debug(sprintf('New amount is %f', $room)); + $amount = $room; + } + + // amount is negative and $currentamount is smaller than $amount + if (bccomp($amount, '0') === -1 && bccomp($compare, $amount) === 1) { + Log::debug(sprintf('Max amount to remove is %f', $repetition->currentamount)); + Log::debug(sprintf('Cannot remove %f from piggy bank #%d ("%s")', $amount, $piggyBank->id, $piggyBank->name)); + Log::debug(sprintf('New amount is %f', $compare)); + $amount = $compare; + } + + return $amount; + } + + /** + * @param StoredTransactionJournal $event + * + * @return bool + */ + private function verifyExistence(StoredTransactionJournal $event): bool + { + /** @var TransactionJournal $journal */ + $journal = $event->journal; + $piggyBankId = $event->piggyBankId; + + /** @var PiggyBank $piggyBank */ + $piggyBank = $journal->user->piggyBanks()->where('piggy_banks.id', $piggyBankId)->first(['piggy_banks.*']); + + if (is_null($piggyBank)) { + Log::error('No such piggy bank!'); + + return false; + } + Log::debug(sprintf('Found piggy bank #%d: "%s"', $piggyBank->id, $piggyBank->name)); + // update piggy bank rep for date of transaction journal. + $repetition = $piggyBank->piggyBankRepetitions()->relevantOnDate($journal->date)->first(); + if (is_null($repetition)) { + Log::error(sprintf('No piggy bank repetition on %s!', $journal->date->format('Y-m-d'))); + + return false; + } + + return true; + } } From 1aee3d8e2c4c390f4377ef2db07534f976f6e80f Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 20:52:00 +0100 Subject: [PATCH 073/350] Various code cleanup --- app/Events/BlockedBadLogin.php | 1 + app/Events/BlockedUseOfEmail.php | 1 + app/Events/BlockedUserLogin.php | 1 + app/Events/DeletedUser.php | 1 + app/Events/LockedOutUser.php | 1 + app/Handlers/Events/StoredJournalEventHandler.php | 7 +++++-- app/Handlers/Events/UserEventHandler.php | 8 ++++++++ app/Helpers/Collection/BalanceLine.php | 7 ++++--- app/Helpers/Help/Help.php | 4 ---- 9 files changed, 22 insertions(+), 9 deletions(-) diff --git a/app/Events/BlockedBadLogin.php b/app/Events/BlockedBadLogin.php index f3239bd7f8..f3e2ad3ad8 100644 --- a/app/Events/BlockedBadLogin.php +++ b/app/Events/BlockedBadLogin.php @@ -18,6 +18,7 @@ use Illuminate\Queue\SerializesModels; /** * Class BlockedBadLogin * + * @deprecated * @package FireflyIII\Events */ class BlockedBadLogin extends Event diff --git a/app/Events/BlockedUseOfEmail.php b/app/Events/BlockedUseOfEmail.php index 8b9d7cbed5..8676a4648d 100644 --- a/app/Events/BlockedUseOfEmail.php +++ b/app/Events/BlockedUseOfEmail.php @@ -19,6 +19,7 @@ use Illuminate\Queue\SerializesModels; /** * Class BlockedUseOfEmail * + * @deprecated * @package FireflyIII\Events */ class BlockedUseOfEmail extends Event diff --git a/app/Events/BlockedUserLogin.php b/app/Events/BlockedUserLogin.php index fd12fb8a36..5ca2d9430a 100644 --- a/app/Events/BlockedUserLogin.php +++ b/app/Events/BlockedUserLogin.php @@ -19,6 +19,7 @@ use Illuminate\Queue\SerializesModels; /** * Class BlockedUserLogin * + * @deprecated * @package FireflyIII\Events */ class BlockedUserLogin extends Event diff --git a/app/Events/DeletedUser.php b/app/Events/DeletedUser.php index 80ab5d58ce..5137cf2862 100644 --- a/app/Events/DeletedUser.php +++ b/app/Events/DeletedUser.php @@ -18,6 +18,7 @@ use Illuminate\Queue\SerializesModels; /** * Class DeletedUser * + * @deprecated * @package FireflyIII\Events */ class DeletedUser extends Event diff --git a/app/Events/LockedOutUser.php b/app/Events/LockedOutUser.php index c498ad1ed7..07586faefb 100644 --- a/app/Events/LockedOutUser.php +++ b/app/Events/LockedOutUser.php @@ -18,6 +18,7 @@ use Illuminate\Queue\SerializesModels; /** * Class LockedOutUser * + * @deprecated * @package FireflyIII\Events */ class LockedOutUser extends Event diff --git a/app/Handlers/Events/StoredJournalEventHandler.php b/app/Handlers/Events/StoredJournalEventHandler.php index 2378bcf70d..c4e10d8f24 100644 --- a/app/Handlers/Events/StoredJournalEventHandler.php +++ b/app/Handlers/Events/StoredJournalEventHandler.php @@ -125,6 +125,7 @@ class StoredJournalEventHandler } /** + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's 6 but I can live with it. * @param TransactionJournal $journal * @param PiggyBank $piggyBank * @param PiggyBankRepetition $repetition @@ -153,7 +154,8 @@ class StoredJournalEventHandler Log::debug(sprintf('Room in piggy bank for extra money is %f', $room)); Log::debug(sprintf('There is NO room to add %f to piggy bank #%d ("%s")', $amount, $piggyBank->id, $piggyBank->name)); Log::debug(sprintf('New amount is %f', $room)); - $amount = $room; + + return $room; } // amount is negative and $currentamount is smaller than $amount @@ -161,7 +163,8 @@ class StoredJournalEventHandler Log::debug(sprintf('Max amount to remove is %f', $repetition->currentamount)); Log::debug(sprintf('Cannot remove %f from piggy bank #%d ("%s")', $amount, $piggyBank->id, $piggyBank->name)); Log::debug(sprintf('New amount is %f', $compare)); - $amount = $compare; + + return $compare; } return $amount; diff --git a/app/Handlers/Events/UserEventHandler.php b/app/Handlers/Events/UserEventHandler.php index 0481dd516f..316be2e682 100644 --- a/app/Handlers/Events/UserEventHandler.php +++ b/app/Handlers/Events/UserEventHandler.php @@ -85,6 +85,7 @@ class UserEventHandler /** * @param BlockedBadLogin $event * + * @deprecated * @return bool */ public function reportBadLogin(BlockedBadLogin $event) @@ -118,6 +119,7 @@ class UserEventHandler /** * @param BlockedUserLogin $event * + * @deprecated * @return bool */ public function reportBlockedUser(BlockedUserLogin $event): bool @@ -157,6 +159,7 @@ class UserEventHandler /** * @param LockedOutUser $event * + * @deprecated * @return bool */ public function reportLockout(LockedOutUser $event): bool @@ -189,6 +192,7 @@ class UserEventHandler /** * @param BlockedUseOfDomain $event * + * @deprecated * @return bool */ public function reportUseBlockedDomain(BlockedUseOfDomain $event): bool @@ -227,6 +231,7 @@ class UserEventHandler /** * @param BlockedUseOfEmail $event * + * @deprecated * @return bool */ public function reportUseOfBlockedEmail(BlockedUseOfEmail $event): bool @@ -263,6 +268,7 @@ class UserEventHandler /** * @param DeletedUser $event * + * @deprecated * @return bool */ public function saveEmailAddress(DeletedUser $event): bool @@ -379,6 +385,7 @@ class UserEventHandler * from the user yet stored conveniently. * * @param ConfirmedUser $event + * @deprecated * * @return bool */ @@ -394,6 +401,7 @@ class UserEventHandler * fashion as the previous method. * * @param RegisteredUser $event + * @deprecated * * @return bool */ diff --git a/app/Helpers/Collection/BalanceLine.php b/app/Helpers/Collection/BalanceLine.php index 28b0d879ba..f82a5ee3db 100644 --- a/app/Helpers/Collection/BalanceLine.php +++ b/app/Helpers/Collection/BalanceLine.php @@ -139,6 +139,7 @@ class BalanceLine } /** + * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @return string */ public function getTitle(): string @@ -147,13 +148,13 @@ class BalanceLine return $this->getBudget()->name; } if ($this->getRole() == self::ROLE_DEFAULTROLE) { - return trans('firefly.no_budget'); + return strval(trans('firefly.no_budget')); } if ($this->getRole() == self::ROLE_TAGROLE) { - return trans('firefly.coveredWithTags'); + return strval(trans('firefly.coveredWithTags')); } if ($this->getRole() == self::ROLE_DIFFROLE) { - return trans('firefly.leftUnbalanced'); + return strval(trans('firefly.leftUnbalanced')); } return ''; diff --git a/app/Helpers/Help/Help.php b/app/Helpers/Help/Help.php index 0d290955ca..12f01670dd 100644 --- a/app/Helpers/Help/Help.php +++ b/app/Helpers/Help/Help.php @@ -74,12 +74,8 @@ class Help implements HelpInterface $converter = new CommonMarkConverter(); $content = $converter->convertToHtml($content); } - if (strlen($content) === 0) { - Log::warning('Raw content length is zero.'); - } return $content; - } /** From 02e792148c64296d264551a862b84359d055ad28 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 27 Dec 2016 22:11:29 +0100 Subject: [PATCH 074/350] Forgot sprintf call. --- app/Handlers/Events/StoredJournalEventHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Handlers/Events/StoredJournalEventHandler.php b/app/Handlers/Events/StoredJournalEventHandler.php index c4e10d8f24..14e4e2a438 100644 --- a/app/Handlers/Events/StoredJournalEventHandler.php +++ b/app/Handlers/Events/StoredJournalEventHandler.php @@ -49,7 +49,7 @@ class StoredJournalEventHandler * Verify existence of piggy bank: */ if (!$this->verifyExistence($event)) { - Log::error('No such piggy bank or no repetition on %s', $journal->date->format('Y-m-d')); + Log::error(sprintf('No such piggy bank or no repetition on %s', $journal->date->format('Y-m-d'))); return true; } From 6521a7c6043f08d030202305cd2c348229d68550 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 05:16:55 +0100 Subject: [PATCH 075/350] This fixes #501 --- app/Support/Twig/Journal.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Support/Twig/Journal.php b/app/Support/Twig/Journal.php index 65aac8e818..5039212e22 100644 --- a/app/Support/Twig/Journal.php +++ b/app/Support/Twig/Journal.php @@ -253,12 +253,12 @@ class Journal extends Twig_Extension $budgets = []; // get all budgets: foreach ($journal->budgets as $budget) { - $budgets[] = sprintf('%1$s', e($budget->name), route('accounts.show', $budget->id)); + $budgets[] = sprintf('%1$s', e($budget->name), route('budgets.show', $budget->id)); } // and more! foreach ($journal->transactions as $transaction) { foreach ($transaction->budgets as $budget) { - $budgets[] = sprintf('%1$s', e($budget->name), route('accounts.show', $budget->id)); + $budgets[] = sprintf('%1$s', e($budget->name), route('budgets.show', $budget->id)); } } $string = join(', ', array_unique($budgets)); @@ -288,7 +288,7 @@ class Journal extends Twig_Extension $categories = []; // get all categories for the journal itself (easy): foreach ($journal->categories as $category) { - $categories[] = sprintf('%1$s', e($category->name), route('accounts.show', $category->id)); + $categories[] = sprintf('%1$s', e($category->name), route('categories.show', $category->id)); } if (count($categories) === 0) { $set = Category::distinct()->leftJoin('category_transaction', 'categories.id', '=', 'category_transaction.category_id') @@ -299,7 +299,7 @@ class Journal extends Twig_Extension ->get(['categories.*']); /** @var Category $category */ foreach ($set as $category) { - $categories[] = sprintf('%1$s', e($category->name), route('accounts.show', $category->id)); + $categories[] = sprintf('%1$s', e($category->name), route('categories.show', $category->id)); } } From c23ea5ea7685995e1d350b968a12b60380e04641 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 05:17:07 +0100 Subject: [PATCH 076/350] Start of new change log. --- CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2d14ac49e..b57b07d91a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,25 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [4.3.1] - 2017-01-xx +### Added +- Support for Russian. + +### Changed +- **[New Github repository!](github.com/firefly-iii/firefly-iii)** + +### Deprecated +- With the realization of a proper demo site many administrative functions have become deprecated, and will be removed over the coming releases. Included but not limited to the ability to block domains for registration, get email notifications for specific actions and many more. + +### Removed +- Something + +### Fixed +- Something + +### Security +- Something + ## [4.3.0] - 2015-12-26 ### Added - New method of keeping track of available budget, see issue #489 From 2dc70ece444044fbcff12d979361aeaa2a165128 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 05:25:58 +0100 Subject: [PATCH 077/350] Some tweaks for #502 --- resources/views/reports/partials/income-expenses.twig | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/views/reports/partials/income-expenses.twig b/resources/views/reports/partials/income-expenses.twig index de978da6fc..c70f60b0d7 100644 --- a/resources/views/reports/partials/income-expenses.twig +++ b/resources/views/reports/partials/income-expenses.twig @@ -4,6 +4,7 @@ {{ 'name'|_ }} {{ 'total'|_ }} {{ 'average'|_ }} + @@ -21,8 +22,6 @@
{{ entry.count }} {{ 'transactions'|_|lower }} - {% endif %} @@ -36,6 +35,10 @@ — {% endif %} + + + {% endfor %} From ebdd64f46f772a2f318a1c4d73a64dec761fbf8d Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 05:48:41 +0100 Subject: [PATCH 078/350] Fix small issues in the category overview and the journal collector. --- app/Http/Controllers/BillController.php | 2 +- app/Http/Controllers/CategoryController.php | 6 +++--- app/Repositories/Category/CategoryRepository.php | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/BillController.php b/app/Http/Controllers/BillController.php index 5e3b3a09ef..35f4329d95 100644 --- a/app/Http/Controllers/BillController.php +++ b/app/Http/Controllers/BillController.php @@ -214,7 +214,7 @@ class BillController extends Controller // use collector: $collector = new JournalCollector(auth()->user()); - $collector->setAllAssetAccounts()->setBills(new Collection([$bill]))->setPage($page)->setLimit($pageSize); + $collector->setAllAssetAccounts()->setBills(new Collection([$bill]))->setLimit($pageSize)->setPage($page); $journals = $collector->getPaginatedJournals(); $journals->setPath('/bills/show/' . $bill->id); diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index bd6c9178da..38f544598a 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -194,7 +194,7 @@ class CategoryController extends Controller // use journal collector $collector = app(JournalCollectorInterface::class); - $collector->setPage($page)->setLimit($pageSize)->setAllAssetAccounts()->setRange($start, $end)->setCategory($category); + $collector->setLimit($pageSize)->setPage($page)->setAllAssetAccounts()->setRange($start, $end)->setCategory($category); $journals = $collector->getPaginatedJournals(); $journals->setPath('categories/show/' . $category->id); @@ -226,7 +226,7 @@ class CategoryController extends Controller // new collector: $collector = app(JournalCollectorInterface::class); - $collector->setPage($page)->setLimit($pageSize)->setAllAssetAccounts()->setRange($start, $end)->setCategory($category); + $collector->setLimit($pageSize)->setPage($page)->setAllAssetAccounts()->setCategory($category); $journals = $collector->getPaginatedJournals(); $journals->setPath('categories/show/' . $category->id . '/all'); @@ -253,7 +253,7 @@ class CategoryController extends Controller // new collector: $collector = app(JournalCollectorInterface::class); - $collector->setPage($page)->setLimit($pageSize)->setAllAssetAccounts()->setRange($start, $end)->setCategory($category); + $collector->setLimit($pageSize)->setPage($page)->setAllAssetAccounts()->setRange($start, $end)->setCategory($category); $journals = $collector->getPaginatedJournals(); $journals->setPath('categories/show/' . $category->id . '/' . $date); diff --git a/app/Repositories/Category/CategoryRepository.php b/app/Repositories/Category/CategoryRepository.php index 65b46ad44c..4d32e42fa6 100644 --- a/app/Repositories/Category/CategoryRepository.php +++ b/app/Repositories/Category/CategoryRepository.php @@ -134,27 +134,27 @@ class CategoryRepository implements CategoryRepositoryInterface { $first = null; - - /** @var TransactionJournal $first */ + /** @var TransactionJournal $firstJournal */ $firstJournal = $category->transactionJournals()->orderBy('date', 'ASC')->first(['transaction_journals.date']); if ($firstJournal) { $first = $firstJournal->date; } - // check transactions: - $firstTransaction = $category->transactions() ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') ->orderBy('transaction_journals.date', 'ASC')->first(['transaction_journals.date']); - if (!is_null($firstTransaction) && ((!is_null($first) && $firstTransaction->date < $first) || is_null($first))) { - $first = new Carbon($firstTransaction->date); + // both exist, the one that is earliest "wins". + if (!is_null($firstTransaction) && !is_null($first) && $firstTransaction->date->lt($first)) { + $first = $firstTransaction->date; } + if (is_null($first)) { return new Carbon('1900-01-01'); } + return $first; } From 94e51952f4852dcfe727c120617029d49ddb9522 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 06:09:48 +0100 Subject: [PATCH 079/350] More fields for query. --- app/Helpers/Collector/JournalCollector.php | 20 ++++++++ .../Controllers/TransactionController.php | 9 ++-- app/Support/Twig/Transaction.php | 47 ++++++++++++++++++- 3 files changed, 70 insertions(+), 6 deletions(-) diff --git a/app/Helpers/Collector/JournalCollector.php b/app/Helpers/Collector/JournalCollector.php index c874c9949e..f4a4713546 100644 --- a/app/Helpers/Collector/JournalCollector.php +++ b/app/Helpers/Collector/JournalCollector.php @@ -649,9 +649,17 @@ class JournalCollector implements JournalCollectorInterface // join some extra tables: $this->joinedBudget = true; $this->query->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id'); + $this->query->leftJoin('budgets as transaction_journal_budgets', 'transaction_journal_budgets.id', '=', 'budget_transaction_journal.budget_id'); $this->query->leftJoin('budget_transaction', 'budget_transaction.transaction_id', '=', 'transactions.id'); + $this->query->leftJoin('budgets as transaction_budgets', 'transaction_budgets.id', '=', 'budget_transaction.budget_id'); + $this->fields[] = 'budget_transaction_journal.budget_id as transaction_journal_budget_id'; + $this->fields[] = 'transaction_journal_budgets.encrypted as transaction_journal_budget_encrypted'; + $this->fields[] = 'transaction_journal_budgets.name as transaction_journal_budget_name'; + $this->fields[] = 'budget_transaction.budget_id as transaction_budget_id'; + $this->fields[] = 'transaction_budgets.encrypted as transaction_budget_encrypted'; + $this->fields[] = 'transaction_budgets.name as transaction_budget_name'; } } @@ -664,12 +672,24 @@ class JournalCollector implements JournalCollectorInterface // join some extra tables: $this->joinedCategory = true; $this->query->leftJoin('category_transaction_journal', 'category_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id'); + $this->query->leftJoin('categories as transaction_journal_categories', 'transaction_journal_categories.id', '=', 'category_transaction_journal.category_id'); + $this->query->leftJoin('category_transaction', 'category_transaction.transaction_id', '=', 'transactions.id'); + $this->query->leftJoin('categories as transaction_categories', 'transaction_categories.id', '=', 'category_transaction.category_id'); + $this->fields[] = 'category_transaction_journal.category_id as transaction_journal_category_id'; + $this->fields[] = 'transaction_journal_categories.encrypted as transaction_journal_category_encrypted'; + $this->fields[] = 'transaction_journal_categories.name as transaction_journal_category_name'; + $this->fields[] = 'category_transaction.category_id as transaction_category_id'; + $this->fields[] = 'transaction_categories.encrypted as transaction_category_encrypted'; + $this->fields[] = 'transaction_categories.name as transaction_category_name'; } } + /** + * + */ private function joinOpposingTables() { if (!$this->joinedOpposing) { diff --git a/app/Http/Controllers/TransactionController.php b/app/Http/Controllers/TransactionController.php index 3a1c4415e7..2ec3e8ce5c 100644 --- a/app/Http/Controllers/TransactionController.php +++ b/app/Http/Controllers/TransactionController.php @@ -71,10 +71,10 @@ class TransactionController extends Controller $start = session('start', Navigation::startOfPeriod(new Carbon, $range)); $end = session('end', Navigation::endOfPeriod(new Carbon, $range)); - + /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class, [auth()->user()]); $collector->setTypes($types)->setLimit($pageSize)->setPage($page)->setAllAssetAccounts(); - $collector->setRange($start, $end); + $collector->setRange($start, $end)->withBudgetInformation()->withCategoryInformation(); // do not filter transfers if $what = transfer. if (!in_array($what, ['transfer', 'transfers'])) { @@ -123,7 +123,7 @@ class TransactionController extends Controller $page = intval($request->get('page')) === 0 ? 1 : intval($request->get('page')); $collector = app(JournalCollectorInterface::class, [auth()->user()]); - $collector->setTypes($types)->setLimit($pageSize)->setPage($page)->setAllAssetAccounts(); + $collector->setTypes($types)->setLimit($pageSize)->setPage($page)->setAllAssetAccounts()->withBudgetInformation()->withCategoryInformation(); // do not filter transfers if $what = transfer. if (!in_array($what, ['transfer', 'transfers'])) { @@ -160,9 +160,10 @@ class TransactionController extends Controller Log::debug(sprintf('Transaction index by date will show between %s and %s', $start->format('Y-m-d'), $end->format('Y-m-d'))); + /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class, [auth()->user()]); $collector->setTypes($types)->setLimit($pageSize)->setPage($page)->setAllAssetAccounts(); - $collector->setRange($start, $end); + $collector->setRange($start, $end)->withBudgetInformation()->withCategoryInformation(); // do not filter transfers if $what = transfer. if (!in_array($what, ['transfer', 'transfers'])) { diff --git a/app/Support/Twig/Transaction.php b/app/Support/Twig/Transaction.php index 0e9d851c40..b00889bbc6 100644 --- a/app/Support/Twig/Transaction.php +++ b/app/Support/Twig/Transaction.php @@ -327,6 +327,21 @@ class Transaction extends Twig_Extension ); } + /** + * @param int $isEncrypted + * @param string $value + * + * @return string + */ + private function encrypted(int $isEncrypted, string $value): string + { + if ($isEncrypted === 1) { + return Crypt::decrypt($value); + } + + return $value; + } + /** * @param TransactionModel $transaction * @@ -334,6 +349,20 @@ class Transaction extends Twig_Extension */ private function getTransactionBudgets(TransactionModel $transaction): string { + // journal has a budget: + if (isset($transaction->transaction_journal_budget_id)) { + $name = $this->encrypted(intval($transaction->transaction_journal_budget_encrypted), $transaction->transaction_journal_budget_name); + + return sprintf('%s (a)', route('budgets.show', [$transaction->transaction_journal_budget_id]), $name, $name); + } + + // transaction has a budget + if (isset($transaction->transaction_budget_id)) { + $name = $this->encrypted(intval($transaction->transaction_budget_encrypted), $transaction->transaction_budget_name); + + return sprintf('%s (b)', route('budgets.show', [$transaction->transaction_budget_id]), $name, $name); + } + // see if the transaction has a budget: $budgets = $transaction->budgets()->get(); if ($budgets->count() === 0) { @@ -342,7 +371,7 @@ class Transaction extends Twig_Extension if ($budgets->count() > 0) { $str = []; foreach ($budgets as $budget) { - $str[] = sprintf('%s', route('budgets.show', [$budget->id]), $budget->name, $budget->name); + $str[] = sprintf('%s (c)', route('budgets.show', [$budget->id]), $budget->name, $budget->name); } return join(', ', $str); @@ -359,6 +388,20 @@ class Transaction extends Twig_Extension */ private function getTransactionCategories(TransactionModel $transaction): string { + // journal has a category: + if (isset($transaction->transaction_journal_category_id)) { + $name = $this->encrypted(intval($transaction->transaction_journal_category_encrypted), $transaction->transaction_journal_category_name); + + return sprintf('%s (a)', route('categories.show', [$transaction->transaction_journal_category_id]), $name, $name); + } + + // transaction has a category: + if (isset($transaction->transaction_category_id)) { + $name = $this->encrypted(intval($transaction->transaction_category_encrypted), $transaction->transaction_category_name); + + return sprintf('%s (b)', route('categories.show', [$transaction->transaction_category_id]), $name, $name); + } + // see if the transaction has a category: $categories = $transaction->categories()->get(); if ($categories->count() === 0) { @@ -367,7 +410,7 @@ class Transaction extends Twig_Extension if ($categories->count() > 0) { $str = []; foreach ($categories as $category) { - $str[] = sprintf('%s', route('categories.show', [$category->id]), $category->name, $category->name); + $str[] = sprintf('%s (c)', route('categories.show', [$category->id]), $category->name, $category->name); } return join(', ', $str); From a4c741222038678d3649eda483fc3420b424381d Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 06:12:21 +0100 Subject: [PATCH 080/350] Hide more from account overview [skip ci] --- resources/views/accounts/show.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/accounts/show.twig b/resources/views/accounts/show.twig index 8fdf39fb68..b68c607cde 100644 --- a/resources/views/accounts/show.twig +++ b/resources/views/accounts/show.twig @@ -75,7 +75,7 @@

{{ 'transactions'|_ }}

- {% include 'list.journals-tasker' with {sorting:true, hideBills:true, hideBudgets: true} %} + {% include 'list.journals-tasker' with {sorting:true, hideBills:true, hideBudgets: true, hideCategories: true} %} {% if entries %}

From 05a93a24261e52aa906bffd8e90e26238acfde92 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 06:14:58 +0100 Subject: [PATCH 081/350] Add budget information. [skip ci] --- app/Http/Controllers/BudgetController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index 77d6ecb164..c0d3681047 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -252,7 +252,7 @@ class BudgetController extends Controller $repetition = null; // collector: $collector = new JournalCollector(auth()->user()); - $collector->setAllAssetAccounts()->setRange($start, $end)->setBudget($budget)->setLimit($pageSize)->setPage($page); + $collector->setAllAssetAccounts()->setRange($start, $end)->setBudget($budget)->setLimit($pageSize)->setPage($page)->withCategoryInformation(); $journals = $collector->getPaginatedJournals(); $journals->setPath('/budgets/show/' . $budget->id); @@ -299,7 +299,7 @@ class BudgetController extends Controller // collector: $collector = new JournalCollector(auth()->user()); - $collector->setAllAssetAccounts()->setRange($start, $end)->setBudget($budget)->setLimit($pageSize)->setPage($page); + $collector->setAllAssetAccounts()->setRange($start, $end)->setBudget($budget)->setLimit($pageSize)->setPage($page)->withCategoryInformation(); $journals = $collector->getPaginatedJournals(); $journals->setPath('/budgets/show/' . $budget->id . '/' . $repetition->id); From 61014d45f4c955680297b0243ae8cb1320d3e748 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 06:19:18 +0100 Subject: [PATCH 082/350] Optimize view [skip ci] --- app/Http/Controllers/CategoryController.php | 17 ++++--- resources/views/categories/show-by-date.twig | 50 -------------------- resources/views/categories/show.twig | 2 +- 3 files changed, 9 insertions(+), 60 deletions(-) delete mode 100644 resources/views/categories/show-by-date.twig diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index 38f544598a..3c040efe99 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -177,11 +177,12 @@ class CategoryController extends Controller } /** - * @param Category $category + * @param JournalCollectorInterface $collector + * @param Category $category * * @return View */ - public function show(Category $category) + public function show(JournalCollectorInterface $collector, Category $category) { $range = Preferences::get('viewRange', '1M')->data; $start = session('start', Navigation::startOfPeriod(new Carbon, $range)); @@ -192,9 +193,7 @@ class CategoryController extends Controller $subTitle = $category->name; $subTitleIcon = 'fa-bar-chart'; - // use journal collector - $collector = app(JournalCollectorInterface::class); - $collector->setLimit($pageSize)->setPage($page)->setAllAssetAccounts()->setRange($start, $end)->setCategory($category); + $collector->setLimit($pageSize)->setPage($page)->setAllAssetAccounts()->setRange($start, $end)->setCategory($category)->withBudgetInformation(); $journals = $collector->getPaginatedJournals(); $journals->setPath('categories/show/' . $category->id); @@ -224,9 +223,9 @@ class CategoryController extends Controller $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); $showAll = true; - // new collector: + /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setLimit($pageSize)->setPage($page)->setAllAssetAccounts()->setCategory($category); + $collector->setLimit($pageSize)->setPage($page)->setAllAssetAccounts()->setCategory($category)->withBudgetInformation(); $journals = $collector->getPaginatedJournals(); $journals->setPath('categories/show/' . $category->id . '/all'); @@ -251,9 +250,9 @@ class CategoryController extends Controller $page = intval(Input::get('page')) === 0 ? 1 : intval(Input::get('page')); $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); - // new collector: + /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setLimit($pageSize)->setPage($page)->setAllAssetAccounts()->setRange($start, $end)->setCategory($category); + $collector->setLimit($pageSize)->setPage($page)->setAllAssetAccounts()->setRange($start, $end)->setCategory($category)->withBudgetInformation(); $journals = $collector->getPaginatedJournals(); $journals->setPath('categories/show/' . $category->id . '/' . $date); diff --git a/resources/views/categories/show-by-date.twig b/resources/views/categories/show-by-date.twig deleted file mode 100644 index c2ffe6c1b0..0000000000 --- a/resources/views/categories/show-by-date.twig +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "./layout/default" %} - -{% block breadcrumbs %} - {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, category, carbon) }} -{% endblock %} - -{% block content %} - -

-
-
-
-

{{ 'overview'|_ }} (period)

-
-
- -
-
-
-
- -
-
- -
-
-

{{ 'transactions'|_ }}

-
-
- {% include 'list.journals-tasker' %} -
-
-
-
- -{% endblock %} -{% block scripts %} - - - - - - -{% endblock %} diff --git a/resources/views/categories/show.twig b/resources/views/categories/show.twig index 894a981e89..77954e0501 100644 --- a/resources/views/categories/show.twig +++ b/resources/views/categories/show.twig @@ -64,7 +64,7 @@

{{ 'transactions'|_ }}

- {% include 'list.journals-tasker' %} + {% include 'list.journals-tasker' with {hideCategories: true} %} {% if entries %}

From 6151d4a0ec110ed1436d534370cf3974b0828d57 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 09:45:08 +0100 Subject: [PATCH 083/350] Flash info message [skip ci] --- app/Http/Controllers/ImportController.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/Http/Controllers/ImportController.php b/app/Http/Controllers/ImportController.php index 9b78b82995..12fc16c3af 100644 --- a/app/Http/Controllers/ImportController.php +++ b/app/Http/Controllers/ImportController.php @@ -23,6 +23,7 @@ use FireflyIII\Repositories\Tag\TagRepositoryInterface; use Illuminate\Http\Request; use Log; use Response; +use Session; use SplFileObject; use Storage; use Symfony\Component\HttpFoundation\File\UploadedFile; @@ -382,6 +383,9 @@ class ImportController extends Controller $job->configuration = $configuration; $job->save(); Log::debug('Set configuration for demo user', $configuration); + + // also flash info + Session::flash('info', trans('demo.import-configure-security')); } if (!auth()->user()->hasRole('demo')) { // user is not demo, process original upload: From 9c6a3e4ad573f4b2c9322f600b9fa428fd3e0762 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 09:56:07 +0100 Subject: [PATCH 084/350] This fixes the tests. --- app/Http/breadcrumbs.php | 8 ++++++ .../Category/CategoryRepository.php | 4 ++- .../Controllers/AccountControllerTest.php | 16 +++++++++++ .../Controllers/CategoryControllerTest.php | 28 +++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/app/Http/breadcrumbs.php b/app/Http/breadcrumbs.php index 339855c695..f83a4b0153 100644 --- a/app/Http/breadcrumbs.php +++ b/app/Http/breadcrumbs.php @@ -320,6 +320,14 @@ Breadcrumbs::register( } ); +Breadcrumbs::register( + 'categories.show.all', function (BreadCrumbGenerator $breadcrumbs, Category $category) { + $breadcrumbs->parent('categories.index'); + $breadcrumbs->push(e($category->name) . '(' . strtolower(trans('firefly.all_periods')) . ')', route('categories.show.all', [$category->id])); + +} +); + Breadcrumbs::register( 'categories.show.date', function (BreadCrumbGenerator $breadcrumbs, Category $category, Carbon $date) { diff --git a/app/Repositories/Category/CategoryRepository.php b/app/Repositories/Category/CategoryRepository.php index 4d32e42fa6..451d995d59 100644 --- a/app/Repositories/Category/CategoryRepository.php +++ b/app/Repositories/Category/CategoryRepository.php @@ -145,8 +145,10 @@ class CategoryRepository implements CategoryRepositoryInterface ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') ->orderBy('transaction_journals.date', 'ASC')->first(['transaction_journals.date']); + + // both exist, the one that is earliest "wins". - if (!is_null($firstTransaction) && !is_null($first) && $firstTransaction->date->lt($first)) { + if (!is_null($firstTransaction) && !is_null($first) && Carbon::parse($firstTransaction->date)->lt($first)) { $first = $firstTransaction->date; } diff --git a/tests/acceptance/Controllers/AccountControllerTest.php b/tests/acceptance/Controllers/AccountControllerTest.php index fb03855828..f133ab166b 100644 --- a/tests/acceptance/Controllers/AccountControllerTest.php +++ b/tests/acceptance/Controllers/AccountControllerTest.php @@ -128,6 +128,22 @@ class AccountControllerTest extends TestCase $this->see('

-->
-
- {# send email messages about stuff: #} -
-
-
-

{{ trans('firefly.setting_send_email_notifications') }}

-
-
-

- {{ trans('firefly.setting_send_email_explain',{site_owner: siteOwner})|raw }} -

- {{ ExpandedForm.checkbox('mail_for_lockout','1', sendErrorMessage.mail_for_lockout, {helpText: trans('firefly.mail_for_lockout_help')}) }} - {{ ExpandedForm.checkbox('mail_for_blocked_domain','1', sendErrorMessage.mail_for_blocked_domain, {helpText: trans('firefly.mail_for_blocked_domain_help')}) }} - {{ ExpandedForm.checkbox('mail_for_blocked_email','1', sendErrorMessage.mail_for_blocked_email, {helpText: trans('firefly.mail_for_blocked_email_help')}) }} - {{ ExpandedForm.checkbox('mail_for_bad_login','1', sendErrorMessage.mail_for_bad_login, {helpText: trans('firefly.mail_for_bad_login_help')}) }} - {{ ExpandedForm.checkbox('mail_for_blocked_login','1', sendErrorMessage.mail_for_blocked_login, {helpText: trans('firefly.mail_for_blocked_login_help')}) }} -
-
-
-
-
- {# need to activate account #} -
-
-
-

{{ 'setting_must_confirm_account'|_ }}

-
-
-

- {{ 'setting_must_confirm_account_explain'|_ }} -

- {{ ExpandedForm.checkbox('must_confirm_account','1', mustConfirmAccount) }} -
-
-
{# installation is demo site #}
diff --git a/resources/views/admin/users/show.twig b/resources/views/admin/users/show.twig index 38794f32c2..2922ed89ff 100644 --- a/resources/views/admin/users/show.twig +++ b/resources/views/admin/users/show.twig @@ -28,14 +28,6 @@ {{ user.created_at.formatLocalized(monthAndDayFormat) }} {{ user.created_at.format('H:i') }} - - {{ trans('list.registered_from') }} - {{ registration }} ({{ registrationHost }}) - - - {{ trans('list.confirmed_from') }} - {{ confirmation }} ({{ confirmationHost }}) - {{ trans('list.is_admin') }} @@ -56,16 +48,6 @@ {% endif %} - - {{ trans('list.is_activated') }} - - {% if information.is_activated %} - Yes - {% else %} - No - {% endif %} - - {{ trans('list.is_blocked') }} diff --git a/resources/views/auth/register.twig b/resources/views/auth/register.twig index c531e09733..30431d4763 100644 --- a/resources/views/auth/register.twig +++ b/resources/views/auth/register.twig @@ -27,10 +27,6 @@
- {% if mustConfirmAccount %} -

- You must activate your account. If your email address is incorrect, your account will not work.

- {% endif %}
diff --git a/routes/web.php b/routes/web.php index ba46a250d9..f78f062798 100755 --- a/routes/web.php +++ b/routes/web.php @@ -49,6 +49,7 @@ Route::group( /** * For the two factor routes, the user must be logged in, but NOT 2FA. Account confirmation does not matter here. + * @deprecated */ Route::group( ['middleware' => 'user-logged-in-no-2fa', 'prefix' => 'two-factor', 'as' => 'two-factor.', 'namespace' => 'Auth'], function () { @@ -59,18 +60,6 @@ Route::group( } ); -/** - * For the confirmation routes, the user must be logged in, also 2FA, but his account must not be confirmed. - */ -Route::group( - ['middleware' => 'user-logged-in-2fa-no-activation', 'namespace' => 'Auth'], function () { - Route::get('/confirm-your-account', ['uses' => 'ConfirmationController@confirmationError', 'as' => 'confirmation_error']); - Route::get('/resend-confirmation', ['uses' => 'ConfirmationController@resendConfirmation', 'as' => 'resend_confirmation']); - Route::get('/confirmation/{code}', ['uses' => 'ConfirmationController@doConfirmation', 'as' => 'do_confirm_account']); - -} -); - /** * For all other routes, the user must be fully authenticated and have an activated account. */ From a23c61ee3c8421d7bee2fbeffcd1f774fa87785b Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 17:14:32 +0100 Subject: [PATCH 124/350] Fix tests --- .../Admin/ConfigurationControllerTest.php | 3 - .../Auth/ConfirmationControllerTest.php | 121 ------------------ 2 files changed, 124 deletions(-) delete mode 100644 tests/acceptance/Controllers/Auth/ConfirmationControllerTest.php diff --git a/tests/acceptance/Controllers/Admin/ConfigurationControllerTest.php b/tests/acceptance/Controllers/Admin/ConfigurationControllerTest.php index 0d4351fc5e..b212b656fd 100644 --- a/tests/acceptance/Controllers/Admin/ConfigurationControllerTest.php +++ b/tests/acceptance/Controllers/Admin/ConfigurationControllerTest.php @@ -30,7 +30,6 @@ class ConfigurationControllerTest extends TestCase { parent::setUp(); - FireflyConfig::shouldReceive('get')->withArgs(['must_confirm_account', false])->once(); } /** @@ -47,7 +46,6 @@ class ConfigurationControllerTest extends TestCase $trueConfig->data = true; FireflyConfig::shouldReceive('get')->withArgs(['single_user_mode', true])->once()->andReturn($trueConfig); - FireflyConfig::shouldReceive('get')->withArgs(['must_confirm_account', false])->once()->andReturn($falseConfig); FireflyConfig::shouldReceive('get')->withArgs(['is_demo_site', false])->times(2)->andReturn($falseConfig); $this->call('GET', route('admin.configuration.index')); @@ -67,7 +65,6 @@ class ConfigurationControllerTest extends TestCase FireflyConfig::shouldReceive('get')->withArgs(['is_demo_site', false])->once()->andReturn($falseConfig); FireflyConfig::shouldReceive('set')->withArgs(['single_user_mode', false])->once(); - FireflyConfig::shouldReceive('set')->withArgs(['must_confirm_account', false])->once(); FireflyConfig::shouldReceive('set')->withArgs(['is_demo_site', false])->once(); $this->be($this->user()); diff --git a/tests/acceptance/Controllers/Auth/ConfirmationControllerTest.php b/tests/acceptance/Controllers/Auth/ConfirmationControllerTest.php deleted file mode 100644 index c1e5cfa0cb..0000000000 --- a/tests/acceptance/Controllers/Auth/ConfirmationControllerTest.php +++ /dev/null @@ -1,121 +0,0 @@ -data = true; - $falsePreference = new Preference; - $falsePreference->data = false; - - Preferences::shouldReceive('get')->withArgs(['user_confirmed', false])->andReturn($falsePreference); - Preferences::shouldReceive('get')->withArgs(['twoFactorAuthEnabled', false])->andReturn($falsePreference); - Preferences::shouldReceive('get')->withArgs(['twoFactorAuthSecret'])->andReturn(null); - - $falseConfig = new Configuration; - $falseConfig->data = false; - - FireflyConfig::shouldReceive('get')->withArgs(['is_demo_site', false])->once()->andReturn($falseConfig); - - FireflyConfig::shouldReceive('get')->withArgs(['must_confirm_account', false])->andReturn($trueConfig); - $this->be($this->user()); - $this->call('GET', route('confirmation_error')); - $this->assertResponseStatus(200); - $this->see('has been sent to the address you used during your registration'); - - } - - /** - * @covers \FireflyIII\Http\Controllers\Auth\ConfirmationController::doConfirmation - */ - public function testDoConfirmation() - { - $codePreference = new Preference; - $codePreference->data = 'abcde'; - $timePreference = new Preference; - $timePreference->data = 0; - $falsePreference = new Preference; - $falsePreference->data = false; - - Preferences::shouldReceive('get')->withArgs(['user_confirmed_code'])->andReturn($codePreference); - Preferences::shouldReceive('get')->withArgs(['user_confirmed_last_mail', 0])->andReturn($timePreference); - Preferences::shouldReceive('get')->withArgs(['twoFactorAuthEnabled', false])->andReturn($falsePreference); - Preferences::shouldReceive('get')->withArgs(['twoFactorAuthSecret'])->andReturn(null); - Preferences::shouldReceive('get')->withArgs(['user_confirmed', false])->andReturn($falsePreference); - - $this->be($this->user()); - $this->call('GET', route('do_confirm_account', ['abcde'])); - $this->assertResponseStatus(302); - $this->assertRedirectedToRoute('home'); - } - - /** - * @covers \FireflyIII\Http\Controllers\Auth\ConfirmationController::resendConfirmation - */ - public function testResendConfirmation() - { - $trueConfig = new Configuration; - $trueConfig->data = true; - $codePreference = new Preference; - $codePreference->data = 'abcde'; - $timePreference = new Preference; - $timePreference->data = 0; - $falsePreference = new Preference; - $falsePreference->data = false; - - $falseConfig = new Configuration; - $falseConfig->data = false; - - FireflyConfig::shouldReceive('get')->withArgs(['is_demo_site', false])->once()->andReturn($falseConfig); - - Preferences::shouldReceive('get')->withArgs(['user_confirmed_last_mail', 0])->andReturn($timePreference); - Preferences::shouldReceive('get')->withArgs(['twoFactorAuthEnabled', false])->andReturn($falsePreference); - Preferences::shouldReceive('get')->withArgs(['twoFactorAuthSecret'])->andReturn(null); - FireflyConfig::shouldReceive('get')->withArgs(['must_confirm_account', false])->andReturn($trueConfig); - Preferences::shouldReceive('get')->withArgs(['user_confirmed', false])->andReturn($falsePreference); - - // from event handler: - Preferences::shouldReceive('setForUser')->withAnyArgs(); - - $this->be($this->user()); - $this->call('GET', route('resend_confirmation')); - $this->assertResponseStatus(200); - } - -} From 1a245f1303734141d36d20a26de01b2cc43818e5 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:22:20 +0100 Subject: [PATCH 125/350] Fix import command instruction [skip ci] #504 --- resources/views/import/complete.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/import/complete.twig b/resources/views/import/complete.twig index 9a95c16620..932dbe2caa 100644 --- a/resources/views/import/complete.twig +++ b/resources/views/import/complete.twig @@ -15,7 +15,7 @@ {{ 'import_complete_text'|_ }}

- php artisan firefly:import {{ job.key }} + php artisan firefly:start-import {{ job.key }}

From 32ab9167079c51765bec3c145aa9cdf1f5505b5a Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:26:44 +0100 Subject: [PATCH 126/350] Remove debug text [skip ci] --- app/Support/Twig/Transaction.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/Support/Twig/Transaction.php b/app/Support/Twig/Transaction.php index b00889bbc6..63f38a3a7f 100644 --- a/app/Support/Twig/Transaction.php +++ b/app/Support/Twig/Transaction.php @@ -353,14 +353,14 @@ class Transaction extends Twig_Extension if (isset($transaction->transaction_journal_budget_id)) { $name = $this->encrypted(intval($transaction->transaction_journal_budget_encrypted), $transaction->transaction_journal_budget_name); - return sprintf('%s (a)', route('budgets.show', [$transaction->transaction_journal_budget_id]), $name, $name); + return sprintf('%s', route('budgets.show', [$transaction->transaction_journal_budget_id]), $name, $name); } // transaction has a budget if (isset($transaction->transaction_budget_id)) { $name = $this->encrypted(intval($transaction->transaction_budget_encrypted), $transaction->transaction_budget_name); - return sprintf('%s (b)', route('budgets.show', [$transaction->transaction_budget_id]), $name, $name); + return sprintf('%s', route('budgets.show', [$transaction->transaction_budget_id]), $name, $name); } // see if the transaction has a budget: @@ -371,7 +371,7 @@ class Transaction extends Twig_Extension if ($budgets->count() > 0) { $str = []; foreach ($budgets as $budget) { - $str[] = sprintf('%s (c)', route('budgets.show', [$budget->id]), $budget->name, $budget->name); + $str[] = sprintf('%s', route('budgets.show', [$budget->id]), $budget->name, $budget->name); } return join(', ', $str); @@ -392,14 +392,14 @@ class Transaction extends Twig_Extension if (isset($transaction->transaction_journal_category_id)) { $name = $this->encrypted(intval($transaction->transaction_journal_category_encrypted), $transaction->transaction_journal_category_name); - return sprintf('%s (a)', route('categories.show', [$transaction->transaction_journal_category_id]), $name, $name); + return sprintf('%s', route('categories.show', [$transaction->transaction_journal_category_id]), $name, $name); } // transaction has a category: if (isset($transaction->transaction_category_id)) { $name = $this->encrypted(intval($transaction->transaction_category_encrypted), $transaction->transaction_category_name); - return sprintf('%s (b)', route('categories.show', [$transaction->transaction_category_id]), $name, $name); + return sprintf('%s', route('categories.show', [$transaction->transaction_category_id]), $name, $name); } // see if the transaction has a category: @@ -410,7 +410,7 @@ class Transaction extends Twig_Extension if ($categories->count() > 0) { $str = []; foreach ($categories as $category) { - $str[] = sprintf('%s (c)', route('categories.show', [$category->id]), $category->name, $category->name); + $str[] = sprintf('%s', route('categories.show', [$category->id]), $category->name, $category->name); } return join(', ', $str); From 866a7d7401f3450d796a546d7805775fdb20ecac Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:27:32 +0100 Subject: [PATCH 127/350] Add missing translation [skip ci] --- resources/lang/en_US/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 05db3ad57c..53a4eb861f 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: From 54092118e10197b5d7b991b43912f53c0d8fe93c Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:31:57 +0100 Subject: [PATCH 128/350] Approved. Step name: Proofread --- resources/lang/nl_NL/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/nl_NL/firefly.php b/resources/lang/nl_NL/firefly.php index 65e0eab272..24113bc0c8 100644 --- a/resources/lang/nl_NL/firefly.php +++ b/resources/lang/nl_NL/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'Je kan het wachtwoord van de demonstratie-account niet resetten', 'per_period' => 'Per periode', 'all_periods' => 'Alle perioden', + 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Bekijk de huidige periode en overzicht', // repeat frequencies: From c34947f657ad77cef1e31d3e0ecbbba2280be53f Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:32:06 +0100 Subject: [PATCH 129/350] New translations --- resources/lang/es_ES/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/es_ES/firefly.php b/resources/lang/es_ES/firefly.php index fe2a5a2bcc..b6e7f59c70 100644 --- a/resources/lang/es_ES/firefly.php +++ b/resources/lang/es_ES/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: From 7410f1944c3301a6a96fcf44168a99879d23c840 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:32:12 +0100 Subject: [PATCH 130/350] New translations --- resources/lang/ru_RU/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/ru_RU/firefly.php b/resources/lang/ru_RU/firefly.php index fe2a5a2bcc..b6e7f59c70 100644 --- a/resources/lang/ru_RU/firefly.php +++ b/resources/lang/ru_RU/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: From f26f94ad3bdd784a78f91a05a4305267b28ae546 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:32:32 +0100 Subject: [PATCH 131/350] New translations --- resources/lang/hr_HR/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/hr_HR/firefly.php b/resources/lang/hr_HR/firefly.php index fe2a5a2bcc..b6e7f59c70 100644 --- a/resources/lang/hr_HR/firefly.php +++ b/resources/lang/hr_HR/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: From 974fbe9e5b8f6c807625bd877e03001b73445192 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:32:37 +0100 Subject: [PATCH 132/350] New translations --- resources/lang/zh_TW/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/zh_TW/firefly.php b/resources/lang/zh_TW/firefly.php index af705c6f8b..639044b3e3 100644 --- a/resources/lang/zh_TW/firefly.php +++ b/resources/lang/zh_TW/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: From 838d0808c058bc1c300bf10951c6793e92f2448a Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:32:42 +0100 Subject: [PATCH 133/350] New translations --- resources/lang/zh_HK/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/zh_HK/firefly.php b/resources/lang/zh_HK/firefly.php index fe2a5a2bcc..b6e7f59c70 100644 --- a/resources/lang/zh_HK/firefly.php +++ b/resources/lang/zh_HK/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: From 121deec62f5e158a19fea830e8783486ecc43058 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:32:56 +0100 Subject: [PATCH 134/350] New translations --- resources/lang/fr_FR/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/fr_FR/firefly.php b/resources/lang/fr_FR/firefly.php index 3504c4b147..04b0bbda11 100644 --- a/resources/lang/fr_FR/firefly.php +++ b/resources/lang/fr_FR/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: From f65c2ff4fb573b8ec3f2d5c58cbd1dba4a9c2e23 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:33:01 +0100 Subject: [PATCH 135/350] New translations --- resources/lang/de_DE/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/de_DE/firefly.php b/resources/lang/de_DE/firefly.php index d052463b95..50070becdb 100644 --- a/resources/lang/de_DE/firefly.php +++ b/resources/lang/de_DE/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: From 96cafed154447ae1d748607fba1f14782cbf1481 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:33:05 +0100 Subject: [PATCH 136/350] New translations --- resources/lang/pt_BR/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/pt_BR/firefly.php b/resources/lang/pt_BR/firefly.php index 28ef0df704..f437fe610b 100644 --- a/resources/lang/pt_BR/firefly.php +++ b/resources/lang/pt_BR/firefly.php @@ -101,6 +101,7 @@ return [ 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', 'all_periods' => 'All periods', + 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Show the current period and overview', // repeat frequencies: From 7ee650ba7ac77e7ee1244c367b9198b4575a39d0 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:49:30 +0100 Subject: [PATCH 137/350] Some code cleanup [skip ci] --- app/Http/Controllers/AttachmentController.php | 10 ++---- app/Http/Controllers/Auth/LoginController.php | 32 ++++++++++++------- .../Controllers/Auth/PasswordController.php | 1 + 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/AttachmentController.php b/app/Http/Controllers/AttachmentController.php index 189f92ce68..0b5d09d776 100644 --- a/app/Http/Controllers/AttachmentController.php +++ b/app/Http/Controllers/AttachmentController.php @@ -18,7 +18,6 @@ use FireflyIII\Exceptions\FireflyException; use FireflyIII\Http\Requests\AttachmentFormRequest; use FireflyIII\Models\Attachment; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; -use Log; use Preferences; use Response; use Session; @@ -28,6 +27,8 @@ use View; /** * Class AttachmentController * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) // it's 13. + * * @package FireflyIII\Http\Controllers */ class AttachmentController extends Controller @@ -54,7 +55,7 @@ class AttachmentController extends Controller /** * @param Attachment $attachment * - * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory + * @return View */ public function delete(Attachment $attachment) { @@ -98,9 +99,6 @@ class AttachmentController extends Controller $content = $repository->getContent($attachment); $quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\')); - - Log::debug('Send file to user', ['file' => $quoted, 'size' => strlen($content)]); - return response($content, 200) ->header('Content-Description', 'File Transfer') ->header('Content-Type', 'application/octet-stream') @@ -112,7 +110,6 @@ class AttachmentController extends Controller ->header('Pragma', 'public') ->header('Content-Length', strlen($content)); } - throw new FireflyException('Could not find the indicated attachment. The file is no longer there.'); } @@ -144,7 +141,6 @@ class AttachmentController extends Controller { $image = 'images/page_green.png'; - if ($attachment->mime == 'application/pdf') { $image = 'images/page_white_acrobat.png'; } diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 79740cc936..30d8c34481 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -71,19 +71,8 @@ class LoginController extends Controller return $this->sendLoginResponse($request); } - // check if user is blocked: - $errorMessage = ''; - /** @var User $foundUser */ - $foundUser = User::where('email', $credentials['email'])->where('blocked', 1)->first(); - if (!is_null($foundUser)) { - // user exists, but is blocked: - $code = strlen(strval($foundUser->blocked_code)) > 0 ? $foundUser->blocked_code : 'general_blocked'; - $errorMessage = strval(trans('firefly.' . $code . '_error', ['email' => $credentials['email']])); - } + $errorMessage = $this->getBlockedError($credentials['email']); - // If the login attempt was unsuccessful we will increment the number of attempts - // to login and redirect the user back to the login form. Of course, when this - // user surpasses their maximum number of attempts they will get locked out. if (!$lockedOut) { $this->incrementLoginAttempts($request); } @@ -148,4 +137,23 @@ class LoginController extends Controller ] ); } + + /** + * @param string $email + * + * @return string + */ + private function getBlockedError(string $email): string + { + // check if user is blocked: + $errorMessage = ''; + /** @var User $foundUser */ + $foundUser = User::where('email', $email)->where('blocked', 1)->first(); + if (!is_null($foundUser)) { + // user exists, but is blocked: + $code = strlen(strval($foundUser->blocked_code)) > 0 ? $foundUser->blocked_code : 'general_blocked'; + $errorMessage = strval(trans('firefly.' . $code . '_error', ['email' => $email])); + } + return $errorMessage; + } } diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php index f49857ba67..06a6fa99b2 100644 --- a/app/Http/Controllers/Auth/PasswordController.php +++ b/app/Http/Controllers/Auth/PasswordController.php @@ -47,6 +47,7 @@ class PasswordController extends Controller /** * Send a reset link to the given user. + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's 7 but ok * * @param \Illuminate\Http\Request $request * From 9ef24c0a439775fd6df245d1baef47c38c37974a Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:54:15 +0100 Subject: [PATCH 138/350] Registration process no longer cares about blocked domains or previously deleted users. --- .../Controllers/Auth/RegisterController.php | 49 +------------------ 1 file changed, 1 insertion(+), 48 deletions(-) diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 097d912855..4a0ca3ade4 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -20,8 +20,6 @@ use FireflyIII\Http\Controllers\Controller; use FireflyIII\User; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Http\Request; -use Log; -use Preferences; use Session; use Validator; @@ -76,26 +74,7 @@ class RegisterController extends Controller $data = $request->all(); $data['password'] = bcrypt($data['password']); - - // is user email domain blocked? - if ($this->isBlockedDomain($data['email'])) { - $validator->getMessageBag()->add('email', (string)trans('validation.invalid_domain')); - $this->throwValidationException($request, $validator); - } - - // is user a deleted user? - $hash = hash('sha256', $data['email']); - $configuration = FireflyConfig::get('deleted_users', []); - $set = $configuration->data; - Log::debug(sprintf('Hash of email is %s', $hash)); - Log::debug('Hashes of deleted users: ', $set); - if (in_array($hash, $set)) { - $validator->getMessageBag()->add('email', (string)trans('validation.deleted_user')); - $this->throwValidationException($request, $validator); - } - - - $user = $this->create($request->all()); + $user = $this->create($request->all()); // trigger user registration event: event(new RegisteredUser($user, $request->ip())); @@ -169,30 +148,4 @@ class RegisterController extends Controller ] ); } - - /** - * @return array - */ - private function getBlockedDomains() - { - return FireflyConfig::get('blocked-domains', [])->data; - } - - /** - * @param string $email - * - * @return bool - */ - private function isBlockedDomain(string $email) - { - $parts = explode('@', $email); - $blocked = $this->getBlockedDomains(); - - if (isset($parts[1]) && in_array($parts[1], $blocked)) { - return true; - } - - return false; - } - } From 04b284f0309fb06f748590587cd908f74e9d2563 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 18:57:15 +0100 Subject: [PATCH 139/350] No longer able to manage blocked domains. --- .../Controllers/Admin/DomainController.php | 140 ------------------ .../Controllers/Auth/RegisterController.php | 4 +- resources/lang/en_US/firefly.php | 12 -- resources/views/admin/domains/index.twig | 122 --------------- resources/views/admin/index.twig | 2 - routes/web.php | 5 - .../Admin/DomainControllerTest.php | 68 --------- 7 files changed, 1 insertion(+), 352 deletions(-) delete mode 100644 app/Http/Controllers/Admin/DomainController.php delete mode 100644 resources/views/admin/domains/index.twig delete mode 100644 tests/acceptance/Controllers/Admin/DomainControllerTest.php diff --git a/app/Http/Controllers/Admin/DomainController.php b/app/Http/Controllers/Admin/DomainController.php deleted file mode 100644 index 2115d5816d..0000000000 --- a/app/Http/Controllers/Admin/DomainController.php +++ /dev/null @@ -1,140 +0,0 @@ -data; - - // known domains - $knownDomains = $this->getKnownDomains(); - - return view('admin.domains.index', compact('title', 'mainTitleIcon', 'knownDomains', 'subTitle', 'subTitleIcon', 'domains')); - } - - - /** - * @param Request $request - * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - */ - public function manual(Request $request) - { - if (strlen($request->get('domain')) === 0) { - Session::flash('error', trans('firefly.no_domain_filled_in')); - - return redirect(route('admin.users.domains')); - } - - $domain = strtolower($request->get('domain')); - $blocked = FireflyConfig::get('blocked-domains', [])->data; - - if (in_array($domain, $blocked)) { - Session::flash('error', trans('firefly.domain_already_blocked', ['domain' => $domain])); - - return redirect(route('admin.users.domains')); - } - $blocked[] = $domain; - FireflyConfig::set('blocked-domains', $blocked); - - Session::flash('success', trans('firefly.domain_is_now_blocked', ['domain' => $domain])); - - return redirect(route('admin.users.domains')); - } - - /** - * @param string $domain - * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - */ - public function toggleDomain(string $domain) - { - $domain = strtolower($domain); - $blocked = FireflyConfig::get('blocked-domains', [])->data; - - if (in_array($domain, $blocked)) { - $key = array_search($domain, $blocked); - unset($blocked[$key]); - sort($blocked); - - FireflyConfig::set('blocked-domains', $blocked); - Session::flash('message', trans('firefly.domain_now_unblocked', ['domain' => $domain])); - - - return redirect(route('admin.users.domains')); - - } - - $blocked[] = $domain; - - FireflyConfig::set('blocked-domains', $blocked); - Session::flash('message', trans('firefly.domain_now_blocked', ['domain' => $domain])); - - return redirect(route('admin.users.domains')); - } - - /** - * @return array - */ - private function getKnownDomains(): array - { - /** @var UserRepositoryInterface $repository */ - $repository = app(UserRepositoryInterface::class); - $users = $repository->all(); - $set = []; - $filtered = []; - /** @var User $user */ - foreach ($users as $user) { - $email = $user->email; - $parts = explode('@', $email); - $set[] = strtolower($parts[1]); - } - $set = array_unique($set); - // filter for already banned domains: - $blocked = FireflyConfig::get('blocked-domains', [])->data; - - foreach ($set as $domain) { - // in the block array? ignore it. - if (!in_array($domain, $blocked)) { - $filtered[] = $domain; - } - } - - return $filtered; - } -} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 4a0ca3ade4..2cf28042ba 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -72,9 +72,7 @@ class RegisterController extends Controller $this->throwValidationException($request, $validator); } - $data = $request->all(); - $data['password'] = bcrypt($data['password']); - $user = $this->create($request->all()); + $user = $this->create($request->all()); // trigger user registration event: event(new RegisteredUser($user, $request->ip())); diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 53a4eb861f..04e2386198 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -832,18 +832,6 @@ return [ 'user_administration' => 'User administration', 'list_all_users' => 'All users', 'all_users' => 'All users', - 'all_blocked_domains' => 'All blocked domains', - 'blocked_domains' => 'Blocked domains', - 'no_domains_banned' => 'No domains blocked', - 'all_user_domains' => 'All user email address domains', - 'all_domains_is_filtered' => 'This list does not include already blocked domains.', - 'domain_now_blocked' => 'Domain :domain is now blocked', - 'domain_now_unblocked' => 'Domain :domain is now unblocked', - 'manual_block_domain' => 'Block a domain by hand', - 'block_domain' => 'Block domain', - 'no_domain_filled_in' => 'No domain filled in', - 'domain_already_blocked' => 'Domain :domain is already blocked', - 'domain_is_now_blocked' => 'Domain :domain is now blocked', 'instance_configuration' => 'Configuration', 'firefly_instance_configuration' => 'Configuration options for Firefly III', 'setting_single_user_mode' => 'Single user mode', diff --git a/resources/views/admin/domains/index.twig b/resources/views/admin/domains/index.twig deleted file mode 100644 index 2ea2a88005..0000000000 --- a/resources/views/admin/domains/index.twig +++ /dev/null @@ -1,122 +0,0 @@ -{% extends "./layout/default" %} - -{% block breadcrumbs %} - {{ Breadcrumbs.renderIfExists }} -{% endblock %} -{% block content %} -
-
-
-
-

{{ 'all_blocked_domains'|_ }}

-
-
- {% if domains|length > 0 %} - - - - - - - - - {% for domain in domains %} - - - - - {% endfor %} - -
 {{ trans('list.domain') }}
- unblock - - {{ domain }} - (whois) -
- {% else %} -

- {{ 'no_domains_banned'|_ }} -

- {% endif %} -
-
-
- - -
-
-
-

{{ 'all_user_domains'|_ }}

-
-
- {% if knownDomains|length > 0 %} -

- {{ 'all_domains_is_filtered'|_ }} - -

- - - - - - - - - {% for domain in knownDomains %} - - - - - - {% endfor %} - -
 {{ trans('list.domain') }}
block{{ domain }}
- {% else %} -

- {{ 'no_domains_banned'|_ }} -

- {% endif %} -
-
-
-
- - -
-
-
-
-

{{ 'manual_block_domain'|_ }}

-
-
- -
-
- -
- - - - {{ ExpandedForm.text('domain') }} - - - -
- -
-
-
-
-
-
- - -{% endblock %} -{% block styles %} - -{% endblock %} -{% block scripts %} - -{% endblock %} diff --git a/resources/views/admin/index.twig b/resources/views/admin/index.twig index 8ca383246f..2edd7c681e 100644 --- a/resources/views/admin/index.twig +++ b/resources/views/admin/index.twig @@ -28,8 +28,6 @@
diff --git a/routes/web.php b/routes/web.php index f78f062798..d619a909bb 100755 --- a/routes/web.php +++ b/routes/web.php @@ -684,11 +684,6 @@ Route::group( Route::get('users/show/{user}', ['uses' => 'UserController@show', 'as' => 'users.show']); Route::post('users/update/{user}', ['uses' => 'UserController@update', 'as' => 'users.update']); - // user domain manager - Route::get('domains', ['uses' => 'DomainController@domains', 'as' => 'users.domains']); - Route::get('domains/toggle/{domain}', ['uses' => 'DomainController@toggleDomain', 'as' => 'users.domains.block-toggle']); - Route::post('domains/manual', ['uses' => 'DomainController@manual', 'as' => 'users.domains.manual']); - // FF configuration: Route::get('configuration', ['uses' => 'ConfigurationController@index', 'as' => 'configuration.index']); Route::post('configuration', ['uses' => 'ConfigurationController@postIndex', 'as' => 'configuration.index.post']); diff --git a/tests/acceptance/Controllers/Admin/DomainControllerTest.php b/tests/acceptance/Controllers/Admin/DomainControllerTest.php deleted file mode 100644 index bba83a9265..0000000000 --- a/tests/acceptance/Controllers/Admin/DomainControllerTest.php +++ /dev/null @@ -1,68 +0,0 @@ -be($this->user()); - $this->call('GET', route('admin.users.domains')); - $this->assertResponseStatus(200); - - // has bread crumb - $this->see('
diff --git a/resources/views/currencies/edit.twig b/resources/views/currencies/edit.twig index 2c4819545e..1c614ebbb2 100644 --- a/resources/views/currencies/edit.twig +++ b/resources/views/currencies/edit.twig @@ -18,6 +18,7 @@ {{ ExpandedForm.text('name',null,{'maxlength' : 48}) }} {{ ExpandedForm.text('symbol',null,{'maxlength' : 8}) }} {{ ExpandedForm.text('code',null,{'maxlength' : 3}) }} + {{ ExpandedForm.integer('decimal_places',null,{'maxlength' : 2,'min': 0,'max': 12}) }}
diff --git a/resources/views/currencies/index.twig b/resources/views/currencies/index.twig index 5955d6edc6..6c26819d9c 100644 --- a/resources/views/currencies/index.twig +++ b/resources/views/currencies/index.twig @@ -20,7 +20,9 @@   - {{ 'currency'|_ }} + {{ 'currency'|_ }} + {{ 'number_of_decimals'|_ }} +   @@ -33,6 +35,7 @@
{{ currency.name }} ({{ currency.code }}) ({{ currency.symbol|raw }}) + {{ currency.decimal_places }} {% if currency.id == defaultCurrency.id %} {{ 'default_currency'|_ }} diff --git a/resources/views/form/integer.twig b/resources/views/form/integer.twig index 9ce0e38f5b..54be537886 100644 --- a/resources/views/form/integer.twig +++ b/resources/views/form/integer.twig @@ -2,9 +2,8 @@
-
- {{ Form.input('number', name, value, options) }} - {% include 'form/feedback' %} -
+ {{ Form.input('number', name, value, options) }} + {% include 'form/help' %} + {% include 'form/feedback' %}
From b71abd3f6a86b0d00bda6fe63ab04dfa65bfbffd Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:51:33 +0100 Subject: [PATCH 152/350] Approved. Step name: Proofread --- resources/lang/nl_NL/form.php | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/resources/lang/nl_NL/form.php b/resources/lang/nl_NL/form.php index 52f39cf82e..7f6ca81411 100644 --- a/resources/lang/nl_NL/form.php +++ b/resources/lang/nl_NL/form.php @@ -63,6 +63,7 @@ return [ 'description' => 'Omschrijving', 'expense_account' => 'Crediteur', 'revenue_account' => 'Debiteur', + 'decimal_places' => 'Decimal places', 'revenue_account_source' => 'Debiteur (bron)', 'source_account_asset' => 'Bronrekening (betaalrekening)', @@ -150,30 +151,30 @@ return [ 'category_keep_transactions' => 'De transactie verbonden aan deze categorie blijft bewaard.|De :count transacties verbonden aan deze categorie blijven bewaard.', 'tag_keep_transactions' => 'De transactie verbonden aan deze tag blijft bewaard.|De :count transacties verbonden aan deze tag blijven bewaard.', - 'email' => 'E-mailadres', - 'password' => 'Wachtwoord', - 'password_confirmation' => 'Wachtwoord (nogmaals)', - 'blocked' => 'Is geblokkeerd?', - 'blocked_code' => 'Reden voor blokkade', + 'email' => 'E-mailadres', + 'password' => 'Wachtwoord', + 'password_confirmation' => 'Wachtwoord (nogmaals)', + 'blocked' => 'Is geblokkeerd?', + 'blocked_code' => 'Reden voor blokkade', // admin - 'domain' => 'Domein', - 'single_user_mode' => 'Enkele gebruiker-modus', - 'must_confirm_account' => 'Nieuwe gebruikers moeten hun account activeren', - 'is_demo_site' => 'Is demo website', + 'domain' => 'Domein', + 'single_user_mode' => 'Enkele gebruiker-modus', + 'must_confirm_account' => 'Nieuwe gebruikers moeten hun account activeren', + 'is_demo_site' => 'Is demo website', // import - 'import_file' => 'Importbestand', - 'configuration_file' => 'Configuratiebestand', - 'import_file_type' => 'Importbestandstype', - 'csv_comma' => 'Een komma (,)', - 'csv_semicolon' => 'Een puntkomma (;)', - 'csv_tab' => 'Een tab (onzichtbaar)', - 'csv_delimiter' => 'CSV scheidingsteken', - 'csv_import_account' => 'Standaard rekening voor importeren', - 'csv_config' => 'Configuratiebestand', + 'import_file' => 'Importbestand', + 'configuration_file' => 'Configuratiebestand', + 'import_file_type' => 'Importbestandstype', + 'csv_comma' => 'Een komma (,)', + 'csv_semicolon' => 'Een puntkomma (;)', + 'csv_tab' => 'Een tab (onzichtbaar)', + 'csv_delimiter' => 'CSV scheidingsteken', + 'csv_import_account' => 'Standaard rekening voor importeren', + 'csv_config' => 'Configuratiebestand', 'due_date' => 'Vervaldatum', From b8a8becd0ca6fe560fbb59eb8510a9b2fd1ca15b Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:51:39 +0100 Subject: [PATCH 153/350] New translations --- resources/lang/es_ES/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/es_ES/firefly.php b/resources/lang/es_ES/firefly.php index e7ce035bad..27da2628ad 100644 --- a/resources/lang/es_ES/firefly.php +++ b/resources/lang/es_ES/firefly.php @@ -826,6 +826,7 @@ return [ 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', 'total_amount' => 'Total amount', + 'number_of_decimals' => 'Number of decimals', // administration 'administration' => 'Administration', From 8f1c693d3d5c520a58080759a21b4b8ff44054bc Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:51:41 +0100 Subject: [PATCH 154/350] New translations --- resources/lang/es_ES/form.php | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/resources/lang/es_ES/form.php b/resources/lang/es_ES/form.php index 8d0beed425..ff44cbf9ef 100644 --- a/resources/lang/es_ES/form.php +++ b/resources/lang/es_ES/form.php @@ -63,6 +63,7 @@ return [ 'description' => 'Description', 'expense_account' => 'Expense account', 'revenue_account' => 'Revenue account', + 'decimal_places' => 'Decimal places', 'revenue_account_source' => 'Revenue account (source)', 'source_account_asset' => 'Source account (asset account)', @@ -150,30 +151,30 @@ return [ 'category_keep_transactions' => 'The only transaction connected to this category will not be deleted.|All :count transactions connected to this category will spared deletion.', 'tag_keep_transactions' => 'The only transaction connected to this tag will not be deleted.|All :count transactions connected to this tag will spared deletion.', - 'email' => 'Email address', - 'password' => 'Password', - 'password_confirmation' => 'Password (again)', - 'blocked' => 'Is blocked?', - 'blocked_code' => 'Reason for block', + 'email' => 'Email address', + 'password' => 'Password', + 'password_confirmation' => 'Password (again)', + 'blocked' => 'Is blocked?', + 'blocked_code' => 'Reason for block', // admin - 'domain' => 'Domain', - 'single_user_mode' => 'Single user mode', - 'must_confirm_account' => 'New users must activate account', - 'is_demo_site' => 'Is demo site', + 'domain' => 'Domain', + 'single_user_mode' => 'Single user mode', + 'must_confirm_account' => 'New users must activate account', + 'is_demo_site' => 'Is demo site', // import - 'import_file' => 'Import file', - 'configuration_file' => 'Configuration file', - 'import_file_type' => 'Import file type', - 'csv_comma' => 'A comma (,)', - 'csv_semicolon' => 'A semicolon (;)', - 'csv_tab' => 'A tab (invisible)', - 'csv_delimiter' => 'CSV field delimiter', - 'csv_import_account' => 'Default import account', - 'csv_config' => 'CSV import configuration', + 'import_file' => 'Import file', + 'configuration_file' => 'Configuration file', + 'import_file_type' => 'Import file type', + 'csv_comma' => 'A comma (,)', + 'csv_semicolon' => 'A semicolon (;)', + 'csv_tab' => 'A tab (invisible)', + 'csv_delimiter' => 'CSV field delimiter', + 'csv_import_account' => 'Default import account', + 'csv_config' => 'CSV import configuration', 'due_date' => 'Due date', From fb555f5b969dccc661ce71c9f4e6cbbd78608a18 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:51:44 +0100 Subject: [PATCH 155/350] New translations --- resources/lang/ru_RU/form.php | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/resources/lang/ru_RU/form.php b/resources/lang/ru_RU/form.php index 8d0beed425..ff44cbf9ef 100644 --- a/resources/lang/ru_RU/form.php +++ b/resources/lang/ru_RU/form.php @@ -63,6 +63,7 @@ return [ 'description' => 'Description', 'expense_account' => 'Expense account', 'revenue_account' => 'Revenue account', + 'decimal_places' => 'Decimal places', 'revenue_account_source' => 'Revenue account (source)', 'source_account_asset' => 'Source account (asset account)', @@ -150,30 +151,30 @@ return [ 'category_keep_transactions' => 'The only transaction connected to this category will not be deleted.|All :count transactions connected to this category will spared deletion.', 'tag_keep_transactions' => 'The only transaction connected to this tag will not be deleted.|All :count transactions connected to this tag will spared deletion.', - 'email' => 'Email address', - 'password' => 'Password', - 'password_confirmation' => 'Password (again)', - 'blocked' => 'Is blocked?', - 'blocked_code' => 'Reason for block', + 'email' => 'Email address', + 'password' => 'Password', + 'password_confirmation' => 'Password (again)', + 'blocked' => 'Is blocked?', + 'blocked_code' => 'Reason for block', // admin - 'domain' => 'Domain', - 'single_user_mode' => 'Single user mode', - 'must_confirm_account' => 'New users must activate account', - 'is_demo_site' => 'Is demo site', + 'domain' => 'Domain', + 'single_user_mode' => 'Single user mode', + 'must_confirm_account' => 'New users must activate account', + 'is_demo_site' => 'Is demo site', // import - 'import_file' => 'Import file', - 'configuration_file' => 'Configuration file', - 'import_file_type' => 'Import file type', - 'csv_comma' => 'A comma (,)', - 'csv_semicolon' => 'A semicolon (;)', - 'csv_tab' => 'A tab (invisible)', - 'csv_delimiter' => 'CSV field delimiter', - 'csv_import_account' => 'Default import account', - 'csv_config' => 'CSV import configuration', + 'import_file' => 'Import file', + 'configuration_file' => 'Configuration file', + 'import_file_type' => 'Import file type', + 'csv_comma' => 'A comma (,)', + 'csv_semicolon' => 'A semicolon (;)', + 'csv_tab' => 'A tab (invisible)', + 'csv_delimiter' => 'CSV field delimiter', + 'csv_import_account' => 'Default import account', + 'csv_config' => 'CSV import configuration', 'due_date' => 'Due date', From 3142151fc339f149b782b949358f8f96931934cb Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:51:47 +0100 Subject: [PATCH 156/350] New translations --- resources/lang/ru_RU/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/ru_RU/firefly.php b/resources/lang/ru_RU/firefly.php index e7ce035bad..27da2628ad 100644 --- a/resources/lang/ru_RU/firefly.php +++ b/resources/lang/ru_RU/firefly.php @@ -826,6 +826,7 @@ return [ 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', 'total_amount' => 'Total amount', + 'number_of_decimals' => 'Number of decimals', // administration 'administration' => 'Administration', From c92a56c9805b17d69cc3f45aacc6465612cc0200 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:04 +0100 Subject: [PATCH 157/350] New translations --- resources/lang/hr_HR/form.php | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/resources/lang/hr_HR/form.php b/resources/lang/hr_HR/form.php index 8d0beed425..ff44cbf9ef 100644 --- a/resources/lang/hr_HR/form.php +++ b/resources/lang/hr_HR/form.php @@ -63,6 +63,7 @@ return [ 'description' => 'Description', 'expense_account' => 'Expense account', 'revenue_account' => 'Revenue account', + 'decimal_places' => 'Decimal places', 'revenue_account_source' => 'Revenue account (source)', 'source_account_asset' => 'Source account (asset account)', @@ -150,30 +151,30 @@ return [ 'category_keep_transactions' => 'The only transaction connected to this category will not be deleted.|All :count transactions connected to this category will spared deletion.', 'tag_keep_transactions' => 'The only transaction connected to this tag will not be deleted.|All :count transactions connected to this tag will spared deletion.', - 'email' => 'Email address', - 'password' => 'Password', - 'password_confirmation' => 'Password (again)', - 'blocked' => 'Is blocked?', - 'blocked_code' => 'Reason for block', + 'email' => 'Email address', + 'password' => 'Password', + 'password_confirmation' => 'Password (again)', + 'blocked' => 'Is blocked?', + 'blocked_code' => 'Reason for block', // admin - 'domain' => 'Domain', - 'single_user_mode' => 'Single user mode', - 'must_confirm_account' => 'New users must activate account', - 'is_demo_site' => 'Is demo site', + 'domain' => 'Domain', + 'single_user_mode' => 'Single user mode', + 'must_confirm_account' => 'New users must activate account', + 'is_demo_site' => 'Is demo site', // import - 'import_file' => 'Import file', - 'configuration_file' => 'Configuration file', - 'import_file_type' => 'Import file type', - 'csv_comma' => 'A comma (,)', - 'csv_semicolon' => 'A semicolon (;)', - 'csv_tab' => 'A tab (invisible)', - 'csv_delimiter' => 'CSV field delimiter', - 'csv_import_account' => 'Default import account', - 'csv_config' => 'CSV import configuration', + 'import_file' => 'Import file', + 'configuration_file' => 'Configuration file', + 'import_file_type' => 'Import file type', + 'csv_comma' => 'A comma (,)', + 'csv_semicolon' => 'A semicolon (;)', + 'csv_tab' => 'A tab (invisible)', + 'csv_delimiter' => 'CSV field delimiter', + 'csv_import_account' => 'Default import account', + 'csv_config' => 'CSV import configuration', 'due_date' => 'Due date', From 52bf358978fdeaa076afbeb93a6c31d816eece06 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:07 +0100 Subject: [PATCH 158/350] New translations --- resources/lang/hr_HR/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/hr_HR/firefly.php b/resources/lang/hr_HR/firefly.php index e7ce035bad..27da2628ad 100644 --- a/resources/lang/hr_HR/firefly.php +++ b/resources/lang/hr_HR/firefly.php @@ -826,6 +826,7 @@ return [ 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', 'total_amount' => 'Total amount', + 'number_of_decimals' => 'Number of decimals', // administration 'administration' => 'Administration', From 9731b59174d71c31b01bfc20b7f8b6e8f3646f1d Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:12 +0100 Subject: [PATCH 159/350] New translations --- resources/lang/zh_TW/form.php | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/resources/lang/zh_TW/form.php b/resources/lang/zh_TW/form.php index 3b634fc69e..1c04418238 100644 --- a/resources/lang/zh_TW/form.php +++ b/resources/lang/zh_TW/form.php @@ -63,6 +63,7 @@ return [ 'description' => '描述', 'expense_account' => '支出帳戶', 'revenue_account' => '收入帳戶', + 'decimal_places' => 'Decimal places', 'revenue_account_source' => '收入帳戶 (源頭)', 'source_account_asset' => '來源帳戶 (資產帳戶)', @@ -150,30 +151,30 @@ return [ 'category_keep_transactions' => 'The only transaction connected to this category will not be deleted.|All :count transactions connected to this category will spared deletion.', 'tag_keep_transactions' => 'The only transaction connected to this tag will not be deleted.|All :count transactions connected to this tag will spared deletion.', - 'email' => 'Email address', - 'password' => 'Password', - 'password_confirmation' => 'Password (again)', - 'blocked' => 'Is blocked?', - 'blocked_code' => 'Reason for block', + 'email' => 'Email address', + 'password' => 'Password', + 'password_confirmation' => 'Password (again)', + 'blocked' => 'Is blocked?', + 'blocked_code' => 'Reason for block', // admin - 'domain' => 'Domain', - 'single_user_mode' => 'Single user mode', - 'must_confirm_account' => 'New users must activate account', - 'is_demo_site' => 'Is demo site', + 'domain' => 'Domain', + 'single_user_mode' => 'Single user mode', + 'must_confirm_account' => 'New users must activate account', + 'is_demo_site' => 'Is demo site', // import - 'import_file' => '匯入檔案', - 'configuration_file' => 'Configuration file', - 'import_file_type' => '匯入檔案類型', - 'csv_comma' => 'A comma (,)', - 'csv_semicolon' => 'A semicolon (;)', - 'csv_tab' => 'A tab (invisible)', - 'csv_delimiter' => 'CSV field delimiter', - 'csv_import_account' => 'Default import account', - 'csv_config' => 'CSV import configuration', + 'import_file' => '匯入檔案', + 'configuration_file' => 'Configuration file', + 'import_file_type' => '匯入檔案類型', + 'csv_comma' => 'A comma (,)', + 'csv_semicolon' => 'A semicolon (;)', + 'csv_tab' => 'A tab (invisible)', + 'csv_delimiter' => 'CSV field delimiter', + 'csv_import_account' => 'Default import account', + 'csv_config' => 'CSV import configuration', 'due_date' => '到期日', From 5c691491e8ca8f6fa5659f9c333dc825fce38c34 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:15 +0100 Subject: [PATCH 160/350] New translations --- resources/lang/zh_TW/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/zh_TW/firefly.php b/resources/lang/zh_TW/firefly.php index b29db5642c..bc76802eee 100644 --- a/resources/lang/zh_TW/firefly.php +++ b/resources/lang/zh_TW/firefly.php @@ -826,6 +826,7 @@ return [ 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', 'total_amount' => 'Total amount', + 'number_of_decimals' => 'Number of decimals', // administration 'administration' => 'Administration', From c0dfc554b36815d1cbd06ff7313f7fda917d4b95 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:18 +0100 Subject: [PATCH 161/350] New translations --- resources/lang/zh_HK/form.php | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/resources/lang/zh_HK/form.php b/resources/lang/zh_HK/form.php index 8d0beed425..ff44cbf9ef 100644 --- a/resources/lang/zh_HK/form.php +++ b/resources/lang/zh_HK/form.php @@ -63,6 +63,7 @@ return [ 'description' => 'Description', 'expense_account' => 'Expense account', 'revenue_account' => 'Revenue account', + 'decimal_places' => 'Decimal places', 'revenue_account_source' => 'Revenue account (source)', 'source_account_asset' => 'Source account (asset account)', @@ -150,30 +151,30 @@ return [ 'category_keep_transactions' => 'The only transaction connected to this category will not be deleted.|All :count transactions connected to this category will spared deletion.', 'tag_keep_transactions' => 'The only transaction connected to this tag will not be deleted.|All :count transactions connected to this tag will spared deletion.', - 'email' => 'Email address', - 'password' => 'Password', - 'password_confirmation' => 'Password (again)', - 'blocked' => 'Is blocked?', - 'blocked_code' => 'Reason for block', + 'email' => 'Email address', + 'password' => 'Password', + 'password_confirmation' => 'Password (again)', + 'blocked' => 'Is blocked?', + 'blocked_code' => 'Reason for block', // admin - 'domain' => 'Domain', - 'single_user_mode' => 'Single user mode', - 'must_confirm_account' => 'New users must activate account', - 'is_demo_site' => 'Is demo site', + 'domain' => 'Domain', + 'single_user_mode' => 'Single user mode', + 'must_confirm_account' => 'New users must activate account', + 'is_demo_site' => 'Is demo site', // import - 'import_file' => 'Import file', - 'configuration_file' => 'Configuration file', - 'import_file_type' => 'Import file type', - 'csv_comma' => 'A comma (,)', - 'csv_semicolon' => 'A semicolon (;)', - 'csv_tab' => 'A tab (invisible)', - 'csv_delimiter' => 'CSV field delimiter', - 'csv_import_account' => 'Default import account', - 'csv_config' => 'CSV import configuration', + 'import_file' => 'Import file', + 'configuration_file' => 'Configuration file', + 'import_file_type' => 'Import file type', + 'csv_comma' => 'A comma (,)', + 'csv_semicolon' => 'A semicolon (;)', + 'csv_tab' => 'A tab (invisible)', + 'csv_delimiter' => 'CSV field delimiter', + 'csv_import_account' => 'Default import account', + 'csv_config' => 'CSV import configuration', 'due_date' => 'Due date', From 1ba03088c9159cddf5d0408c3e818a932b72bfc9 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:21 +0100 Subject: [PATCH 162/350] New translations --- resources/lang/zh_HK/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/zh_HK/firefly.php b/resources/lang/zh_HK/firefly.php index e7ce035bad..27da2628ad 100644 --- a/resources/lang/zh_HK/firefly.php +++ b/resources/lang/zh_HK/firefly.php @@ -826,6 +826,7 @@ return [ 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', 'total_amount' => 'Total amount', + 'number_of_decimals' => 'Number of decimals', // administration 'administration' => 'Administration', From 98312ac5542c2fff07c6099151ef3c51e7ce79ed Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:25 +0100 Subject: [PATCH 163/350] New translations --- resources/lang/nl_NL/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/nl_NL/firefly.php b/resources/lang/nl_NL/firefly.php index 8d7bb281a0..8297596a88 100644 --- a/resources/lang/nl_NL/firefly.php +++ b/resources/lang/nl_NL/firefly.php @@ -826,6 +826,7 @@ return [ 'transaction_journal_information' => 'Transactieinformatie', 'transaction_journal_meta' => 'Metainformatie', 'total_amount' => 'Totaalbedrag', + 'number_of_decimals' => 'Number of decimals', // administration 'administration' => 'Administratie', From 26933637ddb4b108287878f59a23d963d22fc02d Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:31 +0100 Subject: [PATCH 164/350] New translations --- resources/lang/pt_BR/form.php | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/resources/lang/pt_BR/form.php b/resources/lang/pt_BR/form.php index cb529c917d..4d7a1cae62 100644 --- a/resources/lang/pt_BR/form.php +++ b/resources/lang/pt_BR/form.php @@ -63,6 +63,7 @@ return [ 'description' => 'Descrição', 'expense_account' => 'Conta de Despesa', 'revenue_account' => 'Conta de Receita', + 'decimal_places' => 'Decimal places', 'revenue_account_source' => 'Conta de receita (fonte)', 'source_account_asset' => 'Conta de origem (conta de ativo)', @@ -150,30 +151,30 @@ return [ 'category_keep_transactions' => 'A única transação ligada a esta categoria não será excluída.|Todos :count transações ligadas a esta categoria não serão excluídos.', 'tag_keep_transactions' => 'A única transação ligada a essa marca não será excluída.|Todos :count transações ligadas a essa marca não serão excluídos.', - 'email' => 'Email address', - 'password' => 'Password', - 'password_confirmation' => 'Password (again)', - 'blocked' => 'Is blocked?', - 'blocked_code' => 'Reason for block', + 'email' => 'Email address', + 'password' => 'Password', + 'password_confirmation' => 'Password (again)', + 'blocked' => 'Is blocked?', + 'blocked_code' => 'Reason for block', // admin - 'domain' => 'Domínio', - 'single_user_mode' => 'Modo de usuário único', - 'must_confirm_account' => 'Novos usuários devem ativar a conta', - 'is_demo_site' => 'É o site de demonstração', + 'domain' => 'Domínio', + 'single_user_mode' => 'Modo de usuário único', + 'must_confirm_account' => 'Novos usuários devem ativar a conta', + 'is_demo_site' => 'É o site de demonstração', // import - 'import_file' => 'Importar arquivo', - 'configuration_file' => 'Arquivo de configuração', - 'import_file_type' => 'Tipo de arquivo de importação', - 'csv_comma' => 'Uma vírgula (,)', - 'csv_semicolon' => 'Um ponto e vírgula (;)', - 'csv_tab' => 'Um Tab (invisível)', - 'csv_delimiter' => 'Delimitador de campo CSV', - 'csv_import_account' => 'Conta de importação padrão', - 'csv_config' => 'Importar CSV de configuração', + 'import_file' => 'Importar arquivo', + 'configuration_file' => 'Arquivo de configuração', + 'import_file_type' => 'Tipo de arquivo de importação', + 'csv_comma' => 'Uma vírgula (,)', + 'csv_semicolon' => 'Um ponto e vírgula (;)', + 'csv_tab' => 'Um Tab (invisível)', + 'csv_delimiter' => 'Delimitador de campo CSV', + 'csv_import_account' => 'Conta de importação padrão', + 'csv_config' => 'Importar CSV de configuração', 'due_date' => 'Data de vencimento', From 245389d74f21a43dbdc0195bb123b7dc5c710393 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:33 +0100 Subject: [PATCH 165/350] New translations --- resources/lang/fr_FR/form.php | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/resources/lang/fr_FR/form.php b/resources/lang/fr_FR/form.php index d496bb8ed7..e833b5995a 100644 --- a/resources/lang/fr_FR/form.php +++ b/resources/lang/fr_FR/form.php @@ -63,6 +63,7 @@ return [ 'description' => 'Description', 'expense_account' => 'Compte de dépenses', 'revenue_account' => 'Compte de recettes', + 'decimal_places' => 'Decimal places', 'revenue_account_source' => 'Revenue account (source)', 'source_account_asset' => 'Source account (asset account)', @@ -150,30 +151,30 @@ return [ 'category_keep_transactions' => 'La seule opération liée à cette catégorie ne sera pas supprimée.|Les :count opérations liées à cette catégorie ne seront pas supprimées.', 'tag_keep_transactions' => 'La seule opération liée à ce tag ne sera pas supprimée.|Les :count opérations liées à ce tag ne seront pas supprimées.', - 'email' => 'Email address', - 'password' => 'Password', - 'password_confirmation' => 'Password (again)', - 'blocked' => 'Is blocked?', - 'blocked_code' => 'Reason for block', + 'email' => 'Email address', + 'password' => 'Password', + 'password_confirmation' => 'Password (again)', + 'blocked' => 'Is blocked?', + 'blocked_code' => 'Reason for block', // admin - 'domain' => 'Domaine', - 'single_user_mode' => 'Mode utilisateur unique', - 'must_confirm_account' => 'New users must activate account', - 'is_demo_site' => 'Is demo site', + 'domain' => 'Domaine', + 'single_user_mode' => 'Mode utilisateur unique', + 'must_confirm_account' => 'New users must activate account', + 'is_demo_site' => 'Is demo site', // import - 'import_file' => 'Fichier à importer', - 'configuration_file' => 'Fichier de configuration', - 'import_file_type' => 'Type de fichier de configuration', - 'csv_comma' => 'Une virgule (,)', - 'csv_semicolon' => 'Un point-virgule (;)', - 'csv_tab' => 'Un onglet (invisible)', - 'csv_delimiter' => 'Délimiteur de champ CSV', - 'csv_import_account' => 'Compte d’importation par défaut', - 'csv_config' => 'Configuration d\'importation CSV', + 'import_file' => 'Fichier à importer', + 'configuration_file' => 'Fichier de configuration', + 'import_file_type' => 'Type de fichier de configuration', + 'csv_comma' => 'Une virgule (,)', + 'csv_semicolon' => 'Un point-virgule (;)', + 'csv_tab' => 'Un onglet (invisible)', + 'csv_delimiter' => 'Délimiteur de champ CSV', + 'csv_import_account' => 'Compte d’importation par défaut', + 'csv_config' => 'Configuration d\'importation CSV', 'due_date' => 'Due date', From a8fdf7ffad2db154e6fe9791dfb60b03a8f0f2a0 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:36 +0100 Subject: [PATCH 166/350] New translations --- resources/lang/fr_FR/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/fr_FR/firefly.php b/resources/lang/fr_FR/firefly.php index 6a0204523a..93a3d050aa 100644 --- a/resources/lang/fr_FR/firefly.php +++ b/resources/lang/fr_FR/firefly.php @@ -826,6 +826,7 @@ return [ 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', 'total_amount' => 'Total amount', + 'number_of_decimals' => 'Number of decimals', // administration 'administration' => 'Administration', From d88c6a82d053a79429b4fe8d309b27f0356d0086 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:41 +0100 Subject: [PATCH 167/350] New translations --- resources/lang/pt_BR/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/pt_BR/firefly.php b/resources/lang/pt_BR/firefly.php index c400975841..f3a86f2b44 100644 --- a/resources/lang/pt_BR/firefly.php +++ b/resources/lang/pt_BR/firefly.php @@ -826,6 +826,7 @@ return [ 'transaction_journal_information' => 'Informação da transação', 'transaction_journal_meta' => 'Meta-informação', 'total_amount' => 'Valor total', + 'number_of_decimals' => 'Number of decimals', // administration 'administration' => 'Administração', From 9e8f8f76a4bad2c9d70731463f0a37cb17e80515 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:43 +0100 Subject: [PATCH 168/350] New translations --- resources/lang/de_DE/form.php | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/resources/lang/de_DE/form.php b/resources/lang/de_DE/form.php index 34d680be08..a5e6307e0d 100644 --- a/resources/lang/de_DE/form.php +++ b/resources/lang/de_DE/form.php @@ -63,6 +63,7 @@ return [ 'description' => 'Beschreibung', 'expense_account' => 'Debitor (Ausgabe)', 'revenue_account' => 'Kreditor (Einnahme)', + 'decimal_places' => 'Decimal places', 'revenue_account_source' => 'Ertragskonto (Quelle)', 'source_account_asset' => 'Quellkonto (Bestandskonto)', @@ -150,30 +151,30 @@ return [ 'category_keep_transactions' => 'Die eine Überweisungen, die mit dieser Kategorie verknüpft ist, wird nicht gelöscht. | Keine der :count Kategorien, die mit dieser Rechnung verknüpft sind, werden gelöscht.', 'tag_keep_transactions' => 'Die einzige Überweisung, die mit diesem Tag verknüpft ist, wird nicht gelöscht. | Keiner der :count Tags, die mit dieser Rechnung verknüpft sind, werden gelöscht.', - 'email' => 'Email address', - 'password' => 'Password', - 'password_confirmation' => 'Password (again)', - 'blocked' => 'Is blocked?', - 'blocked_code' => 'Reason for block', + 'email' => 'Email address', + 'password' => 'Password', + 'password_confirmation' => 'Password (again)', + 'blocked' => 'Is blocked?', + 'blocked_code' => 'Reason for block', // admin - 'domain' => 'Domain', - 'single_user_mode' => 'Einzelnutzermodus', - 'must_confirm_account' => 'Erstanwender müssen ihr Konto aktivieren', - 'is_demo_site' => 'Ist eine Demonstrationsseite', + 'domain' => 'Domain', + 'single_user_mode' => 'Einzelnutzermodus', + 'must_confirm_account' => 'Erstanwender müssen ihr Konto aktivieren', + 'is_demo_site' => 'Ist eine Demonstrationsseite', // import - 'import_file' => 'Datei importieren', - 'configuration_file' => 'Konfigurationsdatei', - 'import_file_type' => 'Import-Dateityp', - 'csv_comma' => 'Ein Komma (,)', - 'csv_semicolon' => 'Ein Semikolon (;)', - 'csv_tab' => 'Ein Tab (unsichtbar)', - 'csv_delimiter' => 'CSV-Trennzeichen', - 'csv_import_account' => 'Standard Import-Konto', - 'csv_config' => 'CSV-Import Einstellungen', + 'import_file' => 'Datei importieren', + 'configuration_file' => 'Konfigurationsdatei', + 'import_file_type' => 'Import-Dateityp', + 'csv_comma' => 'Ein Komma (,)', + 'csv_semicolon' => 'Ein Semikolon (;)', + 'csv_tab' => 'Ein Tab (unsichtbar)', + 'csv_delimiter' => 'CSV-Trennzeichen', + 'csv_import_account' => 'Standard Import-Konto', + 'csv_config' => 'CSV-Import Einstellungen', 'due_date' => 'Fälligkeitstermin', From f63cd7496500b35ab19ecd75a0197f8957516259 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:52:46 +0100 Subject: [PATCH 169/350] New translations --- resources/lang/de_DE/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/lang/de_DE/firefly.php b/resources/lang/de_DE/firefly.php index 2cf3833546..d43db4595a 100644 --- a/resources/lang/de_DE/firefly.php +++ b/resources/lang/de_DE/firefly.php @@ -827,6 +827,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'transaction_journal_information' => 'Transaktionsinformationen', 'transaction_journal_meta' => 'Metainformationen', 'total_amount' => 'Gesamtbetrag', + 'number_of_decimals' => 'Number of decimals', // administration 'administration' => 'Administration', From f010c17ae6d63302f0fb07147153d229441b3419 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:55:09 +0100 Subject: [PATCH 170/350] Up the scales for #506 --- bootstrap/app.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootstrap/app.php b/bootstrap/app.php index 06a88210b2..88ef952626 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -23,7 +23,7 @@ declare(strict_types = 1); | */ -bcscale(6); +bcscale(12); $app = new Illuminate\Foundation\Application( From fe9344cd0a36a0b92d07937e1440103aed475b43 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 21:55:46 +0100 Subject: [PATCH 171/350] Round on max number of decimals #506 --- app/Models/Transaction.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 5b5036d7a0..70061c8072 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -157,7 +157,7 @@ class Transaction extends Model */ public function setAmountAttribute($value) { - $this->attributes['amount'] = strval(round($value, 2)); + $this->attributes['amount'] = strval(round($value, 12)); } /** From eaefb7136a62df0a3225f964f10a78fbe5f781d0 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 28 Dec 2016 22:21:55 +0100 Subject: [PATCH 172/350] Looks like somebody had to google how the decimal thing works. --- .../2016_06_16_000002_create_main_tables.php | 22 +++++++++--------- .../2016_12_22_150431_changes_for_v430.php | 2 +- database/seeds/TransactionCurrencySeeder.php | 13 ++++++----- storage/database/databasecopy.sqlite | Bin 295936 -> 299008 bytes .../Controllers/CurrencyControllerTest.php | 14 ++++++----- 5 files changed, 27 insertions(+), 24 deletions(-) diff --git a/database/migrations/2016_06_16_000002_create_main_tables.php b/database/migrations/2016_06_16_000002_create_main_tables.php index f2ce7844b7..1090bcb05f 100644 --- a/database/migrations/2016_06_16_000002_create_main_tables.php +++ b/database/migrations/2016_06_16_000002_create_main_tables.php @@ -89,7 +89,7 @@ class CreateMainTables extends Migration $table->integer('user_id', false, true); $table->integer('account_type_id', false, true); $table->string('name', 1024); - $table->decimal('virtual_balance', 14, 12)->nullable(); + $table->decimal('virtual_balance', 22, 12)->nullable(); $table->string('iban', 255)->nullable(); $table->boolean('active')->default(1); $table->boolean('encrypted')->default(0); @@ -160,8 +160,8 @@ class CreateMainTables extends Migration $table->integer('user_id', false, true); $table->string('name', 1024); $table->string('match', 1024); - $table->decimal('amount_min', 14, 12); - $table->decimal('amount_max', 14, 12); + $table->decimal('amount_min', 22, 12); + $table->decimal('amount_max', 22, 12); $table->date('date'); $table->string('repeat_freq', 30); $table->smallInteger('skip', false, true)->default(0); @@ -205,7 +205,7 @@ class CreateMainTables extends Migration $table->timestamps(); $table->integer('budget_id', false, true); $table->date('startdate'); - $table->decimal('amount', 14, 12); + $table->decimal('amount', 22, 12); $table->string('repeat_freq', 30); $table->boolean('repeats')->default(0); $table->foreign('budget_id')->references('id')->on('budgets')->onDelete('cascade'); @@ -221,7 +221,7 @@ class CreateMainTables extends Migration $table->integer('budget_limit_id', false, true); $table->date('startdate'); $table->date('enddate'); - $table->decimal('amount', 14, 12); + $table->decimal('amount', 22, 12); $table->foreign('budget_limit_id')->references('id')->on('budget_limits')->onDelete('cascade'); } ); @@ -299,7 +299,7 @@ class CreateMainTables extends Migration $table->softDeletes(); $table->integer('account_id', false, true); $table->string('name', 1024); - $table->decimal('targetamount', 14, 12); + $table->decimal('targetamount', 22, 12); $table->date('startdate')->nullable(); $table->date('targetdate')->nullable(); $table->integer('order', false, true)->default(0); @@ -318,7 +318,7 @@ class CreateMainTables extends Migration $table->integer('piggy_bank_id', false, true); $table->date('startdate')->nullable(); $table->date('targetdate')->nullable(); - $table->decimal('currentamount', 14, 12); + $table->decimal('currentamount', 22, 12); $table->foreign('piggy_bank_id')->references('id')->on('piggy_banks')->onDelete('cascade'); } ); @@ -472,8 +472,8 @@ class CreateMainTables extends Migration $table->string('tagMode', 1024); $table->date('date')->nullable(); $table->text('description')->nullable(); - $table->decimal('latitude', 18, 12)->nullable(); - $table->decimal('longitude', 18, 12)->nullable(); + $table->decimal('latitude', 24, 12)->nullable(); + $table->decimal('longitude', 24, 12)->nullable(); $table->boolean('zoomLevel')->nullable(); // link user id to users table @@ -579,7 +579,7 @@ class CreateMainTables extends Migration $table->integer('piggy_bank_id', false, true); $table->integer('transaction_journal_id', false, true)->nullable(); $table->date('date'); - $table->decimal('amount', 14, 12); + $table->decimal('amount', 22, 12); $table->foreign('piggy_bank_id')->references('id')->on('piggy_banks')->onDelete('cascade'); $table->foreign('transaction_journal_id')->references('id')->on('transaction_journals')->onDelete('set null'); @@ -596,7 +596,7 @@ class CreateMainTables extends Migration $table->integer('account_id', false, true); $table->integer('transaction_journal_id', false, true); $table->string('description', 1024)->nullable(); - $table->decimal('amount', 14, 12); + $table->decimal('amount', 22, 12); $table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade'); $table->foreign('transaction_journal_id')->references('id')->on('transaction_journals')->onDelete('cascade'); diff --git a/database/migrations/2016_12_22_150431_changes_for_v430.php b/database/migrations/2016_12_22_150431_changes_for_v430.php index 9325c8b3f5..84f61fb4c1 100644 --- a/database/migrations/2016_12_22_150431_changes_for_v430.php +++ b/database/migrations/2016_12_22_150431_changes_for_v430.php @@ -30,7 +30,7 @@ class ChangesForV430 extends Migration $table->softDeletes(); $table->integer('user_id', false, true); $table->integer('transaction_currency_id', false, true); - $table->decimal('amount', 14, 12); + $table->decimal('amount', 22, 12); $table->date('start_date'); $table->date('end_date'); diff --git a/database/seeds/TransactionCurrencySeeder.php b/database/seeds/TransactionCurrencySeeder.php index 6edd351d28..f1204569a3 100644 --- a/database/seeds/TransactionCurrencySeeder.php +++ b/database/seeds/TransactionCurrencySeeder.php @@ -23,12 +23,13 @@ class TransactionCurrencySeeder extends Seeder { DB::table('transaction_currencies')->delete(); - TransactionCurrency::create(['code' => 'EUR', 'name' => 'Euro', 'symbol' => '€']); - TransactionCurrency::create(['code' => 'USD', 'name' => 'US Dollar', 'symbol' => '$']); - TransactionCurrency::create(['code' => 'HUF', 'name' => 'Hungarian forint', 'symbol' => 'Ft']); - TransactionCurrency::create(['code' => 'BRL', 'name' => 'Real', 'symbol' => 'R$']); - TransactionCurrency::create(['code' => 'GBP', 'name' => 'British Pound', 'symbol' => '£']); - TransactionCurrency::create(['code' => 'IDR', 'name' => 'Indonesian rupiah', 'symbol' => 'Rp']); + TransactionCurrency::create(['code' => 'EUR', 'name' => 'Euro', 'symbol' => '€', 'decimal_places' => 2]); + TransactionCurrency::create(['code' => 'USD', 'name' => 'US Dollar', 'symbol' => '$', 'decimal_places' => 2]); + TransactionCurrency::create(['code' => 'HUF', 'name' => 'Hungarian forint', 'symbol' => 'Ft', 'decimal_places' => 2]); + TransactionCurrency::create(['code' => 'BRL', 'name' => 'Real', 'symbol' => 'R$', 'decimal_places' => 2]); + TransactionCurrency::create(['code' => 'GBP', 'name' => 'British Pound', 'symbol' => '£', 'decimal_places' => 2]); + TransactionCurrency::create(['code' => 'IDR', 'name' => 'Indonesian rupiah', 'symbol' => 'Rp', 'decimal_places' => 2]); + TransactionCurrency::create(['code' => 'XBT', 'name' => 'Bitcoin', 'symbol' => 'B', 'decimal_places' => 8]); } } diff --git a/storage/database/databasecopy.sqlite b/storage/database/databasecopy.sqlite index 41f250808b831a6eb5f5fa0499aaf81b57e15b09..e298d59101739d3959388e8db47a0e60ae2a6f1d 100644 GIT binary patch literal 299008 zcmeFa2Vfh=l{daSLjVL-DT$)hK}xbjtD&#~v}CZ0q`+Q8N)`w=Wz zmg*Fz7pKQg^CeCXl3aSZ%a{KDl1rRiF3u&FOS!a5^5y?#cCf&bOM3@m9LokQ?+kb6 z{bu&<%)B>mX5RF4oeIVSmh+M5q&IGH2zi1i3T}%<5H|deAc*^f^v?;=y!4-fm=Rwg z3K&QJ0~z4yR{Ua;rW5}e{~rGu{{sIM{|J8{e+PdZe-(cL|1pehYpB zel>o%Ot1oQ?skp?&t49As^Hz)D&TU`0hdNQT)=wf1uh#lz{OkumwdxIxE3I<0PXPY_)a{4 z?N~(LMejxTz|Gt*$APQm!1V=rLYLWYwN(z=?8ElzVY}5~w^j`M#=POtKx`N!&+x@^ zhwXZ^DxH1UR$+zPOVe4e&rheb4cp6y?KW#gg?&jnyY+fgI-PacZXdQ*Ra9Hcm!z{< zj~Vj>A1j}A*y<$tS{+rxf!Qf<*gqVPdc!fVFCL79W5aRpNGPz^kSDas1SB;S)NXTB zIET*%XNSYnp%6(EyFO3J-3qT<0l>BjC`9I4J8V|lL7XS_F)(0I<*=3fAYC-zjR%G& zy}_`YYwRG>N(uatQ%=VMQC7f1VxDkj8KyOrGB!Om6^X_fENTB1@nr)36-eVx;&$xp%OHOHi~}~|4sag_%ZPj0LcAT zkpo2*d`$FS^ag2d8XlSUj|Sqgee3t&z2>QC;Cvt&2>SxD^}FG3sHo&~jz>mf8+PHn zVsKLV+jQMdTp{|PCXGg-bD4E{_tqWQCd#;(_X{>`2MBLG?)8mL2Ey?e+H)PQMavUH ze$&ygH-zpkEXMm$W-~E-eA`xBk$EeXIEKDevJE#PtrDfupojB|aFH1Ij>hsfZo&J- z=yWJB%vvBS+>8&%cjD3D=qS{AoWBVdn@OVB`a)m_O+FfpOi#s%HUbx?AlcmTh&Mbj z9Jol{$h=`aykh!x3~%3nof$WVqk*YFJV={7UcU~Pq&OH1#PYYU#m7)6I2nv*CKFz^ zX$?M*ViSEF6JEBa0PkQtjv35mTr7?RL!lVjm=CYz_4y*x;rQ@mAnwI$O?X%8PHd0a z2uW#!MrH#4;WKahrlX{GKw(XV2)LEXh$hcpFT(pw z21lb_`hEqZ{pX|Y0%+j(;VxVRvj3&f!imC=`#q;Q;LJA&4o4Z0+(&HoBlc>G-R81Y zx$Jh0TP?KHv9P*!!bC_x%6RQjK7Ef3x5Eg0r~&N=XBN2y?l-XSI>b> zxJ*>{i}}UaA!_t@rX9FOT%jK`ZpMeiCH<3u+*{J`Bc-BjB~p?%j_-`!Z-+i2;ntvl6dDb-F?YB^XM^p{$o4-J4N z$P$jkEyMt8nTiG{$!KyS03*ujI0zgtk`imyVN0oOF7*$4G5ijSZZ*iW0kRBAL8cR59=nbs`r1~^PAKC5EdDNLGm zO*?HSnq29$(-G#-7FQ;PO{U^w$Hav-%Q_fp?98O6Hwx4YU-mpJzW+UXloe{Jv_9Wd z+!OoCS&HK_12bN(G$T%4l(zpoY!UG1@dNl~h~$1b4&*qXaG)m7NUR(h^9Widjt-a# z2!=;fa}nj367SMyAL%7a4Pa{5fhg4ueN+vBsYomsuM{a!i9Vu%V0_FU_0D)hWc;6p zKO^A(z@LHf|8JBR&qZ<^$Z_D>-~gEpSkm?6t%Vf@sU8KdfrSXHqd>5r!JKaYME_T< z>b*AJI9JLX2XY)(1r8ATpKJfCz{ng#jsw>q2XgZN8vJOvBIh`;N*s{w|349gpNN-{ z8QqWXUM1jX5{$HajfqU}NHJ=rp7O?GGm)sDT3zF@C4a708?ToRn2Kxmiqa0b0;J!H z0cJcP_Ua2cAhB z$c_J>NnayZmK+D3UJm5s|I^FwTy8lIJd-#;_3So~yu_$3`n5FNNX
wrUzunJ3L18ib!6P=s5WLjeM9wrIX z23`7Rv6{O}o)SK1+|t?`MV5a9?6CGT*pM0sj)uv`sijC|mbBX;OGYlSQo0GNjO-GU z_efcM-k8tphYA+9$QJa}ox^0uYdV8eLDbMPdw4)Iw|gxucEgF?opBnXLj6!x;Ewm!)BSKJQ~^2XxSd(y>Vd~W&H1#16C_?H6y zCH{l1mY++M<3NrB*C+?_!Lu4sD^Nc8Orv^2&i;3ee#%_2a~xO&4&>~AtH8t@M2-X3 zCUq-x7pxi8rDu^w>4}8cT}pFESO| zc8QWnHuW+~E!bMwLh6)pcDttGKJ_%6Ubft)?lY5anKZkVdcRsYMh(KgNcenkbXxYT zuKHuA+BB?sma-2o^&0cEdof$GU_I^I2DU4BQ`Y9xhJ`zdGaZkqUMO>RMD<{oCbLyZ zGHGR=s~!_xv00O*>*)N`;sj+qv82c7Ww)Bu^xo6T;*~dtr1oB981>UkCJyQ*N5Hth zbPI`W-zScOz~sMVHee(a@l9yCGlHoY*~|9<>j9VoVdwa9Kj@2l!m?JMBGosw>biH!|AW6Y|UtH8obXcZTZ*Bje3dzDNpGe^muqR+R9m#_{k} zxy>GHJ~~iaUGA**pX?1pnvb0f**ojnnk#Gj=H|wo@z9X77S+gZ z^&WCI@3Zjp=UyqtfgA^xa-e%N-07m{{~}>g5Eju#mnM0-{$8xuMi*AzeViI|m~(hI zb(Nlw7~7*Z>7;HytyY~UbN|158E4w8lj-PQz0@#b7i(4Mzd6lkH03oPxL7#|ey2k{gHxnGV0ISy!W01i3V>@By>N-VK{AN@H*=Ou$di<|}QYTZ44tAQg`HA~+XkICM{td9TL#tXk#Cgkf_7 zGLGE-cMABQ@EG2y@#48#ISxEWInavNL7NxEJ*Y$w^Yb;V1RA$cdtk-_imPu-{2zE+ zal~4F#A?H>C|j(lF*x-Qolaw+R#C<(fpVGo$_1wrMZNfmG#Iu23B!UgjADO>&%9W; zgSvFP5~M0x#;NNW(NeX7miYuGe6`f2r+sofTiq@0jgEo}I!TUt&(Pn~%0FzzjK+yW zK>0Yblxi>2Ex!+53j@*R+qlx2J)Q5>H3pz5^^O6^fI&3|$Y2Ps%DGUmlb#EANnSRQ z{@mb?aS9G(qX*M#-`%%TP01vET9x{Ya%xpn7-n&PVc&E#3fucut}?36pw3?XCDPBH zQvYuw=l@>8ZGVRzAP1S_z;lBGE}Tz>2%sxys0A9ga9Rq_)*wcUG!kmuBFUI)A$nXQ zAvTu?I*HS?=m+xrUr@kK6nt)crrcZpLpX3xBPt@=v{~%)EHuJ@$I1VqS)+1m+(J!3 z@IMfmYiVgY>w!}zL$R~;a2ulOM8d6+>1fy+3Y@q5eEy2+>Jdkv!tS-7KX0?0FZWx0 z)i#GcaNZY~Yn}23TPj<^6LUk&@s5#+@)_@>FY2|=mU{-OXL|>x;yzoWv$Llq))F2X z8#&n@Y8j6Nha91~-qT|Z-tnezSMS7pw;+hy@3~Qw-^Wbf=Qz9%{HOPQ^t?`Wd9~eN zl-6y9mn7#%v5y0T5ZmF^0ey8Sx=(SH}Q_F=(mKN`U&q!Q_zD+(+g$OBdtk) zMaE=F`u_P~D6rxb42(v=fR~1oSL3SOc*`e{$`9ZmQgUW<=B-IMU^)XJoo_5S4-b|u z`-TC-^b|ST^eLxhmJP|WnUzDcRA85qLLl?X5Ch| zlL2oiK1Q5w!M+gixe@$AKz?nTqgTdMC_IMnXZqcP>_)Cll^5>zn~>j*uh3Bhzs^mMJ&urL6Zx z%aKe|te2*a2$O1&w~Wz<50;VzV)FdocPHYHIwtjQjlFW2b)pLNXp0DVnwT!I)FTh_RO+QH1 z|KnfdU*MnOAK~xg@8GY?56HvZFUNr#2cG#H7?svSAp>{7#Ww{P?+9Fmd*O0(6I{+z z!)5RWxD1fRe*No7`(J}U2UlTStNqK5$m85E$AKINp1B+tlQux%&Pxcc{%N?3jKSrW zGjKWA4wtjFa2YCx%jpAf>DvyM-gQ*}7q<%HR`ej;$o(h>5_gt>*Z*VUCHZ&*s-$Kv zFNW&y$I^>CCOi8}dfyZlsF<1#_8Bs_sB=a%4Ih1NUFBX2V980Se~L zI;p{6c$_Z&6U>Knk~Dz-f;r1*ru|RENdf-lemM^0IB<<|;Do#nuw;kEqDhTguskW= zI6D=AjpgBqFq{BFg>+@ld74 zrwXiA-^tx4*-jGM4_kZoic&Fkyqdx5VR%R8d^O{)oqe0W_Li=`MoUY3L*r>nX-0w! zGT9$!#xwHy2r@Uy zRyN^HOoe-F9*4i#U+!u2huf{QJ?)P6`d-`E{D{V$!XDdL_v!lT@*&4iynn*q(m!Df z^*BQ1LyfjJPuM5#L7cRW4bH)az3~>u;P~jwP;Yy%qjzxL)7xnCGz`wP&$mx@^maKq z8U}5H1D@HT-ny~&h8Al_uRqw{&@?tUKQ`f+_mp?^j)giJLZQL&!TI+2iTR;{_VJDe zPw;%#@#A#-FZK#zFSLBMZ}b#y0;EJL)I3w}6ON^F)UvP8gxV9KS3QFM2OV>s zdR^Ern0mXiGTT98apRtq4melXHEdI&l~n%YKMU|L_sel0$ARY#2e63EW-|U4bM61R z^VM^2n&W`XfxJAk*(}Td2L+s4{gw7fB85$iL`xC=ja+ zg)DR670E*Xq8{LbVT;!?1>PouzG+ygM3w+ePaP%g9|^k!VYm3%qs`+g_uiSyrgH*S9J5Tie5NZ$BWBi)eY3az}+6@JJBx` zb1wfjuwvjD;#4&?hSeOhE465){dfQP?*^_tBU8guWGP)N1~z!!O?#>L=UHK~#Lkj# zhJ;OOp!BmRS+F6?{{;arEN}g}J2?*IIPiDpz^&q1D(cNO7r?QQ#;k+JtwAE&&j+Ki zxZ=!&H22=IV2p}<3xwXVB{1tHvwlY{klx~h8!_+s04)ENWu+w;m*qb`E#No9CHKp5 zAjg4K;XoTA`n!35nW(o(!`%Ha+ru<>inxu3);kpl!=dwNkPZgS4yW$^0j86H)<2w~ z!q!EmN5|q8IM~oK6N!fWuoWXRX_57R*d%xc9a@zaPlGIY4$i-q5tRv&U5)FW>>WzGy1pGv<@B0CmLaVHs~04-2Xyv< zv52K70s@?LO^W|Oya_6#(^W_vd?s~{-4bM!7r3s1MnQK`ngws z4su`uPB7z|Vn&8;_WZi;Bd{XXq#|?j42gYNN5^>M;Ph^|Y$~S5?0+8!uJBb=@U!QzsT& z+5^}8OIzS-xMYSaUIgcMqOeGgtNiOC@p1L%#hc;!$3-}oNBG@hGhBbWcq3eYwP=Iu zFBi$d7C&Fy0oR``ZiMT9EE28v#|!gteS9GT*MD2^!}b3z48rxh3&dO2w-)N*`i%wR zFYo^>9D(as7fRv!<%MFneqn)l+57B*2-km3T!iZ<6BBU#MB)~>ek=iRBz!p03fIRH zH^KFv62zg-dlO}FeRl$8+l7Y{o8kJ7L_S>KCfyF#H%n2tJ|vC8_4U$OxV~EIg6k_K z;<)eSQVm>RDp}$BfV3a3FO-M}ujf;*U-wIS5Wh4BmxVA~?t-&@ggb~q|27X?=IY=w zQw5jl!*Gd~z-4MHTq0|z{1<>vgjITeS56%@6<1V<&##gDdpOo0#>`)AND+%`+`DOs zJkUsTZODg=f|H&3E6q+5SN`f}azCHRo78R+b-ESSA85#=Ou3V$A}7j3VSm?f=3_bY zkw|1h<2IYY)_9`NYzeY)m=1uKyV{54>3aQHQK$K-U21-{uw!qh%yk`Dm1Pr4=F&4i zP3qIC4Wvs`tZXb@0-dT2YB+LN0|F)j*fFpw@t&D^X3bG!YNP_EX)F8xCGB4zok#AM z<3NrB&p8f|_K$?02*OWL;#vFh3)_#;naE2sRA*s&%J3w3qR))is&$miM^CG6lG%r+ z3bDe(B;OXj(lKvrOnV3$AbZ38!(KS0oaha4IJNGngiuD&R+d35(UVA^#I06SaZQbQ zXIFs#7>u2+Au6;fsO^$6AqT-PYb3Q5%xTt-~NEMgg1$qnifHDZN)mjGsH zs87xPocw>*_IkM&%W>c-IY2BSCj4!xUA=!uZAnv4q|$HNf?raasTWx*&WV5u4$&;kU5PW-6|&6))|l z3MF$#uc14w{G>sxR<4{dE6tL@t*&yJ234zr^8J6Lin*}eZYpkU6fafL?~z*Ls-@09 z*|R3~H+iz8S$!1+aCN^+Can6)uqRJup8Naj{~7XsZBG6_8@j*TJLEV(IPm+$S-Ad? z%KtAekh#eBC&--XYZK(;uPapkU#9ZkEdE%4S^g_9gTDc0=U`ok=gkit|FCfKVjcALvq<+4|3->QIj zJz{kTzjM)pKX_>?k67)(?`o(MLnyP(d}Ur)A#a=TJEH%KXqy24a=#o0(i~XuJLnN; zm*qK=DcI*TH$37EPYlCaG&rhe*^Oqke!lE^c1n3P0J9OA^Ae@gQ)H$>`&mZr*{bvM zl8MYk6zMeLe+GX7e+WN{ zAHi?MZ@{m@FU2pw_uvJ5JD$N8@B|LvVLXU?um?BeT3mxG@G)G5_u^f+7#HF-*ns|q z{)B#u{tNvSJ&yh_`X>4p^ab>3^fB}pdM|n>dNX<*dIfp_Jr7+$61o*lqX-HjAG#S0 zpf1#g8qrP2i5%z%I)F;h4pf9TATz?^U&TL&zZQQk{)84jU2k(SH3!6<_rbz1amRhI zy;Cf{&jQ!2_Z7l*^L?;-O)R|k0$exT>xJw3d%NJe=H6Pkn(u`LVWR0?upWuVdrA7d zdr5k94@ocH1L=jo-2>@`zuW`qh5x+=(hGmO2ht0FxChb;|8ozd7k+a$q!)gDH%b5B zca!x0bvH@>i@Qns|Gb-|f8uVE{wH^n^#6W^r2o+slKux*Nc!(zA?d$&g{1%gu8{QK zxkA!^`wB__&C4YH*DsUwU%O1w|I1~P{wtSB`Y&B3=|6v&r2pJylKwN7NcvA-BI!SM ziKI_nBI!SViKPGNC6fLlmq_{#ULxr~ut?HBx=7N$Z;_;b&mu|xF1ohx5vpCkbCINf z`yxsI)&-LOEej<5n-)m=H!P6!uUoLe^)(A6aDCMRN&gDEdho#nN&m70N&k`rN&n&m zN&lh*N&kWbN&mbANq=8LgzMcBNxvwO^a;8?P?AXcJ0+6-c8R3FRU+xi0!#hl7Ir4T>K8Ya1+e{`o@>ZiUPcS3HTZ{%8zS)!~KX{V~%aMnSh(39v zQKaD;Wc$A)2oiezKjbwRcb3z&Iah9#mw%*JFJ!JGjt94ZN z;2)u&`n+(`uRlw^hW{z0sj)t0Qw&O2L3YG0zVAijijy!7GBqx2J zsZfr**SL|UeUEVi4c~2AFDHGMX`LK-#I#mU`mkw@9C>H<(jOa`^v8yWOd$Qq8@lB`6V0;DauN;8V3 zXPIjzoLVHYCt1#TXDQ(lJF2K})WssIL4+f4_!YghtJz8KWyilPjg(KeN12p{C_F1L zyi|F<;_4KkWS9eZ>BMHCQ>? z90zh7xHdQ-?gj4wV(B_M|1Ulvz`xw@Sb0jhv3RLGY z(qazMT7P6Dkk||U$;c@vVom<1OP6IFhw?roFj!+|%4; zZEtRx7@G8yx6k+4hsGzYp83Z4!O1~5;X~it9j)kS7#bUDfa6;Sx`Uqi z?s3mR-%Lkui@n|6Iyuzfv$fB)Iukn(zKyC)#Ddd5Arj^5hY4&cIIZ%ak{d|hy`w{LE!H#Fht?Vt2a z_LX)@*+96irOnnD?XmXF1)93%+Z|J$-oA?Z9&2}>&*~iP@3jU` z)wjmsT;E_vkg%gWG&ImU+1}u*@XQa5lk zPP9+9hT6wl;Ax+uecU(G-q7Xn^w!$j=UXZ~4gC{C5N`=v>G{9wg-!u1{`1&{{)j$| zZb2pD55+f$XT`0;_k`!eLyq5#n^|Mu!_n9qqSN3t4!n|{+Qg`D;-Ky!4%NbO%c%%B zOYMk`dc(naaI+Q(R~Kf{@$`%ZLZOC@jPe*yIU=xUJ`xTE!vPC@o2Cs6#leAcGT;rx z$1I(p>6oP@9Gi{?qOSD}X9ovPZ74Y69r50@j?wPtpsj~fA}sa5)2KIed@Tbg;Q;VX zdgmkIqu|Zw^cqG!z(L;YoehxlEBuyjve8U^zs3!vP z1|y^AsiVZF@BnBlQA>Sfa>^T?Bl`bZ;Y$Mk6uyX$pII+_J3LQh(>sD?fjg3 z7(+Nz6oagyH11}kHvQky(AL>*=^TqdYwwIk!0mG&TD6P86mh`R!J69BI~gHID>3M5 zCGH&znWLT?S|cOPL1=H#0r`&JxSb*Jw6jyB@rJ;C*vV~-x=KGw@>-`Sp_*Gd!4Xzd zB;vR95ZTah9Yf-&??Kv&5kJ~K8Rd8}L*ePpPWP0P1NB;ZIvck#a*m3UchVbz!GJ$z zsfT0tI-%*uT8kJ=4F^}6qXF=xHWq=t&(atQ_~3v7Uobv*;}(X+^L;$NhDg{O^2bQ~ zUnh(a`5(iF!9(Y3(P>mDeoCM)-U~0fW)Gv!+0XfgLXFrEEtWHh-hMKSwuf$a#>! z8Z`>AM&7EU8-|=TwG0MWBk$VL4P(-R0oKSHcuMqcIx+$bY-fQ@ID|E@DW)1&bFoq0 z%A>n51{npm<1iG$U?I^c@9NPFlPAMKDF_TLmcuH%s}b|n8n%%N=ow7q5rFwXBi-vG z>Mo7Et%vT{kxN5%4GC{-5J_pwx?yBm^2O6J;l*sb3=WbHq=D$QRI8n*Mb zmF-YUC@k5fl!}qI0fHj->U^Z*P0Bbh!v1XGD<4|gigZ8k6e1$30 zLIKun6?o}>C+xo25BmSB z!~t=$@Kxa+c=%Mmy7gvS^~4=Ik1r%0EYw?47XM@<93KnK)vuE=kX{VZyD|*n^C^(E zoFJrcWgz$o22!_%fS6&kk}5Q;|Re}3R0iX3Bou+K++sB zWyKLyLEJ_e0}RN(FMZo%nL==JF5r!Z<{AvF6nnT3h%z7~#y|%@LU0=LvO*!cfbgyh z)1bWvpe%KmpCj-#L=_M|!0K5oVim=gy!5LgDB==3DkI-@M1qq0nzdQ zdZAW;9X~VJj(!Q_{{XUx-xD7cd&Kp^7lq64@X3DlJ4q2l{jG&nFv5y-1>3>TPIw8* z&Q#m4+b$P`w-X}#RGQp2&X-|Lj((F=LF%vL1YsN@AZd;iXT=d!LF%?<#}QIJ6pj>e zz6|3CtzrsCws3+lju4PEM>c205miCzHf6^VqE9FsDdc<^#u0*%?v^)lf-sH{kTgd& zWW^CxL6q_Thj0`hqT~Mow2_YgZxnvFisOHOoEr)}<1VbeDP{t1eYlkh<%$;|S@b6prlYd>O_Os_ZIacONGR z;|Kvsb7XH;98nddt~5K2kiJRbND1f5Fpf~gUEzp@6NGVufTTIHCo7Jq3R1T_JC2Yp zN#V#Y&X-{vQEAO8`7hi52blf;##Ocdm-BU3<+QsZj-=!+7-A0i1dTA2&eQ8Tv|vCW z*cpsY!@XUGAp_b}j0gmn1mY=-LYs*K0>R1$V@(wy69!lV^I|-uIi>{ztU1cZnxird zc-~^KXQgVy5x&A4(Lw>%9Oi>LtOWzCIm8EZNDBs7a|0i1ZlEx!ISr=6`Wwsm3R9+q z0<1a62Xjyh20x+5|E$OV)ttQ$=~Brs75=5W)GGcim0>9IzpgT?E|qpMN|#!}`7&~s zN->mz)R%LD$U=sKq&ec?=SVqqyqDI9>g?HZgnSx>BR0;LVH{D}{_3rqAdDmGI&v&4 zj;IP!cQiYWklsz<$Pvz$VH_bC={j|NGAW*Yb5&wQ?^( zY!#^(%;bK)(ai_rP7!CqfIzs359TH<7!U|27>rIe;)D#tlp5&3h>J*n<8i*i9M?ht z*4)SkbE6gvum+Z-@Td_rS}?#G7awa}G7M?0sTeWTIQa_WOwned0BfrGV5+rXfHkm& ziH9{+S}?$xNO_Of|0HxH*$h7ju4PEM{2U-h^ioUuIxBM`bVXXI5}U2aYUsN$@2f{ zSpU<`*Xy;*O`O?ap^cHnQ~pK|U$5uULIHtriVxlJnR~M8Qq@N0?(Di$ zm65rN^JQ3^Pz_GJ7~*hH*q?WUfEO3Bou+K+-5gh zK8hUZAoo@fBjf*uA-+y;Nbc&${9GzVQ>)`9_f0GobzhLr8M;)A2!sG%VFD>yCJ+FR z&T07hVEkGzAP{_fFg`69V9f|0Yer-k_MzYmF4%Gh8kU!@FkUSbkd?Ra!Q7$+1FRY5 zgBjL>0oI)3W6e1khIECg7^yWk^A+ai6m2F7u;wfu%vmj%)tLXE;_QV;mkKRgZDfw{ zcc}~`-KB=J=u!bhWn`Y@d>PWEG7P04^&w6W#u2rVc_J&0sEy3y*>OarnguyuhH->o zq&YIi3Bou+K+=lHXjU9i6{PNb795e!Gfa!!0O!ldVt2_J5kDsg;Rq{8nj=1bjxY@6 z(`3m1zwiA2G+%c$EjKJ?$b}|G_P9c?7w3bCYr%j(i1ES1v|vCWL>Y`uH6kj*FcU28 zz=%M&z*m?HS}4GpDL$AfEf`=;gbya71p}-J^RXr@!;t!rmth=H*>>w^IYAgl)JEo+ ztT>`7NZrNkIHFo3GR^rij3Wd?`84%$P7uZs0+OyHv8*_vDo9;4JB|?1p^X18aJ~%V z2*FS|BFlfDw*Qa+5#9+NL9h1LC{c$eNVhK-AtCow%>D}Pi*8M8lBmZMz>&WSXjD&r zz_K7|;Rv5^k_6Isasb_>1q1@&PQE_)PAwP^2zT%aggayy(s89?WXOFxUtw-f(PpB6 zth|j6<~A)DV9l+3Ft=*K0Bh#?STirfklrU1BeHUiuP}2d+DsH+%`6|xtQHKgW`+-D zMhga5bCHiV7iAdI4W(jGYe@TFFO-x0{}-_p{T#go{QqqizbU>@Y=tv|J|WD*!zI6Z zDH}H%;POFjSeCNzv%x@=?yFA9#?c0}9AeQ`I#MYcPa6zGDN4PRjjIiYk`^vf7QQx? z7Nt(2&NjpnE?)?MqB1W_)ZYe&X9p%<9!%cR4X&;C4p0RGp-PnG*|A-N)b_&M3(>U0)7mK@qYAu^b$C88;Ktl zFNg<)9|$iO+Ltu`C;hWYqP~qdBdxy%2J+=&}q%`i)eK)*|YMkfT7CQq-9^ zghkX7AqUW+77$?(^+m`5w4enfkN*qA7NY-8gZ%$b^d>Y6^8Xv+^WkRhr=J6LQa0Xp zs2{9M>5`4R9R`x2iDct%hoPjUi3 z;7S%wca|2VPRhn%9-t8EmgY(}9`hK8!WAO_O$f{K|9U3>vHohGOL@(6pi!d!M>(YA z%cv|#Er)%5YYT*zmNqvxV0KG&Dh)7B5g_Hy60WBb+NKikd94vaV z45S$C^itfP4l!mhdY=Jtv9 zfksD1gMR`Js+og>Y~YlZP{;!(x{zal;6NKlS6eX@Y;}%!L*B3tj_RrP$+MZH-Psc* zh%u>gM^;R#w)NVYDn|MubN=}uThBzJ)jL^UF=UN*4D>B$QdeJpv-f1k+HMO4dm38H z{r!G&22zD@V#w1sUpog(Z1dX2;7FUXf$sU%neK+MaMxUHw*TbVMau9=+t}b-OJ&PA zFm9Zj6x8Jy9B3bFw|4=9d~kG4YjCK!4-U5JvwIrqCOq^0NqV|ZbN2)sdjtP>**)WM z($9P!FvmYOG+t}-*x|&WftER7Zt#59@#AnL?ijF%))um=19$`;ENMl`jz^RIo&BMi zi{A0>ncm*ect?Mzzug*{?P+eG_Q3tVUMsBt{>i48f1nSJ>1mzxHio8pn}=qGCR^JF z=l$OH(3HnB*?P*`H{0ue@!GXlVyi~(4%c^r6 ztQZ*YpKb4-3Jt+|Y$NmjV4t=BqG!C-F?4$Q8DIV|=?wepynXGbddJ7$Os`p6Uqicf z1UiYHiP`SJcx(4ysJ*+*+A`}Kn4NBO)J^oBtUEOjn(9|~j?kI)`exvex7opg76&;3 zt)szHP8}&?c{_AWaIbuDywB>H^vn%4x4le-ql-8`DHb2QoUF*5CHMyHU zd!GE9>v*#@B^jw}EqAs?chmUssfWH@;9SF-tue_+T?M?^ZZNoeZ#?+BPrcx*)6AQ# zA<0Nx`MlW{<+*#vyB@#bH1TGemt>?aBX73F*xk1F%kcY()4-c8PBKzg9&ffrC;m)) zM2w1+!k=Lda8Wq;?fN7mb#3R(*0j#;*!Bwez0$djH`{edM(VnbH`{`>?#lPb zExwpH+qFqX>e|Yit$B^x{&@4dw#+~7EaJ^}O_Gtiw(w?~U*L8S9s`p%^JZI+WTdW5 zyxE$}?xUj zBT>Ba^YhL6$0L?eIQ1J5@5vGl#|Rf8r4vxX0| zDHsX?W*p9a^ug(K@ct@jTh%F}0$sufT^E@i9gCCVrV47UI%{BPqWLC1G(-_^?!pS{AwJaJer?FgUZg;B z7F0f*Q?sDu-6BIZn>lM%H#s*I&LCXMQmb8V|9t{}7w*D&=rJ^oHi`cvo&(kWVWE$- z=`4PITb0-6Y^E8n-xL^$rawQ}bIN;)l=nZz_o0;cUj}MFvqc6K1@mz}P~1aL(6+#F zE`d2M?%Jz+H!I+rB}P49_KVJGGy{A2*-Z+2Yx#=Y903EFB{D5n27fddo>F3Ct;M|ra?E_S!PP*z!w@Mc?_WTdXcyxAJJx-Fk08tX~tA>M4a zCK+k@4XJE(j~0ut$5EEbP%l-{Umh(#$eR_~BHZsdz?;>Uzr~%`r-<|#kv6+u{)c%o z0C4S3l~OP1j?Kvw?LJ=Gb(`EZ|4XvH)w!3q$eWUk)K$uzZK1pNgglZh;mx)%$w+1S z-$eBPKJe@SE17bMBBMN3gW5{ zQ$SIv?%S>4bLu}U4pRWOvTc_Fdvy|&OpbN$RKPfuN$p_@Y{sY>+@WBu<}d|5S=FiS z3iMSDQ{d&RZr;YwL^G!br7=uds#Dsmeb*_4<^BHYamrFyYjt-JWEmE<10w8@9Ro{#Q1j z+jz6xmSm)I`|n+`{R{sK_Wyf@UcH(CNmt&PdKJBjB{~Q?Vn^yF^imxJ9kD${q_;60 za6kBObi&W&NtIGB>5c=*6zwTq+I82vkKRR@=xpOH^7TnZ>T2cAcE7vgD2y(e-{oxK z&31p1k-ARuW?Qh&UG-PF{WtSwyD!N|T}`~%n)kXLFZwymB6m9*d9&S{WTdVJ-fZ(r z-Bml~Y1Mk(Y)g}j)K$lut*OLaZjyVuTHb6+l8jW=|6%{{qxd}DhCYdWXs!4z@hoh$ zeQXu>{*oHseK=dSCBtg#@kV`PvLOWaFIRUQQZNtj8L3jLkQ%VE`vwJ&Q@6@6S*kJ1 zJIffR*~~d`QS6m!MElu;G9nl&ImcPcjg?DvL3?%I0R^4YYMo)NTn1Zy_Iic2oXYl7 znJZz;QQ5y=L0>g~Y-iktC z|NEWzA@L5ePBaN$5?;tB|6RB6c4dWDcQdiQO})uE%-fY&lZ@1Ljyv09?uLiu6(TqD zW_v8jNL^>Svpwo=N{}TYpLU+%&Gu-Lk-CO>v)ypS-Sb0P1sUYc_DGVEx=!QBQ5Vv zWvf>e-d+aw+^$rHda26f^*?KbApyS$_oF{U+aE$$d`RpP{zrH#+`fumTh%IcQ;s8c zM_c8pfx#3_g#yMYMW14d#zCx=X{zDVVEit%Ofjb?T@BeU;Wqc=@WKBMeP6a~4#? zTB*_~ZB|+SufqDjsZ^JxcQjp4?Y6xECQV?mRwUJN>7}hsGE!HVH(PU++e(Iru+Vst zH`}TtBXxy%v(2w`Tkn#E?*wnQl}SeG8t2W{RN;28F=CK6+lnM3b&c_6TTt$YNU@hTYHj`x<+`jHQC%& zs^B=BUfyhNNk%G<{|CwV{|x#oto?5n|02Fk91t-!_3}3 zp+>Y1-Y6r2eZt9SmRW9}Pzfq~b$5*d&ACc1!#JVFEI;c~n7YcA3D7Sp`<)8vEz7~6X$w*zd@n&m0;okorbUwm)D{rB>?FkYNXWvG|xIIRDf<;@D+2y;6#yjk4{b2}GPM0&qNjr+md!HD$Gw_Vez zQtBn$QIky3#(8Pix!koMlGp#oc#G^xGE!HRJ6or_x|qJM^8#~g59>Y;{@y8Z?-OiDGFq3!y-~2R-rYo}@5-DK z_fEn3B%^gndE9SY=WhP4+;K?Udj;!~jMgQw&4T)O%xl4W)~LW_{tqF0~n0)0}lqte314G)hU{F3jOupu_!OJyTlb?ZO;B4R&-S6=LoU!|U4J<&RSHj#J{^ zG2EVHv@VHz%kVmn`^1msxmbyN&#))SXk8Njrr}eH^-kj6HGE1j-%0%2hTGiMK_-T| z_YJot8Ldm=-#FZ=Y=M`!cMi8Id*CJht-~#Dri&}~zc=D`^jq{0>H_b-?-Bc9{m&y; zW&i6wt@K%|(hpXUesDm+T+MzE&P1v@)vrKb<%|vZp07IH$IwJ`6`vhUbH;{kfrWBf zJA0LKatiGXW2MKdAX=+EJqqGpzOts5Ql;T4JG&J)&H`o_Dl-dM-rmI!&F1}l1{s~6P4h1@UBc&R%{A|0z&{Z~465Usp|0e|e1^hhRiMLSyALmf1 z_!IH%Vo0fdffK>yo&)2Nw3HM~K|}1N+k>L}i1ZUVGSvK6md0W(8383F;;8 zOEOxQbTFme>7^~|b@zwZH&%8H>Lu(!8@t`5)B=3oDRJ)~>`pS;a;Y?xv0jaMdl&Y|^8Xx}|2vERg5H5VNDvWLfUIl&C%oQND9c{NLxK}sAB!z4n zUOg~J+qqQ(19QdA3fStJD}aX;oo5wrPQ^lNVHF_S&Ye*ZSKV9zT3~hGkb=Kj<_dtV zY#UTyueLJD{y#Q?d7t0@&%Nisn>;EnS8z%0R9B_9V=uVHUBwm%OWgYdZ%Hy*m!xbE z)SIz+*ljOla!}bQsF!#+$!J{?|AxVHZd+pXfH@odAYdH6w!JCte z)+KRo8Z0>Lu1r$d;*_{|4W3OhT9?GVZP0wiT}}7V9d}CH`v%V>8Ldm=-Z+>)TU#`O#78|C6l$Hwa%4?iV`s%6zA! ztU}h?N`lFrN_j_~q--42OItMN?zONwqwF8lOFWijv@S{BM#!Trj=Ede;wwqsNXVfr zjwTtcOXA*0Xgu$}o=gjpSu*aOgy)ltwp>!S66)3#1F&R3Qg#vQB?}N6@5xkuua^q> ziH%p;JE)h;Pi(yMwn2{1;d8&@O_ZZ9N!~WdQ4ec_r@iDsp?<0a=Z>xXubbVn(VOcFb2oA5R zY@1YIuTBpFFnf1M0b3PwWhF6JPAHhGX|9CxHmXjIE6`VIu7sDb8VoWtk$2gihPkqJ zIvkJ}SCX@4y2g}(a$3YP?3J02*6Q|A1(MSqm@-(Z@G85`D|nnm%&=IhAj>-f4AN}o z9QP_FOBJAfz%K)W&60Cqsfz zf>TLG>yo&)2%01A$`>*HpL>sBB*|!9689#-{II)%EO>&Q`x5sq!Eln%x+Lyxf~HBg zW44RDvQy&TCpej8v@VHzqhMjk-O83iO58gILrF&KlKOcoSK)-a39}hb?!AH&Nk;3E zxHk(Hj=LLv$h24P-GbvuM(dK4?Sgvc|AwHO>D;pX2me2>hxxx>!|8tms6c$5*b6Gq zTY0_yr?r5NxmD=@LadvD^GfZfXO;esb3$!-|Ciab+N--}6l6}bQih3A1zCRfB71v* z*SpkHZFmQ*qOyNlLFW_&TIh4dN@r7m4?Xk~lBMU|uo+9*PIVPO(L-6`i6@EQ3>>w~2+K z8Tze13BMNpQ~0s)J;QjOU=|~WAPK^TF%nD~NAuuZ5)?9?r{RP#K*MpPpM=Js(MLkl zm~n*uJ!BM~pYq&}%qL;BPUUA;GX=hy>>hgCw}waGC^X z4Fe=NW9TQrkfDzRgT`J$k4_tVXgFZ(reVLai-g8LVw;Nk&=rObq_)~_HBxo}_p^gNN##%y; z8jNll)*El4VV&^=35~VJ<0Le>jW^Q2Z!*@~z%X}H6kaEju+FfS1ZxdzNU+9GK!O5; znFMBIKA}hXMiUK9Mk5W4Mgs|r24fxxO?gI4|Hei{|AtXMgk}?w|3kuONc;Z{{yF}4 z{C)gQ{1xy9_%Zx`{0OxF*MMJ;=ix#dp8HKNyB&g3KG6`QcNu)}{y)T(0QmNtI7flkW))4!GNg@>+ znDRN3M5;E*7d~r}NacpuXN(e5Z!;49*(gE%hRCOl5>#-Ae99<64Ts1ljS^IGh$M{? zspClagi#{390?ycN~E46;bSHVYC0+5M@!-er`a9YEv}qXZ2BA`crS(h`vHPNP&xBkwRuq%|Pn?IsD@11aI#OcFE+ z5__vjf>uFdZ!t;GFh~jCY?7dDkaE4rB$4I;_Z~7yq=CS_H<~2UL?HGClSCQ`l=^ih zi8K=^>uXICX($kTjZuQ80@=RWC_!6+$g7MJG!}@w(kMY|fygV25;PZxJZO|idqKj> zjS^`wNO+l1B5eicz1So{^C2aCkx7CUM9TF-lSCR3 z+Mjeh6J(anIzJbpw#!7B+{6mtoNEE(wrc6k5PgrknP<@30f3Ht{5eO zMlKugq~Rsw9W-1t-cG{><83rd7;mMaWSS>fNVv;52N4n7X`H3u9mW|F8gDmVB%$dx z<23#IR%4w0J#UQBaLyPdVcv}K0txdk8mDMDZHPbyV%!iWLCi2of~X-xf(wQT5=_bV z|J7OltL#G3Yp$ImwqeC_fL9<* z6#pjvQT#QWJ@)uA{r{EX1LFOl8{8qzh*M%v^ooP9OG&N&ZvqV=Px!0wd*Q!@C*Y;X zPaXus;Gufc$W0J=)Ca^4Fkp@66TE<2WjY)#{jp;V}N0K3~){!1Ke!rC0U*|^pN0;p_>Fl zhAt8e%KAS(E$jbyK-T|pzpVeGK3V@qy|Vs~dSv|{bsJk~Il7D|Y5wiTW*U0rA;2kl z2+$@E0b1oDK#M#CIB5WViHr+CSt8>C(3HryfT&3#ZjkkVTrcbYxK7spQLU{1Be$&o zqnl*?ADxi(e{|dkx)JchWdzj-LZ>_esFp_nRq_a+QXTbQL~NDye|${V|M5{-|3^n;{U05c^?!6o*8kBBvi^_CWc@$ydLw8(P>%ib0AQay z0N5)J07~TnK#4p6u*d^|J@Noxw*fR9G7cc>jfi*3`aj+w>;HJWtpB5Jvi^^*ll6a8 zEbIShtE~T{B3b{>WBPyIRqFqk>HnDN|Cs6ji0S``>Hmo7|A^`TNY?*9CE!2eU*RY4 z5Ak>Kzv9p1B>o_NH_QpX4o3ekfStj2;u#zP51}{XUeNyCxDp@6rT97+_Zwi<;BV1? z!l?f{=wHxh(MQqy;1q$^g7$wewD*hPOK=3V|4!75PM`{O80|&d(MD+Le-VEpJ^|YQ zH^eWBN$~@q{l7_kmH1*9JS_UfAsF8`i8qRN(EfLeTf_noy?=z3{U5^jg>QgY z!cWomEf|UN4|>;kj70Z`$hVC|^@qr}j70N?$Ty8d@rTGaj70B;$k&ZT?T5(!F%qpG zB41-lKNkMgM3jCJVc}m)MC&Ip7+8SXPn0wmSb*M7Vlc1(#h=7rU_oj(#9&}S>Nmt- zU;(;6Q5#`6L6!eJGMoVAA2NgC1nB+{f#C$G{t$uT1Ze&cf#C$H?}!X1NR6k%38?cB zf#C#b{SblS1XcPm8BS28ACut(DE*|YFq{CbpOgWH6QK5!7z`&s?BnT~K$U(>h7MRR0}LG?S5g`nI)KC>F&H|4+D~H7 zH-X+yBF{5{;!nzVuL(4N61j(|{&zFg|B7**W_+1w{!oBRMDvGmk!b!9E)dNh!UWO$ zA(Tu+^M`MIm#q5ZJ7v`$-yy61=yqB4N4FV4^#^fus}Xd62UYCoUB3a-aMTotbh; z%qNI`YT>S=Ld@+Pr0`C619PJ#aeD{3Gs$RO61RJh!aLk2-$EBhIVEoYAa^7gtxHlI zgy^0jy4~G-2OEAUenRvT-=1W&E=h40qL;SlHh0fSvcL&8<11c6^b+5eWV9~nBCk$d ze5?Bu^WrVZ?n5|+AGanMtxMu|A7Y$$mwb&)F?0J5nNKp>a!GL@qIX2ReJ-{Be?S0R z-_5uHEO%az&F>X`;u_%{!hov1^Zd~%rH^V{g_)2lG7}=D&uLussSucBtnQQ2r#7zE zIwioZY?D&wHVWpen^_|>q1}?8%m}T@N~J2YQt3_wb2V2g!Dp*Fb%z3dl`ECt?W+cF zXK1UlQYk&f3@epxQwqwt3`n(7DGdoLm2OoavtFr`fmhizui$YOQMFPj1F~F}{|5#9 zDSQbxLl5v}^a7Zh+ai7oZ1HEr-NFyy9I$|J(3N2RemErVJ;~}PXir{~U=Dxu6Bh_~ zyDMd*j4Q!B{^+L`?oKk|ngnzCqo3F;Tya;tjTYRMU_O8JQwvv;jJPJjoc`!1&KEAb zZ6xP|zjq~=*B|}V!sR3*u1PSrKl+JH!XYO9q%t#GtS z`3msWDpjytNlG8Ee${ADw)C0mSBnMfDFEJcYY@;A4d>|J^D1ZwC4QQgk!A z9#-MJ7gpL-g2nA4!tH`P-MZB=SAu!{(ck9^FG}{wBfOdfbN-{BxJY=RyN?ct&$|-L z2atYh;e|;?T$7Mp0m1o(dIy)q!VBD<$LMs8D|EsJM?sZ$4D~ts5 z{-d8-xHrj&YZA=;kAC8H!aZ)Ln#=MZ&i{P}J_Y{2-+)eu|4)32*eLu)c!{9<{NFYy zeLU;c^?21sNRO8~o^`c*JV3ALl+vfOa!OIHMVbH!rit{)tgCLC0QCn<6I&H&w_2tN zqE@v@MGEfKem7#8*rK4VifN*nm?osn3g~LuCg8hOosu>w*jH(s0B%;DkqQ}{Xg<#8 zsYqiVm0Gd1S$m|7N?|!w;0yzW8dYBZyHU_H{%4+k^!GBtE0PtjrM~lO63o?)e&Pb* zLHE&=oM*m%^ivBDCK+)}f;s!qPiz)m?yjKYvXia^^Y){kT6lSq5!WP`yC40;`NGTG zj$X3qXNxPr{Qc;s7G9QQ#5D=#@JBzfNqDK-`b%o@cO{s|AN|zAOOuSaCc#|(=qD}| zUgB;|ed`0cV)W&PhN;P=7W{x#@f)DP?O-zc_# z-@jK1PFgzc%Q-1^@TzF8ziMTtComNcOpXMivdPa0JIDK_eTu%rX*$Z#ca{NLt9zvM zX{`T0ZQmVWM^*hl_s%l28(6|BA(|+J&|9*7H}6tzLXr*HB&2O#edhRynhA z(YoyOe~t$;e^>a+{XO`%0RKCI&tN}cH^YqW{xEHKk9W2=$KC`A5vu#-zt?#8sJ`!* zj8;S_?~~uT&AVG3r^oNFyS@;izE6H{?{0<8B0_yDJL#|nYRRC)JEu> zJk7gZu6+|?oCD;1_;!WPBC-NNgrse{cbhyeg;y7mFMXRrXAv!=CLn?LetBTpc0HDS z>Gvyi?uk$YD1Ul9!@D(|{{j8a2mK*n@IJ&(hUfpCY>D@xcYpo*pM%5M-q!l=eDk#M z<#4vKweDzeSI(BS)*DS@mg$n#Mq`$c3jt<%xVz^!0JDUUfLR{qLN*+;oM$l0L)`@$ zg;_#e_!S)D;@11UY0UCq7mb*yOunxJeyD(19^`@&bF2Tkumip~z$_1RvFpSv;nT$Z zA9?UU)ceVQL-!t3{oFt+B0|BR{LWLn56NB)9`5~UAwtEU{NCP&6grCtC4cfew|F0v zoeK~XLd~E2-rfflI*SNJfATvwdmoTp>C*sJfAV{KA5iElB9#5f?;Ls$$hrFCUiEY# zLfxPI-rfTWokfJgKlz=fc=yX5E2db8Q28gnw|BonXAz^bR*=YY1BGmrL z@9o{E&{;$%{*&Li*}GTvrdSWE|K#`f?p5e4B9#Bh?;LvfNKDFY{SW#7UH%gOXPEsf zuqT0o-wzD?ku>Yi0DzN*aSLk;xoG@fH@1#;b7RZ4vDSBEgK+JA>xa|ztE}aiy77tQ zH($6tMJM!W+t&_fTUd!z`6zT^T-bIP@#%AScj81+icO4<*}HbQ*Tp0rbrdo&K5X~u z;T{az(n5T4I$UCW(9TnbyKPWFC5R>dL{wq|>e1Q1Zn(?ECnhDMfQgBL0h{P_A2RXa zlYs}bHg4Ux?c5X$)7V6Z3*Rto0@4Yr|Ld9mLDql%yN~xVwRXM1xJ88I|NPF=yhmYm zq3J3XBGdrL@9jMbtBA2BX{7*2RpKLZSs%{-STO)fSK$$b<oFfc)nUypPI#(^(Nz z1IX{~eN>@yPlR#+lq&Hfdj1EM0P_2JAJM%Y6amQZ#=Q^gUJvsB^ZR)p*1aA}{il2@ z56kNg(ZcfQi)ahAcAx1ztep25RPR>rA=$6nd!*Bik>( zxA#ef<p(Uw-Fi?-Q~kt$L8}m*3m_ghFQ#A>l8-bLc%T`;|%c3K25?@_T!aD|8kS zQvUKgw|O6z$6bM?2Xg-MdwU;O=qw^6{pELV^Zri`Y{VgaWc}s$_Wn z?EhJnW&XLX^~2ec*2X46kaz1uXi>uxA)U|z9JtU0t_xN&#~d8aR<_n14bHZpVQ14& z<$M>7SQ-8AfpYyh0#qqo^!lMn9TK3*V_e8aLzQp=JzjaVy8y8&Sh;QU*;~$-b?)jgX&i4DJ>a|slh{~sUfOZ~@_Kt;Rp=~Y$NbCdJk9%xTpJh~Kp}Sgzr5bwR}?yn*s=f# zN!xVq%W^qR0mqgGNXZw!tk7A+WENoHJt6nI2si+s_z=@sfKMoN?ui`>FmHN1!~2q* z|2ffn)bpS7pZ1^he+26PU-Uoee-!k9ZuhST<^K{WfA8?m@;5l;zav2NbEf|azXj%n zp6Ac-U-KXFZ%k1ByM&+1xA66R4PVOV^L{>u?>~w1->2B4?1M0G^gebKyMjgR(n*#7 zc7^Zq1@AB3@4TOR-}Sx%%72fBk&&EkW`~9mNY8;3Gdm=RjP@KmIEak)96Kn8Kzpu* zvjc+&r02jmAc*!d#{NMB!gKJ-enAAfb70I4B9NT}W8W~cs&i~s7+KXhwoe!t)j7`g z4kM#F7qHic5vb0AL^OL%7=i2@2uQP;VFbE!`n4Hh1j2LLdUY5X$>}CGJ&cUxbTiv4 zj6i!%pL$vl8Sy!`XApt-99;jEK?K@!V7wxTKza_0wjcuKIWYDJB2bY7V`>nA?i?7q z2NB55fzcWcTiH3bTR3cV=Q!In95%vpoJ|RbL3CQ5uq7P6+@7mB90v6{{aP3fgZ`X8 zYY+~D0-d&Y35P+04n*si9}a^GojxlMhe3x_LV2s}f!>1bKsbCl+UEz$s3x-cI#&3h+la2A4aQGx0 zk$b-mhflQDli~0Q*7{XAyiQwz_sej2NL!)zi*R_YeeLJr@EZHt&%)u=*7|8Uyh>Y5 z-jBoKmD+0deiRNLZ>=8&!z;{XLE&<_F+kyRnK3}&a?lu{aJkeNpm2GdF+kyRi7`Oo za=;j%aJg7VyQ67Gq53|9w}Xvxv$3zbW2# zWcP3J$xrA1eMh0Qh!3O|;Vs^`W&eG)^$;IGuK&NS&{@R$Q!m}@eM|P}*5i4%7h*d9 z?^_C;MNH=Zh2A$MCgryNKg#p(_6PXi`Fo-Me-ZS5)_8ySZuE|NnfibIFz#fBiie0K zPpo*x7gU`9%i@A|2u~bb8CCL3hzqkC*<$tvwhU_r+rGKu_S;S;saNzw+&ek89#zE-3;GZdU?ui{QIDeJ+ zQ<(pW9V0lepZ8PU>v3G*ylxzJ(Lt}rv4HdXc|Xy;9?Sowd@Dbe*LT|apV-oW2|tLL z-j9{@Ci8z=y&p-ryQNyibpG#;6grET%>Qlmekd_D*MI*fc%QWO|F1y(|7-qdVfWvM z{5$;{{rC7Iu=nrMohbh|@fZ1DVDHz@_;*1y>@)l^*!DMG`Ts<|f-i)@i;X--DeVPs84?A9>$|X5c4XUJ~fyAIi{q zY3<*i*8Y8I?cbZ${ym|t{XspQb%(n6*H%}ktAA~EhPwQR>WFo?`oG=P|8rgaKL_i7 z&W^zPze!^drv7iz7zEV+a3H`Sp!^2|FbJbNuQ3RtJFhVaqdU(4gRrGPU=X(S2MofN z{(wPP)p?CU7}a@SV-Qdw>azj{VO8ff24Pj_0fR{E|Cz4-pW*8NS7ZI(1jvJ}|C<1L z(DgqYanC@P|6sf_(A7T}uLyMU4@O&{Ykx5I2z2QW#?-X(-yJJ|jXXf*ug?X@1C;*S z0^|W|e{BKsprz>Ha|PrXWRya8%|IG4s7p!nAo;0;jyYYXrODF3wucmvk|fH#=>ze%GErv7j80A+ys zAFc{01C;+@0LlQ>KNx^AK=BX8?*m=?g8?W5l>T4<$^ex=7=SWB;SUC&3{dy$a{90=%C-@?TqkGMM_mNn;D9{%`Vr zX!HN0wf@&?(EqxFFJjNJ>p}nPdGBWLX!m!v6Jx{hR+p7DJniW;Y0sJN0*y+0ATA`o zTU^}wQfY_=lNo2YXvF5% z6grET%=~Zmek(h_U}r*OI`jXx3Y|qvX8woXZ{*xpV|7Dk{{Kdyvxv#e|2FT}a>DaAMi`p9jT#mn~YTy#Lw$}w*PKXP@<+<+B z(qP~cG7bPPU+=;<47h~nH-LlZxWM&hTN=1LyK&LrY_DrrG!0yCbI}?LT*BuFz~xyk zdINw<2-#tu|FzBkIz@ooAkAMjCgijL^15+o{R1ZCQ~>h&d4JKEkmdhFJ(c(F=>1t< zbC)45iP+NrNtn=|mGdU^|69FhLO`ywW@ecQZ$%Ee#C^o-8-{ii}_5tG@zZQk>8 zaoQQCvwfde=qzF~+qcboPA*D+lytW5a|)eB?AX3}?|oCff5@RjvAyCrzj?jAe<*Yo zv19(`b)M$^U9Ndl|3Ms5h_{kc@xLo{7V(+XRD8PktUT^P-CbE-h%F76^1OIfp|gm| zEa1TVo16vA2h9SE=`7&CDRl0MH>K}7@8fZX_t#Ya3-G`D{UQDwzl#q7{&zQ9343;L ze0luul;LzA8+icWfAwii>aWwCY$aR0>5dHvecEg#TVnxBTdqLrpY3QPqCb=OX>D9c zdM|USUmYp5jRt__r7ju~_?iT;G(olM)g>-y!vISYTdQ7O>|)mgSlagw;xHFsxJHP> zj4Lm-ILw9aw8T<)lsL?|uv#4E0vEPMahUNjvHza~|4YdHf5ud|9VinCo&V1~+1rM< zWHSGsc?z9HTm%3Azq0cwd=Sz3|Nm9!EaDpY|NoIae=+^&LQLoX|3{&-h-={g|6BH6 zgQJIZ{{O!fI*XXh|DWQ$B-@`b6;~mq^Z#E`=qzF~|G&lim+Uea98eGG{QrL`bQUq0 z|KIGrD7y~B+?LM&e^H^ch{^o_(0f5*Qf~3T6;}UyFa9{+0JGos!2I98ygR)WlLCGJ zf8daOmQHP4wTB5_&( zd7Y=RX1V$$yEP?oiU4`NS+hcCkyu>-0<<@sg>u;*_TijZVE{sv$U=qAA|dMn1T2sT zylBhvgscm|0)@^!iPHthT_v(zVE!+0iU4{2*e-zeCQb_=uN#NKrnhw`VOsy^^84hfn6&$vQok?^$g&-<=h8Izcr z+voo>&%ecA1^oY8_-dH{zm6^To`U@!%l^lsevuv*m2{MuWyo zl_mvL(t5M=EqqH56qlm5J%kPLT?T+dCMgOO@-=gMcS7 zMC)7~;X37p=s}pEfK)`dNV$=E5GFPt6;ZZOxlW`4-hbbzQMy365u;V()5?x^`~1&S z|L;q_x3;OiXUu%FNXX3pDQpkfHOEdzCuHV7+e4wVNXX3p7B*G(BK)3^ng496LT8bX zng7jfciDH9oe4?E%zw7KLT8bXng1bcm2;+Ay@Q0z{AaBSokc=s{q*GW zf3}-KXOWPZ|7~nnIq+A!G@1F&c2(#s5;F6@jZKk@7TAVsLT3K6DGHrM;+X$=pZ`-? zi^LS%{{7d~|4$qvICqlvYMm20E^uBq&R(T+LdOEm>&ITDb3)7irDW>UVgH}OWkh1> zzoeXSI_&>LZ!-V4mF*?F&chOe%>QM3DRdSIng83$rpeAlR*p6y^MBbih0Y?O^MBc% zvU{Uxf)$d3$d8#l6*`NA&i`evls!0bk&yYn?3D_gMMCHQvRBBy^wMPhFMEYTXOYaN z=KmpUllW-1`Tr7)|D6PUp7--(LI3Lp*#Gx;?;3B(BuV~GURoAqyV>eYd%7U)IXOyq zu`%j)x=CcPmT%m#`7Aq9*ahR{tD|fm8xc($)t(s>w7viMC|k>R5N+Q;3Q>-Y*tv&CFy;6R6^1DzT&`Z%Fy(}}fK6sQ z)f-E;fo!I}&J^z!;C*Pj;RXxvI6_A9?_HARcRMk&$ShzsL!om|;#k0W)8iTJ)#?1t zS`XB|^!)!lp#Sj?b`3oL|K&a4t=-AP{$*ZX7iAmT8g}c02RGdMvSn@c-TJz;07jH; zX{$RLob5o@O{_PXhAR(n(T<^I6E8DZ1)pQj$|zf{OiTinZ{M+HjMO#2UJw%C%514} z!{JKE2q6u~_A56Eu7tSoE7;e4()E6C8m`2x%8i06;fD%vC2mu0FkA`WTmJoj37P-L z4pE(tnVywM==?u+u>iq4WRPL2^#|AR_bs*g*=NMMCHQu>)m) ziV2bVf9ybo&LW}n|JVVtAIDJ=GXIYqpwL+)Wd7e2w!iGhA)JKF|6}_rbQTGj|JTCy zlb!n_^g!nSvHcV}i-gSoYi6@$yB_=<_&^~c^Z(dvh0Y>bK(GJzl|9dzpSZ>UhCKh% ze$gNBTR_RA}k@j~MGLAi6rc7@K}iDd~v&Y1VW)7jkquEg?# zAX&`o#^!!eBxGJtz~;z(--_>(%nM?36gu}Lju(_aOFTmN{~aSJuOB-?W4(?Gl-G^3 z!!_3HSU`FG*x?%MwfrAS?tYlO_6MfO6N#n&5Xy#`>@elL$^4&IcBniCrydhB|A!r_ z&{-s8{!c4AMB<~_;(rT0|5kq)sQGC9|L54PY@zoL?>cYc*gxx?{nP3Qmo_#k>FG8} z4{mB~aMIJQs5cm<)J3rV`#-_^_+nQ#2!~NO* ztNh*l{Q6%7-oX#%`|!PZE9go8i~Wr~#eT-V!=7M@eH7G2wf@&TSi&x6JJ>dMI&2?X z!4|P2StmP~?alUNQ<&BN`jz(s?`z)Y;JD^LL1d(-St*E&^fW7mkQ7xBMxZ~Xm9O6r zMj$|?t;>SQC{VFWgUBdQu}gx;C{VGBgUBdQv5SJpC{VErgUBdQu?vC-6sSPSYDW+m z>1lR;7#aO3&dv)Xt3SoIhmqBvV&{gD(Vq&~>%++CPlfE9Ff#g60XsX4jQ&)}UKd72 ze=20#!pP`PH?gf@Wb~(-*_mNv^rxHImLM_`RP2l(G7?m5a}XH`Dz+(zj06?i7(_;b zik%)rMtYi^7DS*x1*hH+L?A!~#;IXs^{3eSFtYkn?36IF`cv%WFf#g60Xr#-jQ&)} zP7EWXKNYYO!pP`Pg=}3IE!3Z8$cDn`SZy`2HDR>Ce!{E6Xuh>p1(7tDT^U5j7~}XL zI@%a3g6Jq?EDxe1jj=3y@PFzU0`Kp6E}YjGI$Xe(fg z!l+wYAzK(mUG}wO!>H4~wjhi;tTjK3+O^fhjtQf=+G=J;htV8s9Th}Jn9Cj+M28zg z1kqu}C= zyFP+YIGF&<`V=~ggiHW#X1%iKhX{U<3BasZp|eQH1mKYM$gU?53MUhQS&u?zk&p?% zZLC`k+=!#yWCAejR_H7eG6A@ab;*U>arkLVTD#`1BfAtji-b%7ZeyK}?46Jaz^pSR zdv_;}0GziLoyt0v+58{&e?H`&%wOPlqW<>=whQooYT5s}I>Kd*btOS#vbIi0g0cmT z4Niif)&L$!wx_XS4GT!#p(&89Y^)Dl*2f%-M1!Dehz4gXG%T8KSj={G1}RM8-=v`lEc^kQfWjZXM1Urs?gs;)30w99 zG-1nrfF^9&572}y`vID;Wj{a@w(JLJ0?K|6$=1*W)cx85Xu=f!zJ?~S@CRrD3x9wn zOySQpG+_#VuAvE2_;U?Sn8Lq_0U%)t|0V{21Qh;oL;xh9?gs+^2`Kx)06@Z4{QyYV zsviIeTlE7VVXJ-sBy80WfCNV7Z)hIoxJ3O4^=ujhZ(z&^hZLGO>V zhXH}(-iN*QSoPQVKSNQ?>sxoqFoSUu$bi!It@Sd@G-qpdglk(H)xGF3-3#2-+TiX* zkLg}4b_rme-3xgCeJ4hXFdS>?qaosxj#{I3E1a}_Wwg+pl$f@U>Rl|~=t8#lFOQCO zA@`%5HXF0f;`OeK7PxrCBaZ4@j6P!bifBHDY-u@wcEnL5*4Y`MXCZCCM)WMkR@VI% z|I0o9Tcor7k5la*GK>~cB(we7*b=!^=cKEiE)?l(|0N2YMUl+*Z({>;$s>0Dw@7FE z4=8jNMKasJjV+do5dJID+5U?aI*X!X`{#wSrm{tHXp3b56&>e4uQywy&{-56^FOci zG`3I<9d9wXqT~PP^=1ndI*X!J0U#7@)7i0d>6h_mwo6*o=Dzf?3Y|rftO5|Q1@b^6 zKyXx{=#wwKK%sL_(WwCBEstlg`F8$y4=)G*x419)aI4h(%?3#p#aU_1pZ7zZ!dA+j zH`(f_Naz2qROl>W>f0rwC7DY1ucM4l3`xfC%htB_9rqEdw$^73IHYn$s@xLX7BAx#`sL)vy z$^74Dwp4anete-w=l?EM=q!q4{%^>RllV}!`Tuecs{LiK%Nz7RpeuMETL$&^&E9fi z;(vUUu5D~-A&!-}%xCFE=WemnFTIeQpAg}yMo4{#$oypE8ZN2o>|Yt-#zu%tJnNWY zjVvT|DY6}n4enAvO#xksRW4N}eij4Ux1GCn*7l1ooOR~*9kb5ZvF+TmFR&jnr0LKJ zSm^@ShbZe~4o1f}E*hL|MZ==$F2!;et+8DS_#B~2vCKs$))JG^Dj+0uDF$80hIc8T z`osLc4*jp9Qvt~PXlEy>HFw#W%c9c)$m=|foha8$F|2|@(J2Dt^=2n3bQVRc3qZ;e zPmqJ3uw=xd6$YSm6;4p-EQ(}ZfPk%&vmeK7h^`B;PN8#8(dh!@&k~1V{ zA>He7S^#<7I9m(7o}yC$$m_?}La(Q2`Tvw}WsSW4U^|>rJb;>`&SYzp^Ct8ETiI&a zZ}~BW;(p}hdbL7lQ6%&KTiGg!skwdrL;wGN{}e#<@8j!Xmi<0Rf1bgxl5|1yuGLpb~ei zHyEgd?+wPRvpwr|0+sOofd-fERcF-E-ARDT(RpS^`>H5gtxg=>9feemj@jP7BFYx5 z6LG*4svHxrcU6?_SSKEG6jnJVX1B%v^3?xy=Kn_3ZLvF1l+=6c6n45(M=sKt|ED{3 zZ)5A_;2^?pbmsqhh0dZ#X8yOaQ{XHc&weY zEYg|(Co6OoMaTTln+8v1CrM1f?eqU+&wsza)(`lj{4{v}-_KTg|Ml+kPA1m>WB&CO zQMRV7=G)&nSYG$R({xpoZECCM_BSeK_wiA>udN=$VpPP=6C>Qw2Dk#Toi-7%7=5qq z>|Yh(wq*!SOsz&i7Gq)pW|1veZZKv6=>=dG*`DQwVHS{E04|WNT&@qZ(8nB%HoK&? z?r3nfY`b#3(KKeU(VeZam<4=}J@)xu+x(wX1jt>aZPPWO(*nrr#@SiACUhzQdHvW~ zx+b*ze@acbRbK01-@?-W2_V5twpBTAGXKAoohj$0tp_^)|4fC>qDbcdx3Vp=<282r zzDVc)Z&BzhiZ$^6&yXE2BBn#<|DU1ISrlvF|8JIa(@QTR7vY-~I*Vcr{Qphq5MH5p zEcw!#9IK{S1OI=c#MIpW{pauhJ7Ry{T!Wpj`b|@Jy(p6T{cY?#xitNIp!56BQ|K&; zj^Cg6+-+>T99V-@fTQ{6^=8`@I*THi?cc`Em5c3XRw&Zh{^u%m7DdPQ&wK8v?DcZp zA(nYmbe#XZ-t6@Xokh_x|MNOeW9P`#sO3;}{Qtb(>>P#8qG(kB2siEN>}+}58}J5X zWdJD8i?bCviy~PCAYiYP`{EYRB3%XGbqbw(icSR}@8fX>+m`Bo!T#_2{gt5qbq8Mw z^MCh({?~KfwH|5z_h6K*Xsa*l={rJaJ?VzFM(g!Mbm-J%3)+a8^kkhH2nir%ww$fu zASIMP08(cA)f>ep(Phz}08-*+^+th|eFmh&ed-McDdBqqkTTn;UMENi z?;k+QbccFlK+3GN)F5THMx9syj{zyOm}&nn5B^6d{$8e})i)8v8i>D_%68QMFVcy> zmnw7?#Ttmem&pE`u+K*){$8TcSrls^{$4EmjPU2`LXl4Vy;z~MDAqvyy~xQ?7wN>` zi<}&FkxcxZ!Y-6^@3spUi*(}eg$kWTkxcw;VHe1b@0dq_p-3nGUZBuf6v@QjX0}6i zr&-=+a{j+Vp|dD%qJrxoJ6~c_Zt*|Z|MQT4hQBMnpP$J7t@rNwy{XeI~43P>( zT~RklgJ%9kTQ9ocLOZ3>55weZV$b0q#1(a;?tWvVw!;`uwwsNZ38YP$aUpxxMA?Ei z;z38XX~sqEUKORQmRqReGH$kNTui_!alvw9u*&SYqOnR`v|J}vIVvV#mDz6P24j_w zWdK&0typdtRtYHv;DOn;<$5z?ja6oAmg|nzW$XVs=6_0#1)RH78&+#xXGWey$#H@6 zI!|M7l|$zsOywBCdA-?N6*`NeeE`OmzP58x%T=BANf&$}W?bn%lqs9Ql8V z&itvWt_>!Q79}$CX9}yx?xp4~Q7F-wKNW?}qC{r?w6L=5Ml`5IXa1BGI*SsS`P0lw zvi&KW376>1pOQjnQ6e*cLROS>e`0T}B|7t`sL)xI$jqNMmdJr8?TxiWXZ|D#okfYv z{ApvcT)3MRTqx~APQqh_&Z0zS{%p@>DOJ_I9uCTceJj-I9t?MZ#2Lw z<8)7Bqwz|peR@{L*p-PAgzk+nVdcAlh zMC)7~<68Ab;g#@1?K>&_iyz7Pw-T#|M3(5+x`>2@;?gwfcN{?`tR@){|%u3d8WS}^Z}Oo^ZkC% z|2WWpt-q%~1@0Hm@u&H(_z(Ek_-FZJpdN51CCgz8^(SI`k&urUjhA($3SQNZgvy9ijAwo&_L2Mzb`t;0`;PYn9M}CPjEw|E$bJ>ZMuH+_zYJp|LD9s19>zw3qM7|HjEw|E zGy7=}g9HU=Ap9hVL4g8{9|tiAP=N8HAh!AwKMZ24Kk3eG+e#zul7V2_8fk)R0K z$HUl2Pz3D%!q`YqgzT{}HWCye`&bwo35q86NEjOlie~oFFg6kt&FmvV3=$M@*bfJ> zRiJn{h^+#}LqTj6C>{*rndaa5P!P{B#s`D=)yDWh5WmV84}|e_d)E8IcrR<+7sk`9 zb#EB&sjYzB6UML9R>dY>%CzNziNHztHapSR;ZlQMUPiP4hn`#|X|{q+JO$VaaiU z^SW{NE~p7hjs=|8kG%_O!jk3xQfk6?%4>Hwz^o`)`Y)*_e5Z2WWd3g}dxz{g+fKrk z==|SzD0CJjGXJ-gy>X`_b@iN2|G_WVdHEUW1UIOJVc5(ejOUl(UP7>Q8vs9wZ`!0r8O;#a!tj@Ua$+Yu9^_O6Rx;i3|cJE|iw zF>v?VxD5lhv~Lz0 z@3jh@MTyMzZDZHSfk({A3ne<+_Zo%HqC{r+b67NrBJc-VCI9(mmT zhyor!MgiZW&{>qoEZ~5>TkfZ!&)dFVDA8HK?^fvCQ<|N=>%8gl40dHY{|Efv`}|Y= zUHI*M6?+!+I8R_L-iK=9|E`Z`yE|2bZ-n#AjWAo+*svQRJkkLUoaN449~`KUIT&Xv z8|#h+XUmqW*BebkmFaHvMnjeGIRaFfEmv;-9pF5DlP8+_T;&s1kmt`S*X8=9BM>x2mIUX(dWE@PBWSU1?!P=l|ZK&{>pf z;Q!t%J8&?oMCbqBtk7AMYT*Cg1-7l*s(w zDeOksZCbrY6-spe?~MwbMTyM+ZDBXaUL3eA(fPkOD0CJjGXJ-kT`&7g`@gGDqVs>R zSLiHCWd3i+u9KLQ>-s+z{(ma)gRTB|yMK_s_oVp$gZyr8^}iE-Ip4w0ngsvfg}nqB zhSvZ70sA`pJo`9%XafF!5?jfv{`cW*KQ@Ey0b594+8O?DP=BBO3sHZcy@;qkXD=Y? z&)GjijrwaW_W4l5{@Qvj)VRO4{t;^6Un8r33pMhut-q$w|6fw*|IaD(|4g8ve}J|B z6lmlhjHd$){DbkwK;!;k{2|b=KN!D9)Zb@MA?ok5-y!Pnv)>}>&)IJf_2=x@i28H( zWT;VpeM0DN7~yHIyBmP}>k~px1Au>RK~KXX|IpL0$UpQnEbfTRGywMp19}<&`-1^J4HTY+o`ymFecjVAsK2j!8V2>}x~E}Kf3ABP2KDEWLV%IIvD``!^xnN z0k}UH(8&PU9}MVZ7}Vd_oeYEe`?`~1P=8-{G7Rd^btl81{#EyC&QrrTz4`I z>d$p215kf`Lg-%r?5{28Us&89`WF`WhyI1d{h@zhaewGvSll1_7Z&%2{srLva75@| z0PGJ2^e+tR?=$FM7}Vcq(7!OKzt8SP)SpBD!lM2h`WF`U=j<*-{W-f6QGd?vK-9kp zx)vJs*Jr&oh5c_yVgH*`*#D*!_J3ar``?(Z&bz_l|MkrOITmp4QtckK&QA7=lH&sB zb)LrVmg_>S5*;HruQ$6}p|dDiUN8aLpU&=*OP|1zBufmYbQSJW=qyTPUU0zfl(P*C za!8>>=LO%X(7C7Nc)|Ir#5-XAujClPdHvWOy4T~lz@c-V3STt?d1>`!Gzn==|UJD|8m61@uebDls*;`2VpQ z{~rMS{{}t)-T5oo0`IrpmEN(V@&BFLgK@g0wazN1quo?FxS+K`RSpEz0~xrPwXwYm zh^>1U*@D*kdKdcr_pOf)K^%g$97BWDC+S@rzxl%LY3D+pwta1Uu!A{>i2bO}#kjET z{j1`GTv#GCE$v&3kJ-C6KG4M^9(7dLVtm-{)$suswxxxL|GS>W_@JGq#{1i#(6Jz* zUK2YO6FMTD{p;fWTzn!zF{)`XF)-?X!T!%r`$d1ipTfVw-w8W=_GI5<*RfOB-rg^~ z+q^Aq|7TZeV|t6tyJe6)_>?G-ng3JRhh(4Tpp+sl?e@LOTD3O`}E$oAG?rk`Z zN@xCmP@%IZk(vL^>;tl^U0)lT@O0+?2NXJs5}ElQvIk^4N{^N3%>M@zI*SsS`QOIw zmy7Q_Q~#$>qBH;RSLiHCWafVxyH75fVVVCWI`jWNh0dZxX8yOad*zZCe`a*%|Gf&G zMaeP$^Cm7+**y|daQpl}#`Eun=l|bfch?e_&%2+k@&4|;&pT$P&;0cNI3>o#jBwvO ziuSacc;6d$SMBUy8{>{fh)(Q=kGkuP4-388Y%?SAW<6Omb<~8WPBx%dn=NQ;REt7C zyP*xx?H-7AwE@gA2ji~BMT4_-HY}QMQFORy#3X27$M(%zc5K^n!K{tvo-yl!?XTZ5 zTJKzcj?kiLchT!_QRtA+qL}MKHo8Rt7tk$=Iqm|)1Yl>=)H-gjt^eomZ2$NEu>bo* z-lg9B^bdZ*|8|$0FhK5F?PIz$bdmsh-8g$xmxfLZAg>>LRF{TU27pqqKO(RFsG;JB zl2rj9UC;YXKdtpO-th*~U z{I=I&ZhH&d1sZkRgSgO{O?R}_i&;Q4=*;4RwnkwV9R{<&Md}U4EIJHkk?m8j6SIK# z-*;-9?oVgb>UR>%V#W50vvJD~IBxq;oUKu({tC8VvSr7tO~9&|H9l^8|LQnfs7{0e zQq*EX(B7dq+pA7I>?qh`Lfq~(ak^o>g_;aI++sph-2a_>{;$l)H^)z@-UUWhT9nCb z|2C%NaVuaXY~TZh5}oa@6grC%neE@kJ}C$ENZ41tS}4)k{-0FnEJ|dye;fORTx`l= zsE6rn|4%4%7A42_&-*Bw${v?PKQImPLdkLd^Ln$#6*`NOWB%uLp2j{d*F1yYwd4Qi z^=2Pe=qyTB1%QyPO=tfnm-gWho|OThB#Qs1&{>qoDgXg{Ozyk46`Ly2RRA7S=-g9s zDgb%&;u-8?g#CYII{*Jm>PVf#4tzkAYvBKXQTE_CN}108|Dr-?QLcgi{{=Y*MMukY z{{I&gI*W1*{Qu9(UYz_b)A|3OSLiItHSqsGCwt5K`&v>c)A|3OQ|K(pWd8pY_E~8_ z&+~3ClBhF&vz`f2JJ-j!sSSWdBEB>cwj7^Sbplv}TiYN!v2!&Fx110cfXi&5 zdV_&Ws5k()%=W4`47h~+9l*hC#d>|fr9S3hJm6}=x}(9_7B?)K1}+!5Xv81Z%K(?~ zIRbFG&_!weHPU7pUyGzq?W|@0np=^o4lq~V<3Y|rn%nJ_K*W8xqGMyLvHMb?Y?0CWXv&65$ z{7>02g7f;ZuL8(hc3j}RZk&AuK;E)r0q6B&UjdM}Z27;GZ{^GKx|{6$PubFc2|tLL z?90k|lli}`>)B;Ez|kGPbhR2WitP_m3>KKYHpwZLi2yt@MnSlv&8U!mU~Zo z*LmW9Jn%j5lsMhTMt+FC%)PGD-0QN9Yz?^AK}cxQWDD6Ej#fgl0?++yK^rj%+G&#p z;=&Uz-K$(LS_#nrt;C(mjY2Cs4O)rolpBmz!uJLfR@q+VI?+ma|A1Dedz2f2R*p|D zHCmaiQ>Ok3GPH7hT#Z&{i`p|dEHnZGUU`*M!HFY9uY&iwtpLT6DXGk=@e_hkEvb{wTlXa0Uqp|dEHnZF_X zuI#jOjfFCu`TJdk&Z10a{Eoc%&)h>jDO*N^=|XNZ;!NXZa? zF0cErp=pV-B?FQ&#GfnYO=bhOvY*NRyR8~%na&3MnL=k#CbI!s*-z!sKeMoOna&3M zsX}K_u7M5slMD@{vjKmSqJiCI#|F&X5N}~W-m9zZXn=X$*pL4p$~Ex+ek40mn3>N1 z`;kItQLcgi_d|(~W}E-7wEF*h@yCI&7r@JD zt?G>cEXQYo8nDC->vaK^6XF73nJrdtFklHq2LP7Ye)Wa{mQZm3D44BUuMc9>#~h5a z9qV;RgR^B@)$5JcG0#5#^Y{PhY`@>Dev5L5GMVky#-5VLz0y2=3uQXn?nGo-Wqeyh+~lpWhIe`fd_IrMMyeHF@% z^Ox6~{YIg)C_Cm~Ugv4-*K+6-eAkZum)D#9TA{NjFQ%sA)7g`9Spmx~O9P~2h)*hX z7G*LEFkruuvvmEj>ght6&I0_ELg${cV*%z(h-a{0+W!9u-X}f(Isa+@SN;$Dulb+# z{|~kS-Q(ZlUjzETMgNWd4*x8F1MvTs`qJ<95BF#Lukv>XwV;;(G5iDnCFuWtoqwKx z9Mr?_<~M=zpEd=JPjUSfY^Pl5jLci0n5v5x}V z;QhcgdKW9RH?xaC|93Mx8TkK;*^#Uh^ndqed$K9agMQ@G-jm*syl;A6gyW|F2@;^6 zw{U(`kO2D}j3a}@NX~K*Bt~+U7lOn{&hmL-0?c#ZrStwU0qVK7`oaXb=i2HG6Cj_1 z9xLw&6JVc%9xLw-6QesD@UAd1y0ang3=^X}8}g1YF%0x3J~vDZ1HGBg2@}IWZ{|k? z2{6#%M280n5YWLmEJ%QV4#uHD0`zk*4ha%qpM!C5kQm8Xeo&AY$yt72kQnMYKOjti zdah5nf0zLGTwD8v36RgVH9JgzeXdWvZB?;R$FfgbYL zhKXUIH}RQaVi@Snd`1`>-PvaT>L3Q)Svb+Ff*53H!I&PzpgIf2UO^0^vtUdMV$hrg zW6vN4@;Ml<3}PcW%U==1Msk+7g)vCZ>J#n}#-KT?t*K!QqO;oCJ&Z4~Cu|Ml9oh={ zZee`BeQnn;KF_{3C5*RQt0j!j)m9S^!}#^uYUV*0pJT0Eg7|E6kftDhoiY3%-ewFQ z#Ag|U1@Ts6ctL!oHrRiIc#ARq6U1j2ea&1FGh;sj%W!o)gb zfWpL(F+gErtua7hVvR9CVPds0Kw)B)F+gErrH;t8!o=~`0)>ec)&hlz<=P6g!o)Id zg<4@^(7yJh&HtBs{;e?o`y9WOuVMd!`QHKW_udWO^7PLv=l>4I*`CHaQWKN&cS53* zZDy=Dn(oY|iy0f*tuSZRo!M+PW4+x98xpz|XS?#GvE2%+sfOa$xeHKn>TR3P29Fzccx8CnfcPq|v(TJ$`iY;5tfKzVW2wWf((YHS>;Dc{=fVFS@i%u$_E$CMDl^O`$~EwR|04S~ z+U+Q1I{)`C3Y|r{2LA7#GZ3E6|NV0Y!q>q6eMa{0W`~Z;bpG!%3Y|r{2LA7#WFHP4 zm+Ac9KPhw;WitPF3VT}i^jQ7xGM)eXv_fZ5Ci8z=*dJww{=8wzyG-Z*{!yW`D3kfW z&Fl|y?i`r6gxU5oo&Wm>h0dZ(=KqH5_Y#Y8`}~Lg|3m&s{6&5n@PGcyt^xgzKX@ZA z)Bj%;AVk1)pe>tiVWd9pvbOB_xVkNy?PDZ9pi&aa zgrGno$(E@T4?7B*oDdhrDbuy;wU1Lyh}wBdjO)|^KCGJsKJF2vS>U)?9irFH0v{h1 zu*qzndLyw(n_>VqnXOfC3^r-=3rLHz4eRx$SDo1ZuV?|5C_55x zUgv4-pK|RZIHvBXzwY`>tEr zUnQpIx%2-DnfV7hrqU&x6*BX03iq;fl+66&UY3rMnSU+pzp^JC!l5(&{;SYgl*!D$ zX7(T1wI7Zi(V2h$QRpnnWaeMU{w@2`cTH#h{ac~4D3h6gZR{mEU@OH!na=!sNujeS zlbL^Q>|b)=e4PKGGyndj&{>qp%)d7FqFg)|A18F?--`;JMcFa`^8Wo#WiLp41l#<7 zt>@ov_&@i+{O>;?|341;{||U;bK-vE{0I8(lPFF*rF|X=kf1cR?G8R>JpY^#4!v9@YK7Kl#7*f9!wD z{}Sx~e8m3%+!3z#-{qIa^#4Zh|J>E*{Ga?8{%e>S{KlyM-_`tWJmzoU=Y#(DX?z`D z#uxB@K8NqmXSn{~@7XWd_u1Fj=Rp7aVRkROg}s-(jYaHIb}l;u`+rBVZgv=(&0Y=q z-=X&(P$c^Us1bh8`-=Bz@6k{<{&X+t)KGW+w6#9etv_v@66)TcwoVRp^G{nRVfU|z zufy(N6CVn6_YWFaYXjZ<17l5~dw*c84s`1ej8%c|{DHAD(2YMZjt_L-4~!LoZu^0; z9J_u#Ul!`FALBkB40YR2TT4UT_tR%MF4T=bZ7m6P=TBP$p>F+YYjLQ1f7)6U>gJ#B zb}hi}UlX4n=nF%>GxUVI@29QqP&fXx)fMW_pSC(f-TKp3N2q&$ z`mA$8-Tc$m5rOXh!Nm>_bn_34!vfv=1LM#@xBkF5B+#8dFb)oM;}4930^RomzctY<_ThQ?|%|G4ogytVy6*`{K`vU_yp3wRO13I42`2zzwp3wLM13I42_X7hu zp3wFK13I3j>*wo^r|J6ny5niOe!lK_nyw$`(D8(>pFRzAJfZEUE$Dbc-%nf6@r1^o zwxHt)oj-j-=yO8rPg~IEG`&9#eNNN+1o##^8!tT-)z+-|%XYQlO-^v3ik=O?COFZL@O-PZpGM$y{nTcE+X-mqgoYXgLbb>S}=6{zzB5`y70tl@==-(6XJHSPXhPxHn>fpi(vcw&prQJA+!B? zo9cbSBCHiM+rN$PAqSc*1ExY|`|~{%I*SUK?cc_y%7Me|U}lBP_UBU-I*SUK?cc_C zmjiz{lM{ssneESaSLiG%j_sct8RD&S&8zSOcbxyc-n>kmokhi}01%S4>3ml?_`Hz;C{(Nr03~1CRiU$}kW~NzK1J^PR@()rkW~Qq z6ot+`6{iA_H$9%gTSo2we8@kUzrgQA{qGHI7w^uR_J6KUa9JbVW{FIlQTM?y_wG)( z31$l#8+;RljH7p5lI>}17+?vHZ~z6fm5ud*OZu3DNw$H#?r3nfZ0CBt(KKM0u3T^Q zcqM#}09a=G)`{uB^6fjejGt13kR2P6Y}0zf0ZYgYAtA_?t~Uy>gt+i4NO!K+B?e&< z;&#;k%rXC0A@l$FtJRT9@ySo;|MOSLu4Q&Gt3u}g^H(W!78N@GpHG)vPueD2h0Oow z(-k_43Z4JY_mb`U>3i^Vg$kMf&-YU3EGl&VKc6Q1AGTDh3Yq`Urzvz66*B*S3g1)q z-)TkoDhHA4|2-8ti^_r2BD{saQg&T~Pku80pTAO}v#9J(y>v5wh3x$yLJwsAKYxWn zXHl6=y>!UiBqrrH|F2{Ir{Z}3xl^@$)zDg#-HM81|L1j{#%IYjUHHd&4EeV*OQEx< zSS0{bmbi~xntowc3V@O&?xWCIRLDvI0pDBBe%#XXDr6-9zPCc>o{Ccf$e$&?7Uq8{ zP6HsXAAhaJdL8>ew;O+r#(Ev^Keyj&G}dbw|CDcKro8S#^EW6emiJHiLCoYcmGdU^ z|6BPC*{Ky4_I|WbA@l$F42903LgxRs@>ffIG+X>{weJ6~0zTipe2D#%-NTl9|Mc$l zR*!4!=laK?$2w-&)l zX1myRBA4*~0lC~4!!-iAoPXYqZRc3z63z<9c5G$cZ=e5p@_#b(pC6)n zUSseaQ6V$`r|^Si@0E5it3qb}^Me&Siwc?f-@*@)J*a(CAv6E^K?HQQsi^@W365hsV%OxeOdX6PudbUDmQCUE}^i;mD#1z~< z|Cf6H&Hgf&<++8g2Db8jY#HqTxxrhS>w%B|(uySA+1Ao>0PQX{s%3+kKRxh>J}JR9 zZH>6?jk%?E_ODKGUt3)$<=CKrQf52a8jMmxb^$15wr9CvC?!0u0SU}jF4uSGQj z*{{sMpP{QmsAtZRnD8t|83=S zWM>LJlKH=UjzVWqA@hG*`4O_+pfZ;iDrEjIKSH6isL=Vp{BYT8Ft{m&3Yq`Q4_D|c zDs=uYKTLM(Chs4Mg$kMf%MVlNEGl&VFF({#k1J&UFF({#k1KTkFF!Az!*np|hxvS%3lWl(S8dd`O|PnSAL^h0Z;d zO~x7Cb>7G04BnCU|A+McpHuxQ{Db^-$p1gcHnJA)Zf}T^|Bw22S0>rM#s(xpJth&# zRy8&}5rS$1+O;*WZQLop1mZ$EoUU!G7q-+j(dq>Etv71mvd6%dxMsb<1DEi<0c@G= zTCWqfg!kWfVv_DwXDxlSB6HG#OIL1ow69FE?drrI?I_T4`9>GAy?=R`Xi1Wd1KdN};o;komt; z_>pq%+4x-~h0dZv=Kr>EA$#nQN})pL|8k+wSyagU-)3HrbC#LRxKJVUe|bTn zv#5~yzagI|F)6qB-+Iq~Kj?b~{83=+d9eR)4P(InT|erXUW2(J8F1hQ5fMype@ibq zcZ=;S!MsxMswCUhMw~4ib^jX^v-|iY-PqRBLToEJ*m6w7&Jz;c(gxTf5vQB1UE}Wm zo&775V_hSNc-Aqqm03u@EEl-%sKJ;eq!xf#W_#9&pT)rTZRc*Cwf&+CXPvoy$E-7U zY&-Yt3+zt;@(REOvz6=h;ez^@gGsh)z3ymmwrsn4z0ovgnJ!mvG-e5(V~_s(Kf!z4 z^Pl&h@qYvS-*5U~@E`Xd2L0cg{j2>e{9*qR|6G5IzusR1`oEU{dw@UFZ}UU`Z_xk! zJ^wlXF8?zB6x=&L2=l}51O4ACc*HN`+hLdJDSQ!8uDwy1gNK4{PvnK0q&`mmVIxS0Qpo~SBD9(Pc@bDJz-*m zXPf!E!vy%JT2S`NAh870cLj+hpuRImKz0_$lK6TrS;Ml4E2=rQkWR(X~2tN0@PD|t|Ux=d#X z7~$EF4~K~no^9f92@@kc+sxk_CPsL+nZGGWECcn8K>`d^ILPHe0t8er-Vh|fKLz8m zAOZR*7?%bKuus9bBuIdK3dY4j0^CzDE(#N*o?aLxhI-2R1z}>Sr=0Hy6QG{z6P_O? zz&+I`JTFXue5zmD9wxv()vui!CPsKR2yD@+;K37NNnlL`cT0j^-!dgHW zKU`aZCX64Ztxyxj54EoWVf+yL8W6@0wiXb^57Jf>KQ>Gb)K;^mjvrvH`9ZS3xhzn} z_cI1i$7dVkXq*4nG5=R}Ea2Qw&2ehzjTRBCIxcWt=V^S294gug*{Wj%=k?}G6grEl zWu;@dksK|`_vl@P{Q{H0A;pQy-t7<-anAn(;e!J zI;%GcKsmaw>}X$=WNXxk?m7x(<+_$yF#I}sFIn# zAzv=r|7k}Lt90h?a)r*KN@o7H@nv%9u+@66(wV=@6grD4nfcqs2j${E%m1m;nZJVy zokf+*{B7e)<-*;~*khqeXZ|i#=q##^`I|R!naYoon1b8YUKA0CW4DsB=Qg|D)uDC&+6)YW07rmi|X55@zxfl=CL@|62JvId2y`j#8!b z|JEsV7F9C;uaytUW9+zgp-Sif4JmXM)f)JJYi0j$ZRfvA=l`u$=q#!=@c-7xcI^CD z4`nem_5v z{Tt?gPhf%fkhjjlZ1n#=DM=SIHYN)?2NCN&AeXF4vfYgJWIj8>|d3f;6f8CtWm9s zF)^W6vF`s@uL7zJ=v554@D1x#K#2kUfVD1gy_K=EUIJ{aKKNN2OzV%N@oF|tkAiq>R7;e z)8iTZq;&pogXcf!5BVN!@H`p%b9b^O-izM--Uj-Uf2_w~k}Yqm@6Oj}y0qEWwz{Li zT{+v+R&O+oS8j24XhaW0{fVfV*!FVNnZ-7^3E7j}7E8+c**8kS~ ze}CwI1N#4;@IM0mfZHa~|JM6|kMQ@0{{Jid7PwzLKZ*Xg-v2wyFNOa9nfz3~mJd#% z|E>4`+W!Az>_K)nyLl4*Z@vHb5H^cVXS;(M*-PHD-WdIF)Svz&4gqlf2^<38{Baxt zXyT9I5I__ESfGahpyB*zpl1NUcqGsx0APGH&=UY)d?XzJ_;5M^@NhZ+@K8Dc@L;G1 z0JK*2heAC8psf#vdIUgQ9|-jffNtzQ;D!M1cS8X8xgmgiaR`9(dvFM#iQkDs08RXk zKo0@Hfo>1<3;-Cn1$qPkjQ0n60sxF#13dr$#w}_8|K_y+e^c83e_yEk|N2}vhI#-% zTQ`Jy0zg~Whk67+pB2U@P=6Z6CvXS=#wTzH0LCY92mr<>%n(469-1&i08M&m!YWY1 z(1cZ>hM@_oKn+6^MuA!nO~3#EoE3&9p#KjB3{BYfKMYOS_CE|wK>J^x3x+13|F10= znt%ZSZNbn4OaSP!!q5ba0B8$_CSV3YTQD?%LjW)|fkOZ=G+~ASn)IlI83Jh1qY^L# z0GEeR377!@14boa1ON;em4FEVFkn;y1^~c-Q3>e(g8`!w(EbMlMkQ?bA4Vmh`>)Rh zqY}{m*A|RQK>uG`Fe(890Qy`oDghG!+JaFD7y-~0j7q=^fVN;%0*3%#RKg4aH0c2e zGX&722P9w!0ImuH5-{Qt9L-&t0OvP$Rw zpQX@QRBPb>ZHrxDJHshqSIPYU7QR^mSfM}hLY2<{->lGCRLT7RX1+=G+=K<@ zvE+BXNujf-E})jxA>SymD7X0EQJ#O7zl8stUuX7z-pCevPkGmQM~%(qC;Zb%32tU= zaGuj|@|rdyW$A#=&lVm&9i3c5pOOA`$y(&p}tG7@!U)>D#xR`)V;zo6tqHX{- znZceKo5aoP5SsY8j=?5J#RP0JTc+ONIci<{u1m6=>J7stp`1Ycub%lorvi{0sySZ` zU5)*<)2X+vY5Y97=1D74S#^p4xi5X5LT6F6x&S1UXuCY_2{X}9s9IqF3QDwHp|hxx zbpZl?uAF@W0#tNefO8c(_f(xOKz@|y^?Lr#DFWp6_<{vVn7KZRc^J5IuhS32|mQiaZefng16lbQV=I^S_N>D35!sRe7jxC1=7H zDs&cAGV{NUUmzDc&Z0_Y{L%(#bSghz;v?AR z|EoOzKH&fF!f)rR*t5XLIRW_pAF4_Je|?heX>4#J)Nc}@Y+Yl+5+O+8p&gKIZmh2z zppQA2WGfr%js|CYg9EASjiy@_m$_(-ZB@YM2(5}sU36k{Jz1*)LPD$J5*M=JtqLd( zVYK>UcY#K=Dj+WW3NCVS>;2wztKvczts$)n_@Ns7e-E#w`M(jT2#`BT8-|>4#7l2i zx!w3%bx!D10CM}iRp*43|4+#Y-y*O5vUwVbs-^#va>BPL=S}ASxAHg3`9Ct+V}&Z6 z|Nmx%&Z0`@|F`ltNs;!z>HPmUDRdUq8u!k2?yjoEW%!ZINN%mKNf&J_lG%4BL5f(X(LzSS0GdPn@S53y601 zuSsyjIs_*^{zsvfwhkcw2_Oos_K2%)I4H@%>8ZS6}jXfd&eB1bAKxeox4XI_m?%BKaLJqh1fr{nSRSX5xUYP*Fk)%I zlzcH(=qyIaEZ~4g^1!Kf;Bth{0*(|q_l)rLUFS`YXYgS=|F?&iqyIlb=l@-)j>i7~ zNDchIcgYS^!X2UW|K6q0S&Y=c|9hwG8?iY52%Z1;PKC~5qz3-qJ5ph$!U&!J_YNnu zI#L7w@9naCE&k=x`G0R$=qyIa{J$yuZL<5V<_S|6q4WRVrqEf8kokWt{0i6qAEERA zu5kVT5i}^ zAD{~ASy{{$t2Y3mgpeH@irHHAhC`H48ukwrvn}hyKZc#EKR{gE|6ND_f24z)s$Hjs z7Mcf*7;#+Sys6qWeytpuX>|cc93wcdH@{Y)vly|wU;?x^onIrD;lS32B?eQn#A_5f zixDy}INX=~8EPsfEPV7jWUPViDk1Mm{Jv^5C4grFL{#BJ)01ur4C1~0Rv>h*z_`u+E< zFQ!Y>S<5kXgO|r|zHoaAUFy@euPtV))QOPYDClxr*!KQa#cZcKk*J*lm*Zpht}SMp z)rm(P1zU~}+r7G&u2^rO0)P&*93M3Q{_hbw^Y>QOV<&jT2$}gih2J8(a2#cX&iuVa zp|cnvGk;t7&2p}u%Z8co5jyktW`)jTgv|VH<~PYc>i z@0!m1eV;;SF+yhkw(%R~0Cqh`=*-_66*`L%GV`~M-yj#KP%EAJdxJt}F+yhk{=fFF zHOP&tN=sLc9QDw?q#BYCfIuGPf%1gBv$eoJYC}=AOD$C_f2i91!Jpl8`(E|T zcs!H7nhDEpS+V1*md?>R_i^sM=brD}{pgvYw#58WN6 zOK?2@PoWRGJpbi!ivK&}IqbO(^8fBe{|zUGzeWFs{u#Z4UO~?Qdia~@Zz2D0AN@JH zh;&qj{J$BLKw)$YeHMKZT?apO<@HBh13tq_J-Z9N?K7;@v%Aq-KEp~qyBodfH3;zR z4X;6fXRmt=0z7-oYY^bst6qZu&wk=HNY>dOdkvCx_7$%|vd+HjGY%09+)F;=ASu1* zGj1fM7ktJIxa398`;6;x$%h6$;}hiBk9@|*$+PEt#&x9htk3upT-t@6_8A|;rQLx1 zG(Jj7PkD`xSWvhpy~edx;R&ztVXN@C*EnDme&97eWEH;eHTGMD$GpY|t-|-b#y+d? zU7v9c=7<3KY3wDXM}5ZCr1Xf-_y8_>0r_d{!6hI1md_X?&mQ&}yUDYMe1?yd9`qSr zT-t>m@EKR((r&t4fS{p|f-16hUpyoTE<-0L-5Rsk@ee`XZ`1Nud)02t6a ztpZ>`zhD&r19}JMh%g4UM@oPJrRdpv$oe1he}3DOg8ZM4LC)^0A^*P&_kZ8(V!Hn` zXRO}T$hb;hv+5BSFRq?hbKInVDr*eyY#bY7JX*GwJsY_4XAF8*BRCg7$F^GC=)AmS zRmC5d40>%NaA%ZxjqCDKw&1v2y;^-|9hZ2s0glU?Mm=ud)NzT|?%*6;y=;A3&OuAe zQ^sLi%x!Z6*;emW-!3=oxIARb#<&UEIt>J_M{ryow7GBJafw-Sc>IqV|Cb(mTO2!S z9>hK&8w>2141E*(glrVBW4do*pAfLP-I|l}?>PTgpB?S@-NCU#aU8T0>NBJL_M`8FW6xXE(|vZd-**O-IMioG`|U@M zhUbRo;p}L?M+cNR)MrNf?MIJ<u1OZobb zXN=F-d>PwqcvP{0DLwyp690Fed5QAWz)!;HLj4i&zfXpVUlx|5?D*d&2b4I}9|8aS zMEE!fQl9R!`!@`B$t`6)OPpsGYD>v{3hvn*}>O1VPghdB9ELZPV->FDTyy5_- z;OaH&+g)(sNXymx)wj(JWLv#aeY@Pa6J-Ctjrc#)MgcqCsy#oDUL+VG)5ZcjCB7C7 z!tx0^P1%TGr_^XLpv0j*!38tz5`Pp<{uREl;rw);0E1a}i9Z@p;!vL%7wkpPg~x}^ zId)v|a|22o?Ay3t=exvbar~c+2zE+`p2fai8w>213_XK=y*3KiG2JuR*GurfEUof% z_$wcxcr*h4W#|weM^6uIYG(ZJUi8E8vG36C#E$>{;eZl{`po#>z38bhU7F+Zzt7Vi zp8x-&=Pl36o@e0x--kS3^L)kgWzUy9Ux1IVysp&1l^WQQ8laH?yKr2E6$!8l$5lWi z03_>$xC#gafC9u-KpX%RAg+Rh0YF>@2?Kz*3K9kYaTO#C;FVz*z{@@y27vSWzU0Gk z0J!v`4+jF^(hGJZ!1Hz_z`$Prf7O#l|B1eeGVb5I@3!)P-ov{7KV__5)408r3BYk- zowIr|<94~>gW2J|jLZw@_c)m4EobHG&5S#6FbgcfSsAxCQ#<7Ga$qfBg`Dyx=iBanBy~2Kq8eqYt}( z4y%AO?(1E@bUg?k@7ybB+PMH6@9oe#uqQO_EC7z_-hn-#N$~$Hd&0NFcmK*dhYpzp z{?D{0e0yM1GvojFqPN1g{1df$?D+q;29!8tGUNaEqBq00P&k^&j{kpiK#4=<2>Aau z!bhzX7`INF?D+pT29!8tj)4DvJ$(H0bo{g9|6d{WT|a||@9XQdL9bf`pEGNM_vpn+ zQ(HOMX=%0Y!EU?I?3^8@xeCAucix~EE&^*tzc5O9gG1$jBd5jI_<2amBl?LN4XaO$Pk88ViIs)Cr^H z8_y;#U7_N$iImNL^s|W#eBo?Dw5w!?&n94x0cR6}&7QFjZXQex8w}VN&)bZ*yT9U( z;vpVMv?cf}2IO=uR&A>O#!6aGb4p%IO0i_37>H$a&DppdJyDwX3(IA#JiCxhbP_sO zRaO#56MCjD)|H+bDJ>~{q9?|qJ%LXwsr8u^A+K-(pR5b@G_Ulux*+9xLPXTndI|nb z_=UK@iS~}O3E#%@$`x+MOW0g0=j2vsl2Q!68x>7TTyzYpi)n)h6AQM&*mEI^b&f|-y+JCAZ0WW>R#*#Q$k#=3wcpf z>$7!{7pBCXtf^81^vErxq)biZ(*dz3f_^1V=_$*q1iDJX60{}gnB#@o8ol%rS*0ON zmGiBW3b%Ce6epi9OG&Aycjq$sYG8r%A705Xb7~g)t(L5(=BlU4jSN?i)zhbV7(MZ& zU@oTes(!++#>=P5%~-1_m+Pne;>moYdR`2O=ZiW2I=xh>T2&*$vKl!DZIj^Ccp@lD z4Zl#YLi@xt0qYY_`%{ssuJA%Y)pN_D4!YJ=Ed~0EdaMp(jaMVlo+y-yjm~oFy4BKG+TrE z53U;@4S6n`PxSJVHU)iOO#72jbxtkK^T(Gnu~>6Meb>6NG_O@p^{UORE>{b4>0p*m z%Bo(Km6dL)l#{z9ZZ=to%r4|WUs;RkGN0gz{&H`?~#zbOD)rF;0Bo`FwvoL}Z%R)TLEA{Aln^vzb zsJZF|Ik)Uj2V%8Kt(%f_-I`R-q>9bb2Afva7njs%Zb{4s^HMK)LEyBs&{Qv|Q8^{V zsuI{IF%{P`S!wokDIlII@tLUT4^9<(Yi$~~xz^YP+0xKvGk&30Za}?5--)ikc&Nh| zUsm)SCxT4_TgQVPh0jYp5&D);S9lmF0RfNy-nr!zwh3Un*0q@)ix%^mC`!qBxf#oq zwbpsj-&q#&t+pD!j9#b31sL0zOd!)O>an?$tOhdCZZg#mV%ITsO6H;@@NKq=cC4VZ#01XG)CAN$6jGIUY=b%{VVNs@ak@TTs@w z8T7B5U+HCFUYS`EBS}r+qrBKV$AL|T_E5pXYjs5jy8v@c3d;>T;Xav?k{amY7a}sA zzjPrFcCD8N8wm3N%tJR2|9{QpdBk(ZGlm{VMYPxbl)LQS=X%Oj!`5MkUV=&T*0|9v zPP1oz9R2;e#V1{jAN=%TZsIptbC}8|;dT!fx?3mlgyg21E|r04U?PAr<}lHXW3KPT z^i5zoOoNkfk2w={-_~6DiNk60Q`BeVnCW}*d^cl~1Uhb%aN0)KY|WILxF&6q#5!Zn znZ6g#-z}J*q&}~x(;B@R{oT6Gw7QdlrspTdQ|4h>pN?5>&G8ot=D01S!!)xW*oq~G zg&bz#j5=+gtvUVzkN>M(v-tk+g6Bi%1=K-@-9L5zg*)K-SJz*|2k-e3%wfug8K-T5 zezvYDh8uXRA$}{G!z>Onj&6a4faA**wKhTq~F)RU8)2VPkw^(|M1d_|3dYvd6L1 z-e%%)6W8ML?{h!x@;vIf)tdiHXdk@2^7`YifwVbHZ4`BCH$3R)m#l!+*j{Xl(k4lG z<1P*={~L@)HN}_;-8mbHSf0uPZfhr3U`^YCtt)`v8RT z?8dW+wI?~H@qv~#{#~!Q@Sp#?uP+^QU+oG6#tt30xgWjju(LgOx6(E7rK?nvx{xL&>f#1SM>5Y zJgaCmz1FR?;mHyBuV(R_ER;%%7n<-j?#OtjRVmfZ)=I$Wj`2*PxL7PS8<9$<)ULI< zwZ$fU>CPkLrA6(6-kcngov@#@7qtqIo*Ab+Cu=|tzf`)=ZdaP66(A{Buq0TzS`$P8 z)!=;_erd8?DOS3ZrFNxU!_Nx3CDoDf#TGu>Y@Qo3v)?xhy3MS(xY)pq*NA##{Px

L5lcEywzC-p+B1zJGublVpyN38#m z##;OTtv*}(J;&u$8LY;E79icm?kTh}sd(^t^K1>Iykp!Cq5?IC%h6nhG<}dfJc|EW z?Fp;I>zLnp$9Sh(X?1QdFE%UV)BYpl-NkM}yWM(dy|1*}i@4X~A0pim`nA;=;mhQK zQ~+uGcjEDXm227M`50=sUvrN`@elI4>r>tj;1PTHz{&ki2W*Sh;)QkvMl98<(=Bu_ zbZ*B-;BBaZLc3cjpSf)ZYv`_GALOR9x`q%IiuE zT&aQgqXzE!n2(y~&p4h!&eoc>PPI~AJAsf@zz)uCoHhUNb)9y3p7gXlpGLn#UqK6K zw|n4TcKcnwc6}8-8tE0If%9YN&>?5b@vHs?z6V5T z@;Q#>p>g-@@*K1I9K(D_2>uB29JToz#d^_Te0F(o7qaTvAH?#Ixcm|1nX>szVR>kT zKD#^++)3pLV0lQe{s{8e{n-!Ug~wwQcF!)4-JfBk1+4s^@5}fn0qCrHLMNblS|$EO zjE15!>WMoOsduXc^-iMFS>*}ZcEl zhIRyoi)BYh{5rclLpuU|EIUFY+1cfxb_DoXc7z1Ak01|ja58^bc7(##*yW*i1pcw? z2tlxoAP==8z{j#96wAgg549t}$Fd^?);5AXbbJ9HY)A0^e-BLcm!1Ddn)&~K6U9j2 z32VI{we5&i0y{#ZO&I$DP}_Em*bx$AGJ-tRjsQo?j?lmoW_gBo1cseuM+mx$U7n#G z0X~);p=d95d8i!$K9(J!@Go{g)Q-SEmK`BTuo3ivfrjl7@UiR&!Gw*#huRU~W7!dk P4rAAg+7aM`?a2QC>~Q&g literal 295936 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['currencies.create.url' => 'http://localhost']); $data = [ - 'name' => 'XX', - 'code' => 'XXX', - 'symbol' => 'x', + 'name' => 'XX', + 'code' => 'XXX', + 'symbol' => 'x', + 'decimal_places' => 2, ]; $this->be($this->user()); $this->call('post', route('currencies.store'), $data); @@ -126,9 +127,10 @@ class CurrencyControllerTest extends TestCase { $this->session(['currencies.edit.url' => 'http://localhost']); $data = [ - 'name' => 'XA', - 'code' => 'XAX', - 'symbol' => 'a', + 'name' => 'XA', + 'code' => 'XAX', + 'symbol' => 'a', + 'decimal_places' => 2, ]; $this->be($this->user()); $this->call('post', route('currencies.update', [2]), $data); From de56c18c6e68f061a0f117e45722c8cc1f9865ff Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 09:02:23 +0100 Subject: [PATCH 173/350] Clean up some money formatting routines. --- app/Support/Amount.php | 81 +++++----------- app/Support/Twig/Journal.php | 92 ------------------- app/Support/Twig/Transaction.php | 54 ++++++----- resources/views/list/journals-tasker.twig | 5 +- .../views/list/journals-tiny-tasker.twig | 5 +- .../views/popup/list/journals-tasker.twig | 5 +- .../partials/journals-audit-tasker.twig | 5 +- .../views/search/partials/transactions.twig | 5 +- resources/views/transactions/show.twig | 18 ++-- 9 files changed, 75 insertions(+), 195 deletions(-) diff --git a/app/Support/Amount.php b/app/Support/Amount.php index c283289933..2a481683a8 100644 --- a/app/Support/Amount.php +++ b/app/Support/Amount.php @@ -43,16 +43,16 @@ class Amount * This method will properly format the given number, in color or "black and white", * as a currency, given two things: the currency required and the current locale. * - * @param TransactionCurrency $format - * @param string $amount - * @param bool $coloured + * @param \FireflyIII\Models\TransactionCurrency $format + * @param string $amount + * @param bool $coloured * * @return string */ public function formatAnything(TransactionCurrency $format, string $amount, bool $coloured = true): string { $locale = setlocale(LC_MONETARY, 0); - $float = round($amount, 2); + $float = round($amount, 12); $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY); $result = $formatter->formatCurrency($float, $format->code); @@ -74,6 +74,22 @@ class Amount return $result; } + /** + * Used in many places (unfortunately). + * + * @param string $currencyCode + * @param string $amount + * @param bool $coloured + * + * @return string + */ + public function formatByCode(string $currencyCode, string $amount, bool $coloured = true): string + { + $currency = TransactionCurrency::whereCode($currencyCode)->first(); + + return $this->formatAnything($currency, $amount, $coloured); + } + /** * * @param \FireflyIII\Models\TransactionJournal $journal @@ -83,27 +99,9 @@ class Amount */ public function formatJournal(TransactionJournal $journal, bool $coloured = true): string { - $locale = setlocale(LC_MONETARY, 0); - $float = round(TransactionJournal::amount($journal), 2); - $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY); - $currencyCode = $journal->transaction_currency_code ?? $journal->transactionCurrency->code; - $result = $formatter->formatCurrency($float, $currencyCode); + $currency = $journal->transactionCurrency; - if ($coloured === true && $float === 0.00) { - return '' . $result . ''; // always grey. - } - if (!$coloured) { - return $result; - } - if (!$journal->isTransfer()) { - if ($float > 0) { - return '' . $result . ''; - } - - return '' . $result . ''; - } else { - return '' . $result . ''; - } + return $this->formatAnything($currency, TransactionJournal::amount($journal), $coloured); } /** @@ -119,41 +117,6 @@ class Amount return $this->formatAnything($currency, strval($transaction->amount), $coloured); } - /** - * This method will properly format the given number, in color or "black and white", - * as a currency, given two things: the currency required and the currency code. - * - * @param string $code - * @param string $amount - * @param bool $coloured - * - * @return string - */ - public function formatWithCode(string $code, string $amount, bool $coloured = true): string - { - $locale = setlocale(LC_MONETARY, 0); - $float = round($amount, 2); - $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY); - $result = $formatter->formatCurrency($float, $code); - - if ($coloured === true) { - - if ($amount > 0) { - return sprintf('%s', $result); - } else { - if ($amount < 0) { - return sprintf('%s', $result); - } - } - - return sprintf('%s', $result); - - - } - - return $result; - } - /** * @return Collection */ diff --git a/app/Support/Twig/Journal.php b/app/Support/Twig/Journal.php index 5039212e22..3c52ad161e 100644 --- a/app/Support/Twig/Journal.php +++ b/app/Support/Twig/Journal.php @@ -33,96 +33,6 @@ use Twig_SimpleFunction; class Journal extends Twig_Extension { - /** - * @return Twig_SimpleFunction - */ - public function formatAccountPerspective(): Twig_SimpleFunction - { - return new Twig_SimpleFunction( - 'formatAccountPerspective', function (TransactionJournal $journal, Account $account) { - - $cache = new CacheProperties; - $cache->addProperty('formatAccountPerspective'); - $cache->addProperty($journal->id); - $cache->addProperty($account->id); - - if ($cache->has()) { - return $cache->get(); - } - - // get the account amount: - $transactions = $journal->transactions()->where('transactions.account_id', $account->id)->get(['transactions.*']); - $amount = '0'; - foreach ($transactions as $transaction) { - $amount = bcadd($amount, strval($transaction->amount)); - } - if ($journal->isTransfer()) { - $amount = bcmul($amount, '-1'); - } - - // check if this sum is the same as the journal: - $journalSum = TransactionJournal::amount($journal); - $full = Amount::formatJournal($journal); - if (bccomp($journalSum, $amount) === 0 || bccomp(bcmul($journalSum, '-1'), $amount) === 0) { - $cache->store($full); - - return $full; - } - - $formatted = Amount::format($amount, true); - - if ($journal->isTransfer()) { - $formatted = '' . Amount::format($amount) . ''; - } - $str = $formatted . ' (' . $full . ')'; - $cache->store($str); - - return $str; - - } - ); - } - - /** - * @return Twig_SimpleFunction - */ - public function formatBudgetPerspective(): Twig_SimpleFunction - { - return new Twig_SimpleFunction( - 'formatBudgetPerspective', function (TransactionJournal $journal, ModelBudget $budget) { - - $cache = new CacheProperties; - $cache->addProperty('formatBudgetPerspective'); - $cache->addProperty($journal->id); - $cache->addProperty($budget->id); - - if ($cache->has()) { - return $cache->get(); - } - - // get the account amount: - $transactions = $journal->transactions()->where('transactions.amount', '<', 0)->get(['transactions.*']); - $amount = '0'; - foreach ($transactions as $transaction) { - $currentBudget = $transaction->budgets->first(); - if (!is_null($currentBudget) && $currentBudget->id === $budget->id) { - $amount = bcadd($amount, strval($transaction->amount)); - } - } - if ($amount === '0') { - $formatted = Amount::formatJournal($journal); - $cache->store($formatted); - - return $formatted; - } - - $formatted = Amount::format($amount, true) . ' (' . Amount::formatJournal($journal) . ')'; - $cache->store($formatted); - - return $formatted; - } - ); - } /** * @return Twig_SimpleFunction @@ -178,8 +88,6 @@ class Journal extends Twig_Extension $functions = [ $this->getSourceAccount(), $this->getDestinationAccount(), - $this->formatAccountPerspective(), - $this->formatBudgetPerspective(), $this->journalBudgets(), $this->journalCategories(), ]; diff --git a/app/Support/Twig/Transaction.php b/app/Support/Twig/Transaction.php index 63f38a3a7f..d00150518a 100644 --- a/app/Support/Twig/Transaction.php +++ b/app/Support/Twig/Transaction.php @@ -17,6 +17,7 @@ use Amount; use Crypt; use FireflyIII\Models\AccountType; use FireflyIII\Models\Transaction as TransactionModel; +use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionType; use Twig_Extension; use Twig_SimpleFilter; @@ -29,15 +30,16 @@ use Twig_SimpleFunction; */ class Transaction extends Twig_Extension { + /** * @return Twig_SimpleFunction */ - public function formatAmountPlainWithCode(): Twig_SimpleFunction + public function formatAnything(): Twig_SimpleFunction { return new Twig_SimpleFunction( - 'formatAmountPlainWithCode', function (string $amount, string $code): string { + 'formatAnything', function (TransactionCurrency $currency, string $amount): string { - return Amount::formatWithCode($code, $amount, false); + return Amount::formatAnything($currency, $amount, true); }, ['is_safe' => ['html']] ); @@ -46,12 +48,26 @@ class Transaction extends Twig_Extension /** * @return Twig_SimpleFunction */ - public function formatAmountWithCode(): Twig_SimpleFunction + public function formatAnythingPlain(): Twig_SimpleFunction { return new Twig_SimpleFunction( - 'formatAmountWithCode', function (string $amount, string $code): string { + 'formatAnythingPlain', function (TransactionCurrency $currency, string $amount): string { - return Amount::formatWithCode($code, $amount, true); + return Amount::formatAnything($currency, $amount, false); + + }, ['is_safe' => ['html']] + ); + } + + /** + * @return Twig_SimpleFunction + */ + public function formatByCode(): Twig_SimpleFunction + { + return new Twig_SimpleFunction( + 'formatByCode', function (string $currencyCode, string $amount): string { + + return Amount::formatByCode($currencyCode, $amount, true); }, ['is_safe' => ['html']] ); @@ -75,8 +91,8 @@ class Transaction extends Twig_Extension public function getFunctions(): array { $functions = [ - $this->formatAmountWithCode(), - $this->formatAmountPlainWithCode(), + $this->formatAnything(), + $this->formatAnythingPlain(), $this->transactionSourceAccount(), $this->transactionDestinationAccount(), $this->optionalJournalAmount(), @@ -85,6 +101,7 @@ class Transaction extends Twig_Extension $this->transactionCategories(), $this->transactionIdCategories(), $this->splitJournalIndicator(), + $this->formatByCode(), ]; return $functions; @@ -107,24 +124,17 @@ class Transaction extends Twig_Extension { return new Twig_SimpleFunction( 'optionalJournalAmount', function (int $journalId, string $transactionAmount, string $code, string $type): string { - - $amount = strval( - TransactionModel::where('transaction_journal_id', $journalId) - ->whereNull('deleted_at') - ->where('amount', '<', 0) - ->sum('amount') - ); - + // get amount of journal: + $amount = strval(TransactionModel::where('transaction_journal_id', $journalId)->whereNull('deleted_at')->where('amount', '<', 0)->sum('amount')); + // display deposit and transfer positive if ($type === TransactionType::DEPOSIT || $type === TransactionType::TRANSFER) { $amount = bcmul($amount, '-1'); } - if ( - bccomp($amount, $transactionAmount) !== 0 - && bccomp($amount, bcmul($transactionAmount, '-1')) !== 0 - ) { - // not equal? - return sprintf(' (%s)', Amount::formatWithCode($code, $amount, true)); + // not equal to transaction amount? + if (bccomp($amount, $transactionAmount) !== 0 && bccomp($amount, bcmul($transactionAmount, '-1')) !== 0) { + //$currency = + return sprintf(' (%s)', 'x'); // Amount::formatWithCode($code, $amount, true) } return ''; diff --git a/resources/views/list/journals-tasker.twig b/resources/views/list/journals-tasker.twig index daa673cfb9..b54fb18fa1 100644 --- a/resources/views/list/journals-tasker.twig +++ b/resources/views/list/journals-tasker.twig @@ -70,10 +70,9 @@ - {{ formatAmountWithCode(transaction.transaction_amount, transaction.transaction_currency_code) }} + {{ formatByCode(transaction.transaction_currency_code, transaction.transaction_amount) }} - {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, - transaction.transaction_currency_code, transaction.transaction_type_type) }} + {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, transaction.transaction_currency_code, transaction.transaction_type_type) }} diff --git a/resources/views/list/journals-tiny-tasker.twig b/resources/views/list/journals-tiny-tasker.twig index a8eae3298d..190d28cf37 100644 --- a/resources/views/list/journals-tiny-tasker.twig +++ b/resources/views/list/journals-tiny-tasker.twig @@ -15,10 +15,9 @@ {% endif %} - {{ formatAmountWithCode(transaction.transaction_amount, transaction.transaction_currency_code) }} + {{ formatByCode(transaction.transaction_currency_code, transaction.transaction_amount) }} - {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, - transaction.transaction_currency_code, transaction.transaction_type_type) }} + {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, transaction.transaction_currency_code, transaction.transaction_type_type) }} {% endfor %} diff --git a/resources/views/popup/list/journals-tasker.twig b/resources/views/popup/list/journals-tasker.twig index 36c36aeccb..d6f97dcc59 100644 --- a/resources/views/popup/list/journals-tasker.twig +++ b/resources/views/popup/list/journals-tasker.twig @@ -46,10 +46,9 @@ - {{ formatAmountWithCode(transaction.transaction_amount, transaction.transaction_currency_code) }} + {{ formatByCode(transaction.transaction_currency_code, transaction.transaction_amount) }} - {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, - transaction.transaction_currency_code, transaction.transaction_type_type) }} + {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, transaction.transaction_currency_code, transaction.transaction_type_type) }} {{ transaction.date.formatLocalized(monthAndDayFormat) }} diff --git a/resources/views/reports/partials/journals-audit-tasker.twig b/resources/views/reports/partials/journals-audit-tasker.twig index 50e9ed6a00..824dd126bc 100644 --- a/resources/views/reports/partials/journals-audit-tasker.twig +++ b/resources/views/reports/partials/journals-audit-tasker.twig @@ -60,10 +60,9 @@ {{ transaction.before|formatAmount }} - {{ formatAmountWithCode(transaction.transaction_amount, transaction.transaction_currency_code) }} + {{ formatByCode(transaction.transaction_currency_code, transaction.transaction_amount) }} - {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, - transaction.transaction_currency_code, transaction.transaction_type_type) }} + {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, transaction.transaction_currency_code, transaction.transaction_type_type) }} {{ transaction.after|formatAmount }} diff --git a/resources/views/search/partials/transactions.twig b/resources/views/search/partials/transactions.twig index 279a336a3c..587c9b432d 100644 --- a/resources/views/search/partials/transactions.twig +++ b/resources/views/search/partials/transactions.twig @@ -40,10 +40,9 @@ - {{ formatAmountWithCode(transaction.transaction_amount, transaction.transaction_currency_code) }} + {{ formatByCode(transaction.transaction_currency_code, transaction.transaction_amount) }} - {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, - transaction.transaction_currency_code, transaction.transaction_type_type) }} + {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, transaction.transaction_currency_code, transaction.transaction_type_type) }} diff --git a/resources/views/transactions/show.twig b/resources/views/transactions/show.twig index d9b8242094..f20e920b98 100644 --- a/resources/views/transactions/show.twig +++ b/resources/views/transactions/show.twig @@ -285,8 +285,9 @@ - {{ formatAmountWithCode(transaction.source_account_before,journal.transactionCurrency.code) }} - ⟶ {{ formatAmountWithCode(transaction.source_account_after,journal.transactionCurrency.code) }} + + {{ formatAnything(journal.transactionCurrency, transaction.source_account_before) }} + ⟶ {{ formatAnything(journal.transactionCurrency, transaction.source_account_after) }} {% if transaction.destination_account_type == 'Cash account' %} @@ -297,23 +298,26 @@ - {{ formatAmountWithCode(transaction.destination_account_before,journal.transactionCurrency.code) }} - ⟶ {{ formatAmountWithCode(transaction.destination_account_after,journal.transactionCurrency.code) }} + + {{ formatAnything(journal.transactionCurrency, transaction.destination_account_before) }} + ⟶ {{ formatAnything(journal.transactionCurrency, transaction.destination_account_after) }} {% if journal.transactiontype.type == 'Deposit' %} - {{ formatAmountWithCode(transaction.destination_amount, journal.transactionCurrency.code) }} + {{ formatAnything(journal.transactionCurrency, transaction.destination_amount) }} {% endif %} {% if journal.transactiontype.type == 'Withdrawal' %} - {{ formatAmountWithCode(transaction.source_amount, journal.transactionCurrency.code) }} + {{ formatAnything(journal.transactionCurrency, transaction.source_amount) }} {% endif %} {% if journal.transactiontype.type == 'Transfer' %} - {{ formatAmountPlainWithCode(transaction.destination_amount, journal.transactionCurrency.code) }} + + {{ formatAnythingPlain(journal.transactionCurrency, transaction.destination_amount) }} + {% endif %} From 1e9aaf2d2a55d8c2fdde02554c7809acd89fb769 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 09:05:02 +0100 Subject: [PATCH 174/350] Code cleanup. [skip ci] --- app/Support/Twig/Transaction.php | 2 +- resources/views/list/journals-tasker.twig | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/app/Support/Twig/Transaction.php b/app/Support/Twig/Transaction.php index d00150518a..5285a8ee90 100644 --- a/app/Support/Twig/Transaction.php +++ b/app/Support/Twig/Transaction.php @@ -134,7 +134,7 @@ class Transaction extends Twig_Extension // not equal to transaction amount? if (bccomp($amount, $transactionAmount) !== 0 && bccomp($amount, bcmul($transactionAmount, '-1')) !== 0) { //$currency = - return sprintf(' (%s)', 'x'); // Amount::formatWithCode($code, $amount, true) + return sprintf(' (%s)', Amount::formatByCode($code, $amount, true)); } return ''; diff --git a/resources/views/list/journals-tasker.twig b/resources/views/list/journals-tasker.twig index b54fb18fa1..37cbcd1b72 100644 --- a/resources/views/list/journals-tasker.twig +++ b/resources/views/list/journals-tasker.twig @@ -26,12 +26,6 @@ {% endif %} - {% for transaction in journals %} From 45914b2e9e072127b75e52a825f08c5fdfca23c9 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 09:15:50 +0100 Subject: [PATCH 175/350] First set of views will respect decimal places configuration. --- app/Support/Amount.php | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/app/Support/Amount.php b/app/Support/Amount.php index 2a481683a8..1e52f19ef3 100644 --- a/app/Support/Amount.php +++ b/app/Support/Amount.php @@ -17,7 +17,6 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionJournal; use Illuminate\Support\Collection; -use NumberFormatter; use Preferences as Prefs; /** @@ -51,10 +50,20 @@ class Amount */ public function formatAnything(TransactionCurrency $format, string $amount, bool $coloured = true): string { - $locale = setlocale(LC_MONETARY, 0); + setlocale(LC_MONETARY, 0); $float = round($amount, 12); - $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY); - $result = $formatter->formatCurrency($float, $format->code); + $info = localeconv(); + $formatted = number_format($float, $format->decimal_places, $info['mon_decimal_point'], $info['mon_thousands_sep']); + + // some complicated switches to format the amount correctly: + $precedes = $amount < 0 ? $info['n_cs_precedes'] : $info['p_cs_precedes']; + $separated = $amount < 0 ? $info['n_sep_by_space'] : $info['p_sep_by_space']; + $space = $separated ? ' ' : ''; + $result = $format->symbol . $space . $formatted; + + if (!$precedes) { + $result = $space . $formatted . $format->symbol; + } if ($coloured === true) { From 7a3b39886edec449166b5190ad36666680581f5f Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 17:42:46 +0100 Subject: [PATCH 176/350] Changed to budget controller chart. --- .../Controllers/Chart/BudgetController.php | 164 ++++++++---------- 1 file changed, 75 insertions(+), 89 deletions(-) diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index 03a8ac4f0e..98f4fcc0d2 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -31,6 +31,8 @@ use Response; /** * Class BudgetController * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) // can't realy be helped. + * * @package FireflyIII\Http\Controllers\Chart */ class BudgetController extends Controller @@ -73,7 +75,6 @@ class BudgetController extends Controller $final = clone $last; $final->addYears(2); - $budgetCollection = new Collection([$budget]); $last = Navigation::endOfX($last, $range, $final); // not to overshoot. $entries = []; @@ -100,6 +101,7 @@ class BudgetController extends Controller /** * Shows the amount left in a specific budget limit. * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's exactly five. * @param BudgetRepositoryInterface $repository * @param Budget $budget * @param LimitRepetition $repetition @@ -139,6 +141,8 @@ class BudgetController extends Controller /** * Shows a budget list with spent/left/overspent. + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's exactly five. + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) // 46 lines, I'm fine with this. * * @param BudgetRepositoryInterface $repository * @@ -159,55 +163,30 @@ class BudgetController extends Controller $budgets = $repository->getActiveBudgets(); $repetitions = $repository->getAllBudgetLimitRepetitions($start, $end); $chartData = [ - [ - 'label' => strval(trans('firefly.spent_in_budget')), - 'entries' => [], - 'type' => 'bar', - ], - [ - 'label' => strval(trans('firefly.left_to_spend')), - 'entries' => [], - 'type' => 'bar', - ], - [ - 'label' => strval(trans('firefly.overspent')), - 'entries' => [], - 'type' => 'bar', - ], + ['label' => strval(trans('firefly.spent_in_budget')), 'entries' => [], 'type' => 'bar',], + ['label' => strval(trans('firefly.left_to_spend')), 'entries' => [], 'type' => 'bar',], + ['label' => strval(trans('firefly.overspent')), 'entries' => [], 'type' => 'bar',], ]; /** @var Budget $budget */ foreach ($budgets as $budget) { // get relevant repetitions: - $reps = $this->filterRepetitions($repetitions, $budget, $start, $end); - - if ($reps->count() === 0) { - $row = $this->spentInPeriodSingle($repository, $budget, $start, $end); - if (bccomp($row['spent'], '0') !== 0 || bccomp($row['repetition_left'], '0') !== 0) { - $chartData[0]['entries'][$row['name']] = bcmul($row['spent'], '-1'); - $chartData[1]['entries'][$row['name']] = $row['repetition_left']; - $chartData[2]['entries'][$row['name']] = bcmul($row['repetition_overspent'], '-1'); - } - continue; + $filtered = $this->filterRepetitions($repetitions, $budget, $start, $end); + $expenses = $this->getExpensesForBudget($filtered, $budget, $start, $end); + foreach ($expenses as $name => $row) { + $chartData[0]['entries'][$name] = $row['spent']; + $chartData[1]['entries'][$name] = $row['left']; + $chartData[2]['entries'][$name] = $row['overspent']; } - $rows = $this->spentInPeriodMulti($repository, $budget, $reps); - foreach ($rows as $row) { - if (bccomp($row['spent'], '0') !== 0 || bccomp($row['repetition_left'], '0') !== 0) { - $chartData[0]['entries'][$row['name']] = bcmul($row['spent'], '-1'); - $chartData[1]['entries'][$row['name']] = $row['repetition_left']; - $chartData[2]['entries'][$row['name']] = bcmul($row['repetition_overspent'], '-1'); - } - } - unset($rows, $row); - } // for no budget: - $row = $this->spentInPeriodWithout($start, $end); - if (bccomp($row['repetition_overspent'], '0') !== 0) { - $chartData[0]['entries'][$row['name']] = bcmul($row['spent'], '-1'); - $chartData[1]['entries'][$row['name']] = $row['repetition_left']; - $chartData[2]['entries'][$row['name']] = bcmul($row['repetition_overspent'], '-1'); + $spent = $this->spentInPeriodWithout($start, $end); + $name = strval(trans('firefly.no_budget')); + if (bccomp($spent, '0') !== 0) { + $chartData[0]['entries'][$name] = bcmul($spent, '-1'); + $chartData[1]['entries'][$name] = '0'; + $chartData[2]['entries'][$name] = '0'; } $data = $this->generator->multiSet($chartData); @@ -252,6 +231,7 @@ class BudgetController extends Controller while ($current < $end) { $currentStart = Navigation::startOfPeriod($current, $range); $currentEnd = Navigation::endOfPeriod($current, $range); + $reps = $repetitions->filter( function (LimitRepetition $repetition) use ($budget, $currentStart, $currentEnd) { if ($repetition->budget_id === $budget->id && $repetition->startdate >= $currentStart && $repetition->enddate <= $currentEnd) { @@ -354,12 +334,53 @@ class BudgetController extends Controller ); } + + /** + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's 6 but ok. + * + * @param Collection $repetitions + * @param Budget $budget + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + private function getExpensesForBudget(Collection $repetitions, Budget $budget, Carbon $start, Carbon $end): array + { + /** @var BudgetRepositoryInterface $repository */ + $repository = app(BudgetRepositoryInterface::class); + $return = []; + if ($repetitions->count() === 0) { + $spent = $repository->spentInPeriod(new Collection([$budget]), new Collection, $start, $end); + if (bccomp($spent, '0') !== 0) { + $return[$budget->name]['spent'] = $spent; + $return[$budget->name]['left'] = 0; + $return[$budget->name]['overspent'] = 0; + } + + return $return; + } + + $rows = $this->spentInPeriodMulti($repository, $budget, $repetitions); + foreach ($rows as $name => $row) { + if (bccomp($row['spent'], '0') !== 0 || bccomp($row['left'], '0') !== 0) { + $return[$name]['spent'] = bcmul($row['spent'], '-1'); + $return[$name]['left'] = $row['left']; + $return[$name]['overspent'] = bcmul($row['overspent'], '-1'); + } + } + unset($rows, $row); + + return $return; + } + /** * Returns an array with the following values: * 0 => * 'name' => name of budget + repetition - * 'repetition_left' => left in budget repetition (always zero) - * 'repetition_overspent' => spent more than budget repetition? (always zero) + * 'left' => left in budget repetition (always zero) + * 'overspent' => spent more than budget repetition? (always zero) * 'spent' => actually spent in period for budget * 1 => (etc) * @@ -384,49 +405,20 @@ class BudgetController extends Controller ['start' => $repetition->startdate->formatLocalized($format), 'end' => $repetition->enddate->formatLocalized($format)] ); } - $amount = $repetition->amount; - $left = bccomp(bcadd($amount, $expenses), '0') < 1 ? '0' : bcadd($amount, $expenses); - $spent = $expenses; - $overspent = bccomp(bcadd($amount, $expenses), '0') < 1 ? bcadd($amount, $expenses) : '0'; - $return[] = [ - 'name' => $name, - 'repetition_left' => $left, - 'repetition_overspent' => $overspent, - 'spent' => $spent, + $amount = $repetition->amount; + $left = bccomp(bcadd($amount, $expenses), '0') < 1 ? '0' : bcadd($amount, $expenses); + $spent = $expenses; + $overspent = bccomp(bcadd($amount, $expenses), '0') < 1 ? bcadd($amount, $expenses) : '0'; + $return[$name] = [ + 'left' => $left, + 'overspent' => $overspent, + 'spent' => $spent, ]; } return $return; } - /** - * Returns an array with the following values: - * 'name' => name of budget - * 'repetition_left' => left in budget repetition (always zero) - * 'repetition_overspent' => spent more than budget repetition? (always zero) - * 'spent' => actually spent in period for budget - * - * - * @param BudgetRepositoryInterface $repository - * @param Budget $budget - * @param Carbon $start - * @param Carbon $end - * - * @return array - */ - private function spentInPeriodSingle(BudgetRepositoryInterface $repository, Budget $budget, Carbon $start, Carbon $end): array - { - $spent = $repository->spentInPeriod(new Collection([$budget]), new Collection, $start, $end); - $array = [ - 'name' => $budget->name, - 'repetition_left' => '0', - 'repetition_overspent' => '0', - 'spent' => $spent, - ]; - - return $array; - } - /** * Returns an array with the following values: * 'name' => "no budget" in local language @@ -437,9 +429,9 @@ class BudgetController extends Controller * @param Carbon $start * @param Carbon $end * - * @return array + * @return string */ - private function spentInPeriodWithout(Carbon $start, Carbon $end): array + private function spentInPeriodWithout(Carbon $start, Carbon $end): string { // collector /** @var JournalCollectorInterface $collector */ @@ -452,13 +444,7 @@ class BudgetController extends Controller foreach ($journals as $entry) { $sum = bcadd($entry->transaction_amount, $sum); } - $array = [ - 'name' => strval(trans('firefly.no_budget')), - 'repetition_left' => '0', - 'repetition_overspent' => $sum, - 'spent' => '0', - ]; - return $array; + return $sum; } } From dbe9628cc5e29baa8bc3b325f563967f2b9e1d80 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 17:43:11 +0100 Subject: [PATCH 177/350] Update to budget limits. --- .../migrations/2016_12_28_203205_changes_for_v431.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/database/migrations/2016_12_28_203205_changes_for_v431.php b/database/migrations/2016_12_28_203205_changes_for_v431.php index a36e0d1003..407e82c844 100644 --- a/database/migrations/2016_12_28_203205_changes_for_v431.php +++ b/database/migrations/2016_12_28_203205_changes_for_v431.php @@ -32,9 +32,18 @@ class ChangesForV431 extends Migration */ public function up() { + // add decimal places to "transaction currencies". Schema::table( 'transaction_currencies', function (Blueprint $table) { - $table->smallInteger('decimal_places',false, true)->default(2); + $table->smallInteger('decimal_places', false, true)->default(2); + } + ); + + // add end date to budget limits, forget budget limit repetitions: + Schema::table( + 'budget_limits', function (Blueprint $table) { + $table->renameColumn('startdate', 'start_date'); + $table->date('end_date'); } ); } From a54a886bf09da16a642cd16651a51f4580cf81d0 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 17:56:12 +0100 Subject: [PATCH 178/350] Chart was negative. [skip ci] --- app/Http/Controllers/Chart/BudgetController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index 98f4fcc0d2..372e972edd 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -354,7 +354,7 @@ class BudgetController extends Controller if ($repetitions->count() === 0) { $spent = $repository->spentInPeriod(new Collection([$budget]), new Collection, $start, $end); if (bccomp($spent, '0') !== 0) { - $return[$budget->name]['spent'] = $spent; + $return[$budget->name]['spent'] = bcmul($spent, '-1'); $return[$budget->name]['left'] = 0; $return[$budget->name]['overspent'] = 0; } From c756b809624e7c6515e523a6a77965f9d6285e6d Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 18:01:06 +0100 Subject: [PATCH 179/350] These are changes to budget limit. FF must work with them. --- database/migrations/2016_12_28_203205_changes_for_v431.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/database/migrations/2016_12_28_203205_changes_for_v431.php b/database/migrations/2016_12_28_203205_changes_for_v431.php index 407e82c844..671104f8ed 100644 --- a/database/migrations/2016_12_28_203205_changes_for_v431.php +++ b/database/migrations/2016_12_28_203205_changes_for_v431.php @@ -44,6 +44,8 @@ class ChangesForV431 extends Migration 'budget_limits', function (Blueprint $table) { $table->renameColumn('startdate', 'start_date'); $table->date('end_date'); + $table->dropColumn('repeat_freq'); + $table->dropColumn('repeats'); } ); } From b14719464cba2fd9061ef2f87870ffc04a1ac7eb Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 18:10:14 +0100 Subject: [PATCH 180/350] No changes to budget limit for now. --- .../2016_12_28_203205_changes_for_v431.php | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/database/migrations/2016_12_28_203205_changes_for_v431.php b/database/migrations/2016_12_28_203205_changes_for_v431.php index 671104f8ed..2842b6b606 100644 --- a/database/migrations/2016_12_28_203205_changes_for_v431.php +++ b/database/migrations/2016_12_28_203205_changes_for_v431.php @@ -22,7 +22,11 @@ class ChangesForV431 extends Migration */ public function down() { - // + Schema::table( + 'budget_limits', function (Blueprint $table) { + $table->renameColumn('start_date', 'startdate'); + } + ); } /** @@ -39,14 +43,5 @@ class ChangesForV431 extends Migration } ); - // add end date to budget limits, forget budget limit repetitions: - Schema::table( - 'budget_limits', function (Blueprint $table) { - $table->renameColumn('startdate', 'start_date'); - $table->date('end_date'); - $table->dropColumn('repeat_freq'); - $table->dropColumn('repeats'); - } - ); } } From ba222eaf77beea203f0f1faf8037290fa5001f11 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 18:10:29 +0100 Subject: [PATCH 181/350] No changes to budget limit for now. --- database/migrations/2016_12_28_203205_changes_for_v431.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/database/migrations/2016_12_28_203205_changes_for_v431.php b/database/migrations/2016_12_28_203205_changes_for_v431.php index 2842b6b606..45763acc4a 100644 --- a/database/migrations/2016_12_28_203205_changes_for_v431.php +++ b/database/migrations/2016_12_28_203205_changes_for_v431.php @@ -22,11 +22,6 @@ class ChangesForV431 extends Migration */ public function down() { - Schema::table( - 'budget_limits', function (Blueprint $table) { - $table->renameColumn('start_date', 'startdate'); - } - ); } /** From 0d4febff85029647dd5fcd029d58c67d9f2da46c Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 18:20:49 +0100 Subject: [PATCH 182/350] New test database just to be sure. --- storage/database/databasecopy.sqlite | Bin 299008 -> 299008 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/storage/database/databasecopy.sqlite b/storage/database/databasecopy.sqlite index e298d59101739d3959388e8db47a0e60ae2a6f1d..ed2cee66a9ecb86507f92b387074dd52d2fdb595 100644 GIT binary patch literal 299008 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

p|eOV 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

wrUzunJ3L18ib!6P=s5WLjeM9wrIX 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

L5lcEywzC-p+B1zJGublVpyN38#m z##;OTtv*}(J;&u$8LY;E79icm?kTh}sd(^t^K1>Iykp!Cq5?IC%h6nhG<}dfJc|EW z?Fp;I>zLnp$9Sh(X?1QdFE%UV)BYpl-NkM}yWM(dy|1*}i@4X~A0pim`nA;=;mhQK zQ~+uGcjEDXm227M`50=sUvrN`@elI4>r>tj;1PTHz{&ki2W*Sh;)QkvMl98<(=Bu_ zbZ*B-;BBaZLc3cjpSf)ZYv`_GALOR9x`q%IiuE zT&aQgqXzE!n2(y~&p4h!&eoc>PPI~AJAsf@zz)uCoHhUNb)9y3p7gXlpGLn#UqK6K zw|n4TcKcnwc6}8-8tE0If%9YN&>?5b@vHs?z6V5T z@;Q#>p>g-@@*K1I9K(D_2>uB29JToz#d^_Te0F(o7qaTvAH?#Ixcm|1nX>szVR>kT zKD#^++)3pLV0lQe{s{8e{n-!Ug~wwQcF!)4-JfBk1+4s^@5}fn0qCrHLMNblS|$EO zjE15!>WMoOsduXc^-iMFS>*}ZcEl zhIRyoi)BYh{5rclLpuU|EIUFY+1cfxb_DoXc7z1Ak01|ja58^bc7(##*yW*i1pcw? z2tlxoAP==8z{j#96wAgg549t}$Fd^?);5AXbbJ9HY)A0^e-BLcm!1Ddn)&~K6U9j2 z32VI{we5&i0y{#ZO&I$DP}_Em*bx$AGJ-tRjsQo?j?lmoW_gBo1cseuM+mx$U7n#G z0X~);p=d95d8i!$K9(J!@Go{g)Q-SEmK`BTuo3ivfrjl7@UiR&!Gw*#huRU~W7!dk P4rAAg+7aM`?a2QC>~Q&g From a442d3d952d811bca35de756cbd1deef51eb8150 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 19:35:27 +0100 Subject: [PATCH 183/350] Migration for #508 --- .../2016_12_28_203205_changes_for_v431.php | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/database/migrations/2016_12_28_203205_changes_for_v431.php b/database/migrations/2016_12_28_203205_changes_for_v431.php index 45763acc4a..ad640bf06c 100644 --- a/database/migrations/2016_12_28_203205_changes_for_v431.php +++ b/database/migrations/2016_12_28_203205_changes_for_v431.php @@ -22,6 +22,27 @@ class ChangesForV431 extends Migration */ public function down() { + // reinstate "repeats" and "repeat_freq". + Schema::table( + 'budget_limits', function (Blueprint $table) { + $table->string('repeat_freq', 30); + $table->boolean('repeats')->default(0); + } + ); + // remove date field "end_date" + Schema::table( + 'budget_limits', function (Blueprint $table) { + $table->dropColumn('end_date'); + } + ); + + // change field "start_date" to "startdate" + Schema::table( + 'budget_limits', function (Blueprint $table) { + $table->renameColumn('startdate', 'start_date'); + } + ); + } /** @@ -38,5 +59,27 @@ class ChangesForV431 extends Migration } ); + // change field "startdate" to "start_date" + Schema::table( + 'budget_limits', function (Blueprint $table) { + $table->renameColumn('startdate', 'start_date'); + } + ); + + // add date field "end_date" after "start_date" + Schema::table( + 'budget_limits', function (Blueprint $table) { + $table->date('end_date')->nullable()->after('start_date'); + } + ); + + // drop "repeats" and "repeat_freq". + Schema::table( + 'budget_limits', function (Blueprint $table) { + $table->dropColumn('repeats'); + $table->dropColumn('repeat_freq'); + } + ); + } } From 6a13dd317d98dcbf67fe9ec9c514675f6130231b Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 20:19:20 +0100 Subject: [PATCH 184/350] Will also upgrade database. #508 --- app/Console/Commands/UpgradeDatabase.php | 27 ++++++++++++++++++- .../2016_12_28_203205_changes_for_v431.php | 24 ++++++++++++----- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/app/Console/Commands/UpgradeDatabase.php b/app/Console/Commands/UpgradeDatabase.php index a526e31a5a..7b3e905b88 100644 --- a/app/Console/Commands/UpgradeDatabase.php +++ b/app/Console/Commands/UpgradeDatabase.php @@ -15,6 +15,8 @@ namespace FireflyIII\Console\Commands; use DB; +use FireflyIII\Models\BudgetLimit; +use FireflyIII\Models\LimitRepetition; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use Illuminate\Console\Command; @@ -57,6 +59,29 @@ class UpgradeDatabase extends Command public function handle() { $this->setTransactionIdentifier(); + $this->migrateRepetitions(); + } + + private function migrateRepetitions() + { + if (!Schema::hasTable('budget_limits')) { + return; + } + // get all budget limits with end_date NULL + $set = BudgetLimit::whereNull('end_date')->get(); + $this->line(sprintf('Found %d budget limit(s) to update', $set->count())); + /** @var BudgetLimit $budgetLimit */ + foreach ($set as $budgetLimit) { + // get limit repetition (should be just one): + /** @var LimitRepetition $repetition */ + $repetition = $budgetLimit->limitrepetitions()->first(); + if (!is_null($repetition)) { + $budgetLimit->end_date = $repetition->enddate; + $budgetLimit->save(); + $this->line(sprintf('Updated budget limit #%d', $budgetLimit->id)); + $repetition->delete(); + } + } } /** @@ -83,7 +108,7 @@ class UpgradeDatabase extends Command $journalIds = array_unique($result->pluck('id')->toArray()); foreach ($journalIds as $journalId) { - $this->updateJournal($journalId); + $this->updateJournal(intval($journalId)); } } diff --git a/database/migrations/2016_12_28_203205_changes_for_v431.php b/database/migrations/2016_12_28_203205_changes_for_v431.php index ad640bf06c..310ccac5a8 100644 --- a/database/migrations/2016_12_28_203205_changes_for_v431.php +++ b/database/migrations/2016_12_28_203205_changes_for_v431.php @@ -25,10 +25,16 @@ class ChangesForV431 extends Migration // reinstate "repeats" and "repeat_freq". Schema::table( 'budget_limits', function (Blueprint $table) { - $table->string('repeat_freq', 30); + $table->string('repeat_freq', 30)->nullable(); + } + ); + Schema::table( + 'budget_limits', function (Blueprint $table) { $table->boolean('repeats')->default(0); } ); + + // remove date field "end_date" Schema::table( 'budget_limits', function (Blueprint $table) { @@ -37,11 +43,11 @@ class ChangesForV431 extends Migration ); // change field "start_date" to "startdate" - Schema::table( - 'budget_limits', function (Blueprint $table) { - $table->renameColumn('startdate', 'start_date'); - } - ); +// Schema::table( +// 'budget_limits', function (Blueprint $table) { +// $table->renameColumn('startdate', 'start_date'); +// } +// ); } @@ -77,9 +83,15 @@ class ChangesForV431 extends Migration Schema::table( 'budget_limits', function (Blueprint $table) { $table->dropColumn('repeats'); + + } + ); + Schema::table( + 'budget_limits', function (Blueprint $table) { $table->dropColumn('repeat_freq'); } ); + } } From 3f802fe27a0be8aa53e171f94b0112292e80c13b Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 20:48:12 +0100 Subject: [PATCH 185/350] Removed limit repetition events #508 --- app/Events/StoredBudgetLimit.php | 50 ------------ app/Events/UpdatedBudgetLimit.php | 50 ------------ app/Handlers/Events/BudgetEventHandler.php | 93 ---------------------- app/Providers/EventServiceProvider.php | 10 --- 4 files changed, 203 deletions(-) delete mode 100644 app/Events/StoredBudgetLimit.php delete mode 100644 app/Events/UpdatedBudgetLimit.php delete mode 100644 app/Handlers/Events/BudgetEventHandler.php diff --git a/app/Events/StoredBudgetLimit.php b/app/Events/StoredBudgetLimit.php deleted file mode 100644 index 65b7be0008..0000000000 --- a/app/Events/StoredBudgetLimit.php +++ /dev/null @@ -1,50 +0,0 @@ -budgetLimit = $budgetLimit; - $this->end = $end; - - } - -} diff --git a/app/Events/UpdatedBudgetLimit.php b/app/Events/UpdatedBudgetLimit.php deleted file mode 100644 index 3642531e75..0000000000 --- a/app/Events/UpdatedBudgetLimit.php +++ /dev/null @@ -1,50 +0,0 @@ -budgetLimit = $budgetLimit; - $this->end = $end; - - } - -} diff --git a/app/Handlers/Events/BudgetEventHandler.php b/app/Handlers/Events/BudgetEventHandler.php deleted file mode 100644 index 2acc5a29d9..0000000000 --- a/app/Handlers/Events/BudgetEventHandler.php +++ /dev/null @@ -1,93 +0,0 @@ -processRepetitionChange($budgetLimitEvent->budgetLimit, $budgetLimitEvent->end); - } - - /** - * Updates, if present the budget limit repetition part of a budget limit. - * - * @param UpdatedBudgetLimit $budgetLimitEvent - * - * @return bool - */ - public function updateRepetition(UpdatedBudgetLimit $budgetLimitEvent): bool - { - return $this->processRepetitionChange($budgetLimitEvent->budgetLimit, $budgetLimitEvent->end); - } - - /** - * @param BudgetLimit $budgetLimit - * @param Carbon $date - * - * @return bool - */ - private function processRepetitionChange(BudgetLimit $budgetLimit, Carbon $date): bool - { - $set = $budgetLimit->limitrepetitions() - ->where('startdate', $budgetLimit->startdate->format('Y-m-d 00:00:00')) - ->where('enddate', $date->format('Y-m-d 00:00:00')) - ->get(); - if ($set->count() == 0) { - $repetition = new LimitRepetition; - $repetition->startdate = $budgetLimit->startdate; - $repetition->enddate = $date; - $repetition->amount = $budgetLimit->amount; - $repetition->budgetLimit()->associate($budgetLimit); - - try { - $repetition->save(); - } catch (QueryException $e) { - Log::error('Trying to save new LimitRepetition failed: ' . $e->getMessage()); - } - } - - if ($set->count() == 1) { - $repetition = $set->first(); - $repetition->amount = $budgetLimit->amount; - $repetition->save(); - - } - - return true; - } -} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 61e41f8342..19d79a9fd6 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -45,16 +45,6 @@ class EventServiceProvider extends ServiceProvider 'FireflyIII\Events\RequestedNewPassword' => [ // is a User related event. 'FireflyIII\Handlers\Events\UserEventHandler@sendNewPassword', ], - 'FireflyIII\Events\StoredBudgetLimit' => // is a Budget related event. - [ - 'FireflyIII\Handlers\Events\BudgetEventHandler@storeRepetition', - ], - - 'FireflyIII\Events\UpdatedBudgetLimit' => // is a Budget related event. - [ - 'FireflyIII\Handlers\Events\BudgetEventHandler@updateRepetition', - ], - 'FireflyIII\Events\StoredTransactionJournal' => // is a Transaction Journal related event. [ 'FireflyIII\Handlers\Events\StoredJournalEventHandler@scanBills', From a58cd83ea717e79557fcc5b007a84993119ad5fd Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 20:48:33 +0100 Subject: [PATCH 186/350] Fixed routes and budgets.index #508 --- app/Http/Controllers/BudgetController.php | 29 ++++++++------- app/Models/BudgetLimit.php | 6 ++-- app/Repositories/Budget/BudgetRepository.php | 36 +++++++++++++++---- .../Budget/BudgetRepositoryInterface.php | 11 ++++++ resources/views/budgets/index.twig | 18 +++++----- routes/web.php | 4 +-- 6 files changed, 69 insertions(+), 35 deletions(-) diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index 303c6ac578..0f4cf2dd50 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -21,6 +21,7 @@ use FireflyIII\Http\Requests\BudgetFormRequest; use FireflyIII\Http\Requests\BudgetIncomeRequest; use FireflyIII\Models\AccountType; use FireflyIII\Models\Budget; +use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\LimitRepetition; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; @@ -407,24 +408,22 @@ class BudgetController extends Controller 'budgeted' => '0', 'currentRep' => false, ]; - $allRepetitions = $this->repository->getAllBudgetLimitRepetitions($start, $end); - $otherRepetitions = new Collection; + $budgetLimits = $this->repository->getBudgetLimits($budget, $start, $end); + $otherLimits = new Collection; - // get all the limit repetitions relevant between start and end and examine them: - /** @var LimitRepetition $repetition */ - foreach ($allRepetitions as $repetition) { - if ($repetition->budget_id == $budget->id) { - if ($repetition->startdate->isSameDay($start) && $repetition->enddate->isSameDay($end) - ) { - $return[$budgetId]['currentRep'] = $repetition; - $return[$budgetId]['budgeted'] = $repetition->amount; - continue; - } - // otherwise it's just one of the many relevant repetitions: - $otherRepetitions->push($repetition); + // get all the budget limits relevant between start and end and examine them: + /** @var BudgetLimit $limit */ + foreach ($budgetLimits as $limit) { + if ($limit->start_date->isSameDay($start) && $limit->end_date->isSameDay($end) + ) { + $return[$budgetId]['currentLimit'] = $limit; + $return[$budgetId]['budgeted'] = $limit->amount; + continue; } + // otherwise it's just one of the many relevant repetitions: + $otherLimits->push($limit); } - $return[$budgetId]['otherRepetitions'] = $otherRepetitions; + $return[$budgetId]['otherLimits'] = $otherLimits; } return $return; diff --git a/app/Models/BudgetLimit.php b/app/Models/BudgetLimit.php index 622ad9bbc7..b606529277 100644 --- a/app/Models/BudgetLimit.php +++ b/app/Models/BudgetLimit.php @@ -32,12 +32,12 @@ class BudgetLimit extends Model = [ 'created_at' => 'date', 'updated_at' => 'date', - 'startdate' => 'date', + 'start_date' => 'date', + 'end_date' => 'date', 'repeats' => 'boolean', ]; /** @var array */ - protected $dates = ['created_at', 'updated_at']; - protected $hidden = ['amount_encrypted']; + protected $dates = ['created_at', 'updated_at','start_date','end_date']; /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index 92645343aa..6864013e58 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -14,8 +14,6 @@ declare(strict_types = 1); namespace FireflyIII\Repositories\Budget; use Carbon\Carbon; -use FireflyIII\Events\StoredBudgetLimit; -use FireflyIII\Events\UpdatedBudgetLimit; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\AvailableBudget; use FireflyIII\Models\Budget; @@ -248,6 +246,36 @@ class BudgetRepository implements BudgetRepositoryInterface return $amount; } + /** + * @param Budget $budget + * @param Carbon $start + * @param Carbon $end + * + * @return Collection + */ + public function getBudgetLimits(Budget $budget, Carbon $start, Carbon $end): Collection + { + $set = $budget->budgetLimits() + ->where( + function (Builder $q1) use ($start, $end) { + $q1->where( + function (Builder $q2) use ($start, $end) { + $q2->where('budget_limits.end_date', '>=', $start->format('Y-m-d 00:00:00')); + $q2->where('budget_limits.end_date', '<=', $end->format('Y-m-d 00:00:00')); + } + ) + ->orWhere( + function (Builder $q3) use ($start, $end) { + $q3->where('budget_limits.start_date', '>=', $start->format('Y-m-d 00:00:00')); + $q3->where('budget_limits.start_date', '<=', $end->format('Y-m-d 00:00:00')); + } + ); + } + )->get(); + + return $set; + } + /** * This method is being used to generate the budget overview in the year/multi-year report. Its used * in both the year/multi-year budget overview AND in the accompanying chart. @@ -603,9 +631,6 @@ class BudgetRepository implements BudgetRepositoryInterface $limit->amount = $amount; $limit->save(); - // fire event to create or update LimitRepetition. - event(new UpdatedBudgetLimit($limit, $end)); - return $limit; } @@ -617,7 +642,6 @@ class BudgetRepository implements BudgetRepositoryInterface $limit->repeat_freq = $repeatFreq; $limit->repeats = 0; $limit->save(); - event(new StoredBudgetLimit($limit, $end)); // likewise, there should be a limit repetition to match the end date diff --git a/app/Repositories/Budget/BudgetRepositoryInterface.php b/app/Repositories/Budget/BudgetRepositoryInterface.php index 8d04c7bff6..7fb856f0e2 100644 --- a/app/Repositories/Budget/BudgetRepositoryInterface.php +++ b/app/Repositories/Budget/BudgetRepositoryInterface.php @@ -84,6 +84,8 @@ interface BudgetRepositoryInterface public function getActiveBudgets(): Collection; /** + * @deprecated + * * @param Carbon $start * @param Carbon $end * @@ -100,6 +102,15 @@ interface BudgetRepositoryInterface */ public function getAvailableBudget(TransactionCurrency $currency, Carbon $start, Carbon $end): string; + /** + * @param Budget $budget + * @param Carbon $start + * @param Carbon $end + * + * @return Collection + */ + public function getBudgetLimits(Budget $budget, Carbon $start, Carbon $end): Collection; + /** * * @param Collection $budgets diff --git a/resources/views/budgets/index.twig b/resources/views/budgets/index.twig index f837687845..f1aa8a889a 100644 --- a/resources/views/budgets/index.twig +++ b/resources/views/budgets/index.twig @@ -90,8 +90,8 @@

- {% if budgetInformation[budget.id]['currentRep'] %} - {{ budget.name }} {% else %} {{ budget.name }} @@ -123,8 +123,8 @@
{{ defaultCurrency.symbol|raw }}
- {% if budgetInformation[budget.id]['currentRep'] %} - {% set repAmount = budgetInformation[budget.id]['currentRep'].amount %} + {% if budgetInformation[budget.id]['currentLimit'] %} + {% set repAmount = budgetInformation[budget.id]['currentLimit'].amount %} {% else %} {% set repAmount = '0' %} {% endif %} @@ -147,18 +147,18 @@ {{ budgetInformation[budget.id]['spent']|formatAmount }} - {% if budgetInformation[budget.id]['otherRepetitions'].count > 0 %} + {% if budgetInformation[budget.id]['otherLimits'].count > 0 %}
    - {% for other in budgetInformation[budget.id]['otherRepetitions'] %} + {% for other in budgetInformation[budget.id]['otherLimits'] %}
  • Budgeted - {{ other.amount|formatAmountPlain }} + {{ other.amount|formatAmountPlain }} between - {{ other.startdate.formatLocalized(monthAndDayFormat) }} - and {{ other.enddate.formatLocalized(monthAndDayFormat) }}. + {{ other.start_date.formatLocalized(monthAndDayFormat) }} + and {{ other.end_date.formatLocalized(monthAndDayFormat) }}.
  • {% endfor %}
diff --git a/routes/web.php b/routes/web.php index d619a909bb..8b50c86560 100755 --- a/routes/web.php +++ b/routes/web.php @@ -144,7 +144,7 @@ Route::group( Route::get('edit/{budget}', ['uses' => 'BudgetController@edit', 'as' => 'edit']); Route::get('delete/{budget}', ['uses' => 'BudgetController@delete', 'as' => 'delete']); Route::get('show/{budget}', ['uses' => 'BudgetController@show', 'as' => 'show']); - Route::get('show/{budget}/{limitrepetition}', ['uses' => 'BudgetController@showByRepetition', 'as' => 'show.repetition']); + Route::get('show/{budget}/{budgetlimit}', ['uses' => 'BudgetController@showByBudgetLimit', 'as' => 'show.limit']); Route::get('list/no-budget', ['uses' => 'BudgetController@noBudget', 'as' => 'no-budget']); Route::post('income', ['uses' => 'BudgetController@postUpdateIncome', 'as' => 'income.post']); @@ -250,7 +250,7 @@ Route::group( Route::get('frontpage', ['uses' => 'BudgetController@frontpage', 'as' => 'frontpage']); Route::get('period/0/{accountList}/{start_date}/{end_date}', ['uses' => 'BudgetController@periodNoBudget', 'as' => 'period.no-budget']); Route::get('period/{budget}/{accountList}/{start_date}/{end_date}', ['uses' => 'BudgetController@period', 'as' => 'period']); - Route::get('budget/{budget}/{limitrepetition}', ['uses' => 'BudgetController@budgetLimit', 'as' => 'budget-limit']); + Route::get('budget/{budget}/{budgetlimit}', ['uses' => 'BudgetController@budgetLimit', 'as' => 'budget-limit']); Route::get('budget/{budget}', ['uses' => 'BudgetController@budget', 'as' => 'budget']); From 497400587dd53919dfef387f03f952fd8d09df31 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 20:52:02 +0100 Subject: [PATCH 187/350] Update budget limit #508 --- app/Http/Controllers/BudgetController.php | 7 +++--- app/Repositories/Budget/BudgetRepository.php | 25 +++++++------------ .../Budget/BudgetRepositoryInterface.php | 3 +-- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index 0f4cf2dd50..aedb331883 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -78,14 +78,13 @@ class BudgetController extends Controller $start = session('start', Carbon::now()->startOfMonth()); /** @var Carbon $end */ $end = session('end', Carbon::now()->endOfMonth()); - $viewRange = Preferences::get('viewRange', '1M')->data; - $limitRepetition = $repository->updateLimitAmount($budget, $start, $end, $viewRange, $amount); + $budgetLimit = $repository->updateLimitAmount($budget, $start, $end, $amount); if ($amount == 0) { - $limitRepetition = null; + $budgetLimit = null; } Preferences::mark(); - return Response::json(['name' => $budget->name, 'repetition' => $limitRepetition ? $limitRepetition->id : 0, 'amount' => $amount]); + return Response::json(['name' => $budget->name, 'limit' => $budgetLimit ? $budgetLimit->id : 0, 'amount' => $amount]); } diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index 6864013e58..0188612250 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -606,19 +606,18 @@ class BudgetRepository implements BudgetRepositoryInterface * @param Budget $budget * @param Carbon $start * @param Carbon $end - * @param string $range * @param int $amount * * @return BudgetLimit */ - public function updateLimitAmount(Budget $budget, Carbon $start, Carbon $end, string $range, int $amount): BudgetLimit + public function updateLimitAmount(Budget $budget, Carbon $start, Carbon $end, int $amount): BudgetLimit { - // there might be a budget limit for this startdate: - $repeatFreq = config('firefly.range_to_repeat_freq.' . $range); + // there might be a budget limit for these dates: /** @var BudgetLimit $limit */ $limit = $budget->budgetlimits() - ->where('budget_limits.startdate', $start) - ->where('budget_limits.repeat_freq', $repeatFreq)->first(['budget_limits.*']); + ->where('budget_limits.start_date', $start->format('Y-m-d')) + ->where('budget_limits.end_date', $end->format('Y-m-d')) + ->first(['budget_limits.*']); // delete if amount is zero. if (!is_null($limit) && $amount <= 0.0) { @@ -634,20 +633,14 @@ class BudgetRepository implements BudgetRepositoryInterface return $limit; } - // create one and return it. + // or create one and return it. $limit = new BudgetLimit; $limit->budget()->associate($budget); - $limit->startdate = $start; - $limit->amount = $amount; - $limit->repeat_freq = $repeatFreq; - $limit->repeats = 0; + $limit->start_date = $start; + $limit->end_date = $end; + $limit->amount = $amount; $limit->save(); - - // likewise, there should be a limit repetition to match the end date - // (which is always the end of the month) but that is caught by an event. - // so handled automatically. - return $limit; } } diff --git a/app/Repositories/Budget/BudgetRepositoryInterface.php b/app/Repositories/Budget/BudgetRepositoryInterface.php index 7fb856f0e2..eed24b1da4 100644 --- a/app/Repositories/Budget/BudgetRepositoryInterface.php +++ b/app/Repositories/Budget/BudgetRepositoryInterface.php @@ -189,11 +189,10 @@ interface BudgetRepositoryInterface * @param Budget $budget * @param Carbon $start * @param Carbon $end - * @param string $range * @param int $amount * * @return BudgetLimit */ - public function updateLimitAmount(Budget $budget, Carbon $start, Carbon $end, string $range, int $amount): BudgetLimit; + public function updateLimitAmount(Budget $budget, Carbon $start, Carbon $end, int $amount): BudgetLimit; } From 13f6bd759b8db40cbc28effdf4aed03f3b7e83f2 Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 30 Dec 2016 07:39:42 +0100 Subject: [PATCH 188/350] Views must pick up on this #508 --- app/Http/Controllers/BudgetController.php | 42 ++++++++++++----------- app/Http/breadcrumbs.php | 17 ++++++--- app/Models/BudgetLimit.php | 28 ++++++++++++--- config/firefly.php | 1 + resources/views/budgets/show.twig | 15 ++++---- 5 files changed, 68 insertions(+), 35 deletions(-) diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index aedb331883..82030bb7bf 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -22,7 +22,6 @@ use FireflyIII\Http\Requests\BudgetIncomeRequest; use FireflyIII\Models\AccountType; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; -use FireflyIII\Models\LimitRepetition; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use Illuminate\Http\Request; @@ -77,7 +76,7 @@ class BudgetController extends Controller /** @var Carbon $start */ $start = session('start', Carbon::now()->startOfMonth()); /** @var Carbon $end */ - $end = session('end', Carbon::now()->endOfMonth()); + $end = session('end', Carbon::now()->endOfMonth()); $budgetLimit = $repository->updateLimitAmount($budget, $start, $end, $amount); if ($amount == 0) { $budgetLimit = null; @@ -263,13 +262,13 @@ class BudgetController extends Controller $journals->setPath('/budgets/show/' . $budget->id); - $set = $budget->limitrepetitions()->orderBy('startdate', 'DESC')->get(); + $set = $budget->budgetlimits()->orderBy('start_date', 'DESC')->get(); $subTitle = e($budget->name); $limits = new Collection(); - /** @var LimitRepetition $entry */ + /** @var BudgetLimit $entry */ foreach ($set as $entry) { - $entry->spent = $repository->spentInPeriod(new Collection([$budget]), $accounts, $entry->startdate, $entry->enddate); + $entry->spent = $repository->spentInPeriod(new Collection([$budget]), $accounts, $entry->start_date, $entry->end_date); $limits->push($entry); } @@ -277,16 +276,17 @@ class BudgetController extends Controller } /** - * @param Request $request - * @param Budget $budget - * @param LimitRepetition $repetition + * @param Request $request + * @param Budget $budget + * @param BudgetLimit $budgetLimit * * @return View * @throws FireflyException */ - public function showByRepetition(Request $request, Budget $budget, LimitRepetition $repetition) + public function showByBudgetLimit(Request $request, Budget $budget, BudgetLimit $budgetLimit) { - if ($repetition->budgetLimit->budget->id != $budget->id) { + if ($budgetLimit->budget->id + != $budget->id) { throw new FireflyException('This budget limit is not part of this budget.'); } @@ -294,28 +294,30 @@ class BudgetController extends Controller $repository = app(BudgetRepositoryInterface::class); /** @var AccountRepositoryInterface $accountRepository */ $accountRepository = app(AccountRepositoryInterface::class); - $start = $repetition->startdate; - $end = $repetition->enddate; $page = intval($request->get('page')) == 0 ? 1 : intval($request->get('page')); $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); $subTitle = trans( - 'firefly.budget_in_month', ['name' => $budget->name, 'month' => $repetition->startdate->formatLocalized($this->monthFormat)] + 'firefly.budget_in_period', [ + 'name' => $budget->name, + 'start' => $budgetLimit->start_date->formatLocalized($this->monthAndDayFormat), + 'end' => $budgetLimit->end_date->formatLocalized($this->monthAndDayFormat), + ] ); $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET, AccountType::CASH]); - // collector: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class, [auth()->user()]); - $collector->setAllAssetAccounts()->setRange($start, $end)->setBudget($budget)->setLimit($pageSize)->setPage($page)->withCategoryInformation(); + $collector->setAllAssetAccounts()->setRange($budgetLimit->start_date, $budgetLimit->end_date) + ->setBudget($budget)->setLimit($pageSize)->setPage($page)->withCategoryInformation(); $journals = $collector->getPaginatedJournals(); - $journals->setPath('/budgets/show/' . $budget->id . '/' . $repetition->id); + $journals->setPath('/budgets/show/' . $budget->id . '/' . $budgetLimit->id); - $repetition->spent = $repository->spentInPeriod(new Collection([$budget]), $accounts, $repetition->startdate, $repetition->enddate); - $limits = new Collection([$repetition]); + $budgetLimit->spent = $repository->spentInPeriod(new Collection([$budget]), $accounts, $budgetLimit->start_date, $budgetLimit->end_date); + $limits = new Collection([$budgetLimit]); - return view('budgets.show', compact('limits', 'budget', 'repetition', 'journals', 'subTitle')); + return view('budgets.show', compact('limits', 'budget', 'budgetLimit', 'journals', 'subTitle')); } @@ -416,7 +418,7 @@ class BudgetController extends Controller if ($limit->start_date->isSameDay($start) && $limit->end_date->isSameDay($end) ) { $return[$budgetId]['currentLimit'] = $limit; - $return[$budgetId]['budgeted'] = $limit->amount; + $return[$budgetId]['budgeted'] = $limit->amount; continue; } // otherwise it's just one of the many relevant repetitions: diff --git a/app/Http/breadcrumbs.php b/app/Http/breadcrumbs.php index f83a4b0153..e77a25f372 100644 --- a/app/Http/breadcrumbs.php +++ b/app/Http/breadcrumbs.php @@ -17,9 +17,9 @@ use FireflyIII\Models\Account; use FireflyIII\Models\Attachment; use FireflyIII\Models\Bill; use FireflyIII\Models\Budget; +use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\Category; use FireflyIII\Models\ImportJob; -use FireflyIII\Models\LimitRepetition; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\Rule; use FireflyIII\Models\RuleGroup; @@ -274,11 +274,20 @@ Breadcrumbs::register( ); Breadcrumbs::register( - 'budgets.show.repetition', function (BreadCrumbGenerator $breadcrumbs, Budget $budget, LimitRepetition $repetition) { + 'budgets.show.limit', function (BreadCrumbGenerator $breadcrumbs, Budget $budget, BudgetLimit $budgetLimit) { $breadcrumbs->parent('budgets.index'); - $breadcrumbs->push(e($budget->name), route('budgets.show.repetition', [$budget->id, $repetition->id])); + $breadcrumbs->push(e($budget->name), route('budgets.show', [$budget->id])); + + $title = trans( + 'firefly.budget_in_period_breadcrumb', [ + 'name' => $budget->name, + 'start' => $budgetLimit->start_date->formatLocalized(strval(trans('config.month_and_day'))), + 'end' => $budgetLimit->end_date->formatLocalized(strval(trans('config.month_and_day'))), + ] + ); + $breadcrumbs->push( - Navigation::periodShow($repetition->startdate, $repetition->budgetLimit->repeat_freq), route('budgets.show', [$budget->id, $repetition->id]) + $title, route('budgets.show.limit', [$budget->id, $budgetLimit->id]) ); } ); diff --git a/app/Models/BudgetLimit.php b/app/Models/BudgetLimit.php index b606529277..c1153028d8 100644 --- a/app/Models/BudgetLimit.php +++ b/app/Models/BudgetLimit.php @@ -14,6 +14,7 @@ declare(strict_types = 1); namespace FireflyIII\Models; use Illuminate\Database\Eloquent\Model; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Class BudgetLimit @@ -29,15 +30,34 @@ class BudgetLimit extends Model * @var array */ protected $casts - = [ + = [ 'created_at' => 'date', 'updated_at' => 'date', - 'start_date' => 'date', - 'end_date' => 'date', + 'start_date' => 'date', + 'end_date' => 'date', 'repeats' => 'boolean', ]; /** @var array */ - protected $dates = ['created_at', 'updated_at','start_date','end_date']; + protected $dates = ['created_at', 'updated_at', 'start_date', 'end_date']; + + /** + * @param $value + * + * @return mixed + */ + public static function routeBinder($value) + { + if (auth()->check()) { + $object = self::where('budget_limits.id', $value) + ->leftJoin('budgets', 'budgets.id', '=', 'budget_limits.budget_id') + ->where('budgets.user_id', auth()->user()->id) + ->first(['budget_limits.*']); + if ($object) { + return $object; + } + } + throw new NotFoundHttpException; + } /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo diff --git a/config/firefly.php b/config/firefly.php index 402ea01558..1cba0ac243 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -149,6 +149,7 @@ return [ 'transaction_type' => 'FireflyIII\Models\TransactionType', 'currency' => 'FireflyIII\Models\TransactionCurrency', 'limitrepetition' => 'FireflyIII\Models\LimitRepetition', + 'budgetlimit' => 'FireflyIII\Models\BudgetLimit', 'piggyBank' => 'FireflyIII\Models\PiggyBank', 'tj' => 'FireflyIII\Models\TransactionJournal', 'unfinishedJournal' => 'FireflyIII\Support\Binder\UnfinishedJournal', diff --git a/resources/views/budgets/show.twig b/resources/views/budgets/show.twig index 85f8c12f7c..fc7e71c7b5 100644 --- a/resources/views/budgets/show.twig +++ b/resources/views/budgets/show.twig @@ -1,7 +1,7 @@ {% extends "./layout/default" %} {% block breadcrumbs %} - {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, budget, repetition) }} + {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, budget, budgetLimit) }} {% endblock %} {% block content %} @@ -45,7 +45,10 @@

{{ limit.startdate.formatLocalized(monthFormat) }} + href="{{ route('budgets.show.limit',[budget.id,limit.id]) }}"> + {{ limit.start_date.formatLocalized(monthAndDayFormat) }} — + {{ limit.end_date.formatLocalized(monthAndDayFormat) }} +

@@ -93,12 +96,10 @@ {% block scripts %} - - + + {% endblock %} diff --git a/resources/views/tags/edit.twig b/resources/views/tags/edit.twig index e6a089d269..d427e05273 100644 --- a/resources/views/tags/edit.twig +++ b/resources/views/tags/edit.twig @@ -59,12 +59,13 @@ {% block scripts %} - - + + {% endblock %} From f797344106df55e032bc7a35866cc2d1f029231c Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 12:15:33 +0100 Subject: [PATCH 264/350] Default values [skip ci] --- resources/views/tags/edit.twig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/views/tags/edit.twig b/resources/views/tags/edit.twig index d427e05273..99366b5546 100644 --- a/resources/views/tags/edit.twig +++ b/resources/views/tags/edit.twig @@ -61,7 +61,7 @@ {% if Input.old('latitude') %} var latitude = {{ Input.old('latitude') }}; {% else %} - var latitude = {{ tag.latitude }}; + var latitude = {{ tag.latitude|default("52.3167") }}; {% endif %} {% if (Input.old('latitude') and Input.old('longitude') and Input.old('zoomLevel')) @@ -74,13 +74,13 @@ {% if Input.old('longitude') %} var longitude = "{{ Input.old('longitude') }}"; {% else %} - var longitude = {{ tag.longitude }}; + var longitude = {{ tag.longitude|default("5.5500") }}; {% endif %} {% if Input.old('zoomLevel') %} var zoomLevel = {{ Input.old('zoomLevel') }}; {% else %} - var zoomLevel = {{ tag.zoomLevel }}; + var zoomLevel = {{ tag.zoomLevel|default("6") }}; {% endif %} var apiKey = "{{ apiKey }}"; From 800478d437b50a1bdd8212dcf4bf0e7434f7ef18 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 12:18:18 +0100 Subject: [PATCH 265/350] Add support for Polish #517 [skip ci] --- config/firefly.php | 1 + 1 file changed, 1 insertion(+) diff --git a/config/firefly.php b/config/firefly.php index 1cba0ac243..7b4632912e 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -118,6 +118,7 @@ return [ 'fr_FR' => ['name_locale' => 'Français', 'name_english' => 'French', 'complete' => false], 'hr_HR' => ['name_locale' => 'hrvatski', 'name_english' => 'Croatian', 'complete' => false], 'nl_NL' => ['name_locale' => 'Nederlands', 'name_english' => 'Dutch', 'complete' => true], + 'pl_PL' => ['name_locale' => 'Polski', 'name_english' => 'Polish ', 'complete' => false], 'pt_BR' => ['name_locale' => 'Português do Brasil', 'name_english' => 'Portuguese (Brazil)', 'complete' => true], 'ru-RU' => ['name_locale' => 'Russian', 'name_english' => 'Russian', 'complete' => false], 'zh-HK' => ['name_locale' => '繁體中文(香港)', 'name_english' => 'Chinese Traditional, Hong Kong', 'complete' => false], From dcd89d38e759337da4f8b1a81062a287daef480d Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 12:18:29 +0100 Subject: [PATCH 266/350] Small JS fixes [skip ci] --- public/js/ff/tags/create-edit.js | 10 ++++------ public/js/ff/transactions/create.js | 4 +++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/js/ff/tags/create-edit.js b/public/js/ff/tags/create-edit.js index 9670302e30..397f49ccef 100644 --- a/public/js/ff/tags/create-edit.js +++ b/public/js/ff/tags/create-edit.js @@ -1,13 +1,11 @@ /* - * edit.js - * Copyright (C) 2016 thegrumpydictator@gmail.com - * - * This software may be modified and distributed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International License. + * create-edit.js + * Copyright (c) 2017 thegrumpydictator@gmail.com + * This software may be modified and distributed under the terms of the Creative Commons Attribution-ShareAlike 4.0 International License. * * See the LICENSE file for details. */ -/** global: zoomLevel, latitude, longitude, google, apiKey */ +/** global: zoomLevel, latitude, longitude, google, apiKey, doPlaceMarker */ $(function () { "use strict"; diff --git a/public/js/ff/transactions/create.js b/public/js/ff/transactions/create.js index 9c006e305e..aaed65207a 100644 --- a/public/js/ff/transactions/create.js +++ b/public/js/ff/transactions/create.js @@ -79,7 +79,6 @@ function updateForm() { } break; - default: case 'transfer': // show source_id and dest_id: $('#source_account_id_holder').show(); @@ -98,6 +97,9 @@ function updateForm() { $('#piggy_bank_id_holder').show(); } break; + default: + // no action. + break; } } From 090546cda370ff1867fe2b70fba1d431af30e9f2 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 12:21:43 +0100 Subject: [PATCH 267/350] New translations --- resources/lang/pl_PL/firefly.php | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 8b0721902b..3beb705346 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -11,26 +11,26 @@ return [ // general stuff: - 'language_incomplete' => 'incomplete translation', - 'close' => 'Close', - 'actions' => 'Actions', - 'edit' => 'Edit', - 'delete' => 'Delete', - 'welcomeBack' => 'What\'s playing?', - 'everything' => 'Everything', + 'language_incomplete' => 'niepełne tłumaczenie', + 'close' => 'Zamknij', + 'actions' => 'Akcje', + 'edit' => 'Modyfikuj', + 'delete' => 'Usuń', + 'welcomeBack' => 'Co jest grane?', + 'everything' => 'Wszystko', 'customRange' => 'Custom range', - 'apply' => 'Apply', - 'cancel' => 'Cancel', - 'from' => 'From', - 'to' => 'To', - 'showEverything' => 'Show everything', - 'never' => 'Never', - 'search_results_for' => 'Search results for ":query"', - 'bounced_error' => 'The message sent to :email bounced, so no access for you.', + 'apply' => 'Zastosuj', + 'cancel' => 'Anuluj', + 'from' => 'Z', + 'to' => 'Do', + 'showEverything' => 'Pokaż wszystko', + 'never' => 'Nigdy', + 'search_results_for' => 'Wyniki wyszukiwania dla ":query"', + 'bounced_error' => 'Wiadomość wysłana na adres :email została odrzucona, więc nie ma dostępu dla Ciebie.', 'deleted_error' => 'These credentials do not match our records.', 'general_blocked_error' => 'Your account has been disabled, so you cannot login.', 'expired_error' => 'Your account has expired, and can no longer be used.', - 'removed_amount' => 'Removed :amount', + 'removed_amount' => 'Usunięto :amount', 'added_amount' => 'Added :amount', 'asset_account_role_help' => 'Any extra options resulting from your choice can be set later.', 'Opening balance' => 'Opening balance', From 8f7541b84151a7bfa767009f31d8078a14970e01 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 12:21:45 +0100 Subject: [PATCH 268/350] New translations --- resources/lang/pl_PL/config.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lang/pl_PL/config.php b/resources/lang/pl_PL/config.php index 58220429bf..51c1793191 100644 --- a/resources/lang/pl_PL/config.php +++ b/resources/lang/pl_PL/config.php @@ -10,12 +10,12 @@ */ return [ - 'locale' => 'en, English, en_US, en_US.utf8', + 'locale' => 'pl, Polski, pl_PL, pl_PL.utf8', 'month' => '%B %Y', 'month_and_day' => '%B %e, %Y', 'date_time' => '%B %e, %Y, @ %T', 'specific_day' => '%e %B %Y', - 'week_in_year' => 'Week %W, %Y', + 'week_in_year' => 'Tydzień %W, %Y', 'quarter_of_year' => '%B %Y', 'year' => '%Y', 'half_year' => '%B %Y', From 1818a596fe141303e251af59eb6afade259c996c Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 12:21:47 +0100 Subject: [PATCH 269/350] Translated --- resources/lang/pl_PL/breadcrumbs.php | 54 ++++++++++++++-------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/resources/lang/pl_PL/breadcrumbs.php b/resources/lang/pl_PL/breadcrumbs.php index 6bcf9b862d..210aab7ca0 100644 --- a/resources/lang/pl_PL/breadcrumbs.php +++ b/resources/lang/pl_PL/breadcrumbs.php @@ -11,31 +11,31 @@ */ return [ - 'home' => 'Home', - 'edit_currency' => 'Edit currency ":name"', - 'delete_currency' => 'Delete currency ":name"', - 'newPiggyBank' => 'Create a new piggy bank', - 'edit_piggyBank' => 'Edit piggy bank ":name"', - 'preferences' => 'Preferences', - 'profile' => 'Profile', - 'changePassword' => 'Change your password', - 'bills' => 'Bills', - 'newBill' => 'New bill', - 'edit_bill' => 'Edit bill ":name"', - 'delete_bill' => 'Delete bill ":name"', - 'reports' => 'Reports', - 'searchResult' => 'Search for ":query"', - 'withdrawal_list' => 'Expenses', - 'deposit_list' => 'Revenue, income and deposits', - 'transfer_list' => 'Transfers', - 'transfers_list' => 'Transfers', - 'create_withdrawal' => 'Create new withdrawal', - 'create_deposit' => 'Create new deposit', - 'create_transfer' => 'Create new transfer', - 'edit_journal' => 'Edit transaction ":description"', - 'delete_journal' => 'Delete transaction ":description"', - 'tags' => 'Tags', - 'createTag' => 'Create new tag', - 'edit_tag' => 'Edit tag ":tag"', - 'delete_tag' => 'Delete tag ":tag"', + 'home' => 'Strona główna', + 'edit_currency' => 'Modyfikuj walutę ":name"', + 'delete_currency' => 'Usuń walutę ":name"', + 'newPiggyBank' => 'Utwórz nową skarbonkę', + 'edit_piggyBank' => 'Modyfikuj skarbonkę ":name"', + 'preferences' => 'Preferencje', + 'profile' => 'Profil', + 'changePassword' => 'Zmień swoje hasło', + 'bills' => 'Rachunki', + 'newBill' => 'Nowy rachunek', + 'edit_bill' => 'Modyfikuj rachunek ":name"', + 'delete_bill' => 'Usuń rachunek ":name"', + 'reports' => 'Raporty', + 'searchResult' => 'Szukaj ":query"', + 'withdrawal_list' => 'Wydatki', + 'deposit_list' => 'Przychody, dochody oraz depozyty', + 'transfer_list' => 'Transfery', + 'transfers_list' => 'Transfery', + 'create_withdrawal' => 'Utwórz nową wypłatę', + 'create_deposit' => 'Utwórz nową wpłatę', + 'create_transfer' => 'Utwórz nowy transfer', + 'edit_journal' => 'Modyfikuj transakcję ":description"', + 'delete_journal' => 'Usuń transakcję ":description"', + 'tags' => 'Tagi', + 'createTag' => 'Utwórz nowy tag', + 'edit_tag' => 'Modyfikuj tag ":tag"', + 'delete_tag' => 'Usuń tag ":tag"', ]; \ No newline at end of file From 5bae7e9bdbd86709271dfb6f5d0c251d3e9fbd87 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 12:31:51 +0100 Subject: [PATCH 270/350] New translations --- resources/lang/pl_PL/firefly.php | 60 ++++++++++++++++---------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 3beb705346..26d5e21767 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -18,7 +18,7 @@ return [ 'delete' => 'Usuń', 'welcomeBack' => 'Co jest grane?', 'everything' => 'Wszystko', - 'customRange' => 'Custom range', + 'customRange' => 'Niestandardowy zakres', 'apply' => 'Zastosuj', 'cancel' => 'Anuluj', 'from' => 'Z', @@ -29,34 +29,34 @@ return [ 'bounced_error' => 'Wiadomość wysłana na adres :email została odrzucona, więc nie ma dostępu dla Ciebie.', 'deleted_error' => 'These credentials do not match our records.', 'general_blocked_error' => 'Your account has been disabled, so you cannot login.', - 'expired_error' => 'Your account has expired, and can no longer be used.', + 'expired_error' => 'Twoje konto wygasło i nie może być dalej używane.', 'removed_amount' => 'Usunięto :amount', - 'added_amount' => 'Added :amount', + 'added_amount' => 'Dodano :amount', 'asset_account_role_help' => 'Any extra options resulting from your choice can be set later.', - 'Opening balance' => 'Opening balance', - 'create_new_stuff' => 'Create new stuff', - 'new_withdrawal' => 'New withdrawal', - 'new_deposit' => 'New deposit', - 'new_transfer' => 'New transfer', - 'new_asset_account' => 'New asset account', - 'new_expense_account' => 'New expense account', - 'new_revenue_account' => 'New revenue account', - 'new_budget' => 'New budget', - 'new_bill' => 'New bill', - 'block_account_logout' => 'You have been logged out. Blocked accounts cannot use this site. Did you register with a valid email address?', - 'flash_success' => 'Success!', - 'flash_info' => 'Message', - 'flash_warning' => 'Warning!', - 'flash_error' => 'Error!', - 'flash_info_multiple' => 'There is one message|There are :count messages', - 'flash_error_multiple' => 'There is one error|There are :count errors', - 'net_worth' => 'Net worth', + 'Opening balance' => 'Bilans otwarcia', + 'create_new_stuff' => 'Utwórz nowe rzeczy', + 'new_withdrawal' => 'Nowa wypłata', + 'new_deposit' => 'Nowa wpłata', + 'new_transfer' => 'Nowy transfer', + 'new_asset_account' => 'Nowe konto aktywów', + 'new_expense_account' => 'Nowe konto wydatków', + 'new_revenue_account' => 'Nowe konto przychodów', + 'new_budget' => 'Nowy budżet', + 'new_bill' => 'Nowy rachunek', + 'block_account_logout' => 'Zostałeś wylogowany. Zablokowane konta nie mogą korzystać z tej strony. Czy zarejestrowałeś się z prawidłowym adresem e-mail?', + 'flash_success' => 'Sukces!', + 'flash_info' => 'Komunikat', + 'flash_warning' => 'Ostrzeżenie!', + 'flash_error' => 'Błąd!', + 'flash_info_multiple' => 'Jest jedna wiadomość|Jest :count wiadomości', + 'flash_error_multiple' => 'Jest jeden błąd|Jest :count błędów', + 'net_worth' => 'Wartość netto', 'route_has_no_help' => 'There is no help for this route.', 'help_may_not_be_your_language' => 'This help text is in English. It is not yet available in your language', - 'two_factor_welcome' => 'Hello, :user!', + 'two_factor_welcome' => 'Witaj, :user!', 'two_factor_enter_code' => 'To continue, please enter your two factor authentication code. Your application can generate it for you.', - 'two_factor_code_here' => 'Enter code here', - 'two_factor_title' => 'Two factor authentication', + 'two_factor_code_here' => 'Wprowadź tutaj kod', + 'two_factor_title' => 'Weryfikacja dwuskładnikowa', 'authenticate' => 'Authenticate', 'two_factor_forgot_title' => 'Lost two factor authentication', 'two_factor_forgot' => 'I forgot my two-factor thing.', @@ -66,12 +66,12 @@ return [ 'two_factor_lost_fix_owner' => 'Otherwise, email the site owner, :site_owner and ask them to reset your two factor authentication.', 'warning_much_data' => ':days days of data may take a while to load.', 'registered' => 'You have registered successfully!', - 'search' => 'Search', - 'search_found_accounts' => 'Found :count account(s) for your query.', - 'search_found_categories' => 'Found :count category(ies) for your query.', - 'search_found_budgets' => 'Found :count budget(s) for your query.', - 'search_found_tags' => 'Found :count tag(s) for your query.', - 'search_found_transactions' => 'Found :count transaction(s) for your query.', + 'search' => 'Szukaj', + 'search_found_accounts' => 'Znaleziono :count kont(o/a) dla twojego wyszukiwania.', + 'search_found_categories' => 'Znaleziono :count kategorii dla twojego wyszukiwania.', + 'search_found_budgets' => 'Znaleziono :count budżet(y/ów) dla twojego wyszukiwania.', + 'search_found_tags' => 'Znaleziono :count tag(i/ów) dla twojego wyszukiwania.', + 'search_found_transactions' => 'Znaleziono :count transakcji dla twojego wyszukiwania.', 'results_limited' => 'The results are limited to :count entries.', 'tagbalancingAct' => 'Balancing act', 'tagadvancePayment' => 'Advance payment', From 0c71770b1dd6ddfe52f197fdc77a1597442047ca Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 12:41:57 +0100 Subject: [PATCH 271/350] New translations --- resources/lang/pl_PL/firefly.php | 60 ++++++++++++++++---------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 26d5e21767..044698883c 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -72,17 +72,17 @@ return [ 'search_found_budgets' => 'Znaleziono :count budżet(y/ów) dla twojego wyszukiwania.', 'search_found_tags' => 'Znaleziono :count tag(i/ów) dla twojego wyszukiwania.', 'search_found_transactions' => 'Znaleziono :count transakcji dla twojego wyszukiwania.', - 'results_limited' => 'The results are limited to :count entries.', + 'results_limited' => 'Wyniki są ograniczone do :count wpisów.', 'tagbalancingAct' => 'Balancing act', 'tagadvancePayment' => 'Advance payment', 'tagnothing' => '', 'Default asset account' => 'Default asset account', 'no_budget_pointer' => 'You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.', - 'Savings account' => 'Savings account', - 'Credit card' => 'Credit card', - 'source_accounts' => 'Source account(s)', - 'destination_accounts' => 'Destination account(s)', - 'user_id_is' => 'Your user id is :user', + 'Savings account' => 'Konto oszczędnościowe', + 'Credit card' => 'Karta kredytowa', + 'source_accounts' => 'Konto(a) źródłowe', + 'destination_accounts' => 'Konto(a) docelowe', + 'user_id_is' => 'Twój id użytkownika to :user', 'field_supports_markdown' => 'This field supports Markdown.', 'need_more_help' => 'If you need more help using Firefly III, please open a ticket on Github.', 'nothing_to_display' => 'There are no transactions to show you', @@ -91,8 +91,8 @@ return [ 'expenses_by_budget' => 'Expenses by budget', 'income_by_category' => 'Income by category', 'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.', - 'sum_of_expenses' => 'Sum of expenses', - 'sum_of_income' => 'Sum of income', + 'sum_of_expenses' => 'Suma wydatków', + 'sum_of_income' => 'Suma dochodów', 'spent_in_specific_budget' => 'Spent in budget ":budget"', 'sum_of_expenses_in_budget' => 'Spent total in budget ":budget"', 'left_in_budget_limit' => 'Left to spend according to budgeting', @@ -128,16 +128,16 @@ return [ 'confirm_account_not_resent_go_home' => 'Go to the index page of Firefly', // export data: - 'import_and_export' => 'Import and export', - 'export_data' => 'Export data', + 'import_and_export' => 'Import / eksport', + 'export_data' => 'Eksportuj dane', 'export_data_intro' => 'For backup purposes, when migrating to another system or when migrating to another Firefly III installation.', - 'export_format' => 'Export format', - 'export_format_csv' => 'Comma separated values (CSV file)', - 'export_format_mt940' => 'MT940 compatible format', - 'export_included_accounts' => 'Export transactions from these accounts', + 'export_format' => 'Format eksportu', + 'export_format_csv' => 'Wartości oddzielone przecinkami (plik CSV)', + 'export_format_mt940' => 'Format kompatybilny z MT940', + 'export_included_accounts' => 'Eksportuj transakcje z tych kont', 'include_old_uploads_help' => 'Firefly III does not throw away the original CSV files you have imported in the past. You can include them in your export.', - 'do_export' => 'Export', - 'export_status_never_started' => 'The export has not started yet', + 'do_export' => 'Eksportuj', + 'export_status_never_started' => 'Eksport nie został jeszcze rozpoczęty', 'export_status_make_exporter' => 'Creating exporter thing...', 'export_status_collecting_journals' => 'Collecting your transactions...', 'export_status_collected_journals' => 'Collected your transactions!', @@ -158,21 +158,21 @@ return [ 'attachment_explanation' => 'The file called \':attachment_name\' (#:attachment_id) was originally uploaded to :type \':description\' (#:journal_id) dated :date for the amount of :amount.', // rules - 'rules' => 'Rules', + 'rules' => 'Reguły', 'rules_explanation' => 'Here you can manage rules. Rules are triggered when a transaction is created or updated. Then, if the transaction has certain properties (called "triggers") Firefly will execute the "actions". Combined, you can make Firefly respond in a certain way to new transactions.', - 'rule_name' => 'Name of rule', - 'rule_triggers' => 'Rule triggers when', - 'rule_actions' => 'Rule will', - 'new_rule' => 'New rule', - 'new_rule_group' => 'New rule group', - 'rule_priority_up' => 'Give rule more priority', - 'rule_priority_down' => 'Give rule less priority', - 'make_new_rule_group' => 'Make new rule group', - 'store_new_rule_group' => 'Store new rule group', - 'created_new_rule_group' => 'New rule group ":title" stored!', - 'updated_rule_group' => 'Successfully updated rule group ":title".', - 'edit_rule_group' => 'Edit rule group ":title"', - 'delete_rule_group' => 'Delete rule group ":title"', + 'rule_name' => 'Nazwa reguły', + 'rule_triggers' => 'Reguły są wyzwalane gdy', + 'rule_actions' => 'Reguła będzie', + 'new_rule' => 'Nowa reguła', + 'new_rule_group' => 'Nowa grupa reguł', + 'rule_priority_up' => 'Zwiększ priorytet reguły', + 'rule_priority_down' => 'Zmniejsz priorytet reguły', + 'make_new_rule_group' => 'Utwórz nową grupę reguł', + 'store_new_rule_group' => 'Zapisz nową grupę reguł', + 'created_new_rule_group' => 'Nowa grupa reguł ":title" została zapisana!', + 'updated_rule_group' => 'Pomyślnie zmodyfikowano grupę reguł ":title".', + 'edit_rule_group' => 'Modyfikuj grupę reguł ":title"', + 'delete_rule_group' => 'Usuń grupę reguł ":title"', 'deleted_rule_group' => 'Deleted rule group ":title"', 'update_rule_group' => 'Update rule group', 'no_rules_in_group' => 'There are no rules in this group', From a9bc0073272bf3e535a4240b4767d6500e4b069e Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 14:22:00 +0100 Subject: [PATCH 272/350] New translations --- resources/lang/pl_PL/csv.php | 40 ++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/resources/lang/pl_PL/csv.php b/resources/lang/pl_PL/csv.php index 4acb52efdc..7107aca7a6 100644 --- a/resources/lang/pl_PL/csv.php +++ b/resources/lang/pl_PL/csv.php @@ -13,9 +13,9 @@ declare(strict_types = 1); return [ - 'import_configure_title' => 'Configure your import', + 'import_configure_title' => 'Skonfiguruj import', 'import_configure_intro' => 'There are some options for your CSV import. Please indicate if your CSV file contains headers on the first column, and what the date format of your date-fields is. That might require some experimentation. The field delimiter is usually a ",", but could also be a ";". Check this carefully.', - 'import_configure_form' => 'Basic CSV import options', + 'import_configure_form' => 'Podstawowe opcje importu CSV', 'header_help' => 'Check this if the first row of your CSV file are the column titles', 'date_help' => 'Date time format in your CSV. Follow the format like this page indicates. The default value will parse dates that look like this: :dateExample.', 'delimiter_help' => 'Choose the field delimiter that is used in your input file. If not sure, comma is the safest option.', @@ -23,50 +23,50 @@ return [ 'upload_not_writeable' => 'The grey box contains a file path. It should be writeable. Please make sure it is.', // roles - 'column_roles_title' => 'Define column roles', - 'column_roles_table' => 'Table', - 'column_name' => 'Name of column', + 'column_roles_title' => 'Zdefiniuj role dla kolumn', + 'column_roles_table' => 'Tabela', + 'column_name' => 'Nazwa kolumny', 'column_example' => 'Column example data', 'column_role' => 'Column data meaning', 'do_map_value' => 'Map these values', - 'column' => 'Column', + 'column' => 'Kolumna', 'no_example_data' => 'No example data available', - 'store_column_roles' => 'Continue import', + 'store_column_roles' => 'Kontynuuj import', 'do_not_map' => '(do not map)', 'map_title' => 'Connect import data to Firefly III data', 'map_text' => 'In the following tables, the left value shows you information found in your uploaded CSV file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.', - 'field_value' => 'Field value', + 'field_value' => 'Wartość pola', 'field_mapped_to' => 'Mapped to', 'store_column_mapping' => 'Store mapping', // map things. - 'column__ignore' => '(ignore this column)', - 'column_account-iban' => 'Asset account (IBAN)', + 'column__ignore' => '(ignoruj tę kolumnę)', + 'column_account-iban' => 'Konto aktywów (IBAN)', 'column_account-id' => 'Asset account ID (matching Firefly)', - 'column_account-name' => 'Asset account (name)', - 'column_amount' => 'Amount', - 'column_amount-comma-separated' => 'Amount (comma as decimal separator)', + 'column_account-name' => 'Konto aktywów (nazwa)', + 'column_amount' => 'Kwota', + 'column_amount-comma-separated' => 'Kwota (przecinek jako separator dziesiętny)', 'column_bill-id' => 'Bill ID (matching Firefly)', - 'column_bill-name' => 'Bill name', + 'column_bill-name' => 'Nazwa rachunku', 'column_budget-id' => 'Budget ID (matching Firefly)', - 'column_budget-name' => 'Budget name', + 'column_budget-name' => 'Nazwa budżetu', 'column_category-id' => 'Category ID (matching Firefly)', - 'column_category-name' => 'Category name', - 'column_currency-code' => 'Currency code (ISO 4217)', + 'column_category-name' => 'Nazwa kategorii', + 'column_currency-code' => 'Kod waluty (ISO 4217)', 'column_currency-id' => 'Currency ID (matching Firefly)', 'column_currency-name' => 'Currency name (matching Firefly)', 'column_currency-symbol' => 'Currency symbol (matching Firefly)', 'column_date-interest' => 'Interest calculation date', 'column_date-book' => 'Transaction booking date', 'column_date-process' => 'Transaction process date', - 'column_date-transaction' => 'Date', - 'column_description' => 'Description', + 'column_date-transaction' => 'Data', + 'column_description' => 'Opis', 'column_opposing-iban' => 'Opposing account (IBAN)', 'column_opposing-id' => 'Opposing account ID (matching Firefly)', - 'column_external-id' => 'External ID', + 'column_external-id' => 'Zewnętrzne ID', 'column_opposing-name' => 'Opposing account (name)', 'column_rabo-debet-credit' => 'Rabobank specific debet/credit indicator', 'column_ing-debet-credit' => 'ING specific debet/credit indicator', From 5990a21c46863a79701604c344c50c863904df5c Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 14:22:02 +0100 Subject: [PATCH 273/350] Translated --- resources/lang/pl_PL/pagination.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lang/pl_PL/pagination.php b/resources/lang/pl_PL/pagination.php index 4eeab21dee..f666586cef 100644 --- a/resources/lang/pl_PL/pagination.php +++ b/resources/lang/pl_PL/pagination.php @@ -11,7 +11,7 @@ return [ - 'previous' => '« Previous', - 'next' => 'Next »', + 'previous' => '« Poprzednia', + 'next' => 'Następna »', ]; \ No newline at end of file From 101317cb16f02dfa70f33c6a7dc047cca130b3a8 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 14:22:04 +0100 Subject: [PATCH 274/350] New translations --- resources/lang/pl_PL/validation.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/lang/pl_PL/validation.php b/resources/lang/pl_PL/validation.php index 6d412f04fe..e81a06fc39 100644 --- a/resources/lang/pl_PL/validation.php +++ b/resources/lang/pl_PL/validation.php @@ -10,7 +10,7 @@ */ return [ - 'iban' => 'This is not a valid IBAN.', + 'iban' => 'To nie jest prawidłowy IBAN.', 'unique_account_number_for_user' => 'It looks like this account number is already in use.', 'deleted_user' => 'Due to security constraints, you cannot register using this email address.', 'rule_trigger_value' => 'This value is invalid for the selected trigger.', @@ -19,10 +19,10 @@ return [ 'file_already_attached' => 'Uploaded file ":name" is already attached to this object.', 'file_attached' => 'Succesfully uploaded file ":name".', 'file_invalid_mime' => 'File ":name" is of type ":mime" which is not accepted as a new upload.', - 'file_too_large' => 'File ":name" is too large.', + 'file_too_large' => 'Plik ": nazwa" jest zbyt duży.', 'belongs_to_user' => 'The value of :attribute is unknown', 'accepted' => 'The :attribute must be accepted.', - 'bic' => 'This is not a valid BIC.', + 'bic' => 'To nie jest prawidłowy BIC.', 'active_url' => 'The :attribute is not a valid URL.', 'after' => 'The :attribute must be a date after :date.', 'alpha' => 'The :attribute may only contain letters.', From cf6ea64aba8f8e2e3895e312d684b97a3c313380 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 14:22:06 +0100 Subject: [PATCH 275/350] New translations --- resources/lang/pl_PL/passwords.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/lang/pl_PL/passwords.php b/resources/lang/pl_PL/passwords.php index 2e11aa92dc..1a50526c06 100644 --- a/resources/lang/pl_PL/passwords.php +++ b/resources/lang/pl_PL/passwords.php @@ -10,10 +10,10 @@ */ return [ - 'password' => 'Passwords must be at least six characters and match the confirmation.', - 'user' => 'We can\'t find a user with that e-mail address.', - 'token' => 'This password reset token is invalid.', - 'sent' => 'We have e-mailed your password reset link!', - 'reset' => 'Your password has been reset!', + 'password' => 'Hasło musi zawierać przynajmniej 6 znaków i musi się zgadzać z potwierdzeniem.', + 'user' => 'Nie możemy znaleźć użytkownika o podanym adresie email.', + 'token' => 'Ten token do resetowania hasła jest nieprawidłowy.', + 'sent' => 'Wysłaliśmy link do resetowania hasła na twój adres email!', + 'reset' => 'Twoje hasło zostało zresetowane!', 'blocked' => 'Nice try though.', ]; \ No newline at end of file From 4385d71c6f0257a7292e1507264fa1e67f3f13d3 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 14:31:56 +0100 Subject: [PATCH 276/350] New translations --- resources/lang/pl_PL/validation.php | 54 ++++++++++++++--------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/resources/lang/pl_PL/validation.php b/resources/lang/pl_PL/validation.php index e81a06fc39..09b1c0b3d2 100644 --- a/resources/lang/pl_PL/validation.php +++ b/resources/lang/pl_PL/validation.php @@ -23,34 +23,34 @@ return [ 'belongs_to_user' => 'The value of :attribute is unknown', 'accepted' => 'The :attribute must be accepted.', 'bic' => 'To nie jest prawidłowy BIC.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'unique_for_user' => 'There already is an entry with this :attribute.', - 'before' => 'The :attribute must be a date before :date.', - 'unique_object_for_user' => 'This name is already in use', - 'unique_account_for_user' => 'This account name is already in use', - 'between.numeric' => 'The :attribute must be between :min and :max.', - 'between.file' => 'The :attribute must be between :min and :max kilobytes.', - 'between.string' => 'The :attribute must be between :min and :max characters.', - 'between.array' => 'The :attribute must have between :min and :max items.', - 'boolean' => 'The :attribute field must be true or false.', + 'active_url' => ':attribute nie jest prawidłowym adresem URL.', + 'after' => ':attribute musi być datą późniejszą od :date.', + 'alpha' => ':attribute może zawierać tylko litery.', + 'alpha_dash' => ':attribute może zawierać litery, cyfry oraz myślniki.', + 'alpha_num' => ':attribute może zawierać jedynie litery oraz cyfry.', + 'array' => ':attribute musi być tablicą.', + 'unique_for_user' => 'Istnieje już wpis z tym: attribute.', + 'before' => ':attribute musi być wcześniejszą datą w stosunku do :date.', + 'unique_object_for_user' => 'Ta nazwa jest już w użyciu', + 'unique_account_for_user' => 'Ta nazwa konta jest już w użyciu', + 'between.numeric' => ':attribute musi się mieścić w zakresie pomiędzy :min a :max.', + 'between.file' => ':attribute musi się mieścić w zakresie pomiędzy :min oraz :max kilobajtów.', + 'between.string' => ':attribute musi zawierać pomiędzy :min a :max znaków.', + 'between.array' => ':attribute musi zawierać pomiędzy :min a :max elementów.', + 'boolean' => 'Pole :attribute musi być prawdą albo fałszem.', 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'email' => 'The :attribute must be a valid email address.', - 'filled' => 'The :attribute field is required.', - 'exists' => 'The selected :attribute is invalid.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', + 'date' => ':attribute nie jest prawidłową datą.', + 'date_format' => ':attribute rożni się od formatu :format.', + 'different' => ':attribute oraz :other muszą się różnić.', + 'digits' => ':attribute musi składać się z :digits cyfr.', + 'digits_between' => ':attribute musi mieć od :min do :max cyfr.', + 'email' => ':attribute musi być prawidłowym adresem email.', + 'filled' => 'Pole :attribute jest wymagane.', + 'exists' => 'Wybrane :attribute są nieprawidłowe.', + 'image' => ':attribute musi być obrazkiem.', + 'in' => 'Wybrany :attribute jest nieprawidłowy.', + 'integer' => ':attribute musi być liczbą całkowitą.', + 'ip' => ':attribute musi być poprawnym adresem IP.', 'json' => 'The :attribute must be a valid JSON string.', 'max.numeric' => 'The :attribute may not be greater than :max.', 'max.file' => 'The :attribute may not be greater than :max kilobytes.', From 2ee1fea293e4504f2b0c66abb4527b3812bb09f3 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 14:41:48 +0100 Subject: [PATCH 277/350] New translations --- resources/lang/pl_PL/validation.php | 68 ++++++++++++++--------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/resources/lang/pl_PL/validation.php b/resources/lang/pl_PL/validation.php index 09b1c0b3d2..3a0bf79040 100644 --- a/resources/lang/pl_PL/validation.php +++ b/resources/lang/pl_PL/validation.php @@ -20,8 +20,8 @@ return [ 'file_attached' => 'Succesfully uploaded file ":name".', 'file_invalid_mime' => 'File ":name" is of type ":mime" which is not accepted as a new upload.', 'file_too_large' => 'Plik ": nazwa" jest zbyt duży.', - 'belongs_to_user' => 'The value of :attribute is unknown', - 'accepted' => 'The :attribute must be accepted.', + 'belongs_to_user' => 'Wartość :attribute jest nieznana', + 'accepted' => ':attribute musi zostać zaakceptowany.', 'bic' => 'To nie jest prawidłowy BIC.', 'active_url' => ':attribute nie jest prawidłowym adresem URL.', 'after' => ':attribute musi być datą późniejszą od :date.', @@ -51,38 +51,38 @@ return [ 'in' => 'Wybrany :attribute jest nieprawidłowy.', 'integer' => ':attribute musi być liczbą całkowitą.', 'ip' => ':attribute musi być poprawnym adresem IP.', - 'json' => 'The :attribute must be a valid JSON string.', - 'max.numeric' => 'The :attribute may not be greater than :max.', - 'max.file' => 'The :attribute may not be greater than :max kilobytes.', - 'max.string' => 'The :attribute may not be greater than :max characters.', - 'max.array' => 'The :attribute may not have more than :max items.', - 'mimes' => 'The :attribute must be a file of type: :values.', - 'min.numeric' => 'The :attribute must be at least :min.', - 'min.file' => 'The :attribute must be at least :min kilobytes.', - 'min.string' => 'The :attribute must be at least :min characters.', - 'min.array' => 'The :attribute must have at least :min items.', - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size.numeric' => 'The :attribute must be :size.', - 'size.file' => 'The :attribute must be :size kilobytes.', - 'size.string' => 'The :attribute must be :size characters.', - 'size.array' => 'The :attribute must contain :size items.', - 'unique' => 'The :attribute has already been taken.', - 'string' => 'The :attribute must be a string.', - 'url' => 'The :attribute format is invalid.', - 'timezone' => 'The :attribute must be a valid zone.', - '2fa_code' => 'The :attribute field is invalid.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', + 'json' => ':attribute musi być prawidłowym węzłem JSON.', + 'max.numeric' => ':attribute nie może być większy niż :max.', + 'max.file' => ':attribute nie może być większy niż :max kilobajtów.', + 'max.string' => ':attribute nie może być dłuższy od :max znaków.', + 'max.array' => ':attribute nie może zawierać więcej niż :max elementów.', + 'mimes' => ':attribute musi być plikiem typu :values.', + 'min.numeric' => ':attribute musi być przynajmniej :min.', + 'min.file' => ':attribute musi mieć przynajmniej :min kilobajtów.', + 'min.string' => ':attribute musi mieć co najmniej :min znaków.', + 'min.array' => ':attribute musi zawierać przynajmniej :min elementów.', + 'not_in' => 'Wybrany :attribute jest nieprawidłowy.', + 'numeric' => ':attribute musi byc liczbą.', + 'regex' => 'Format :attribute jest nieprawidłowy.', + 'required' => 'Pole :attribute jest wymagane.', + 'required_if' => 'Pole :attribute jest wymagane gdy :other jest :value.', + 'required_unless' => 'Pole :attribute jest wymagane, chyba że :other jest w :values.', + 'required_with' => 'Pole :attribute jest wymagane gdy :values jest podana.', + 'required_with_all' => 'Pole :attribute jest wymagane gdy :values jest podana.', + 'required_without' => 'Pole :attribute jest wymagane gdy :values nie jest podana.', + 'required_without_all' => ':attribute jest wymagane, gdy żadna z wartości :values nie jest podana.', + 'same' => 'Pole :attribute oraz :other muszą się zgadzać.', + 'size.numeric' => ':attribute musi być wielkości :size.', + 'size.file' => ':attribute musi mieć :size kilobajtów.', + 'size.string' => ':attribute musi mieć :size znaków.', + 'size.array' => ':attribute musi zawierać :size elementów.', + 'unique' => 'Taki :attribute już występuje.', + 'string' => ':attribute musi być ciągiem znaków.', + 'url' => 'Format :attribute jest nieprawidłowy.', + 'timezone' => ':attribute musi być prawidłową strefą.', + '2fa_code' => 'Format :attribute jest nieprawidłowy.', + 'dimensions' => ':attribute ma nieprawidłowe wymiary obrazu.', + 'distinct' => 'Pole :attribute zawiera zduplikowaną wartość.', 'file' => 'The :attribute must be a file.', 'in_array' => 'The :attribute field does not exist in :other.', 'present' => 'The :attribute field must be present.', From 379b15be1db3f9b8cc823b68c10df54e518d1b44 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 14:51:54 +0100 Subject: [PATCH 278/350] New translations --- resources/lang/pl_PL/validation.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/lang/pl_PL/validation.php b/resources/lang/pl_PL/validation.php index 3a0bf79040..26e12a9e08 100644 --- a/resources/lang/pl_PL/validation.php +++ b/resources/lang/pl_PL/validation.php @@ -17,7 +17,7 @@ return [ 'rule_action_value' => 'This value is invalid for the selected action.', 'invalid_domain' => 'Due to security constraints, you cannot register from this domain.', 'file_already_attached' => 'Uploaded file ":name" is already attached to this object.', - 'file_attached' => 'Succesfully uploaded file ":name".', + 'file_attached' => 'Pomyślnie wgrano plik ":name".', 'file_invalid_mime' => 'File ":name" is of type ":mime" which is not accepted as a new upload.', 'file_too_large' => 'Plik ": nazwa" jest zbyt duży.', 'belongs_to_user' => 'Wartość :attribute jest nieznana', @@ -83,8 +83,8 @@ return [ '2fa_code' => 'Format :attribute jest nieprawidłowy.', 'dimensions' => ':attribute ma nieprawidłowe wymiary obrazu.', 'distinct' => 'Pole :attribute zawiera zduplikowaną wartość.', - 'file' => 'The :attribute must be a file.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'present' => 'The :attribute field must be present.', - 'amount_zero' => 'The total amount cannot be zero', + 'file' => ':attribute musi być plikiem.', + 'in_array' => 'Pole :attribute nie istnieje w :other.', + 'present' => 'Pole :attribute musi być obecne.', + 'amount_zero' => 'Całkowita kwota nie może być zerem', ]; \ No newline at end of file From c8511a6e2ab958eff9b22aa3c125e41bcdd3788a Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:12:14 +0100 Subject: [PATCH 279/350] New translations --- resources/lang/nl_NL/demo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lang/nl_NL/demo.php b/resources/lang/nl_NL/demo.php index 6cd5476b57..49df459c39 100644 --- a/resources/lang/nl_NL/demo.php +++ b/resources/lang/nl_NL/demo.php @@ -8,8 +8,8 @@ */ return [ - 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', + 'no_demo_text' => 'Sorry, er is geen extra uitleg voor deze pagina.', + 'see_help_icon' => 'Maar het -icoontje kan je wellicht meer vertellen.', 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', From d5f65e5d07c3ce6009b2ab8086192956a1ce518c Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:22:00 +0100 Subject: [PATCH 280/350] New translations --- resources/lang/nl_NL/demo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lang/nl_NL/demo.php b/resources/lang/nl_NL/demo.php index 49df459c39..1c2b38d00a 100644 --- a/resources/lang/nl_NL/demo.php +++ b/resources/lang/nl_NL/demo.php @@ -10,8 +10,8 @@ return [ 'no_demo_text' => 'Sorry, er is geen extra uitleg voor deze pagina.', 'see_help_icon' => 'Maar het -icoontje kan je wellicht meer vertellen.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + 'index' => 'Welkom bij Firefly III! Op deze pagina krijg je een overzicht van je financiën. Meer diepgaande informatie vindt je onder Rekeningen →Betaalrekeningen en natuurlijk onder Budgetten- en Overzichten. Klik gerust rond en en kijk waar je terecht komt.', + 'accounts-index' => 'Betaalrekeningen zijn je persoonlijke bankrekeningen. Crediteuren zijn rekeningen waar jij geld uit geeft, zoals bij winkels of aan vrienden. Debiteuren zijn rekeningen waar jij geld van krijgt, zoals je werk, de overheid of andere bronnen van inkomsten. Op deze pagina kan je ze wijzigen of verwijderen.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', From 8aa2e3d2f5c21c0c19734e995f634baa4db85949 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:22:30 +0100 Subject: [PATCH 281/350] Various code cleanup. --- .env.example | 4 +++- app/Validation/FireflyValidator.php | 9 +++++++++ config/firefly.php | 2 +- public/js/ff/accounts/show.js | 1 + resources/lang/en_US/demo.php | 2 +- 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 28d87ce566..87540a4f1c 100755 --- a/.env.example +++ b/.env.example @@ -40,6 +40,7 @@ SHOW_INCOMPLETE_TRANSLATIONS=false CACHE_PREFIX=firefly +GOOGLE_MAPS_API_KEY= ANALYTICS_ID= SITE_OWNER=mail@example.com @@ -48,4 +49,5 @@ PUSHER_SECRET= PUSHER_APP_ID= DEMO_USERNAME= -DEMO_PASSWORD= \ No newline at end of file +DEMO_PASSWORD= + diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index b5bdf896a2..778996bb88 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -53,6 +53,7 @@ class FireflyValidator extends Validator } /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @param $attribute * @param $value * @@ -71,6 +72,7 @@ class FireflyValidator extends Validator } /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @param $attribute * @param $value * @param $parameters @@ -94,6 +96,7 @@ class FireflyValidator extends Validator } /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @param $attribute * @param $value * @@ -115,6 +118,7 @@ class FireflyValidator extends Validator } /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @param $attribute * @param $value * @@ -144,6 +148,7 @@ class FireflyValidator extends Validator } /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @param $attribute * @param $value * @param $parameters @@ -256,6 +261,7 @@ class FireflyValidator extends Validator } /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @param $attribute * @param $value * @param $parameters @@ -286,6 +292,7 @@ class FireflyValidator extends Validator } /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @param $attribute * @param $value * @param $parameters @@ -319,6 +326,7 @@ class FireflyValidator extends Validator } /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) * Validate an object and its unicity. Checks for encryption / encrypted values as well. * * parameter 0: the table @@ -356,6 +364,7 @@ class FireflyValidator extends Validator } /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @param $attribute * @param $value * @param $parameters diff --git a/config/firefly.php b/config/firefly.php index 7b4632912e..444a786cd6 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -112,7 +112,7 @@ return [ 'Cash account' => 'cash', ], 'languages' => [ - 'de_DE' => ['name_locale' => 'Deutsch', 'name_english' => 'German', 'complete' => false], + 'de_DE' => ['name_locale' => 'Deutsch', 'name_english' => 'German', 'complete' => true], 'en_US' => ['name_locale' => 'English', 'name_english' => 'English', 'complete' => true], 'es_ES' => ['name_locale' => 'Español', 'name_english' => 'Spanish', 'complete' => false], 'fr_FR' => ['name_locale' => 'Français', 'name_english' => 'French', 'complete' => false], diff --git a/public/js/ff/accounts/show.js b/public/js/ff/accounts/show.js index 12851e0d75..a1db23e92a 100644 --- a/public/js/ff/accounts/show.js +++ b/public/js/ff/accounts/show.js @@ -92,4 +92,5 @@ function sortStop(event, ui) { $(this).animate({backgroundColor: originalBG}, 200); return undefined; }); + return undefined; } diff --git a/resources/lang/en_US/demo.php b/resources/lang/en_US/demo.php index 6cd5476b57..e7f8ea934d 100644 --- a/resources/lang/en_US/demo.php +++ b/resources/lang/en_US/demo.php @@ -11,7 +11,7 @@ return [ 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + '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. On this page you can edit or remove them.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', From e60f60b0f814fc486cecdc62a976cf7b4ec15458 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:32:03 +0100 Subject: [PATCH 282/350] New translations --- resources/lang/zh_TW/demo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/zh_TW/demo.php b/resources/lang/zh_TW/demo.php index 6cd5476b57..e7f8ea934d 100644 --- a/resources/lang/zh_TW/demo.php +++ b/resources/lang/zh_TW/demo.php @@ -11,7 +11,7 @@ return [ 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + '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. On this page you can edit or remove them.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', From 488d4a38b8ab60c87d47c64af68f4aee9f9c82c0 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:32:04 +0100 Subject: [PATCH 283/350] New translations --- resources/lang/zh_HK/demo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/zh_HK/demo.php b/resources/lang/zh_HK/demo.php index 6cd5476b57..e7f8ea934d 100644 --- a/resources/lang/zh_HK/demo.php +++ b/resources/lang/zh_HK/demo.php @@ -11,7 +11,7 @@ return [ 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + '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. On this page you can edit or remove them.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', From 33da756a2f1f5988aea5d5814deaaba4e8d9c03d Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:32:18 +0100 Subject: [PATCH 284/350] New translations --- resources/lang/hr_HR/demo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/hr_HR/demo.php b/resources/lang/hr_HR/demo.php index 6cd5476b57..e7f8ea934d 100644 --- a/resources/lang/hr_HR/demo.php +++ b/resources/lang/hr_HR/demo.php @@ -11,7 +11,7 @@ return [ 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + '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. On this page you can edit or remove them.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', From 1c2602438fd6c1c98382ebc01dd7a357b0860288 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:32:19 +0100 Subject: [PATCH 285/350] New translations --- resources/lang/nl_NL/demo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/nl_NL/demo.php b/resources/lang/nl_NL/demo.php index 1c2b38d00a..4b62e38bfc 100644 --- a/resources/lang/nl_NL/demo.php +++ b/resources/lang/nl_NL/demo.php @@ -11,7 +11,7 @@ return [ 'no_demo_text' => 'Sorry, er is geen extra uitleg voor deze pagina.', 'see_help_icon' => 'Maar het -icoontje kan je wellicht meer vertellen.', 'index' => 'Welkom bij Firefly III! Op deze pagina krijg je een overzicht van je financiën. Meer diepgaande informatie vindt je onder Rekeningen →Betaalrekeningen en natuurlijk onder Budgetten- en Overzichten. Klik gerust rond en en kijk waar je terecht komt.', - 'accounts-index' => 'Betaalrekeningen zijn je persoonlijke bankrekeningen. Crediteuren zijn rekeningen waar jij geld uit geeft, zoals bij winkels of aan vrienden. Debiteuren zijn rekeningen waar jij geld van krijgt, zoals je werk, de overheid of andere bronnen van inkomsten. Op deze pagina kan je ze wijzigen of verwijderen.', + '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. On this page you can edit or remove them.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', From b5c8e005e245b0f429c48fa326920e9ac99c1981 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:32:28 +0100 Subject: [PATCH 286/350] New translations --- resources/lang/pl_PL/demo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/pl_PL/demo.php b/resources/lang/pl_PL/demo.php index 6cd5476b57..e7f8ea934d 100644 --- a/resources/lang/pl_PL/demo.php +++ b/resources/lang/pl_PL/demo.php @@ -11,7 +11,7 @@ return [ 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + '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. On this page you can edit or remove them.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', From 01cc97ad55286298f431bfc4f1d0babea3461c9e Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:32:32 +0100 Subject: [PATCH 287/350] New translations --- resources/lang/ru_RU/demo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/ru_RU/demo.php b/resources/lang/ru_RU/demo.php index 6cd5476b57..e7f8ea934d 100644 --- a/resources/lang/ru_RU/demo.php +++ b/resources/lang/ru_RU/demo.php @@ -11,7 +11,7 @@ return [ 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + '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. On this page you can edit or remove them.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', From 6952957794a0da11f4a44263d32856139e510063 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:32:34 +0100 Subject: [PATCH 288/350] New translations --- resources/lang/es_ES/demo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/es_ES/demo.php b/resources/lang/es_ES/demo.php index 6cd5476b57..e7f8ea934d 100644 --- a/resources/lang/es_ES/demo.php +++ b/resources/lang/es_ES/demo.php @@ -11,7 +11,7 @@ return [ 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + '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. On this page you can edit or remove them.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', From fe039500d694bca8ae214247933e262486a3996b Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:32:36 +0100 Subject: [PATCH 289/350] New translations --- resources/lang/pt_BR/demo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/pt_BR/demo.php b/resources/lang/pt_BR/demo.php index 6cd5476b57..e7f8ea934d 100644 --- a/resources/lang/pt_BR/demo.php +++ b/resources/lang/pt_BR/demo.php @@ -11,7 +11,7 @@ return [ 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + '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. On this page you can edit or remove them.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', From 97dae6dde595eec1de3362cfd1f33bf841ecd6d6 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:32:37 +0100 Subject: [PATCH 290/350] New translations --- resources/lang/fr_FR/demo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/fr_FR/demo.php b/resources/lang/fr_FR/demo.php index 6cd5476b57..e7f8ea934d 100644 --- a/resources/lang/fr_FR/demo.php +++ b/resources/lang/fr_FR/demo.php @@ -11,7 +11,7 @@ return [ 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.', 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + '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. On this page you can edit or remove them.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', From 954b394987596e077663d1e3632451924d8d14f6 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 15:32:39 +0100 Subject: [PATCH 291/350] New translations --- resources/lang/de_DE/demo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/de_DE/demo.php b/resources/lang/de_DE/demo.php index a1481d53d5..24e22bfa97 100644 --- a/resources/lang/de_DE/demo.php +++ b/resources/lang/de_DE/demo.php @@ -11,7 +11,7 @@ return [ 'no_demo_text' => 'Leider gibt es keine zusätzlichen Demoerklärungen für diese Seite.', 'see_help_icon' => 'Trotzdem kann der -Icon in der oberen rechten Ecke mehr erzählen.', 'index' => 'Wilkommen bei Firefly III! Auf dieser Seite erhalten Sie einen schnellen Überblick über Ihre Finanzen. Für weitere Informationen, besuchen Sie die Accounts → Girokonten und natürlich Budgets und Berichte Seiten. Oder sehen Sie sich einfach um und schauen wo Sie landen.', - 'accounts-index' => 'Asset accounts are your personal bank ac counts. 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. On this page you can edit or remove them.', + '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. On this page you can edit or remove them.', 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', From d6b3fe7e1b48f2f9b14addb74584db30eb0fc888 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:02:21 +0100 Subject: [PATCH 292/350] New translations --- resources/lang/pl_PL/list.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/resources/lang/pl_PL/list.php b/resources/lang/pl_PL/list.php index 90625d54e6..b7fa5969cc 100644 --- a/resources/lang/pl_PL/list.php +++ b/resources/lang/pl_PL/list.php @@ -10,24 +10,24 @@ */ return [ - 'buttons' => 'Buttons', - 'icon' => 'Icon', + 'buttons' => 'Przyciski', + 'icon' => 'Ikona', 'id' => 'ID', 'create_date' => 'Created at', 'update_date' => 'Updated at', - 'balance_before' => 'Balance before', - 'balance_after' => 'Balance after', - 'name' => 'Name', - 'role' => 'Role', - 'currentBalance' => 'Current balance', - 'active' => 'Is active?', - 'lastActivity' => 'Last activity', + 'balance_before' => 'Saldo przed', + 'balance_after' => 'Saldo po', + 'name' => 'Nazwa', + 'role' => 'Rola', + 'currentBalance' => 'Bieżące saldo', + 'active' => 'Jest aktywny?', + 'lastActivity' => 'Ostatnia aktywność', 'balanceDiff' => 'Balance difference between :start and :end', 'matchedOn' => 'Matched on', 'matchesOn' => 'Matched on', - 'account_type' => 'Account type', + 'account_type' => 'Typ konta', 'created_at' => 'Created at', - 'new_balance' => 'New balance', + 'new_balance' => 'Nowe saldo', 'account' => 'Account', 'matchingAmount' => 'Amount', 'lastMatch' => 'Last match', From bde37ec2c7e0feab321e072132cd9b724f3cd347 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:12:00 +0100 Subject: [PATCH 293/350] New translations --- resources/lang/pl_PL/form.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php index ff44cbf9ef..98b4fc7568 100644 --- a/resources/lang/pl_PL/form.php +++ b/resources/lang/pl_PL/form.php @@ -12,9 +12,9 @@ return [ // new user: - 'bank_name' => 'Bank name', - 'bank_balance' => 'Balance', - 'savings_balance' => 'Savings balance', + 'bank_name' => 'Nazwa banku', + 'bank_balance' => 'Saldo', + 'savings_balance' => 'Saldo oszczędności', 'credit_card_limit' => 'Credit card limit', 'automatch' => 'Match automatically', 'skip' => 'Skip', From 995b049a5ff45f84530c295c36d9687a0e975faa Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:12:03 +0100 Subject: [PATCH 294/350] New translations --- resources/lang/pl_PL/help.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/pl_PL/help.php b/resources/lang/pl_PL/help.php index 61210ffe41..365ee7fb30 100644 --- a/resources/lang/pl_PL/help.php +++ b/resources/lang/pl_PL/help.php @@ -12,7 +12,7 @@ return [ // tour! - 'main-content-title' => 'Welcome to Firefly III', + 'main-content-title' => 'Witaj w Firefly III', 'main-content-text' => 'Do yourself a favor and follow this short guide to make sure you know your way around.', 'sidebar-toggle-title' => 'Sidebar to create stuff', 'sidebar-toggle-text' => 'Hidden under the plus icon are all the buttons to create new stuff. Accounts, transactions, everything!', From 03792b39057c70278c09d4b9f0e74b12d803cef0 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:12:05 +0100 Subject: [PATCH 295/350] New translations --- resources/lang/pl_PL/list.php | 92 +++++++++++++++++------------------ 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/resources/lang/pl_PL/list.php b/resources/lang/pl_PL/list.php index b7fa5969cc..912fcb79ab 100644 --- a/resources/lang/pl_PL/list.php +++ b/resources/lang/pl_PL/list.php @@ -13,8 +13,8 @@ return [ 'buttons' => 'Przyciski', 'icon' => 'Ikona', 'id' => 'ID', - 'create_date' => 'Created at', - 'update_date' => 'Updated at', + 'create_date' => 'Utworzono', + 'update_date' => 'Zaktualizowano', 'balance_before' => 'Saldo przed', 'balance_after' => 'Saldo po', 'name' => 'Nazwa', @@ -22,68 +22,68 @@ return [ 'currentBalance' => 'Bieżące saldo', 'active' => 'Jest aktywny?', 'lastActivity' => 'Ostatnia aktywność', - 'balanceDiff' => 'Balance difference between :start and :end', + 'balanceDiff' => 'Różnica salda między :start oraz :end', 'matchedOn' => 'Matched on', 'matchesOn' => 'Matched on', 'account_type' => 'Typ konta', - 'created_at' => 'Created at', + 'created_at' => 'Utworzono', 'new_balance' => 'Nowe saldo', - 'account' => 'Account', - 'matchingAmount' => 'Amount', + 'account' => 'Konto', + 'matchingAmount' => 'Kwota', 'lastMatch' => 'Last match', 'split_number' => 'Split #', - 'destination' => 'Destination', - 'source' => 'Source', + 'destination' => 'Cel', + 'source' => 'Źródło', 'next_expected_match' => 'Next expected match', 'automatch' => 'Auto match?', - 'repeat_freq' => 'Repeats', - 'description' => 'Description', - 'amount' => 'Amount', + 'repeat_freq' => 'Powtórzenia', + 'description' => 'Opis', + 'amount' => 'Kwota', 'internal_reference' => 'Internal reference', - 'date' => 'Date', + 'date' => 'Data', 'interest_date' => 'Interest date', 'book_date' => 'Book date', 'process_date' => 'Processing date', - 'due_date' => 'Due date', - 'payment_date' => 'Payment date', - 'invoice_date' => 'Invoice date', + 'due_date' => 'Termin realizacji', + 'payment_date' => 'Data płatności', + 'invoice_date' => 'Data faktury', 'interal_reference' => 'Internal reference', - 'notes' => 'Notes', - 'from' => 'From', - 'piggy_bank' => 'Piggy bank', - 'to' => 'To', - 'budget' => 'Budget', - 'category' => 'Category', - 'bill' => 'Bill', - 'withdrawal' => 'Withdrawal', - 'deposit' => 'Deposit', + 'notes' => 'Notatki', + 'from' => 'Z', + 'piggy_bank' => 'Skarbonka', + 'to' => 'Do', + 'budget' => 'Budżet', + 'category' => 'Kategoria', + 'bill' => 'Rachunek', + 'withdrawal' => 'Wypłata', + 'deposit' => 'Wpłata', 'transfer' => 'Transfer', - 'type' => 'Type', - 'completed' => 'Completed', + 'type' => 'Typ', + 'completed' => 'Zakończone', 'iban' => 'IBAN', 'paid_current_period' => 'Paid this period', - 'email' => 'Email', + 'email' => 'Adres E-Mail', 'registered_at' => 'Registered at', - 'is_activated' => 'Is activated', - 'is_blocked' => 'Is blocked', - 'is_admin' => 'Is admin', - 'has_two_factor' => 'Has 2FA', - 'confirmed_from' => 'Confirmed from', + 'is_activated' => 'Jest aktywny', + 'is_blocked' => 'Jest zablokowany', + 'is_admin' => 'Jest administratorem', + 'has_two_factor' => 'Ma dwustopniową autoryzację', + 'confirmed_from' => 'Potwierdzone z', 'registered_from' => 'Registered from', 'blocked_code' => 'Block code', - 'domain' => 'Domain', - 'registration_attempts' => 'Registration attempts', - 'source_account' => 'Source account', - 'destination_account' => 'Destination account', + 'domain' => 'Domena', + 'registration_attempts' => 'Próby rejestracji', + 'source_account' => 'Konto źródłowe', + 'destination_account' => 'Konto docelowe', - 'accounts_count' => 'Number of accounts', - 'journals_count' => 'Number of transactions', - 'attachments_count' => 'Number of attachments', - 'bills_count' => 'Number of bills', - 'categories_count' => 'Number of categories', - 'export_jobs_count' => 'Number of export jobs', - 'import_jobs_count' => 'Number of import jobs', - 'budget_count' => 'Number of budgets', - 'rule_and_groups_count' => 'Number of rules and rule groups', - 'tags_count' => 'Number of tags', + 'accounts_count' => 'Liczba kont', + 'journals_count' => 'Liczba transakcji', + 'attachments_count' => 'Liczba załączników', + 'bills_count' => 'Liczba rachunków', + 'categories_count' => 'Liczba kategorii', + 'export_jobs_count' => 'Liczba zadań eksportu', + 'import_jobs_count' => 'Liczba zadań importu', + 'budget_count' => 'Liczba budżetów', + 'rule_and_groups_count' => 'Liczba reguł i grup reguł', + 'tags_count' => 'Liczba tagów', ]; \ No newline at end of file From 5096a90e342dffe78d927633202f633338b21eb5 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:21:52 +0100 Subject: [PATCH 296/350] New translations --- resources/lang/pl_PL/form.php | 40 +++++++++++++++++------------------ 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php index 98b4fc7568..1435dace27 100644 --- a/resources/lang/pl_PL/form.php +++ b/resources/lang/pl_PL/form.php @@ -14,17 +14,17 @@ return [ // new user: 'bank_name' => 'Nazwa banku', 'bank_balance' => 'Saldo', - 'savings_balance' => 'Saldo oszczędności', - 'credit_card_limit' => 'Credit card limit', + 'savings_balance' => 'Saldo konta oszczędnościowego', + 'credit_card_limit' => 'Limit karty kredytowej', 'automatch' => 'Match automatically', - 'skip' => 'Skip', - 'name' => 'Name', - 'active' => 'Active', - 'amount_min' => 'Minimum amount', - 'amount_max' => 'Maximum amount', + 'skip' => 'Pomiń', + 'name' => 'Nazwa', + 'active' => 'Aktywny', + 'amount_min' => 'Minimalna kwota', + 'amount_max' => 'Maksymalna kwota', 'match' => 'Matches on', 'repeat_freq' => 'Repeats', - 'journal_currency_id' => 'Currency', + 'journal_currency_id' => 'Waluta', 'currency_id' => 'Currency', 'attachments' => 'Attachments', 'journal_amount' => 'Amount', @@ -32,23 +32,23 @@ return [ 'journal_source_account_name' => 'Revenue account (source)', 'journal_source_account_id' => 'Asset account (source)', 'BIC' => 'BIC', - 'account_from_id' => 'From account', - 'account_to_id' => 'To account', - 'source_account' => 'Source account', - 'destination_account' => 'Destination account', + 'account_from_id' => 'Z konta', + 'account_to_id' => 'Na konto', + 'source_account' => 'Konto źródłowe', + 'destination_account' => 'Konto docelowe', 'journal_destination_account_id' => 'Asset account (destination)', 'asset_destination_account' => 'Asset account (destination)', 'asset_source_account' => 'Asset account (source)', - 'journal_description' => 'Description', - 'note' => 'Notes', - 'split_journal' => 'Split this transaction', + 'journal_description' => 'Opis', + 'note' => 'Notatki', + 'split_journal' => 'Podziel tę transakcję', 'split_journal_explanation' => 'Split this transaction in multiple parts', - 'currency' => 'Currency', - 'account_id' => 'Asset account', - 'budget_id' => 'Budget', - 'openingBalance' => 'Opening balance', + 'currency' => 'Waluta', + 'account_id' => 'Konto aktywów', + 'budget_id' => 'Budżet', + 'openingBalance' => 'Bilans otwarcia', 'tagMode' => 'Tag mode', - 'tagPosition' => 'Tag location', + 'tagPosition' => 'Lokalizacja taga', 'virtualBalance' => 'Virtual balance', 'longitude_latitude' => 'Location', 'targetamount' => 'Target amount', From 05bf7526299a07896072385a61fd4d3f6248b0e6 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:21:54 +0100 Subject: [PATCH 297/350] Translated --- resources/lang/pl_PL/help.php | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/resources/lang/pl_PL/help.php b/resources/lang/pl_PL/help.php index 365ee7fb30..8b73dbc51d 100644 --- a/resources/lang/pl_PL/help.php +++ b/resources/lang/pl_PL/help.php @@ -13,21 +13,21 @@ return [ // tour! 'main-content-title' => 'Witaj w Firefly III', - 'main-content-text' => 'Do yourself a favor and follow this short guide to make sure you know your way around.', - 'sidebar-toggle-title' => 'Sidebar to create stuff', - 'sidebar-toggle-text' => 'Hidden under the plus icon are all the buttons to create new stuff. Accounts, transactions, everything!', - 'account-menu-title' => 'All your accounts', - 'account-menu-text' => 'Here you can find all the accounts you\'ve made.', - 'budget-menu-title' => 'Budgets', - 'budget-menu-text' => 'Use this page to organise your finances and limit spending.', - 'report-menu-title' => 'Reports', - 'report-menu-text' => 'Check this out when you want a solid overview of your finances.', - 'transaction-menu-title' => 'Transactions', - 'transaction-menu-text' => 'All transactions you\'ve created can be found here.', - 'option-menu-title' => 'Options', - 'option-menu-text' => 'This is pretty self-explanatory.', - 'main-content-end-title' => 'The end!', - 'main-content-end-text' => 'Remember that every page has a small question mark at the right top. Click it to get help about the page you\'re on.', - 'index' => 'index', - 'home' => 'home', + 'main-content-text' => 'Zrób sobie przysługę i kontynuuj ten krótki samouczek aby mieć pewność że wiesz jak się poruszać w aplikacji.', + 'sidebar-toggle-title' => 'Boczny panel do tworzenia rzeczy', + 'sidebar-toggle-text' => 'Za ikoną plusa znajdują się ukryte przyciski do tworzenia nowych rzeczy. Kont, transakcji, wszystkiego!', + 'account-menu-title' => 'Wszystkie twoje konta', + 'account-menu-text' => 'Tutaj znajdziesz wszystkie konta, które utworzyłeś.', + 'budget-menu-title' => 'Budżety', + 'budget-menu-text' => 'Użyj tej strony do organizacji swoich finansów oraz ograniczenia wydatków.', + 'report-menu-title' => 'Raporty', + 'report-menu-text' => 'Sprawdź to, gdy będziesz potrzebował solidnego przeglądu swoich finansów.', + 'transaction-menu-title' => 'Transakcje', + 'transaction-menu-text' => 'Wszystkie transakcje, które utworzyłeś znajdują się tutaj.', + 'option-menu-title' => 'Opcje', + 'option-menu-text' => 'To jest dość oczywiste.', + 'main-content-end-title' => 'Koniec!', + 'main-content-end-text' => 'Pamiętaj, że każda strona ma małą ikonkę ze znakiem zapytania w prawym górnym rogu. Kliknij ją aby otrzymać dodatkowe informacje o stronie, na której się znajdujesz.', + 'index' => 'indeks', + 'home' => 'początek', ]; \ No newline at end of file From f61e65cf546a1359ce74c516607817bcc3eb0238 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:31:56 +0100 Subject: [PATCH 298/350] New translations --- resources/lang/pl_PL/firefly.php | 34 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 044698883c..fbaf5966d8 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -65,7 +65,7 @@ return [ 'two_factor_lost_fix_self' => 'If you run your own instance of Firefly III, check the logs in storage/logs for instructions.', 'two_factor_lost_fix_owner' => 'Otherwise, email the site owner, :site_owner and ask them to reset your two factor authentication.', 'warning_much_data' => ':days days of data may take a while to load.', - 'registered' => 'You have registered successfully!', + 'registered' => 'Zarejestrowałeś się pomyślnie!', 'search' => 'Szukaj', 'search_found_accounts' => 'Znaleziono :count kont(o/a) dla twojego wyszukiwania.', 'search_found_categories' => 'Znaleziono :count kategorii dla twojego wyszukiwania.', @@ -83,7 +83,7 @@ return [ 'source_accounts' => 'Konto(a) źródłowe', 'destination_accounts' => 'Konto(a) docelowe', 'user_id_is' => 'Twój id użytkownika to :user', - 'field_supports_markdown' => 'This field supports Markdown.', + 'field_supports_markdown' => 'To pole obsługuje Markdown.', 'need_more_help' => 'If you need more help using Firefly III, please open a ticket on Github.', 'nothing_to_display' => 'There are no transactions to show you', 'show_all_no_filter' => 'Show all transactions without grouping them by date.', @@ -100,25 +100,25 @@ return [ 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', - 'all_periods' => 'All periods', - 'current_period' => 'Current period', + 'all_periods' => 'Wszystkie okresy', + 'current_period' => 'Bieżący okres', 'show_the_current_period_and_overview' => 'Show the current period and overview', 'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.', - 'budget_in_period' => '":name" between :start and :end', + 'budget_in_period' => '":name" między :start oraz :end', 'budget_in_period_breadcrumb' => 'Between :start and :end', // repeat frequencies: - 'repeat_freq_yearly' => 'yearly', - 'repeat_freq_monthly' => 'monthly', - 'weekly' => 'weekly', - 'quarterly' => 'quarterly', - 'half-year' => 'every half year', - 'yearly' => 'yearly', + 'repeat_freq_yearly' => 'rocznie', + 'repeat_freq_monthly' => 'miesięcznie', + 'weekly' => 'tygodniowo', + 'quarterly' => 'kwartalnie', + 'half-year' => 'co pół roku', + 'yearly' => 'rocznie', // account confirmation: - 'confirm_account_header' => 'Please confirm your account', + 'confirm_account_header' => 'Proszę potwierdzić swoje konto', 'confirm_account_intro' => 'An email has been sent to the address you used during your registration. Please check it out for further instructions. If you did not get this message, you can have Firefly send it again.', 'confirm_account_resend_email' => 'Send me the confirmation message I need to activate my account.', - 'account_is_confirmed' => 'Your account has been confirmed!', + 'account_is_confirmed' => 'Twoje konto zostało potwierdzone!', 'invalid_activation_code' => 'It seems the code you are using is not valid, or has expired.', 'confirm_account_is_resent_header' => 'The confirmation has been resent', 'confirm_account_is_resent_text' => 'The confirmation message has been resent. If you still did not receive the confirmation message, please contact the site owner at :owner or check the log files to see what went wrong.', @@ -149,12 +149,12 @@ return [ 'export_status_collected_attachments' => 'Collected all your attachments!', 'export_status_collecting_old_uploads' => 'Collecting all your previous uploads...', 'export_status_collected_old_uploads' => 'Collected all your previous uploads!', - 'export_status_creating_config_file' => 'Creating a configuration file...', + 'export_status_creating_config_file' => 'Tworzenie pliku konfiguracji...', 'export_status_created_config_file' => 'Created a configuration file!', 'export_status_creating_zip_file' => 'Creating a zip file...', - 'export_status_created_zip_file' => 'Created a zip file!', + 'export_status_created_zip_file' => 'Utworzono plik zip!', 'export_status_finished' => 'Export has succesfully finished! Yay!', - 'export_data_please_wait' => 'Please wait...', + 'export_data_please_wait' => 'Proszę czekać...', 'attachment_explanation' => 'The file called \':attachment_name\' (#:attachment_id) was originally uploaded to :type \':description\' (#:journal_id) dated :date for the amount of :amount.', // rules @@ -189,7 +189,7 @@ return [ 'default_rule_group_name' => 'Default rules', 'default_rule_group_description' => 'All your rules not in a particular group.', 'default_rule_name' => 'Your first default rule', - 'default_rule_description' => 'This rule is an example. You can safely delete it.', + 'default_rule_description' => 'Ta reguła jest przykładem. Możesz ją bezpiecznie usunąć.', 'default_rule_trigger_description' => 'The Man Who Sold the World', 'default_rule_trigger_from_account' => 'David Bowie', 'default_rule_action_prepend' => 'Bought the world from ', From 63334a61ad54375f142f9afda20f7f6ccb9fbd3f Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:31:59 +0100 Subject: [PATCH 299/350] New translations --- resources/lang/pl_PL/form.php | 84 +++++++++++++++++------------------ 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php index 1435dace27..0030de839a 100644 --- a/resources/lang/pl_PL/form.php +++ b/resources/lang/pl_PL/form.php @@ -49,8 +49,8 @@ return [ 'openingBalance' => 'Bilans otwarcia', 'tagMode' => 'Tag mode', 'tagPosition' => 'Lokalizacja taga', - 'virtualBalance' => 'Virtual balance', - 'longitude_latitude' => 'Location', + 'virtualBalance' => 'Wirtualne saldo', + 'longitude_latitude' => 'Lokalizacja', 'targetamount' => 'Target amount', 'accountRole' => 'Account role', 'openingBalanceDate' => 'Opening balance date', @@ -59,32 +59,32 @@ return [ 'piggy_bank_id' => 'Piggy bank', 'returnHere' => 'Return here', 'returnHereExplanation' => 'After storing, return here to create another one.', - 'returnHereUpdateExplanation' => 'After updating, return here.', - 'description' => 'Description', + 'returnHereUpdateExplanation' => 'Po aktualizacji, wróć tutaj.', + 'description' => 'Opis', 'expense_account' => 'Expense account', 'revenue_account' => 'Revenue account', - 'decimal_places' => 'Decimal places', + 'decimal_places' => 'Miejsca dziesiętne', - 'revenue_account_source' => 'Revenue account (source)', + 'revenue_account_source' => 'Konto przychodów (źródło)', 'source_account_asset' => 'Source account (asset account)', 'destination_account_expense' => 'Destination account (expense account)', 'destination_account_asset' => 'Destination account (asset account)', 'source_account_revenue' => 'Source account (revenue account)', - 'type' => 'Type', + 'type' => 'Typ', 'convert_Withdrawal' => 'Convert withdrawal', 'convert_Deposit' => 'Convert deposit', 'convert_Transfer' => 'Convert transfer', - 'amount' => 'Amount', - 'date' => 'Date', + 'amount' => 'Kwota', + 'date' => 'Data', 'interest_date' => 'Interest date', 'book_date' => 'Book date', 'process_date' => 'Processing date', - 'category' => 'Category', - 'tags' => 'Tags', - 'deletePermanently' => 'Delete permanently', - 'cancel' => 'Cancel', + 'category' => 'Kategoria', + 'tags' => 'Tagi', + 'deletePermanently' => 'Usuń trwale', + 'cancel' => 'Anuluj', 'targetdate' => 'Target date', 'tag' => 'Tag', 'under' => 'Under', @@ -103,24 +103,24 @@ return [ 'add_new_deposit' => 'Add a new deposit', 'add_new_transfer' => 'Add a new transfer', 'noPiggybank' => '(no piggy bank)', - 'title' => 'Title', - 'notes' => 'Notes', - 'filename' => 'File name', - 'mime' => 'Mime type', - 'size' => 'Size', - 'trigger' => 'Trigger', - 'stop_processing' => 'Stop processing', - 'start_date' => 'Start of range', - 'end_date' => 'End of range', + 'title' => 'Tytuł', + 'notes' => 'Notatki', + 'filename' => 'Nazwa pliku', + 'mime' => 'Typ MIME', + 'size' => 'Rozmiar', + 'trigger' => 'Wyzwalacz', + 'stop_processing' => 'Zatrzymaj przetwarzanie', + 'start_date' => 'Początek zakresu', + 'end_date' => 'Koniec zakresu', 'export_start_range' => 'Start of export range', 'export_end_range' => 'End of export range', - 'export_format' => 'File format', - 'include_attachments' => 'Include uploaded attachments', + 'export_format' => 'Format pliku', + 'include_attachments' => 'Uwzględnij dołączone załączniki', 'include_old_uploads' => 'Include imported data', 'accounts' => 'Export transactions from these accounts', - 'delete_account' => 'Delete account ":name"', - 'delete_bill' => 'Delete bill ":name"', - 'delete_budget' => 'Delete budget ":name"', + 'delete_account' => 'Usuń konto ":name"', + 'delete_bill' => 'Usuń rachunek ":name"', + 'delete_budget' => 'Usuń budżet ":name"', 'delete_category' => 'Delete category ":name"', 'delete_currency' => 'Delete currency ":name"', 'delete_journal' => 'Delete transaction with description ":description"', @@ -139,10 +139,10 @@ return [ 'journal_areYouSure' => 'Are you sure you want to delete the transaction described ":description"?', 'mass_journal_are_you_sure' => 'Are you sure you want to delete these transactions?', 'tag_areYouSure' => 'Are you sure you want to delete the tag ":tag"?', - 'permDeleteWarning' => 'Deleting stuff from Firely is permanent and cannot be undone.', + 'permDeleteWarning' => 'Usuwanie rzeczy z Firefly jest trwałe i nie można tego cofnąć.', 'mass_make_selection' => 'You can still prevent items from being deleted by removing the checkbox.', 'delete_all_permanently' => 'Delete selected permanently', - 'update_all_journals' => 'Update these transactions', + 'update_all_journals' => 'Zmodyfikuj te transakcje', 'also_delete_transactions' => 'The only transaction connected to this account will be deleted as well.|All :count transactions connected to this account will be deleted as well.', 'also_delete_rules' => 'The only rule connected to this rule group will be deleted as well.|All :count rules connected to this rule group will be deleted as well.', 'also_delete_piggyBanks' => 'The only piggy bank connected to this account will be deleted as well.|All :count piggy bank connected to this account will be deleted as well.', @@ -151,17 +151,17 @@ return [ 'category_keep_transactions' => 'The only transaction connected to this category will not be deleted.|All :count transactions connected to this category will spared deletion.', 'tag_keep_transactions' => 'The only transaction connected to this tag will not be deleted.|All :count transactions connected to this tag will spared deletion.', - 'email' => 'Email address', - 'password' => 'Password', - 'password_confirmation' => 'Password (again)', - 'blocked' => 'Is blocked?', - 'blocked_code' => 'Reason for block', + 'email' => 'Adres email', + 'password' => 'Hasło', + 'password_confirmation' => 'Hasło (ponownie)', + 'blocked' => 'Jest zablokowany?', + 'blocked_code' => 'Powód blokady', // admin - 'domain' => 'Domain', - 'single_user_mode' => 'Single user mode', - 'must_confirm_account' => 'New users must activate account', + 'domain' => 'Domena', + 'single_user_mode' => 'Tryb pojedynczego użytkownika', + 'must_confirm_account' => 'Nowi użytkownicy muszą aktywować konto', 'is_demo_site' => 'Is demo site', @@ -169,16 +169,16 @@ return [ 'import_file' => 'Import file', 'configuration_file' => 'Configuration file', 'import_file_type' => 'Import file type', - 'csv_comma' => 'A comma (,)', - 'csv_semicolon' => 'A semicolon (;)', - 'csv_tab' => 'A tab (invisible)', + 'csv_comma' => 'Przecinek (,)', + 'csv_semicolon' => 'Średnik (;)', + 'csv_tab' => 'Tabulator (niewidoczny)', 'csv_delimiter' => 'CSV field delimiter', 'csv_import_account' => 'Default import account', 'csv_config' => 'CSV import configuration', - 'due_date' => 'Due date', - 'payment_date' => 'Payment date', + 'due_date' => 'Termin realizacji', + 'payment_date' => 'Data płatności', 'invoice_date' => 'Invoice date', 'internal_reference' => 'Internal reference', ]; \ No newline at end of file From 7c546b8d3ac4774af2b5ac0c5c58cceb33b790f0 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:32:01 +0100 Subject: [PATCH 300/350] New translations --- resources/lang/pl_PL/csv.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lang/pl_PL/csv.php b/resources/lang/pl_PL/csv.php index 7107aca7a6..16db4317f5 100644 --- a/resources/lang/pl_PL/csv.php +++ b/resources/lang/pl_PL/csv.php @@ -73,8 +73,8 @@ return [ 'column_sepa-ct-id' => 'SEPA Credit Transfer end-to-end ID', 'column_sepa-ct-op' => 'SEPA Credit Transfer opposing account', 'column_sepa-db' => 'SEPA Direct Debet', - 'column_tags-comma' => 'Tags (comma separated)', - 'column_tags-space' => 'Tags (space separated)', + 'column_tags-comma' => 'Tagi (oddzielone przecinkami)', + 'column_tags-space' => 'Tagi (oddzielone spacjami)', 'column_account-number' => 'Asset account (account number)', 'column_opposing-number' => 'Opposing account (account number)', ]; \ No newline at end of file From 8c8ea17fac38b185c34468c351dae05761a258b4 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:41:46 +0100 Subject: [PATCH 301/350] New translations --- resources/lang/nl_NL/demo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lang/nl_NL/demo.php b/resources/lang/nl_NL/demo.php index 4b62e38bfc..ff2c7b4b54 100644 --- a/resources/lang/nl_NL/demo.php +++ b/resources/lang/nl_NL/demo.php @@ -11,8 +11,8 @@ return [ 'no_demo_text' => 'Sorry, er is geen extra uitleg voor deze pagina.', 'see_help_icon' => 'Maar het -icoontje kan je wellicht meer vertellen.', 'index' => 'Welkom bij Firefly III! Op deze pagina krijg je een overzicht van je financiën. Meer diepgaande informatie vindt je onder Rekeningen →Betaalrekeningen en natuurlijk onder Budgetten- en Overzichten. Klik gerust rond en en kijk waar je terecht komt.', - '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. On this page you can edit or remove them.', - 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', + 'accounts-index' => 'Betaalrekeningen zijn je persoonlijke bankrekeningen. Crediteuren zijn rekeningen waar jij geld uit geeft, zoals bij winkels of aan vrienden. Debiteuren zijn rekeningen waar jij geld van krijgt, zoals je werk, de overheid of andere bronnen van inkomsten. Op deze pagina kan je ze wijzigen of verwijderen.', + 'budgets-index' => 'Op deze pagina zie je je budgetten. De bovenste balk is het bedrag dat je kan gaan budgetteren. Dat kan je zelf aanpassen door op het bedrag te klikken. Wat je daadwerkelijk hebt uitgegeven zie je in de balk er onder. Daar weer onder zie je elk budget en wat je er voor gebudgetteerd hebt.', 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', From 0fe10e470d567aa1673517652f341fac0602e9ef Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:41:49 +0100 Subject: [PATCH 302/350] New translations --- resources/lang/pl_PL/firefly.php | 106 +++++++++++++++---------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index fbaf5966d8..922b03e00a 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -194,29 +194,29 @@ return [ 'default_rule_trigger_from_account' => 'David Bowie', 'default_rule_action_prepend' => 'Bought the world from ', 'default_rule_action_set_category' => 'Large expenses', - 'trigger' => 'Trigger', + 'trigger' => 'Wyzwalacz', 'trigger_value' => 'Trigger on value', - 'stop_processing_other_triggers' => 'Stop processing other triggers', - 'add_rule_trigger' => 'Add new trigger', - 'action' => 'Action', + 'stop_processing_other_triggers' => 'Zatrzymaj przetwarzanie innych wyzwalaczy', + 'add_rule_trigger' => 'Dodaj nowy wyzwalacz', + 'action' => 'Akcja', 'action_value' => 'Action value', 'stop_executing_other_actions' => 'Stop executing other actions', 'add_rule_action' => 'Add new action', - 'edit_rule' => 'Edit rule ":title"', - 'delete_rule' => 'Delete rule ":title"', - 'update_rule' => 'Update rule', - 'test_rule_triggers' => 'See matching transactions', + 'edit_rule' => 'Modyfikuj regułę ":title"', + 'delete_rule' => 'Usuń regułę ":title"', + 'update_rule' => 'Modyfikuj regułę', + 'test_rule_triggers' => 'Zobacz dopasowane transakcje', 'warning_transaction_subset' => 'For performance reasons this list is limited to :max_num_transactions and may only show a subset of matching transactions', 'warning_no_matching_transactions' => 'No matching transactions found. Please note that for performance reasons, only the last :num_transactions transactions have been checked.', 'warning_no_valid_triggers' => 'No valid triggers provided.', - 'execute_on_existing_transactions' => 'Execute for existing transactions', + 'execute_on_existing_transactions' => 'Wykonaj dla istniejących transakcji', 'rule_group_select_transactions' => 'Execute rule group ":title" on existing transactions', 'execute_on_existing_transactions_intro' => 'When a rule or group has been changed or added, you can execute it for existing transactions', - 'execute_on_existing_transactions_short' => 'Existing transactions', + 'execute_on_existing_transactions_short' => 'Istniejące transakcje', 'executed_group_on_existing_transactions' => 'Executed group ":title" for existing transactions', 'execute_group_on_existing_transactions' => 'Execute group ":title" for existing transactions', 'include_transactions_from_accounts' => 'Include transactions from these accounts', - 'execute' => 'Execute', + 'execute' => 'Wykonaj', // actions and triggers 'rule_trigger_user_action' => 'User action is ":trigger_value"', @@ -238,9 +238,9 @@ return [ 'rule_trigger_description_is' => 'Description is ":trigger_value"', 'rule_trigger_from_account_starts_choice' => 'Source account starts with..', 'rule_trigger_from_account_ends_choice' => 'Source account ends with..', - 'rule_trigger_from_account_is_choice' => 'Source account is..', - 'rule_trigger_from_account_contains_choice' => 'Source account contains..', - 'rule_trigger_to_account_starts_choice' => 'Destination account starts with..', + 'rule_trigger_from_account_is_choice' => 'Kontem źródłowym jest..', + 'rule_trigger_from_account_contains_choice' => 'Konto źródłowe zawiera..', + 'rule_trigger_to_account_starts_choice' => 'Konto docelowe zaczyna się od..', 'rule_trigger_to_account_ends_choice' => 'Destination account ends with..', 'rule_trigger_to_account_is_choice' => 'Destination account is..', 'rule_trigger_to_account_contains_choice' => 'Destination account contains..', @@ -258,19 +258,19 @@ return [ 'rule_action_clear_category' => 'Clear category', 'rule_action_set_budget' => 'Set budget to ":action_value"', 'rule_action_clear_budget' => 'Clear budget', - 'rule_action_add_tag' => 'Add tag ":action_value"', - 'rule_action_remove_tag' => 'Remove tag ":action_value"', - 'rule_action_remove_all_tags' => 'Remove all tags', - 'rule_action_set_description' => 'Set description to ":action_value"', + 'rule_action_add_tag' => 'Dodaj tag ":action_value"', + 'rule_action_remove_tag' => 'Usuń tag ":action_value"', + 'rule_action_remove_all_tags' => 'Usuń wszystkie tagi', + 'rule_action_set_description' => 'Ustaw opis na ":action_value"', 'rule_action_append_description' => 'Append description with ":action_value"', 'rule_action_prepend_description' => 'Prepend description with ":action_value"', - 'rule_action_set_category_choice' => 'Set category to..', + 'rule_action_set_category_choice' => 'Ustaw kategorię na..', 'rule_action_clear_category_choice' => 'Clear any category', 'rule_action_set_budget_choice' => 'Set budget to..', 'rule_action_clear_budget_choice' => 'Clear any budget', - 'rule_action_add_tag_choice' => 'Add tag..', - 'rule_action_remove_tag_choice' => 'Remove tag..', - 'rule_action_remove_all_tags_choice' => 'Remove all tags', + 'rule_action_add_tag_choice' => 'Dodaj tag..', + 'rule_action_remove_tag_choice' => 'Usuń tag..', + 'rule_action_remove_all_tags_choice' => 'Usuń wszystkie tagi', 'rule_action_set_description_choice' => 'Set description to..', 'rule_action_append_description_choice' => 'Append description with..', 'rule_action_prepend_description_choice' => 'Prepend description with..', @@ -281,37 +281,37 @@ return [ // tags 'store_new_tag' => 'Store new tag', - 'update_tag' => 'Update tag', - 'no_location_set' => 'No location set.', - 'meta_data' => 'Meta data', - 'location' => 'Location', + 'update_tag' => 'Zmodyfikuj tag', + 'no_location_set' => 'Nie ustawiono lokalizacji.', + 'meta_data' => 'Metadane', + 'location' => 'Lokalizacja', // preferences 'pref_home_screen_accounts' => 'Home screen accounts', 'pref_home_screen_accounts_help' => 'Which accounts should be displayed on the home page?', 'pref_view_range' => 'View range', 'pref_view_range_help' => 'Some charts are automatically grouped in periods. What period would you prefer?', - 'pref_1D' => 'One day', - 'pref_1W' => 'One week', - 'pref_1M' => 'One month', - 'pref_3M' => 'Three months (quarter)', - 'pref_6M' => 'Six months', - 'pref_1Y' => 'One year', - 'pref_languages' => 'Languages', - 'pref_languages_help' => 'Firefly III supports several languages. Which one do you prefer?', - 'pref_custom_fiscal_year' => 'Fiscal year settings', - 'pref_custom_fiscal_year_label' => 'Enabled', - 'pref_custom_fiscal_year_help' => 'In countries that use a financial year other than January 1 to December 31, you can switch this on and specify start / end days of the fiscal year', - 'pref_fiscal_year_start_label' => 'Fiscal year start date', - 'pref_two_factor_auth' => '2-step verification', + 'pref_1D' => 'Dzień', + 'pref_1W' => 'Tydzień', + 'pref_1M' => 'Miesiąc', + 'pref_3M' => 'Trzy miesiące (kwartał)', + 'pref_6M' => 'Sześć miesięcy', + 'pref_1Y' => 'Rok', + 'pref_languages' => 'Języki', + 'pref_languages_help' => 'Firefly III obsługuje kilka języków. Który wolisz?', + 'pref_custom_fiscal_year' => 'Ustawienia roku podatkowego', + 'pref_custom_fiscal_year_label' => 'Włączone', + 'pref_custom_fiscal_year_help' => 'W krajach, w których rok podatkowy nie zaczyna się 1 stycznia i nie kończy 31 grudnia, możesz włączyć tą opcję oraz podać początek / koniec roku podatkowego', + 'pref_fiscal_year_start_label' => 'Początek roku podatkowego', + 'pref_two_factor_auth' => 'Weryfikacja dwuetapowa', 'pref_two_factor_auth_help' => 'When you enable 2-step verification (also known as two-factor authentication), you add an extra layer of security to your account. You sign in with something you know (your password) and something you have (a verification code). Verification codes are generated by an application on your phone, such as Authy or Google Authenticator.', - 'pref_enable_two_factor_auth' => 'Enable 2-step verification', - 'pref_two_factor_auth_disabled' => '2-step verification code removed and disabled', - 'pref_two_factor_auth_remove_it' => 'Don\'t forget to remove the account from your authentication app!', - 'pref_two_factor_auth_code' => 'Verify code', + 'pref_enable_two_factor_auth' => 'Włącz weryfikację dwuetapową', + 'pref_two_factor_auth_disabled' => 'Kod weryfikacji dwuetapowej został usunięty i wyłączony', + 'pref_two_factor_auth_remove_it' => 'Nie zapomnij usunąć konta z aplikacji uwierzytelniajcej!', + 'pref_two_factor_auth_code' => 'Zweryfikuj kod', 'pref_two_factor_auth_code_help' => 'Scan the QR code with an application on your phone such as Authy or Google Authenticator and enter the generated code.', - 'pref_two_factor_auth_reset_code' => 'Reset verification code', - 'pref_two_factor_auth_remove_code' => 'Remove verification code', + 'pref_two_factor_auth_reset_code' => 'Zresetuj kod weryfikacyjny', + 'pref_two_factor_auth_remove_code' => 'Usuń kod weryfikacyjny', 'pref_two_factor_auth_remove_will_disable' => '(this will also disable two-factor authentication)', 'pref_save_settings' => 'Save settings', 'saved_preferences' => 'Preferences saved!', @@ -343,17 +343,17 @@ return [ 'pref_optional_tj_attachments' => 'Attachments', 'optional_field_meta_dates' => 'Dates', 'optional_field_meta_business' => 'Business', - 'optional_field_attachments' => 'Attachments', - 'optional_field_meta_data' => 'Optional meta data', + 'optional_field_attachments' => 'Załączniki', + 'optional_field_meta_data' => 'Opcjonalne metadane', // profile: - 'change_your_password' => 'Change your password', - 'delete_account' => 'Delete account', - 'current_password' => 'Current password', - 'new_password' => 'New password', - 'new_password_again' => 'New password (again)', - 'delete_your_account' => 'Delete your account', + 'change_your_password' => 'Zmień swoje hasło', + 'delete_account' => 'Usuń konto', + 'current_password' => 'Bieżące hasło', + 'new_password' => 'Nowe Hasło', + 'new_password_again' => 'Nowe hasło (ponownie)', + 'delete_your_account' => 'Usuń swoje konto', 'delete_your_account_help' => 'Deleting your account will also delete any accounts, transactions, anything you might have saved into Firefly III. It\'ll be GONE.', 'delete_your_account_password' => 'Enter your password to continue.', 'password' => 'Password', From 851b9136fe4be3375e45c85fb93c767573a2ecd3 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:51:41 +0100 Subject: [PATCH 303/350] New translations --- resources/lang/pl_PL/firefly.php | 50 ++++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 922b03e00a..903ee6acc2 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -88,15 +88,15 @@ return [ 'nothing_to_display' => 'There are no transactions to show you', 'show_all_no_filter' => 'Show all transactions without grouping them by date.', 'expenses_by_category' => 'Expenses by category', - 'expenses_by_budget' => 'Expenses by budget', - 'income_by_category' => 'Income by category', + 'expenses_by_budget' => 'Wydatki wg budżetu', + 'income_by_category' => 'Dochody wg kategorii', 'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.', 'sum_of_expenses' => 'Suma wydatków', 'sum_of_income' => 'Suma dochodów', 'spent_in_specific_budget' => 'Spent in budget ":budget"', 'sum_of_expenses_in_budget' => 'Spent total in budget ":budget"', 'left_in_budget_limit' => 'Left to spend according to budgeting', - 'cannot_change_demo' => 'You cannot change the password of the demonstration account.', + 'cannot_change_demo' => 'Nie można zmienić hasła do konta demonstracyjnego.', 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'per_period' => 'Per period', @@ -119,13 +119,13 @@ return [ 'confirm_account_intro' => 'An email has been sent to the address you used during your registration. Please check it out for further instructions. If you did not get this message, you can have Firefly send it again.', 'confirm_account_resend_email' => 'Send me the confirmation message I need to activate my account.', 'account_is_confirmed' => 'Twoje konto zostało potwierdzone!', - 'invalid_activation_code' => 'It seems the code you are using is not valid, or has expired.', + 'invalid_activation_code' => 'Wygląda na to że kod którego używasz jest nieprawidłowy lub wygasł.', 'confirm_account_is_resent_header' => 'The confirmation has been resent', 'confirm_account_is_resent_text' => 'The confirmation message has been resent. If you still did not receive the confirmation message, please contact the site owner at :owner or check the log files to see what went wrong.', 'confirm_account_is_resent_go_home' => 'Go to the index page of Firefly', - 'confirm_account_not_resent_header' => 'Something went wrong :(', + 'confirm_account_not_resent_header' => 'Coś poszło nie tak :(', 'confirm_account_not_resent_intro' => 'The confirmation message has been not resent. If you still did not receive the confirmation message, please contact the site owner at :owner instead. Possibly, you have tried to resend the activation message too often. You can have Firefly III try to resend the confirmation message every hour.', - 'confirm_account_not_resent_go_home' => 'Go to the index page of Firefly', + 'confirm_account_not_resent_go_home' => 'Przejdź do strony głównej Firefly', // export data: 'import_and_export' => 'Import / eksport', @@ -356,38 +356,38 @@ return [ 'delete_your_account' => 'Usuń swoje konto', 'delete_your_account_help' => 'Deleting your account will also delete any accounts, transactions, anything you might have saved into Firefly III. It\'ll be GONE.', 'delete_your_account_password' => 'Enter your password to continue.', - 'password' => 'Password', - 'are_you_sure' => 'Are you sure? You cannot undo this.', - 'delete_account_button' => 'DELETE your account', + 'password' => 'Hasło', + 'are_you_sure' => 'Jesteś pewny? Nie możesz tego cofnąć.', + 'delete_account_button' => 'USUŃ swoje konto', 'invalid_current_password' => 'Invalid current password!', - 'password_changed' => 'Password changed!', - 'should_change' => 'The idea is to change your password.', - 'invalid_password' => 'Invalid password!', + 'password_changed' => 'Hasło zostało zmienione!', + 'should_change' => 'Chodzi o to, aby zmienić swoje hasło.', + 'invalid_password' => 'Nieprawidłowe hasło!', // attachments - 'nr_of_attachments' => 'One attachment|:count attachments', - 'attachments' => 'Attachments', + 'nr_of_attachments' => 'Jeden załącznik |:count załączników', + 'attachments' => 'Załączniki', 'edit_attachment' => 'Edit attachment ":name"', 'update_attachment' => 'Update attachment', 'delete_attachment' => 'Delete attachment ":name"', 'attachment_deleted' => 'Deleted attachment ":name"', 'attachment_updated' => 'Updated attachment ":name"', - 'upload_max_file_size' => 'Maximum file size: :size', + 'upload_max_file_size' => 'Maksymalny rozmiar pliku to: :size', // tour: - 'prev' => 'Prev', - 'next' => 'Next', - 'end-tour' => 'End tour', - 'pause' => 'Pause', + 'prev' => 'Poprz.', + 'next' => 'Nast.', + 'end-tour' => 'Koniec samouczka', + 'pause' => 'Pauza', // transaction index - 'title_expenses' => 'Expenses', - 'title_withdrawal' => 'Expenses', - 'title_revenue' => 'Revenue / income', - 'title_deposit' => 'Revenue / income', - 'title_transfer' => 'Transfers', - 'title_transfers' => 'Transfers', + 'title_expenses' => 'Wydatki', + 'title_withdrawal' => 'Wydatki', + 'title_revenue' => 'Przychód / dochód', + 'title_deposit' => 'Przychód / dochód', + 'title_transfer' => 'Transfery', + 'title_transfers' => 'Transfery', // convert stuff: 'convert_is_already_type_Withdrawal' => 'This transaction is already a withdrawal', From f4c9f2d0e7934687f489b86f0580bd84e1773dba Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:51:43 +0100 Subject: [PATCH 304/350] New translations --- resources/lang/pl_PL/form.php | 46 +++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php index 0030de839a..042ab3090c 100644 --- a/resources/lang/pl_PL/form.php +++ b/resources/lang/pl_PL/form.php @@ -25,12 +25,12 @@ return [ 'match' => 'Matches on', 'repeat_freq' => 'Repeats', 'journal_currency_id' => 'Waluta', - 'currency_id' => 'Currency', - 'attachments' => 'Attachments', - 'journal_amount' => 'Amount', - 'journal_asset_source_account' => 'Asset account (source)', + 'currency_id' => 'Waluta', + 'attachments' => 'Załączniki', + 'journal_amount' => 'Kwota', + 'journal_asset_source_account' => 'Konto aktywów (źródło)', 'journal_source_account_name' => 'Revenue account (source)', - 'journal_source_account_id' => 'Asset account (source)', + 'journal_source_account_id' => 'Konto aktywów (źródło)', 'BIC' => 'BIC', 'account_from_id' => 'Z konta', 'account_to_id' => 'Na konto', @@ -54,10 +54,10 @@ return [ 'targetamount' => 'Target amount', 'accountRole' => 'Account role', 'openingBalanceDate' => 'Opening balance date', - 'ccType' => 'Credit card payment plan', + 'ccType' => 'Plan płatności kartą kredytową', 'ccMonthlyPaymentDate' => 'Credit card monthly payment date', - 'piggy_bank_id' => 'Piggy bank', - 'returnHere' => 'Return here', + 'piggy_bank_id' => 'Skarbonka', + 'returnHere' => 'Wróć tutaj', 'returnHereExplanation' => 'After storing, return here to create another one.', 'returnHereUpdateExplanation' => 'Po aktualizacji, wróć tutaj.', 'description' => 'Opis', @@ -89,18 +89,18 @@ return [ 'tag' => 'Tag', 'under' => 'Under', 'symbol' => 'Symbol', - 'code' => 'Code', + 'code' => 'Kod', 'iban' => 'IBAN', - 'accountNumber' => 'Account number', - 'has_headers' => 'Headers', - 'date_format' => 'Date format', + 'accountNumber' => 'Numer konta', + 'has_headers' => 'Nagłówki', + 'date_format' => 'Format daty', 'specifix' => 'Bank- or file specific fixes', - 'attachments[]' => 'Attachments', - 'store_new_withdrawal' => 'Store new withdrawal', - 'store_new_deposit' => 'Store new deposit', - 'store_new_transfer' => 'Store new transfer', + 'attachments[]' => 'Załączniki', + 'store_new_withdrawal' => 'Zapisz nową wypłatę', + 'store_new_deposit' => 'Zapisz nową wpłatę', + 'store_new_transfer' => 'Zapisz nowy transfer', 'add_new_withdrawal' => 'Add a new withdrawal', - 'add_new_deposit' => 'Add a new deposit', + 'add_new_deposit' => 'Dodaj nową wpłatę', 'add_new_transfer' => 'Add a new transfer', 'noPiggybank' => '(no piggy bank)', 'title' => 'Tytuł', @@ -121,13 +121,13 @@ return [ 'delete_account' => 'Usuń konto ":name"', 'delete_bill' => 'Usuń rachunek ":name"', 'delete_budget' => 'Usuń budżet ":name"', - 'delete_category' => 'Delete category ":name"', - 'delete_currency' => 'Delete currency ":name"', + 'delete_category' => 'Usuń kategorię ":name"', + 'delete_currency' => 'Usuń walutę ":name"', 'delete_journal' => 'Delete transaction with description ":description"', - 'delete_attachment' => 'Delete attachment ":name"', - 'delete_rule' => 'Delete rule ":title"', - 'delete_rule_group' => 'Delete rule group ":title"', - 'attachment_areYouSure' => 'Are you sure you want to delete the attachment named ":name"?', + 'delete_attachment' => 'Usuń załącznik ":name"', + 'delete_rule' => 'Usuń regułę ":title"', + 'delete_rule_group' => 'Usuń grupę reguł ":title"', + 'attachment_areYouSure' => 'Czy na pewno chcesz usunąć załącznik o nazwie ":name"?', 'account_areYouSure' => 'Are you sure you want to delete the account named ":name"?', 'bill_areYouSure' => 'Are you sure you want to delete the bill named ":name"?', 'rule_areYouSure' => 'Are you sure you want to delete the rule titled ":title"?', From 1f58c46f678ba3d3f96b6fdfe956a56ed3f4ffc7 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 18:51:46 +0100 Subject: [PATCH 305/350] New translations --- resources/lang/pl_PL/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/pl_PL/list.php b/resources/lang/pl_PL/list.php index 912fcb79ab..fdb95fd9c0 100644 --- a/resources/lang/pl_PL/list.php +++ b/resources/lang/pl_PL/list.php @@ -42,7 +42,7 @@ return [ 'internal_reference' => 'Internal reference', 'date' => 'Data', 'interest_date' => 'Interest date', - 'book_date' => 'Book date', + 'book_date' => 'Data księgowania', 'process_date' => 'Processing date', 'due_date' => 'Termin realizacji', 'payment_date' => 'Data płatności', From a769a5391d25f62f5b5a44ede96ee1509d25c8af Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:01:55 +0100 Subject: [PATCH 306/350] New translations --- resources/lang/pl_PL/firefly.php | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 903ee6acc2..bddb4ca729 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -87,7 +87,7 @@ return [ 'need_more_help' => 'If you need more help using Firefly III, please open a ticket on Github.', 'nothing_to_display' => 'There are no transactions to show you', 'show_all_no_filter' => 'Show all transactions without grouping them by date.', - 'expenses_by_category' => 'Expenses by category', + 'expenses_by_category' => 'Wydatki wg kategorii', 'expenses_by_budget' => 'Wydatki wg budżetu', 'income_by_category' => 'Dochody wg kategorii', 'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.', @@ -105,7 +105,7 @@ return [ 'show_the_current_period_and_overview' => 'Show the current period and overview', 'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.', 'budget_in_period' => '":name" między :start oraz :end', - 'budget_in_period_breadcrumb' => 'Between :start and :end', + 'budget_in_period_breadcrumb' => 'Między :start i :end', // repeat frequencies: 'repeat_freq_yearly' => 'rocznie', @@ -122,7 +122,7 @@ return [ 'invalid_activation_code' => 'Wygląda na to że kod którego używasz jest nieprawidłowy lub wygasł.', 'confirm_account_is_resent_header' => 'The confirmation has been resent', 'confirm_account_is_resent_text' => 'The confirmation message has been resent. If you still did not receive the confirmation message, please contact the site owner at :owner or check the log files to see what went wrong.', - 'confirm_account_is_resent_go_home' => 'Go to the index page of Firefly', + 'confirm_account_is_resent_go_home' => 'Przejdź do strony głównej Firefly', 'confirm_account_not_resent_header' => 'Coś poszło nie tak :(', 'confirm_account_not_resent_intro' => 'The confirmation message has been not resent. If you still did not receive the confirmation message, please contact the site owner at :owner instead. Possibly, you have tried to resend the activation message too often. You can have Firefly III try to resend the confirmation message every hour.', 'confirm_account_not_resent_go_home' => 'Przejdź do strony głównej Firefly', @@ -151,9 +151,9 @@ return [ 'export_status_collected_old_uploads' => 'Collected all your previous uploads!', 'export_status_creating_config_file' => 'Tworzenie pliku konfiguracji...', 'export_status_created_config_file' => 'Created a configuration file!', - 'export_status_creating_zip_file' => 'Creating a zip file...', + 'export_status_creating_zip_file' => 'Tworzenie pliku zip...', 'export_status_created_zip_file' => 'Utworzono plik zip!', - 'export_status_finished' => 'Export has succesfully finished! Yay!', + 'export_status_finished' => 'Eksport został pomyślnie zakończony! Yay!', 'export_data_please_wait' => 'Proszę czekać...', 'attachment_explanation' => 'The file called \':attachment_name\' (#:attachment_id) was originally uploaded to :type \':description\' (#:journal_id) dated :date for the amount of :amount.', @@ -174,26 +174,26 @@ return [ 'edit_rule_group' => 'Modyfikuj grupę reguł ":title"', 'delete_rule_group' => 'Usuń grupę reguł ":title"', 'deleted_rule_group' => 'Deleted rule group ":title"', - 'update_rule_group' => 'Update rule group', - 'no_rules_in_group' => 'There are no rules in this group', - 'move_rule_group_up' => 'Move rule group up', - 'move_rule_group_down' => 'Move rule group down', + 'update_rule_group' => 'Aktualizuj grupę reguł', + 'no_rules_in_group' => 'Nie ma żadnych reguł w tej grupie', + 'move_rule_group_up' => 'Przenieś grupę reguł w górę', + 'move_rule_group_down' => 'Przenieś grupę reguł w dół', 'save_rules_by_moving' => 'Save these rule(s) by moving them to another rule group:', 'make_new_rule' => 'Make new rule in rule group ":title"', 'rule_help_stop_processing' => 'When you check this box, later rules in this group will not be executed.', - 'rule_help_active' => 'Inactive rules will never fire.', + 'rule_help_active' => 'Nieaktywne reguły nigdy nie zostaną uruchomione.', 'stored_new_rule' => 'Stored new rule with title ":title"', 'deleted_rule' => 'Deleted rule with title ":title"', - 'store_new_rule' => 'Store new rule', + 'store_new_rule' => 'Zapisz nową regułę', 'updated_rule' => 'Updated rule with title ":title"', - 'default_rule_group_name' => 'Default rules', + 'default_rule_group_name' => 'Reguły domyślne', 'default_rule_group_description' => 'All your rules not in a particular group.', 'default_rule_name' => 'Your first default rule', 'default_rule_description' => 'Ta reguła jest przykładem. Możesz ją bezpiecznie usunąć.', 'default_rule_trigger_description' => 'The Man Who Sold the World', 'default_rule_trigger_from_account' => 'David Bowie', 'default_rule_action_prepend' => 'Bought the world from ', - 'default_rule_action_set_category' => 'Large expenses', + 'default_rule_action_set_category' => 'Duże wydatki', 'trigger' => 'Wyzwalacz', 'trigger_value' => 'Trigger on value', 'stop_processing_other_triggers' => 'Zatrzymaj przetwarzanie innych wyzwalaczy', @@ -201,7 +201,7 @@ return [ 'action' => 'Akcja', 'action_value' => 'Action value', 'stop_executing_other_actions' => 'Stop executing other actions', - 'add_rule_action' => 'Add new action', + 'add_rule_action' => 'Dodaj nową akcję', 'edit_rule' => 'Modyfikuj regułę ":title"', 'delete_rule' => 'Usuń regułę ":title"', 'update_rule' => 'Modyfikuj regułę', From c2670fa3799e5a3ce0061e1b1bb9eb23bd1b48c0 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:01:58 +0100 Subject: [PATCH 307/350] New translations --- resources/lang/pl_PL/form.php | 48 +++++++++++++++++------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php index 042ab3090c..4e2f695f14 100644 --- a/resources/lang/pl_PL/form.php +++ b/resources/lang/pl_PL/form.php @@ -29,7 +29,7 @@ return [ 'attachments' => 'Załączniki', 'journal_amount' => 'Kwota', 'journal_asset_source_account' => 'Konto aktywów (źródło)', - 'journal_source_account_name' => 'Revenue account (source)', + 'journal_source_account_name' => 'Konto przychodów (źródło)', 'journal_source_account_id' => 'Konto aktywów (źródło)', 'BIC' => 'BIC', 'account_from_id' => 'Z konta', @@ -79,7 +79,7 @@ return [ 'amount' => 'Kwota', 'date' => 'Data', 'interest_date' => 'Interest date', - 'book_date' => 'Book date', + 'book_date' => 'Data księgowania', 'process_date' => 'Processing date', 'category' => 'Kategoria', 'tags' => 'Tagi', @@ -99,10 +99,10 @@ return [ 'store_new_withdrawal' => 'Zapisz nową wypłatę', 'store_new_deposit' => 'Zapisz nową wpłatę', 'store_new_transfer' => 'Zapisz nowy transfer', - 'add_new_withdrawal' => 'Add a new withdrawal', + 'add_new_withdrawal' => 'Dodaj nową wypłatę', 'add_new_deposit' => 'Dodaj nową wpłatę', - 'add_new_transfer' => 'Add a new transfer', - 'noPiggybank' => '(no piggy bank)', + 'add_new_transfer' => 'Dodaj nowy transfer', + 'noPiggybank' => '(brak skarbonek)', 'title' => 'Tytuł', 'notes' => 'Notatki', 'filename' => 'Nazwa pliku', @@ -112,11 +112,11 @@ return [ 'stop_processing' => 'Zatrzymaj przetwarzanie', 'start_date' => 'Początek zakresu', 'end_date' => 'Koniec zakresu', - 'export_start_range' => 'Start of export range', - 'export_end_range' => 'End of export range', + 'export_start_range' => 'Początek okresu eksportu', + 'export_end_range' => 'Koniec okresu eksportu', 'export_format' => 'Format pliku', 'include_attachments' => 'Uwzględnij dołączone załączniki', - 'include_old_uploads' => 'Include imported data', + 'include_old_uploads' => 'Dołącz zaimportowane dane', 'accounts' => 'Export transactions from these accounts', 'delete_account' => 'Usuń konto ":name"', 'delete_bill' => 'Usuń rachunek ":name"', @@ -128,17 +128,17 @@ return [ 'delete_rule' => 'Usuń regułę ":title"', 'delete_rule_group' => 'Usuń grupę reguł ":title"', 'attachment_areYouSure' => 'Czy na pewno chcesz usunąć załącznik o nazwie ":name"?', - 'account_areYouSure' => 'Are you sure you want to delete the account named ":name"?', - 'bill_areYouSure' => 'Are you sure you want to delete the bill named ":name"?', - 'rule_areYouSure' => 'Are you sure you want to delete the rule titled ":title"?', - 'ruleGroup_areYouSure' => 'Are you sure you want to delete the rule group titled ":title"?', - 'budget_areYouSure' => 'Are you sure you want to delete the budget named ":name"?', - 'category_areYouSure' => 'Are you sure you want to delete the category named ":name"?', - 'currency_areYouSure' => 'Are you sure you want to delete the currency named ":name"?', - 'piggyBank_areYouSure' => 'Are you sure you want to delete the piggy bank named ":name"?', - 'journal_areYouSure' => 'Are you sure you want to delete the transaction described ":description"?', - 'mass_journal_are_you_sure' => 'Are you sure you want to delete these transactions?', - 'tag_areYouSure' => 'Are you sure you want to delete the tag ":tag"?', + 'account_areYouSure' => 'Czy na pewno chcesz usunąć konto o nazwie ":name"?', + 'bill_areYouSure' => 'Czy na pewno chcesz usunąć rachunek o nazwie ":name"?', + 'rule_areYouSure' => 'Czy na pewno chcesz usunąć regułę o nazwie ":name"?', + 'ruleGroup_areYouSure' => 'Czy na pewno chcesz usunąć grupę reguł o nazwie ":name"?', + 'budget_areYouSure' => 'Czy na pewno chcesz usunąć budżet o nazwie ":name"?', + 'category_areYouSure' => 'Czy na pewno chcesz usunąć kategorię o nazwie ":name"?', + 'currency_areYouSure' => 'Czy na pewno chcesz usunąć walutę o nazwie ":name"?', + 'piggyBank_areYouSure' => 'Czy na pewno chcesz usunąć skarbonkę o nazwie ":name"?', + 'journal_areYouSure' => 'Czy na pewno chcesz usunąć transakcję opisaną ":description"?', + 'mass_journal_are_you_sure' => 'Czy na pewno chcesz usunąć te transakcje?', + 'tag_areYouSure' => 'Czy na pewno chcesz usunąć tag ":tag"?', 'permDeleteWarning' => 'Usuwanie rzeczy z Firefly jest trwałe i nie można tego cofnąć.', 'mass_make_selection' => 'You can still prevent items from being deleted by removing the checkbox.', 'delete_all_permanently' => 'Delete selected permanently', @@ -166,19 +166,19 @@ return [ // import - 'import_file' => 'Import file', - 'configuration_file' => 'Configuration file', - 'import_file_type' => 'Import file type', + 'import_file' => 'Importuj plik', + 'configuration_file' => 'Plik konfiguracyjny', + 'import_file_type' => 'Typ pliku importu', 'csv_comma' => 'Przecinek (,)', 'csv_semicolon' => 'Średnik (;)', 'csv_tab' => 'Tabulator (niewidoczny)', 'csv_delimiter' => 'CSV field delimiter', - 'csv_import_account' => 'Default import account', + 'csv_import_account' => 'Domyślne konto importu', 'csv_config' => 'CSV import configuration', 'due_date' => 'Termin realizacji', 'payment_date' => 'Data płatności', - 'invoice_date' => 'Invoice date', + 'invoice_date' => 'Data faktury', 'internal_reference' => 'Internal reference', ]; \ No newline at end of file From 235076b4656adb1cb4a18619bccc7aa24e56be3a Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:02:00 +0100 Subject: [PATCH 308/350] New translations --- resources/lang/pl_PL/csv.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/pl_PL/csv.php b/resources/lang/pl_PL/csv.php index 16db4317f5..ee6b6d07ef 100644 --- a/resources/lang/pl_PL/csv.php +++ b/resources/lang/pl_PL/csv.php @@ -30,7 +30,7 @@ return [ 'column_role' => 'Column data meaning', 'do_map_value' => 'Map these values', 'column' => 'Kolumna', - 'no_example_data' => 'No example data available', + 'no_example_data' => 'Brak dostępnych danych przykładowych', 'store_column_roles' => 'Kontynuuj import', 'do_not_map' => '(do not map)', 'map_title' => 'Connect import data to Firefly III data', From 1d25691aa2b858a4819483983a720cb482fc6e2b Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:02:01 +0100 Subject: [PATCH 309/350] New translations --- resources/lang/pl_PL/auth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/pl_PL/auth.php b/resources/lang/pl_PL/auth.php index 5d833b3d68..96f4d83e1f 100644 --- a/resources/lang/pl_PL/auth.php +++ b/resources/lang/pl_PL/auth.php @@ -23,6 +23,6 @@ return [ */ 'failed' => 'These credentials do not match our records.', - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + 'throttle' => 'Zbyt wiele prób logowania. Spróbuj ponownie za :seconds sekund.', ]; \ No newline at end of file From 3649991ad686670ceca6bd3c1b76c5ec67908636 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:11:55 +0100 Subject: [PATCH 310/350] New translations --- resources/lang/pl_PL/firefly.php | 110 +++++++++++++++---------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index bddb4ca729..3cb9b26f5f 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -179,13 +179,13 @@ return [ 'move_rule_group_up' => 'Przenieś grupę reguł w górę', 'move_rule_group_down' => 'Przenieś grupę reguł w dół', 'save_rules_by_moving' => 'Save these rule(s) by moving them to another rule group:', - 'make_new_rule' => 'Make new rule in rule group ":title"', + 'make_new_rule' => 'Utwórz nową regułę w grupie reguł ":title"', 'rule_help_stop_processing' => 'When you check this box, later rules in this group will not be executed.', 'rule_help_active' => 'Nieaktywne reguły nigdy nie zostaną uruchomione.', - 'stored_new_rule' => 'Stored new rule with title ":title"', - 'deleted_rule' => 'Deleted rule with title ":title"', + 'stored_new_rule' => 'Zapisano regułę o nazwie ":title"', + 'deleted_rule' => 'Usunięto regułę o nazwie ":title"', 'store_new_rule' => 'Zapisz nową regułę', - 'updated_rule' => 'Updated rule with title ":title"', + 'updated_rule' => 'Zmodyfikowano regułę o nazwie ":title"', 'default_rule_group_name' => 'Reguły domyślne', 'default_rule_group_description' => 'All your rules not in a particular group.', 'default_rule_name' => 'Your first default rule', @@ -231,33 +231,33 @@ return [ 'rule_trigger_transaction_type' => 'Transaction is of type ":trigger_value"', 'rule_trigger_amount_less' => 'Amount is less than :trigger_value', 'rule_trigger_amount_exactly' => 'Amount is :trigger_value', - 'rule_trigger_amount_more' => 'Amount is more than :trigger_value', - 'rule_trigger_description_starts' => 'Description starts with ":trigger_value"', - 'rule_trigger_description_ends' => 'Description ends with ":trigger_value"', - 'rule_trigger_description_contains' => 'Description contains ":trigger_value"', - 'rule_trigger_description_is' => 'Description is ":trigger_value"', - 'rule_trigger_from_account_starts_choice' => 'Source account starts with..', - 'rule_trigger_from_account_ends_choice' => 'Source account ends with..', + 'rule_trigger_amount_more' => 'Kwota jest większa niż :trigger_value', + 'rule_trigger_description_starts' => 'Opis się zaczyna od ":trigger_value"', + 'rule_trigger_description_ends' => 'Opis się kończy na ":trigger_value"', + 'rule_trigger_description_contains' => 'Opis zawiera ":trigger_value"', + 'rule_trigger_description_is' => 'Opis jest ":trigger_value"', + 'rule_trigger_from_account_starts_choice' => 'Konto źródłowe zaczyna się od..', + 'rule_trigger_from_account_ends_choice' => 'Konto źródłowe kończy się na..', 'rule_trigger_from_account_is_choice' => 'Kontem źródłowym jest..', 'rule_trigger_from_account_contains_choice' => 'Konto źródłowe zawiera..', 'rule_trigger_to_account_starts_choice' => 'Konto docelowe zaczyna się od..', - 'rule_trigger_to_account_ends_choice' => 'Destination account ends with..', - 'rule_trigger_to_account_is_choice' => 'Destination account is..', - 'rule_trigger_to_account_contains_choice' => 'Destination account contains..', - 'rule_trigger_transaction_type_choice' => 'Transaction is of type..', - 'rule_trigger_amount_less_choice' => 'Amount is less than..', - 'rule_trigger_amount_exactly_choice' => 'Amount is..', - 'rule_trigger_amount_more_choice' => 'Amount is more than..', - 'rule_trigger_description_starts_choice' => 'Description starts with..', - 'rule_trigger_description_ends_choice' => 'Description ends with..', - 'rule_trigger_description_contains_choice' => 'Description contains..', - 'rule_trigger_description_is_choice' => 'Description is..', - 'rule_trigger_store_journal' => 'When a transaction is created', - 'rule_trigger_update_journal' => 'When a transaction is updated', - 'rule_action_set_category' => 'Set category to ":action_value"', - 'rule_action_clear_category' => 'Clear category', - 'rule_action_set_budget' => 'Set budget to ":action_value"', - 'rule_action_clear_budget' => 'Clear budget', + 'rule_trigger_to_account_ends_choice' => 'Konto docelowe kończy się na..', + 'rule_trigger_to_account_is_choice' => 'Konto docelowe jest..', + 'rule_trigger_to_account_contains_choice' => 'Konto docelowe zawiera..', + 'rule_trigger_transaction_type_choice' => 'Transakcja jest typu..', + 'rule_trigger_amount_less_choice' => 'Kwota jest mniejsza niż..', + 'rule_trigger_amount_exactly_choice' => 'Kwota jest..', + 'rule_trigger_amount_more_choice' => 'Kwota jest większa niż..', + 'rule_trigger_description_starts_choice' => 'Opis rozpoczyna się od..', + 'rule_trigger_description_ends_choice' => 'Opis kończy się na..', + 'rule_trigger_description_contains_choice' => 'Opis zawiera..', + 'rule_trigger_description_is_choice' => 'Opis jest..', + 'rule_trigger_store_journal' => 'Po utworzeniu transakcji', + 'rule_trigger_update_journal' => 'Po zmodyfikowaniu transakcji', + 'rule_action_set_category' => 'Ustaw kategorię na ":action_value"', + 'rule_action_clear_category' => 'Wyczyść kategorię', + 'rule_action_set_budget' => 'Ustaw budżet na ":action_value"', + 'rule_action_clear_budget' => 'Wyczyść budżet', 'rule_action_add_tag' => 'Dodaj tag ":action_value"', 'rule_action_remove_tag' => 'Usuń tag ":action_value"', 'rule_action_remove_all_tags' => 'Usuń wszystkie tagi', @@ -265,22 +265,22 @@ return [ 'rule_action_append_description' => 'Append description with ":action_value"', 'rule_action_prepend_description' => 'Prepend description with ":action_value"', 'rule_action_set_category_choice' => 'Ustaw kategorię na..', - 'rule_action_clear_category_choice' => 'Clear any category', - 'rule_action_set_budget_choice' => 'Set budget to..', - 'rule_action_clear_budget_choice' => 'Clear any budget', + 'rule_action_clear_category_choice' => 'Wyczyść wszystkie kategorie', + 'rule_action_set_budget_choice' => 'Ustaw budżetu na..', + 'rule_action_clear_budget_choice' => 'Wyczyść wszystkie budżety', 'rule_action_add_tag_choice' => 'Dodaj tag..', 'rule_action_remove_tag_choice' => 'Usuń tag..', 'rule_action_remove_all_tags_choice' => 'Usuń wszystkie tagi', - 'rule_action_set_description_choice' => 'Set description to..', + 'rule_action_set_description_choice' => 'Ustaw opis na..', 'rule_action_append_description_choice' => 'Append description with..', 'rule_action_prepend_description_choice' => 'Prepend description with..', - 'rule_action_set_source_account_choice' => 'Set source account to...', + 'rule_action_set_source_account_choice' => 'Ustaw konto źródłowe na...', 'rule_action_set_source_account' => 'Set source account to :action_value', - 'rule_action_set_destination_account_choice' => 'Set destination account to...', + 'rule_action_set_destination_account_choice' => 'Ustaw konto docelowe na...', 'rule_action_set_destination_account' => 'Set destination account to :action_value', // tags - 'store_new_tag' => 'Store new tag', + 'store_new_tag' => 'Zapisz nowy tag', 'update_tag' => 'Zmodyfikuj tag', 'no_location_set' => 'Nie ustawiono lokalizacji.', 'meta_data' => 'Metadane', @@ -313,12 +313,12 @@ return [ 'pref_two_factor_auth_reset_code' => 'Zresetuj kod weryfikacyjny', 'pref_two_factor_auth_remove_code' => 'Usuń kod weryfikacyjny', 'pref_two_factor_auth_remove_will_disable' => '(this will also disable two-factor authentication)', - 'pref_save_settings' => 'Save settings', - 'saved_preferences' => 'Preferences saved!', - 'preferences_general' => 'General', - 'preferences_frontpage' => 'Home screen', - 'preferences_security' => 'Security', - 'preferences_layout' => 'Layout', + 'pref_save_settings' => 'Zapisz ustawienia', + 'saved_preferences' => 'Preferencje zostały zapisane!', + 'preferences_general' => 'Ogólne', + 'preferences_frontpage' => 'Ekran główny', + 'preferences_security' => 'Bezpieczeństwo', + 'preferences_layout' => 'Układ', 'pref_home_show_deposits' => 'Show deposits on the home screen', 'pref_home_show_deposits_info' => 'The home screen already shows your expense accounts. Should it also show your revenue accounts?', 'pref_home_do_show_deposits' => 'Yes, show them', @@ -426,23 +426,23 @@ return [ // create new stuff: 'create_new_withdrawal' => 'Create new withdrawal', - 'create_new_deposit' => 'Create new deposit', - 'create_new_transfer' => 'Create new transfer', - 'create_new_asset' => 'Create new asset account', - 'create_new_expense' => 'Create new expense account', - 'create_new_revenue' => 'Create new revenue account', - 'create_new_piggy_bank' => 'Create new piggy bank', - 'create_new_bill' => 'Create new bill', + 'create_new_deposit' => 'Utwórz nową wpłatę', + 'create_new_transfer' => 'Utwórz nowy transfer', + 'create_new_asset' => 'Utwórz nowe konto aktywów', + 'create_new_expense' => 'Utwórz nowe konto wydatków', + 'create_new_revenue' => 'Utwórz nowe konto przychodów', + 'create_new_piggy_bank' => 'Utwórz nową skarbonkę', + 'create_new_bill' => 'Utwórz nowy rachunek', // currencies: - 'create_currency' => 'Create a new currency', - 'store_currency' => 'Store new currency', - 'update_currency' => 'Update currency', - 'new_default_currency' => ':name is now the default currency.', + 'create_currency' => 'Utwórz nową walutę', + 'store_currency' => 'Zapisz nową walutę', + 'update_currency' => 'Modyfikuj walutę', + 'new_default_currency' => ':name jest teraz domyślną walutą.', 'cannot_delete_currency' => 'Cannot delete :name because it is still in use.', - 'deleted_currency' => 'Currency :name deleted', - 'created_currency' => 'Currency :name created', - 'updated_currency' => 'Currency :name updated', + 'deleted_currency' => 'Waluta :name została usunięta', + 'created_currency' => 'Waluta :name została utworzona', + 'updated_currency' => 'Waluta :name została zmodyfikowana', 'ask_site_owner' => 'Please ask :owner to add, remove or edit currencies.', 'currencies_intro' => 'Firefly III supports various currencies which you can set and enable here.', 'make_default_currency' => 'make default', From 4cc9dbbe6aeac14aac51764fef203ae34c1f5476 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:21:42 +0100 Subject: [PATCH 311/350] New translations --- resources/lang/pl_PL/firefly.php | 72 ++++++++++++++++---------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 3cb9b26f5f..ff38f51bfc 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -443,15 +443,15 @@ return [ 'deleted_currency' => 'Waluta :name została usunięta', 'created_currency' => 'Waluta :name została utworzona', 'updated_currency' => 'Waluta :name została zmodyfikowana', - 'ask_site_owner' => 'Please ask :owner to add, remove or edit currencies.', - 'currencies_intro' => 'Firefly III supports various currencies which you can set and enable here.', - 'make_default_currency' => 'make default', - 'default_currency' => 'default', + 'ask_site_owner' => 'Poproś :owner aby dodał, usunął lub zmodyfikował waluty.', + 'currencies_intro' => 'Firefly III obsługuje różne waluty, które można ustawić i włączyć tutaj.', + 'make_default_currency' => 'ustaw domyślną', + 'default_currency' => 'domyślna', // new user: - 'submit' => 'Submit', - 'getting_started' => 'Getting started', - 'to_get_started' => 'To get started with Firefly, please enter your current bank\'s name, and the balance of your checking account:', + 'submit' => 'Prześlij', + 'getting_started' => 'Pierwsze kroki', + 'to_get_started' => 'Aby rozpocząć pracę z Firefly, wprowadź nazwę twojego banku oraz saldo konta bankowego:', 'savings_balance_text' => 'If you have a savings account, please enter the current balance of your savings account:', 'cc_balance_text' => 'If you have a credit card, please enter your credit card\'s limit.', 'stored_new_account_new_user' => 'Yay! Your new account has been stored.', @@ -477,38 +477,38 @@ return [ 'delete_budget' => 'Delete budget ":name"', 'deleted_budget' => 'Deleted budget ":name"', 'edit_budget' => 'Edit budget ":name"', - 'updated_budget' => 'Updated budget ":name"', - 'update_amount' => 'Update amount', - 'update_budget' => 'Update budget', + 'updated_budget' => 'Zmodyfikowano budżet ":name"', + 'update_amount' => 'Aktualizuj kwotę', + 'update_budget' => 'Aktualizuj budżet', 'update_budget_amount_range' => 'Update (expected) available amount between :start and :end', // bills: 'matching_on' => 'Matching on', - 'between_amounts' => 'between :low and :high.', + 'between_amounts' => 'między :low i :high.', 'repeats' => 'Repeats', - 'connected_journals' => 'Connected transactions', + 'connected_journals' => 'Powiązane transakcje', 'auto_match_on' => 'Automatically matched by Firefly', 'auto_match_off' => 'Not automatically matched by Firefly', 'next_expected_match' => 'Next expected match', - 'delete_bill' => 'Delete bill ":name"', - 'deleted_bill' => 'Deleted bill ":name"', - 'edit_bill' => 'Edit bill ":name"', - 'more' => 'More', + 'delete_bill' => 'Usuń rachunek ":name"', + 'deleted_bill' => 'Usunięto rachunek ":name"', + 'edit_bill' => 'Modyfikuj rachunek ":name"', + 'more' => 'Więcej', 'rescan_old' => 'Rescan old transactions', - 'update_bill' => 'Update bill', - 'updated_bill' => 'Updated bill ":name"', - 'store_new_bill' => 'Store new bill', - 'stored_new_bill' => 'Stored new bill ":name"', - 'cannot_scan_inactive_bill' => 'Inactive bills cannot be scanned.', - 'rescanned_bill' => 'Rescanned everything.', + 'update_bill' => 'Aktualizuj rachunek', + 'updated_bill' => 'Zaktualizowano rachunek ":name"', + 'store_new_bill' => 'Zapisz nowy rachunek', + 'stored_new_bill' => 'Zapisano nowy rachunek ":name"', + 'cannot_scan_inactive_bill' => 'Nieaktywne rachunki nie mogą być zeskanowane.', + 'rescanned_bill' => 'Zeskanowano wszystko.', 'average_bill_amount_year' => 'Average bill amount (:year)', 'average_bill_amount_overall' => 'Average bill amount (overall)', 'not_or_not_yet' => 'Not (yet)', 'not_expected_period' => 'Not expected this period', // accounts: - 'details_for_asset' => 'Details for asset account ":name"', - 'details_for_expense' => 'Details for expense account ":name"', - 'details_for_revenue' => 'Details for revenue account ":name"', + 'details_for_asset' => 'Szczegóły konta aktywów ":name"', + 'details_for_expense' => 'Szczegóły konta wydatków ":name"', + 'details_for_revenue' => 'Szczegóły konta przychodów ":name"', 'details_for_cash' => 'Details for cash account ":name"', 'store_new_asset_account' => 'Store new asset account', 'store_new_expense_account' => 'Store new expense account', @@ -528,8 +528,8 @@ return [ 'make_new_asset_account' => 'Create a new asset account', 'make_new_expense_account' => 'Create a new expense account', 'make_new_revenue_account' => 'Create a new revenue account', - 'asset_accounts' => 'Asset accounts', - 'expense_accounts' => 'Expense accounts', + 'asset_accounts' => 'Konta aktywów', + 'expense_accounts' => 'Konta wydatków', 'revenue_accounts' => 'Revenue accounts', 'cash_accounts' => 'Cash accounts', 'Cash account' => 'Cash account', @@ -553,18 +553,18 @@ return [ 'updated_category' => 'Updated category ":name"', 'categories' => 'Categories', 'edit_category' => 'Edit category ":name"', - 'no_category' => '(no category)', - 'category' => 'Category', - 'delete_category' => 'Delete category ":name"', - 'deleted_category' => 'Deleted category ":name"', - 'store_category' => 'Store new category', - 'stored_category' => 'Stored new category ":name"', + 'no_category' => '(bez kategorii)', + 'category' => 'Kategoria', + 'delete_category' => 'Usuń kategorię ":name"', + 'deleted_category' => 'Usunięto kategorię ":name"', + 'store_category' => 'Zapisz nową kategorię', + 'stored_category' => 'Zapisano nową kategorię ":name"', 'without_category_between' => 'Without category between :start and :end', // transactions: - 'update_withdrawal' => 'Update withdrawal', - 'update_deposit' => 'Update deposit', - 'update_transfer' => 'Update transfer', + 'update_withdrawal' => 'Modyfikuj wypłatę', + 'update_deposit' => 'Modyfikuj wpłatę', + 'update_transfer' => 'Modyfikuj transfer', 'updated_withdrawal' => 'Updated withdrawal ":description"', 'updated_deposit' => 'Updated deposit ":description"', 'updated_transfer' => 'Updated transfer ":description"', From c5c1cbd66f3d9c764a23604b1a245b12718f2690 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:21:45 +0100 Subject: [PATCH 312/350] New translations --- resources/lang/pl_PL/list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lang/pl_PL/list.php b/resources/lang/pl_PL/list.php index fdb95fd9c0..e2ed704d6d 100644 --- a/resources/lang/pl_PL/list.php +++ b/resources/lang/pl_PL/list.php @@ -30,12 +30,12 @@ return [ 'new_balance' => 'Nowe saldo', 'account' => 'Konto', 'matchingAmount' => 'Kwota', - 'lastMatch' => 'Last match', + 'lastMatch' => 'Ostatnie dopasowanie', 'split_number' => 'Split #', 'destination' => 'Cel', 'source' => 'Źródło', 'next_expected_match' => 'Next expected match', - 'automatch' => 'Auto match?', + 'automatch' => 'Auto dopasowanie?', 'repeat_freq' => 'Powtórzenia', 'description' => 'Opis', 'amount' => 'Kwota', From e323f5a2d56eb259c697d49d434a24c1e4fe7b11 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:27:27 +0100 Subject: [PATCH 313/350] This should fix most amounts for #511 --- resources/views/list/accounts.twig | 13 ++++++++++--- resources/views/list/bills.twig | 8 ++++++-- resources/views/list/journals-tasker.twig | 7 ++++--- resources/views/list/piggy-bank-events.twig | 2 +- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/resources/views/list/accounts.twig b/resources/views/list/accounts.twig index 12b6111c8e..dbf3d7436c 100644 --- a/resources/views/list/accounts.twig +++ b/resources/views/list/accounts.twig @@ -10,7 +10,8 @@ {{ trans('list.currentBalance') }} {{ trans('list.active') }} {{ trans('list.lastActivity') }} - {{ trans('list.balanceDiff', {'start' : Session.get('start').formatLocalized(monthAndDayFormat),'end' : Session.get('end').formatLocalized(monthAndDayFormat)}) }} + {{ trans('list.balanceDiff', {'start' : Session.get('start').formatLocalized(monthAndDayFormat),'end' : Session.get('end').formatLocalized(monthAndDayFormat)}) }} @@ -33,7 +34,11 @@ {% endif %} {{ account.iban }} - {{ account.endBalance|formatAmount }} + + + {{ account.endBalance|formatAmount }} + + {% if account.active %} @@ -50,8 +55,10 @@ {{ 'never'|_ }} {% endif %} - + + {{ (account.difference)|formatAmount }} + diff --git a/resources/views/list/bills.twig b/resources/views/list/bills.twig index 2bf6f5b128..7e6d1af0b1 100644 --- a/resources/views/list/bills.twig +++ b/resources/views/list/bills.twig @@ -29,11 +29,15 @@ {{ match }} {% endfor %} - + + {{ entry.amount_min|formatAmount }} + - + + {{ entry.amount_max|formatAmount }} + {% if entry.paidDates.count() == 0 and entry.payDates.count() == 0 and entry.active %} diff --git a/resources/views/list/journals-tasker.twig b/resources/views/list/journals-tasker.twig index 37cbcd1b72..a52df725be 100644 --- a/resources/views/list/journals-tasker.twig +++ b/resources/views/list/journals-tasker.twig @@ -1,6 +1,6 @@ {{ journals.render|raw }} - +
@@ -62,12 +62,13 @@ {% endif %} - - - + @@ -27,9 +27,9 @@ {{ account.name }} {% if accountSummary[account.id] %} - + {% else %} - + {% endif %} {% endfor %} @@ -47,7 +47,7 @@ - + @@ -57,9 +57,9 @@ {{ budget.name }} {% if budgetSummary[budget.id] %} - + {% else %} - + {% endif %} {% endfor %} @@ -133,8 +133,8 @@ - - + + @@ -148,10 +148,10 @@ - - - + @@ -215,7 +215,7 @@ {{ row.opposing_account_name }} - diff --git a/resources/views/reports/category/month.twig b/resources/views/reports/category/month.twig index 76df238013..cef7514534 100644 --- a/resources/views/reports/category/month.twig +++ b/resources/views/reports/category/month.twig @@ -17,8 +17,8 @@ - - + + @@ -28,14 +28,14 @@ {{ account.name }} {% if accountSummary[account.id] %} - + {% else %} - + {% endif %} {% if accountSummary[account.id] %} - + {% else %} - + {% endif %} {% endfor %} @@ -53,8 +53,8 @@ - - + + @@ -64,14 +64,14 @@ {{ category.name }} {% if categorySummary[category.id] %} - + {% else %} - + {% endif %} {% if categorySummary[category.id] %} - + {% else %} - + {% endif %} {% endfor %} @@ -164,8 +164,8 @@ - - + + @@ -179,10 +179,10 @@ - - - + @@ -246,7 +246,7 @@ {{ row.opposing_account_name }} - diff --git a/resources/views/reports/partials/accounts.twig b/resources/views/reports/partials/accounts.twig index ef3ad787e7..3468f4c1d0 100644 --- a/resources/views/reports/partials/accounts.twig +++ b/resources/views/reports/partials/accounts.twig @@ -2,9 +2,9 @@ - - - + + + @@ -13,18 +13,18 @@ - - - + + + {% endfor %} - - - + + +
+ + {{ formatByCode(transaction.transaction_currency_code, transaction.transaction_amount) }} {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, transaction.transaction_currency_code, transaction.transaction_type_type) }} - + + {% if event.amount < 0 %} {{ trans('firefly.removed_amount', {amount: (event.amount)|formatAmountPlain})|raw }} {% else %} From 8a1fae5d9ddef3349615ff1d70ebe3755309d5c5 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:31:51 +0100 Subject: [PATCH 314/350] New translations --- resources/lang/pl_PL/firefly.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index ff38f51bfc..7e1c9526f5 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -485,7 +485,7 @@ return [ // bills: 'matching_on' => 'Matching on', 'between_amounts' => 'między :low i :high.', - 'repeats' => 'Repeats', + 'repeats' => 'Powtarza się', 'connected_journals' => 'Powiązane transakcje', 'auto_match_on' => 'Automatically matched by Firefly', 'auto_match_off' => 'Not automatically matched by Firefly', @@ -539,7 +539,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_data_for_chart' => 'There is not enough information (yet) to generate this chart.', + 'no_data_for_chart' => 'Nie ma wystarczająco dużo informacji (póki co), aby wygenerować ten wykres.', 'select_more_than_one_account' => 'Please select more than one account', 'select_more_than_one_category' => 'Please select more than one category', 'select_more_than_one_budget' => 'Please select more than one budget', @@ -575,10 +575,10 @@ return [ 'deleted_deposit' => 'Successfully deleted deposit ":description"', 'deleted_transfer' => 'Successfully deleted transfer ":description"', 'stored_journal' => 'Successfully created new transaction ":description"', - 'select_transactions' => 'Select transactions', + 'select_transactions' => 'Wybierz transakcje', 'stop_selection' => 'Stop selecting transactions', - 'edit_selected' => 'Edit selected', - 'delete_selected' => 'Delete selected', + 'edit_selected' => 'Modyfikuj zaznaczone', + 'delete_selected' => 'Usuń zaznaczone', 'mass_delete_journals' => 'Delete a number of transactions', 'mass_edit_journals' => 'Edit a number of transactions', 'cannot_edit_other_fields' => 'You cannot mass-edit other fields than the ones here, because there is no room to show them. Please follow the link and edit them by one-by-one, if you need to edit these fields.', @@ -718,8 +718,8 @@ return [ 'report_has_no_extra_options' => 'This report has no extra options', 'reports_submit' => 'View report', 'end_after_start_date' => 'End date of report must be after start date.', - 'select_category' => 'Select one or more categories.', - 'select_budget' => 'Select one or more budgets.', + 'select_category' => 'Wybierz jedną lub więcej kategorii.', + 'select_budget' => 'Wybierz jeden lub więcej budżetów.', 'income_per_category' => 'Income per category', 'expense_per_category' => 'Expense per category', 'expense_per_budget' => 'Expense per budget', From 14cd4aaac892442e240b55f9ac79e82a37ba4b74 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:31:54 +0100 Subject: [PATCH 315/350] New translations --- resources/lang/pl_PL/form.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php index 4e2f695f14..2f9a155f2d 100644 --- a/resources/lang/pl_PL/form.php +++ b/resources/lang/pl_PL/form.php @@ -23,7 +23,7 @@ return [ 'amount_min' => 'Minimalna kwota', 'amount_max' => 'Maksymalna kwota', 'match' => 'Matches on', - 'repeat_freq' => 'Repeats', + 'repeat_freq' => 'Powtarza się', 'journal_currency_id' => 'Waluta', 'currency_id' => 'Waluta', 'attachments' => 'Załączniki', @@ -141,7 +141,7 @@ return [ 'tag_areYouSure' => 'Czy na pewno chcesz usunąć tag ":tag"?', 'permDeleteWarning' => 'Usuwanie rzeczy z Firefly jest trwałe i nie można tego cofnąć.', 'mass_make_selection' => 'You can still prevent items from being deleted by removing the checkbox.', - 'delete_all_permanently' => 'Delete selected permanently', + 'delete_all_permanently' => 'Trwale usuń zaznaczone', 'update_all_journals' => 'Zmodyfikuj te transakcje', 'also_delete_transactions' => 'The only transaction connected to this account will be deleted as well.|All :count transactions connected to this account will be deleted as well.', 'also_delete_rules' => 'The only rule connected to this rule group will be deleted as well.|All :count rules connected to this rule group will be deleted as well.', From 3ba1c07f688a311fa47dc35c445ba63b4d46a363 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:31:56 +0100 Subject: [PATCH 316/350] New translations --- resources/lang/pl_PL/csv.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lang/pl_PL/csv.php b/resources/lang/pl_PL/csv.php index ee6b6d07ef..60c0be5d36 100644 --- a/resources/lang/pl_PL/csv.php +++ b/resources/lang/pl_PL/csv.php @@ -26,8 +26,8 @@ return [ 'column_roles_title' => 'Zdefiniuj role dla kolumn', 'column_roles_table' => 'Tabela', 'column_name' => 'Nazwa kolumny', - 'column_example' => 'Column example data', - 'column_role' => 'Column data meaning', + 'column_example' => 'Przykładowe dane w kolumnie', + 'column_role' => 'Znaczenie danych w kolumnie', 'do_map_value' => 'Map these values', 'column' => 'Kolumna', 'no_example_data' => 'Brak dostępnych danych przykładowych', From f0c69ca84f72363fc4676d933762a25fc70ade14 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:31:58 +0100 Subject: [PATCH 317/350] New translations --- resources/lang/pl_PL/list.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/lang/pl_PL/list.php b/resources/lang/pl_PL/list.php index e2ed704d6d..f6e522ae33 100644 --- a/resources/lang/pl_PL/list.php +++ b/resources/lang/pl_PL/list.php @@ -36,12 +36,12 @@ return [ 'source' => 'Źródło', 'next_expected_match' => 'Next expected match', 'automatch' => 'Auto dopasowanie?', - 'repeat_freq' => 'Powtórzenia', + 'repeat_freq' => 'Powtarza się', 'description' => 'Opis', 'amount' => 'Kwota', 'internal_reference' => 'Internal reference', 'date' => 'Data', - 'interest_date' => 'Interest date', + 'interest_date' => 'Stopa procentowa', 'book_date' => 'Data księgowania', 'process_date' => 'Processing date', 'due_date' => 'Termin realizacji', @@ -61,7 +61,7 @@ return [ 'type' => 'Typ', 'completed' => 'Zakończone', 'iban' => 'IBAN', - 'paid_current_period' => 'Paid this period', + 'paid_current_period' => 'Zapłacono w tym okresie', 'email' => 'Adres E-Mail', 'registered_at' => 'Registered at', 'is_activated' => 'Jest aktywny', From 59ad0624f2139ef5bee18ead1f5b6f6a64737730 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:32:00 +0100 Subject: [PATCH 318/350] New translations --- resources/lang/pl_PL/validation.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/lang/pl_PL/validation.php b/resources/lang/pl_PL/validation.php index 26e12a9e08..769500652a 100644 --- a/resources/lang/pl_PL/validation.php +++ b/resources/lang/pl_PL/validation.php @@ -11,12 +11,12 @@ return [ 'iban' => 'To nie jest prawidłowy IBAN.', - 'unique_account_number_for_user' => 'It looks like this account number is already in use.', - 'deleted_user' => 'Due to security constraints, you cannot register using this email address.', + 'unique_account_number_for_user' => 'Wygląda na to, że ten numer konta jest już w użyciu.', + 'deleted_user' => 'Ze względu na zabezpieczenia nie możesz się zarejestrować używając tego adresu e-mail.', 'rule_trigger_value' => 'This value is invalid for the selected trigger.', - 'rule_action_value' => 'This value is invalid for the selected action.', - 'invalid_domain' => 'Due to security constraints, you cannot register from this domain.', - 'file_already_attached' => 'Uploaded file ":name" is already attached to this object.', + 'rule_action_value' => 'Ta wartość jest nieprawidłowa dla wybranej akcji.', + 'invalid_domain' => 'Ze względu na zabezpieczenia nie możesz się zarejestrować z tej domeny.', + 'file_already_attached' => 'Przesłany plik ":name" jest już dołączony do tego obiektu.', 'file_attached' => 'Pomyślnie wgrano plik ":name".', 'file_invalid_mime' => 'File ":name" is of type ":mime" which is not accepted as a new upload.', 'file_too_large' => 'Plik ": nazwa" jest zbyt duży.', From 8be4ec08adf3e92dd3d7c07f3685060ac9343751 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:41:48 +0100 Subject: [PATCH 319/350] New translations --- resources/lang/pl_PL/firefly.php | 108 +++++++++++++++---------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 7e1c9526f5..b031d3609b 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -333,15 +333,15 @@ return [ 'optional_tj_business_fields' => 'Business fields', 'optional_tj_attachment_fields' => 'Attachment fields', 'pref_optional_tj_interest_date' => 'Interest date', - 'pref_optional_tj_book_date' => 'Book date', + 'pref_optional_tj_book_date' => 'Data księgowania', 'pref_optional_tj_process_date' => 'Processing date', - 'pref_optional_tj_due_date' => 'Due date', - 'pref_optional_tj_payment_date' => 'Payment date', - 'pref_optional_tj_invoice_date' => 'Invoice date', + 'pref_optional_tj_due_date' => 'Termin realizacji', + 'pref_optional_tj_payment_date' => 'Data płatności', + 'pref_optional_tj_invoice_date' => 'Data faktury', 'pref_optional_tj_internal_reference' => 'Internal reference', - 'pref_optional_tj_notes' => 'Notes', - 'pref_optional_tj_attachments' => 'Attachments', - 'optional_field_meta_dates' => 'Dates', + 'pref_optional_tj_notes' => 'Notatki', + 'pref_optional_tj_attachments' => 'Załączniki', + 'optional_field_meta_dates' => 'Daty', 'optional_field_meta_business' => 'Business', 'optional_field_attachments' => 'Załączniki', 'optional_field_meta_data' => 'Opcjonalne metadane', @@ -425,7 +425,7 @@ return [ // create new stuff: - 'create_new_withdrawal' => 'Create new withdrawal', + 'create_new_withdrawal' => 'Utwórz nową wypłatę', 'create_new_deposit' => 'Utwórz nową wpłatę', 'create_new_transfer' => 'Utwórz nowy transfer', 'create_new_asset' => 'Utwórz nowe konto aktywów', @@ -458,25 +458,25 @@ return [ 'stored_new_accounts_new_user' => 'Yay! Your new accounts have been stored.', // forms: - 'mandatoryFields' => 'Mandatory fields', - 'optionalFields' => 'Optional fields', - 'options' => 'Options', + 'mandatoryFields' => 'Pola wymagane', + 'optionalFields' => 'Pola opcjonalne', + 'options' => 'Opcje', // budgets: - 'create_new_budget' => 'Create a new budget', - 'store_new_budget' => 'Store new budget', - 'stored_new_budget' => 'Stored new budget ":name"', + 'create_new_budget' => 'Utwórz nowy budżet', + 'store_new_budget' => 'Zapisz nowy budżet', + 'stored_new_budget' => 'Zapisano nowy budżet ":name"', 'available_between' => 'Available between :start and :end', - 'transactionsWithoutBudget' => 'Expenses without budget', + 'transactionsWithoutBudget' => 'Wydatki bez budżetu', 'transactions_no_budget' => 'Expenses without budget between :start and :end', 'spent_between' => 'Spent between :start and :end', - 'createBudget' => 'New budget', - 'inactiveBudgets' => 'Inactive budgets', + 'createBudget' => 'Nowy budżet', + 'inactiveBudgets' => 'Nieaktywne budżety', 'without_budget_between' => 'Transactions without a budget between :start and :end', - 'budget_in_month' => ':name in :month', - 'delete_budget' => 'Delete budget ":name"', - 'deleted_budget' => 'Deleted budget ":name"', - 'edit_budget' => 'Edit budget ":name"', + 'budget_in_month' => ':name w :month', + 'delete_budget' => 'Usuń budżet ":name"', + 'deleted_budget' => 'Usunięto budżet ":name"', + 'edit_budget' => 'Modyfikuj budżet ":name"', 'updated_budget' => 'Zmodyfikowano budżet ":name"', 'update_amount' => 'Aktualizuj kwotę', 'update_budget' => 'Aktualizuj budżet', @@ -489,7 +489,7 @@ return [ 'connected_journals' => 'Powiązane transakcje', 'auto_match_on' => 'Automatically matched by Firefly', 'auto_match_off' => 'Not automatically matched by Firefly', - 'next_expected_match' => 'Next expected match', + 'next_expected_match' => 'Następne oczekiwane dopasowanie', 'delete_bill' => 'Usuń rachunek ":name"', 'deleted_bill' => 'Usunięto rachunek ":name"', 'edit_bill' => 'Modyfikuj rachunek ":name"', @@ -510,9 +510,9 @@ return [ 'details_for_expense' => 'Szczegóły konta wydatków ":name"', 'details_for_revenue' => 'Szczegóły konta przychodów ":name"', 'details_for_cash' => 'Details for cash account ":name"', - 'store_new_asset_account' => 'Store new asset account', - 'store_new_expense_account' => 'Store new expense account', - 'store_new_revenue_account' => 'Store new revenue account', + 'store_new_asset_account' => 'Zapisz nowe konto aktywów', + 'store_new_expense_account' => 'Zapisz nowe konto wydatków', + 'store_new_revenue_account' => 'Zapisz nowe konto przychodów', 'edit_asset_account' => 'Edit asset account ":name"', 'edit_expense_account' => 'Edit expense account ":name"', 'edit_revenue_account' => 'Edit revenue account ":name"', @@ -525,7 +525,7 @@ return [ 'update_asset_account' => 'Update asset account', 'update_expense_account' => 'Update expense account', 'update_revenue_account' => 'Update revenue account', - 'make_new_asset_account' => 'Create a new asset account', + 'make_new_asset_account' => 'Utwórz nowe konto aktywów', 'make_new_expense_account' => 'Create a new expense account', 'make_new_revenue_account' => 'Create a new revenue account', 'asset_accounts' => 'Konta aktywów', @@ -540,19 +540,19 @@ return [ 'credit_card_options' => 'Credit card options', 'no_transactions_account' => 'There are no transactions (in this period) for asset account ":name".', 'no_data_for_chart' => 'Nie ma wystarczająco dużo informacji (póki co), aby wygenerować ten wykres.', - 'select_more_than_one_account' => 'Please select more than one account', - 'select_more_than_one_category' => 'Please select more than one category', - 'select_more_than_one_budget' => 'Please select more than one budget', + 'select_more_than_one_account' => 'Proszę wybierz więcej niż jedno konto', + 'select_more_than_one_category' => 'Proszę wybierz więcej niż jedną kategorię', + 'select_more_than_one_budget' => 'Proszę wybierz więcej niż jeden budżet', 'from_to' => 'From :start to :end', // categories: 'new_category' => 'New category', 'create_new_category' => 'Create a new category', 'without_category' => 'Without a category', - 'update_category' => 'Update category', - 'updated_category' => 'Updated category ":name"', - 'categories' => 'Categories', - 'edit_category' => 'Edit category ":name"', + 'update_category' => 'Aktualizuj kategorię', + 'updated_category' => 'Zmodyfikowano kategorię ":name"', + 'categories' => 'Kategorie', + 'edit_category' => 'Edytuj kategorię ":name"', 'no_category' => '(bez kategorii)', 'category' => 'Kategoria', 'delete_category' => 'Usuń kategorię ":name"', @@ -588,35 +588,35 @@ return [ // new user: - 'welcome' => 'Welcome to Firefly!', + 'welcome' => 'Witaj w Firefly!', // home page: - 'yourAccounts' => 'Your accounts', - 'budgetsAndSpending' => 'Budgets and spending', - 'savings' => 'Savings', + 'yourAccounts' => 'Twoje konta', + 'budgetsAndSpending' => 'Budżety i wydatki', + 'savings' => 'Oszczędności', 'markAsSavingsToContinue' => 'Mark your asset accounts as "Savings account" to fill this panel', 'createPiggyToContinue' => 'Create piggy banks to fill this panel.', - 'newWithdrawal' => 'New expense', - 'newDeposit' => 'New deposit', - 'newTransfer' => 'New transfer', + 'newWithdrawal' => 'Nowy wydatek', + 'newDeposit' => 'Nowa wpłata', + 'newTransfer' => 'Nowy transfer', 'moneyIn' => 'Money in', 'moneyOut' => 'Money out', - 'billsToPay' => 'Bills to pay', - 'billsPaid' => 'Bills paid', + 'billsToPay' => 'Rachunki do zapłacenia', + 'billsPaid' => 'Zapłacone rachunki', 'divided' => 'divided', 'toDivide' => 'left to divide', // menu and titles, should be recycled as often as possible: - 'currency' => 'Currency', - 'preferences' => 'Preferences', - 'logout' => 'Logout', - 'searchPlaceholder' => 'Search...', - 'dashboard' => 'Dashboard', - 'currencies' => 'Currencies', - 'accounts' => 'Accounts', - 'Asset account' => 'Asset account', - 'Default account' => 'Asset account', - 'Expense account' => 'Expense account', + 'currency' => 'Waluta', + 'preferences' => 'Preferencje', + 'logout' => 'Wyloguj', + 'searchPlaceholder' => 'Szukaj...', + 'dashboard' => 'Kokpit', + 'currencies' => 'Waluty', + 'accounts' => 'Konta', + 'Asset account' => 'Konto aktywów', + 'Default account' => 'Konto aktywów', + 'Expense account' => 'Konto wydatków', 'Revenue account' => 'Revenue account', 'Initial balance account' => 'Initial balance account', 'budgets' => 'Budgets', @@ -901,7 +901,7 @@ return [ 'configuration_file_help' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file.', 'import_data_index' => 'Index', 'import_file_type_csv' => 'CSV (comma separated values)', - 'import_file_type_help' => 'Select the type of file you will upload', + 'import_file_type_help' => 'Wybierz typ pliku, który będziesz przesyłać', 'import_start' => 'Start the import', 'configure_import' => 'Further configure your import', 'import_finish_configuration' => 'Finish configuration', @@ -915,7 +915,7 @@ return [ 'import_data' => 'Import data', 'import_data_full' => 'Import data into Firefly III', 'import' => 'Import', - 'import_file_help' => 'Select your file', + 'import_file_help' => 'Wybierz swój plik', 'import_status_settings_complete' => 'The import is ready to start.', 'import_status_import_complete' => 'The import has completed.', 'import_status_import_running' => 'The import is currently running. Please be patient.', From deccd4e9fe6c51fe9227e7f2f268cdd1134f1020 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 19:51:50 +0100 Subject: [PATCH 320/350] New translations --- resources/lang/pl_PL/firefly.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index b031d3609b..d8b15321c2 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -867,28 +867,28 @@ return [ 'transaction_meta_data' => 'Transaction meta-data', 'transaction_dates' => 'Transaction dates', 'splits' => 'Splits', - 'split_title_withdrawal' => 'Split your new withdrawal', + 'split_title_withdrawal' => 'Podziel swoją nową wypłatę', 'split_intro_one_withdrawal' => 'Firefly supports the "splitting" of a withdrawal.', 'split_intro_two_withdrawal' => 'It means that the amount of money you\'ve spent is divided between several destination expense accounts, budgets or categories.', 'split_intro_three_withdrawal' => 'For example: you could split your :total groceries so you pay :split_one from your "daily groceries" budget and :split_two from your "cigarettes" budget.', 'split_table_intro_withdrawal' => 'Split your withdrawal in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_withdrawal' => 'Store splitted withdrawal', - 'update_splitted_withdrawal' => 'Update splitted withdrawal', - 'split_title_deposit' => 'Split your new deposit', + 'store_splitted_withdrawal' => 'Zachowaj podzieloną wypłatę', + 'update_splitted_withdrawal' => 'Aktualizuj podzieloną wypłatę', + 'split_title_deposit' => 'Podziel swój nowy depozyt', 'split_intro_one_deposit' => 'Firefly supports the "splitting" of a deposit.', 'split_intro_two_deposit' => 'It means that the amount of money you\'ve earned is divided between several source revenue accounts or categories.', 'split_intro_three_deposit' => 'For example: you could split your :total salary so you get :split_one as your base salary and :split_two as a reimbursment for expenses made.', 'split_table_intro_deposit' => 'Split your deposit in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_deposit' => 'Store splitted deposit', - 'split_title_transfer' => 'Split your new transfer', + 'store_splitted_deposit' => 'Zachowaj podzielony depozyt', + 'split_title_transfer' => 'Podzielić swój nowy transfer', 'split_intro_one_transfer' => 'Firefly supports the "splitting" of a transfer.', 'split_intro_two_transfer' => 'It means that the amount of money you\'re moving is divided between several categories or piggy banks.', 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', 'store_splitted_transfer' => 'Store splitted transfer', - 'add_another_split' => 'Add another split', - 'split-transactions' => 'Split transactions', - 'split-new-transaction' => 'Split a new transaction', + 'add_another_split' => 'Dodaj kolejny podział', + 'split-transactions' => 'Podziel transakcję', + 'split-new-transaction' => 'Podziel nową transakcję', 'do_split' => 'Do a split', 'split_this_withdrawal' => 'Split this withdrawal', 'split_this_deposit' => 'Split this deposit', From eb0c00896fd7e6c29782882c1e4adab0e2d1e2af Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 20:01:56 +0100 Subject: [PATCH 321/350] New translations --- resources/lang/pl_PL/firefly.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index d8b15321c2..4d78dc2f9d 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -889,13 +889,13 @@ return [ 'add_another_split' => 'Dodaj kolejny podział', 'split-transactions' => 'Podziel transakcję', 'split-new-transaction' => 'Podziel nową transakcję', - 'do_split' => 'Do a split', - 'split_this_withdrawal' => 'Split this withdrawal', - 'split_this_deposit' => 'Split this deposit', - 'split_this_transfer' => 'Split this transfer', + 'do_split' => 'Podziel', + 'split_this_withdrawal' => 'Podziel tą wypłatę', + 'split_this_deposit' => 'Podziel ten depozyt', + 'split_this_transfer' => 'Podziel ten transfer', 'cannot_edit_multiple_source' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple source accounts.', 'cannot_edit_multiple_dest' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple destination accounts.', - 'no_edit_multiple_left' => 'You have selected no valid transactions to edit.', + 'no_edit_multiple_left' => 'Nie wybrałeś żadnych poprawnych transakcji do edycji.', // import 'configuration_file_help' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file.', From a0de10870dffc73d691a02a63906cca33c84dc34 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 20:12:12 +0100 Subject: [PATCH 322/350] New translations --- resources/lang/pl_PL/firefly.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 4d78dc2f9d..690b02fce0 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -758,13 +758,13 @@ return [ 'name' => 'Name', 'date' => 'Date', 'paid' => 'Paid', - 'unpaid' => 'Unpaid', - 'day' => 'Day', + 'unpaid' => 'Niezapłacone', + 'day' => 'Dzień', 'budgeted' => 'Budgeted', - 'period' => 'Period', - 'balance' => 'Balance', - 'summary' => 'Summary', - 'sum' => 'Sum', + 'period' => 'Okres', + 'balance' => 'Saldo', + 'summary' => 'Podsumowanie', + 'sum' => 'Suma', 'average' => 'Average', 'balanceFor' => 'Balance for :name', @@ -789,7 +789,7 @@ return [ 'update_piggy_button' => 'Update piggy bank', 'update_piggy_title' => 'Update piggy bank ":name"', 'updated_piggy_bank' => 'Updated piggy bank ":name"', - 'details' => 'Details', + 'details' => 'Szczegóły', 'events' => 'Events', 'target_amount' => 'Target amount', 'start_date' => 'Start date', @@ -885,7 +885,7 @@ return [ 'split_intro_two_transfer' => 'It means that the amount of money you\'re moving is divided between several categories or piggy banks.', 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_transfer' => 'Store splitted transfer', + 'store_splitted_transfer' => 'Zachowaj podzielony transfer', 'add_another_split' => 'Dodaj kolejny podział', 'split-transactions' => 'Podziel transakcję', 'split-new-transaction' => 'Podziel nową transakcję', From ad116d19595103e15361506577033d8463d0760f Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 20:42:29 +0100 Subject: [PATCH 323/350] Various code cleanup [skip ci] --- .github/CONTRIBUTING | 1 + app/Export/Collector/CollectorInterface.php | 2 + app/Export/Exporter/ExporterInterface.php | 2 + app/Export/ProcessorInterface.php | 1 + .../Chart/Basic/ChartJsGenerator.php | 1 + .../Controllers/Chart/BudgetController.php | 142 +++++++++--------- .../Controllers/Chart/CategoryController.php | 7 +- 7 files changed, 88 insertions(+), 68 deletions(-) create mode 100644 .github/CONTRIBUTING diff --git a/.github/CONTRIBUTING b/.github/CONTRIBUTING new file mode 100644 index 0000000000..2a1338d94d --- /dev/null +++ b/.github/CONTRIBUTING @@ -0,0 +1 @@ +If you are requesting a new feature, please check out the list of [often requested features](https://firefly-iii.github.io/requested-features/) first. Thanks! \ No newline at end of file diff --git a/app/Export/Collector/CollectorInterface.php b/app/Export/Collector/CollectorInterface.php index 6fc24233fe..f1778e9adc 100644 --- a/app/Export/Collector/CollectorInterface.php +++ b/app/Export/Collector/CollectorInterface.php @@ -35,6 +35,8 @@ interface CollectorInterface /** * @param Collection $entries * + * @return void + * */ public function setEntries(Collection $entries); diff --git a/app/Export/Exporter/ExporterInterface.php b/app/Export/Exporter/ExporterInterface.php index 9b8a4e4ed9..3559d89cec 100644 --- a/app/Export/Exporter/ExporterInterface.php +++ b/app/Export/Exporter/ExporterInterface.php @@ -40,6 +40,8 @@ interface ExporterInterface /** * @param Collection $entries * + * @return void + * */ public function setEntries(Collection $entries); diff --git a/app/Export/ProcessorInterface.php b/app/Export/ProcessorInterface.php index 459cbf6276..614d748304 100644 --- a/app/Export/ProcessorInterface.php +++ b/app/Export/ProcessorInterface.php @@ -27,6 +27,7 @@ interface ProcessorInterface * Processor constructor. * * @param array $settings + * */ public function __construct(array $settings); diff --git a/app/Generator/Chart/Basic/ChartJsGenerator.php b/app/Generator/Chart/Basic/ChartJsGenerator.php index b651770829..85cff4d4f6 100644 --- a/app/Generator/Chart/Basic/ChartJsGenerator.php +++ b/app/Generator/Chart/Basic/ChartJsGenerator.php @@ -49,6 +49,7 @@ class ChartJsGenerator implements GeneratorInterface * ] * ] * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five. * * @param array $data * diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index 80fb6142aa..0a8fe543cf 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -42,26 +42,35 @@ class BudgetController extends Controller /** @var GeneratorInterface */ protected $generator; + /** @var BudgetRepositoryInterface */ + protected $repository; + /** * BudgetController constructor. */ public function __construct() { parent::__construct(); - $this->generator = app(GeneratorInterface::class); + + $this->middleware( + function ($request, $next) { + $this->generator = app(GeneratorInterface::class); + $this->repository = app(BudgetRepositoryInterface::class); + + return $next($request); + } + ); } /** - * checked * - * @param BudgetRepositoryInterface $repository - * @param Budget $budget + * @param Budget $budget * * @return \Symfony\Component\HttpFoundation\Response */ - public function budget(BudgetRepositoryInterface $repository, Budget $budget) + public function budget(Budget $budget) { - $first = $repository->firstUseDate($budget); + $first = $this->repository->firstUseDate($budget); $range = Preferences::get('viewRange', '1M')->data; $last = session('end', new Carbon); @@ -86,7 +95,7 @@ class BudgetController extends Controller $currentEnd = Navigation::endOfPeriod($first, $range); // sub another day because reasons. $currentEnd->subDay(); - $spent = $repository->spentInPeriod($budgetCollection, new Collection, $currentStart, $currentEnd); + $spent = $this->repository->spentInPeriod($budgetCollection, new Collection, $currentStart, $currentEnd); $format = Navigation::periodShow($first, $range); $entries[$format] = bcmul($spent, '-1'); $first = Navigation::addPeriod($first, $range, 0); @@ -103,13 +112,13 @@ class BudgetController extends Controller * Shows the amount left in a specific budget limit. * * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's exactly five. - * @param BudgetRepositoryInterface $repository - * @param Budget $budget - * @param BudgetLimit $budgetLimit + * @param Budget $budget + * @param BudgetLimit $budgetLimit * * @return \Symfony\Component\HttpFoundation\Response + * @throws FireflyException */ - public function budgetLimit(BudgetRepositoryInterface $repository, Budget $budget, BudgetLimit $budgetLimit) + public function budgetLimit(Budget $budget, BudgetLimit $budgetLimit) { if ($budgetLimit->budget->id != $budget->id) { throw new FireflyException('This budget limit is not part of this budget.'); @@ -131,7 +140,7 @@ class BudgetController extends Controller $amount = $budgetLimit->amount; $budgetCollection = new Collection([$budget]); while ($start <= $end) { - $spent = $repository->spentInPeriod($budgetCollection, new Collection, $start, $start); + $spent = $this->repository->spentInPeriod($budgetCollection, new Collection, $start, $start); $amount = bcadd($amount, $spent); $format = $start->formatLocalized(strval(trans('config.month_and_day'))); $entries[$format] = $amount; @@ -149,11 +158,9 @@ class BudgetController extends Controller * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's exactly five. * @SuppressWarnings(PHPMD.ExcessiveMethodLength) // 46 lines, I'm fine with this. * - * @param BudgetRepositoryInterface $repository - * * @return \Symfony\Component\HttpFoundation\Response */ - public function frontpage(BudgetRepositoryInterface $repository) + public function frontpage() { $start = session('start', Carbon::now()->startOfMonth()); $end = session('end', Carbon::now()->endOfMonth()); @@ -165,7 +172,7 @@ class BudgetController extends Controller if ($cache->has()) { return Response::json($cache->get()); } - $budgets = $repository->getActiveBudgets(); + $budgets = $this->repository->getActiveBudgets(); $chartData = [ ['label' => strval(trans('firefly.spent_in_budget')), 'entries' => [], 'type' => 'bar',], ['label' => strval(trans('firefly.left_to_spend')), 'entries' => [], 'type' => 'bar',], @@ -176,7 +183,7 @@ class BudgetController extends Controller /** @var Budget $budget */ foreach ($budgets as $budget) { // get relevant repetitions: - $limits = $repository->getBudgetLimits($budget, $start, $end); + $limits = $this->repository->getBudgetLimits($budget, $start, $end); $expenses = $this->getExpensesForBudget($limits, $budget, $start, $end); foreach ($expenses as $name => $row) { $chartData[0]['entries'][$name] = $row['spent']; @@ -201,15 +208,16 @@ class BudgetController extends Controller /** - * @param BudgetRepositoryInterface $repository - * @param Budget $budget - * @param Carbon $start - * @param Carbon $end - * @param Collection $accounts + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's exactly five. + * + * @param Budget $budget + * @param Carbon $start + * @param Carbon $end + * @param Collection $accounts * * @return \Illuminate\Http\JsonResponse */ - public function period(BudgetRepositoryInterface $repository, Budget $budget, Collection $accounts, Carbon $start, Carbon $end) + public function period(Budget $budget, Collection $accounts, Carbon $start, Carbon $end) { // chart properties for cache: $cache = new CacheProperties(); @@ -221,37 +229,14 @@ class BudgetController extends Controller if ($cache->has()) { return Response::json($cache->get()); } - - // get the expenses - $budgeted = []; $periods = Navigation::listOfPeriods($start, $end); - $entries = $repository->getBudgetPeriodReport(new Collection([$budget]), $accounts, $start, $end); - $key = Navigation::preferredCarbonFormat($start, $end); - $range = Navigation::preferredRangeFormat($start, $end); - $current = clone $start; - while ($current < $end) { - - $currentStart = Navigation::startOfPeriod($current, $range); - $currentEnd = Navigation::endOfPeriod($current, $range); - $budgetLimits = $repository->getBudgetLimits($budget, $currentStart, $currentEnd); - $index = $currentStart->format($key); - $budgeted[$index] = $budgetLimits->sum('amount'); - $currentEnd->addDay(); - $current = clone $currentEnd; - } + $entries = $this->repository->getBudgetPeriodReport(new Collection([$budget]), $accounts, $start, $end); // get the expenses + $budgeted = $this->getBudgetedInPeriod($budget, $start, $end); // join them into one set of data: $chartData = [ - [ - 'label' => strval(trans('firefly.spent')), - 'type' => 'bar', - 'entries' => [], - ], - [ - 'label' => strval(trans('firefly.budgeted')), - 'type' => 'bar', - 'entries' => [], - ], + ['label' => strval(trans('firefly.spent')), 'type' => 'bar', 'entries' => [],], + ['label' => strval(trans('firefly.budgeted')), 'type' => 'bar', 'entries' => [],], ]; foreach (array_keys($periods) as $period) { @@ -260,7 +245,6 @@ class BudgetController extends Controller $limit = isset($budgeted[$period]) ? $budgeted[$period] : 0; $chartData[0]['entries'][$label] = round(bcmul($spent, '-1'), 12); $chartData[1]['entries'][$label] = $limit; - } $data = $this->generator->multiSet($chartData); $cache->store($data); @@ -269,14 +253,13 @@ class BudgetController extends Controller } /** - * @param BudgetRepositoryInterface $repository - * @param Collection $accounts - * @param Carbon $start - * @param Carbon $end + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end * * @return \Illuminate\Http\JsonResponse */ - public function periodNoBudget(BudgetRepositoryInterface $repository, Collection $accounts, Carbon $start, Carbon $end) + public function periodNoBudget(Collection $accounts, Carbon $start, Carbon $end) { // chart properties for cache: $cache = new CacheProperties(); @@ -290,7 +273,7 @@ class BudgetController extends Controller // the expenses: $periods = Navigation::listOfPeriods($start, $end); - $entries = $repository->getNoBudgetPeriodReport($accounts, $start, $end); + $entries = $this->repository->getNoBudgetPeriodReport($accounts, $start, $end); $chartData = []; // join them: @@ -305,6 +288,32 @@ class BudgetController extends Controller return Response::json($data); } + /** + * @param Budget $budget + * @param Carbon $start + * @param Carbon $end + * + * @return array + */ + private function getBudgetedInPeriod(Budget $budget, Carbon $start, Carbon $end): array + { + $key = Navigation::preferredCarbonFormat($start, $end); + $range = Navigation::preferredRangeFormat($start, $end); + $current = clone $start; + $budgeted = []; + while ($current < $end) { + $currentStart = Navigation::startOfPeriod($current, $range); + $currentEnd = Navigation::endOfPeriod($current, $range); + $budgetLimits = $this->repository->getBudgetLimits($budget, $currentStart, $currentEnd); + $index = $currentStart->format($key); + $budgeted[$index] = $budgetLimits->sum('amount'); + $currentEnd->addDay(); + $current = clone $currentEnd; + } + + return $budgeted; + } + /** * * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's 6 but ok. @@ -318,11 +327,9 @@ class BudgetController extends Controller */ private function getExpensesForBudget(Collection $limits, Budget $budget, Carbon $start, Carbon $end): array { - /** @var BudgetRepositoryInterface $repository */ - $repository = app(BudgetRepositoryInterface::class); - $return = []; + $return = []; if ($limits->count() === 0) { - $spent = $repository->spentInPeriod(new Collection([$budget]), new Collection, $start, $end); + $spent = $this->repository->spentInPeriod(new Collection([$budget]), new Collection, $start, $end); if (bccomp($spent, '0') !== 0) { $return[$budget->name]['spent'] = bcmul($spent, '-1'); $return[$budget->name]['left'] = 0; @@ -332,7 +339,7 @@ class BudgetController extends Controller return $return; } - $rows = $this->spentInPeriodMulti($repository, $budget, $limits); + $rows = $this->spentInPeriodMulti($budget, $limits); foreach ($rows as $name => $row) { if (bccomp($row['spent'], '0') !== 0 || bccomp($row['left'], '0') !== 0) { $return[$name]['spent'] = bcmul($row['spent'], '-1'); @@ -346,6 +353,8 @@ class BudgetController extends Controller } /** + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's exactly five. + * * Returns an array with the following values: * 0 => * 'name' => name of budget + repetition @@ -354,20 +363,19 @@ class BudgetController extends Controller * 'spent' => actually spent in period for budget * 1 => (etc) * - * @param BudgetRepositoryInterface $repository - * @param Budget $budget - * @param Collection $limits + * @param Budget $budget + * @param Collection $limits * * @return array */ - private function spentInPeriodMulti(BudgetRepositoryInterface $repository, Budget $budget, Collection $limits): array + private function spentInPeriodMulti(Budget $budget, Collection $limits): array { $return = []; $format = strval(trans('config.month_and_day')); $name = $budget->name; /** @var BudgetLimit $budgetLimit */ foreach ($limits as $budgetLimit) { - $expenses = $repository->spentInPeriod(new Collection([$budget]), new Collection, $budgetLimit->start_date, $budgetLimit->end_date); + $expenses = $this->repository->spentInPeriod(new Collection([$budget]), new Collection, $budgetLimit->start_date, $budgetLimit->end_date); if ($limits->count() > 1) { $name = $budget->name . ' ' . trans( diff --git a/app/Http/Controllers/Chart/CategoryController.php b/app/Http/Controllers/Chart/CategoryController.php index c0ff85e2e3..6ba325636a 100644 --- a/app/Http/Controllers/Chart/CategoryController.php +++ b/app/Http/Controllers/Chart/CategoryController.php @@ -65,7 +65,12 @@ class CategoryController extends Controller return Response::json($cache->get()); } - $start = $repository->firstUseDate($category); + $start = $repository->firstUseDate($category); + + if ($start->year == 1900) { + $start = new Carbon; + } + $range = Preferences::get('viewRange', '1M')->data; $start = Navigation::startOfPeriod($start, $range); $end = new Carbon; From b91f6c7ce6d747ce06a79ead7b95b08f99f14606 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 21:04:17 +0100 Subject: [PATCH 324/350] More alignment for #511 --- resources/views/accounts/show.twig | 8 ++-- resources/views/categories/show.twig | 8 ++-- resources/views/reports/budget/month.twig | 24 +++++------ resources/views/reports/category/month.twig | 36 ++++++++--------- .../views/reports/partials/accounts.twig | 18 ++++----- resources/views/reports/partials/balance.twig | 12 +++--- resources/views/reports/partials/bills.twig | 16 ++++---- .../views/reports/partials/budget-period.twig | 10 ++--- resources/views/reports/partials/budgets.twig | 40 ++++++++++++------- .../views/reports/partials/categories.twig | 8 ++-- .../reports/partials/category-period.twig | 12 +++--- .../reports/partials/income-expenses.twig | 10 ++--- .../partials/journals-audit-tasker.twig | 12 +++--- .../views/reports/partials/operations.twig | 6 +-- 14 files changed, 116 insertions(+), 104 deletions(-) diff --git a/resources/views/accounts/show.twig b/resources/views/accounts/show.twig index b68c607cde..e1f7cc7e20 100644 --- a/resources/views/accounts/show.twig +++ b/resources/views/accounts/show.twig @@ -107,14 +107,14 @@ {% if entry[2] != 0 %} - - + + {% endif %} {% if entry[3] != 0 %} - - + + {% endif %}
{{ 'spent'|_ }}{{ entry[2]|formatAmount }}{{ 'spent'|_ }}{{ entry[2]|formatAmount }}
{{ 'earned'|_ }}{{ entry[3]|formatAmount }}{{ 'earned'|_ }}{{ entry[3]|formatAmount }}
diff --git a/resources/views/categories/show.twig b/resources/views/categories/show.twig index 77954e0501..f824d79b75 100644 --- a/resources/views/categories/show.twig +++ b/resources/views/categories/show.twig @@ -96,14 +96,14 @@ {% if entry[2] != 0 %} - - + + {% endif %} {% if entry[3] != 0 %} - - + + {% endif %}
{{ 'spent'|_ }}{{ entry[2]|formatAmount }}{{ 'spent'|_ }}{{ entry[2]|formatAmount }}
{{ 'earned'|_ }}{{ entry[3]|formatAmount }}{{ 'earned'|_ }}{{ entry[3]|formatAmount }}
diff --git a/resources/views/reports/budget/month.twig b/resources/views/reports/budget/month.twig index c3009fe2a0..e8de3bee8f 100644 --- a/resources/views/reports/budget/month.twig +++ b/resources/views/reports/budget/month.twig @@ -17,7 +17,7 @@
{{ 'name'|_ }}{{ 'spent'|_ }}{{ 'spent'|_ }}
{{ accountSummary[account.id]|formatAmount }}{{ accountSummary[account.id]|formatAmount }}{{ 0|formatAmount }}{{ 0|formatAmount }}
{{ 'name'|_ }}{{ 'spent'|_ }}{{ 'spent'|_ }}
{{ budgetSummary[budget.id]|formatAmount }}{{ budgetSummary[budget.id]|formatAmount }}{{ 0|formatAmount }}{{ 0|formatAmount }}
{{ 'account'|_ }}{{ 'spent_average'|_ }}{{ 'total'|_ }}{{ 'spent_average'|_ }}{{ 'total'|_ }} {{ 'transaction_count'|_ }}
{{ row.name }} + {{ row.average|formatAmount }} + {{ row.sum|formatAmount }} @@ -188,7 +188,7 @@ {{ 'description'|_ }} {{ 'date'|_ }} {{ 'account'|_ }}{{ 'amount'|_ }}{{ 'amount'|_ }}
+ {{ row.transaction_amount|formatAmount }}
{{ 'name'|_ }}{{ 'earned'|_ }}{{ 'spent'|_ }}{{ 'earned'|_ }}{{ 'spent'|_ }}
{{ accountSummary[account.id].earned|formatAmount }}{{ accountSummary[account.id].earned|formatAmount }}{{ 0|formatAmount }}{{ 0|formatAmount }}{{ accountSummary[account.id].spent|formatAmount }}{{ accountSummary[account.id].spent|formatAmount }}{{ 0|formatAmount }}{{ 0|formatAmount }}
{{ 'name'|_ }}{{ 'earned'|_ }}{{ 'spent'|_ }}{{ 'earned'|_ }}{{ 'spent'|_ }}
{{ categorySummary[category.id].earned|formatAmount }}{{ categorySummary[category.id].earned|formatAmount }}{{ 0|formatAmount }}{{ 0|formatAmount }}{{ categorySummary[category.id].spent|formatAmount }}{{ categorySummary[category.id].spent|formatAmount }}{{ 0|formatAmount }}{{ 0|formatAmount }}
{{ 'account'|_ }}{{ 'spent_average'|_ }}{{ 'total'|_ }}{{ 'spent_average'|_ }}{{ 'total'|_ }} {{ 'transaction_count'|_ }}
{{ row.name }} + {{ row.average|formatAmount }} + {{ row.sum|formatAmount }} @@ -219,7 +219,7 @@ {{ 'description'|_ }} {{ 'date'|_ }} {{ 'account'|_ }}{{ 'amount'|_ }}{{ 'amount'|_ }}
+ {{ row.transaction_amount|formatAmount }}
{{ 'name'|_ }}{{ 'difference'|_ }}{{ 'difference'|_ }}
{{ account.name }} {{ (account.endBalance - account.startBalance)|formatAmount }}{{ (account.endBalance - account.startBalance)|formatAmount }}
{{ 'sumOfSums'|_ }}{{ accountReport.getDifference|formatAmount }}{{ accountReport.getDifference|formatAmount }}
diff --git a/resources/views/reports/partials/balance.twig b/resources/views/reports/partials/balance.twig index 58fdf45cfc..c2c6e1a323 100644 --- a/resources/views/reports/partials/balance.twig +++ b/resources/views/reports/partials/balance.twig @@ -4,9 +4,9 @@ {{ 'budgets'|_ }} {% for account in balance.getBalanceHeader.getAccounts %} - {{ account.name }} + {{ account.name }} {% endfor %} - + {{ 'leftInBudget'|_ }} @@ -28,7 +28,7 @@ {% endif %} - + {% if(balanceLine.getBudget.amount) %} {{ balanceLine.getBudget.amount|formatAmount }} {% else %} @@ -40,7 +40,7 @@ {% endif %} {% for balanceEntry in balanceLine.getBalanceEntries %} - + {% if balanceEntry.getSpent != 0 %} {{ (balanceEntry.getSpent)|formatAmountPlain }} {{ (balanceEntry.getLeft)|formatAmountPlain }} + {{ (balanceEntry.getLeft)|formatAmountPlain }} {% endif %} {% endfor %} - + {{ balanceLine.leftOfRepetition|formatAmount }} diff --git a/resources/views/reports/partials/bills.twig b/resources/views/reports/partials/bills.twig index fe234655ef..05f7f02839 100644 --- a/resources/views/reports/partials/bills.twig +++ b/resources/views/reports/partials/bills.twig @@ -7,10 +7,10 @@ {{ trans('form.name') }} - {{ trans('form.amount_min') }} - {{ trans('form.amount_max') }} - {{ trans('form.amount') }} - {{ trans('form.under') }} + {{ trans('form.amount_min') }} + {{ trans('form.amount_max') }} + {{ trans('form.amount') }} + {{ trans('form.under') }} @@ -19,10 +19,10 @@ {{ line.getBill.name }} - {{ line.getMin|formatAmount }} - {{ line.getMax|formatAmount }} + {{ line.getMin|formatAmount }} + {{ line.getMax|formatAmount }} {% if line.isHit %} - + {{ line.getAmount|formatAmount }} @@ -34,7 +34,7 @@ {% if not line.isActive %}   {% endif %} - + {% if line.isActive %} {{ (line.getMax + line.getAmount)|formatAmount }} {% endif %} diff --git a/resources/views/reports/partials/budget-period.twig b/resources/views/reports/partials/budget-period.twig index 86d5f98aed..e5586d17b0 100644 --- a/resources/views/reports/partials/budget-period.twig +++ b/resources/views/reports/partials/budget-period.twig @@ -3,9 +3,9 @@ {{ 'budget'|_ }} {% for period in periods %} - {{ period }} + {{ period }} {% endfor %} - {{ 'sum'|_ }} + {{ 'sum'|_ }} @@ -19,17 +19,17 @@ {% for key, period in periods %} {% if(info.entries[key]) %} - + {{ info.entries[key]|formatAmount }} {% else %} - + {{ 0|formatAmount }} {% endif %} {% endfor %} - + {{ info.sum|formatAmount }} diff --git a/resources/views/reports/partials/budgets.twig b/resources/views/reports/partials/budgets.twig index 9deece67bb..be4b938c4b 100644 --- a/resources/views/reports/partials/budgets.twig +++ b/resources/views/reports/partials/budgets.twig @@ -3,10 +3,11 @@ {{ 'budget'|_ }} {{ 'date'|_ }} - {{ 'budgeted'|_ }} - {{ 'spent'|_ }} - {{ 'left'|_ }} - {{ 'overspent'|_ }} + {{ 'budgeted'|_ }} + {{ 'spent'|_ }} +   + {{ 'left'|_ }} + {{ 'overspent'|_ }} @@ -40,33 +41,41 @@ {% if budgetLine.getBudgetLimit.id %} - + {{ budgetLine.getBudgetLimit.amount|formatAmount }} {% else %} - + {{ 0|formatAmount }} {% endif %} - + {% if budgetLine.getSpent != 0 %} {{ budgetLine.getSpent|formatAmount }} - + --> {% endif %} {% if budgetLine.getSpent == 0 %} {{ budgetLine.getSpent|formatAmount }} {% endif %} - - + + {% if budgetLine.getSpent != 0 %} + + + {% endif %} + + + {% if(budgetLine.getOverspent == 0) %} {{ budgetLine.getLeft|formatAmount }} {% endif %} - + {% if budgetLine.getOverspent != 0 %} {{ budgetLine.getOverspent|formatAmount }} {% endif %} @@ -78,8 +87,8 @@ {{ 'sum'|_ }}   - {{ budgets.getBudgeted|formatAmount }} - + {{ budgets.getBudgeted|formatAmount }} + {% if budgets.getSpent != 0 %} {{ budgets.getSpent|formatAmountPlain }} {% endif %} @@ -87,8 +96,9 @@ {{ budgets.getSpent|formatAmount }} {% endif %} - {{ budgets.getLeft|formatAmount }} - {{ budgets.getOverspent|formatAmountPlain }} +   + {{ budgets.getLeft|formatAmount }} + {{ budgets.getOverspent|formatAmountPlain }} diff --git a/resources/views/reports/partials/categories.twig b/resources/views/reports/partials/categories.twig index d5bfcb4df8..eec4ac0843 100644 --- a/resources/views/reports/partials/categories.twig +++ b/resources/views/reports/partials/categories.twig @@ -2,7 +2,8 @@ {{ 'category'|_ }} - {{ 'spent'|_ }} + {{ 'spent'|_ }} +   @@ -17,7 +18,7 @@ {{ category.name }} - {{ category.spent|formatAmount }} + {{ category.spent|formatAmount }} {{ 'sum'|_ }} - {{ sum|formatAmount }} + {{ sum|formatAmount }} +   diff --git a/resources/views/reports/partials/category-period.twig b/resources/views/reports/partials/category-period.twig index d24e0ec09f..8228327b64 100644 --- a/resources/views/reports/partials/category-period.twig +++ b/resources/views/reports/partials/category-period.twig @@ -3,9 +3,9 @@ {{ 'category'|_ }} {% for period in periods %} - {{ period }} + {{ period }} {% endfor %} - {{ 'sum'|_ }} + {{ 'sum'|_ }} @@ -20,11 +20,11 @@ {% for key, period in periods %} {# income first #} {% if(info.entries[key]) %} - + {{ info.entries[key]|formatAmount }} {% else %} - + {{ 0|formatAmount }} {% endif %} @@ -32,11 +32,11 @@ {# if sum of income, display: #} {% if info.sum %} - + {{ info.sum|formatAmount }} {% else %} - + {{ 0|formatAmount }} {% endif %} diff --git a/resources/views/reports/partials/income-expenses.twig b/resources/views/reports/partials/income-expenses.twig index c70f60b0d7..3dcb0f0614 100644 --- a/resources/views/reports/partials/income-expenses.twig +++ b/resources/views/reports/partials/income-expenses.twig @@ -2,8 +2,8 @@ {{ 'name'|_ }} - {{ 'total'|_ }} - {{ 'average'|_ }} + {{ 'total'|_ }} + {{ 'average'|_ }} @@ -25,10 +25,10 @@ {% endif %} - + {{ (entry.sum)|formatAmount }} - + {% if entry.count > 1 %} {{ entry.average|formatAmount }} {% else %} @@ -52,7 +52,7 @@ {% endif %} {{ 'sum'|_ }} - {{ (sum)|formatAmount }} + {{ (sum)|formatAmount }} diff --git a/resources/views/reports/partials/journals-audit-tasker.twig b/resources/views/reports/partials/journals-audit-tasker.twig index 824dd126bc..0c9fd25adc 100644 --- a/resources/views/reports/partials/journals-audit-tasker.twig +++ b/resources/views/reports/partials/journals-audit-tasker.twig @@ -7,9 +7,9 @@   {{ trans('list.description') }} - {{ trans('list.balance_before') }} - {{ trans('list.amount') }} - {{ trans('list.balance_after') }} + {{ trans('list.balance_before') }} + {{ trans('list.amount') }} + {{ trans('list.balance_after') }} {{ trans('list.date') }} {{ trans('list.book_date') }} @@ -57,14 +57,14 @@ {% endif %} - {{ transaction.before|formatAmount }} - + {{ transaction.before|formatAmount }} + {{ formatByCode(transaction.transaction_currency_code, transaction.transaction_amount) }} {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, transaction.transaction_currency_code, transaction.transaction_type_type) }} - {{ transaction.after|formatAmount }} + {{ transaction.after|formatAmount }} {{ transaction.date.formatLocalized(monthAndDayFormat) }} diff --git a/resources/views/reports/partials/operations.twig b/resources/views/reports/partials/operations.twig index 12fb1928f7..60ee342bb9 100644 --- a/resources/views/reports/partials/operations.twig +++ b/resources/views/reports/partials/operations.twig @@ -1,14 +1,14 @@ - + - + - +
{{ 'in'|_ }}{{ incomeSum|formatAmount }}{{ incomeSum|formatAmount }}
{{ 'out'|_ }}{{ expensesSum|formatAmount }}{{ expensesSum|formatAmount }}
{{ 'difference'|_ }}{{ (incomeSum + expensesSum)|formatAmount }}{{ (incomeSum + expensesSum)|formatAmount }}
From 48d735b53b14e5198ff76d646f5b4908ffccb2aa Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 22:41:29 +0100 Subject: [PATCH 325/350] New translations --- resources/lang/pl_PL/form.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php index 2f9a155f2d..a5fd529eae 100644 --- a/resources/lang/pl_PL/form.php +++ b/resources/lang/pl_PL/form.php @@ -51,9 +51,9 @@ return [ 'tagPosition' => 'Lokalizacja taga', 'virtualBalance' => 'Wirtualne saldo', 'longitude_latitude' => 'Lokalizacja', - 'targetamount' => 'Target amount', - 'accountRole' => 'Account role', - 'openingBalanceDate' => 'Opening balance date', + 'targetamount' => 'Docelowa kwota', + 'accountRole' => 'Rola konta', + 'openingBalanceDate' => 'Data salda otwarcia', 'ccType' => 'Plan płatności kartą kredytową', 'ccMonthlyPaymentDate' => 'Credit card monthly payment date', 'piggy_bank_id' => 'Skarbonka', From 1f670f7a0526448e81ab483ceec69132ecaacba5 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 22:51:31 +0100 Subject: [PATCH 326/350] New translations --- resources/lang/pl_PL/firefly.php | 44 ++++++++++++++++---------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 690b02fce0..f6b312b5ab 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -54,7 +54,7 @@ return [ 'route_has_no_help' => 'There is no help for this route.', 'help_may_not_be_your_language' => 'This help text is in English. It is not yet available in your language', 'two_factor_welcome' => 'Witaj, :user!', - 'two_factor_enter_code' => 'To continue, please enter your two factor authentication code. Your application can generate it for you.', + 'two_factor_enter_code' => 'Aby kontynuować, wprowadź kod uwierzytelniania dwuskładnikowego. Twoja aplikacja może wygenerować go dla Ciebie.', 'two_factor_code_here' => 'Wprowadź tutaj kod', 'two_factor_title' => 'Weryfikacja dwuskładnikowa', 'authenticate' => 'Authenticate', @@ -76,8 +76,8 @@ return [ 'tagbalancingAct' => 'Balancing act', 'tagadvancePayment' => 'Advance payment', 'tagnothing' => '', - 'Default asset account' => 'Default asset account', - 'no_budget_pointer' => 'You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.', + 'Default asset account' => 'Domyślne konto aktywów', + 'no_budget_pointer' => 'Wygląda na to że nie masz jeszcze budżetów. Powinieneś utworzyć kilka na stronie budżety. Budżety mogą Ci pomóc śledzić wydatki.', 'Savings account' => 'Konto oszczędnościowe', 'Credit card' => 'Karta kredytowa', 'source_accounts' => 'Konto(a) źródłowe', @@ -93,12 +93,12 @@ return [ 'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.', 'sum_of_expenses' => 'Suma wydatków', 'sum_of_income' => 'Suma dochodów', - 'spent_in_specific_budget' => 'Spent in budget ":budget"', + 'spent_in_specific_budget' => 'Wydatki w budżecie ":budget"', 'sum_of_expenses_in_budget' => 'Spent total in budget ":budget"', 'left_in_budget_limit' => 'Left to spend according to budgeting', 'cannot_change_demo' => 'Nie można zmienić hasła do konta demonstracyjnego.', 'cannot_delete_demo' => 'You cannot remove the demonstration account.', - 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', + 'cannot_reset_demo_user' => 'Nie można zresetować hasła do konta demonstracyjnego', 'per_period' => 'Per period', 'all_periods' => 'Wszystkie okresy', 'current_period' => 'Bieżący okres', @@ -192,7 +192,7 @@ return [ 'default_rule_description' => 'Ta reguła jest przykładem. Możesz ją bezpiecznie usunąć.', 'default_rule_trigger_description' => 'The Man Who Sold the World', 'default_rule_trigger_from_account' => 'David Bowie', - 'default_rule_action_prepend' => 'Bought the world from ', + 'default_rule_action_prepend' => 'Kupił świat od ', 'default_rule_action_set_category' => 'Duże wydatki', 'trigger' => 'Wyzwalacz', 'trigger_value' => 'Trigger on value', @@ -200,7 +200,7 @@ return [ 'add_rule_trigger' => 'Dodaj nowy wyzwalacz', 'action' => 'Akcja', 'action_value' => 'Action value', - 'stop_executing_other_actions' => 'Stop executing other actions', + 'stop_executing_other_actions' => 'Zatrzymaj wykonywanie innych akcji', 'add_rule_action' => 'Dodaj nową akcję', 'edit_rule' => 'Modyfikuj regułę ":title"', 'delete_rule' => 'Usuń regułę ":title"', @@ -208,7 +208,7 @@ return [ 'test_rule_triggers' => 'Zobacz dopasowane transakcje', 'warning_transaction_subset' => 'For performance reasons this list is limited to :max_num_transactions and may only show a subset of matching transactions', 'warning_no_matching_transactions' => 'No matching transactions found. Please note that for performance reasons, only the last :num_transactions transactions have been checked.', - 'warning_no_valid_triggers' => 'No valid triggers provided.', + 'warning_no_valid_triggers' => 'Nie dostarczono prawidłowych wyzwalaczy.', 'execute_on_existing_transactions' => 'Wykonaj dla istniejących transakcji', 'rule_group_select_transactions' => 'Execute rule group ":title" on existing transactions', 'execute_on_existing_transactions_intro' => 'When a rule or group has been changed or added, you can execute it for existing transactions', @@ -219,7 +219,7 @@ return [ 'execute' => 'Wykonaj', // actions and triggers - 'rule_trigger_user_action' => 'User action is ":trigger_value"', + 'rule_trigger_user_action' => 'Akcją użytkownika jest ":trigger_value"', 'rule_trigger_from_account_starts' => 'Source account starts with ":trigger_value"', 'rule_trigger_from_account_ends' => 'Source account ends with ":trigger_value"', 'rule_trigger_from_account_is' => 'Source account is ":trigger_value"', @@ -289,7 +289,7 @@ return [ // preferences 'pref_home_screen_accounts' => 'Home screen accounts', 'pref_home_screen_accounts_help' => 'Which accounts should be displayed on the home page?', - 'pref_view_range' => 'View range', + 'pref_view_range' => 'Pokaż zakres', 'pref_view_range_help' => 'Some charts are automatically grouped in periods. What period would you prefer?', 'pref_1D' => 'Dzień', 'pref_1W' => 'Tydzień', @@ -321,13 +321,13 @@ return [ 'preferences_layout' => 'Układ', 'pref_home_show_deposits' => 'Show deposits on the home screen', 'pref_home_show_deposits_info' => 'The home screen already shows your expense accounts. Should it also show your revenue accounts?', - 'pref_home_do_show_deposits' => 'Yes, show them', + 'pref_home_do_show_deposits' => 'Tak, pokaż je', 'successful_count' => 'of which :count successful', - 'transaction_page_size_title' => 'Page size', + 'transaction_page_size_title' => 'Rozmiar strony', 'transaction_page_size_help' => 'Any list of transactions shows at most this many transactions', - 'transaction_page_size_label' => 'Page size', - 'between_dates' => '(:start and :end)', - 'pref_optional_fields_transaction' => 'Optional fields for transactions', + 'transaction_page_size_label' => 'Rozmiar strony', + 'between_dates' => '(:start i :end)', + 'pref_optional_fields_transaction' => 'Opcjonalne pola dla transakcji', 'pref_optional_fields_transaction_help' => 'By default not all fields are enabled when creating a new transaction (because of the clutter). Below, you can enable these fields if you think they could be useful for you. Of course, any field that is disabled, but already filled in, will be visible regardless of the setting.', 'optional_tj_date_fields' => 'Date fields', 'optional_tj_business_fields' => 'Business fields', @@ -368,11 +368,11 @@ return [ // attachments 'nr_of_attachments' => 'Jeden załącznik |:count załączników', 'attachments' => 'Załączniki', - 'edit_attachment' => 'Edit attachment ":name"', - 'update_attachment' => 'Update attachment', - 'delete_attachment' => 'Delete attachment ":name"', - 'attachment_deleted' => 'Deleted attachment ":name"', - 'attachment_updated' => 'Updated attachment ":name"', + 'edit_attachment' => 'Modyfikuj załącznik ":name"', + 'update_attachment' => 'Aktualizuj załącznik', + 'delete_attachment' => 'Usuń załącznik ":name"', + 'attachment_deleted' => 'Usunięto załącznik ":name"', + 'attachment_updated' => 'Zmodyfikowano załącznik ":name"', 'upload_max_file_size' => 'Maksymalny rozmiar pliku to: :size', // tour: @@ -402,7 +402,7 @@ return [ 'convert_options_DepositWithdrawal' => 'Convert a deposit into a withdrawal', 'convert_options_TransferWithdrawal' => 'Convert a transfer into a withdrawal', 'convert_options_TransferDeposit' => 'Convert a transfer into a deposit', - 'transaction_journal_convert_options' => 'Convert this transaction', + 'transaction_journal_convert_options' => 'Konwertuj tę transakcję', 'convert_Withdrawal_to_deposit' => 'Convert this withdrawal to a deposit', 'convert_Withdrawal_to_transfer' => 'Convert this withdrawal to a transfer', 'convert_Deposit_to_withdrawal' => 'Convert this deposit to a withdrawal', @@ -487,7 +487,7 @@ return [ 'between_amounts' => 'między :low i :high.', 'repeats' => 'Powtarza się', 'connected_journals' => 'Powiązane transakcje', - 'auto_match_on' => 'Automatically matched by Firefly', + 'auto_match_on' => 'Automatycznie dopasowane przez Firefly', 'auto_match_off' => 'Not automatically matched by Firefly', 'next_expected_match' => 'Następne oczekiwane dopasowanie', 'delete_bill' => 'Usuń rachunek ":name"', From c9cc3bf3ff46b01d23624ce042072ad6373f7dac Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 22:51:33 +0100 Subject: [PATCH 327/350] New translations --- resources/lang/pl_PL/form.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php index a5fd529eae..1fec9ee34e 100644 --- a/resources/lang/pl_PL/form.php +++ b/resources/lang/pl_PL/form.php @@ -61,8 +61,8 @@ return [ 'returnHereExplanation' => 'After storing, return here to create another one.', 'returnHereUpdateExplanation' => 'Po aktualizacji, wróć tutaj.', 'description' => 'Opis', - 'expense_account' => 'Expense account', - 'revenue_account' => 'Revenue account', + 'expense_account' => 'Konto wydatków', + 'revenue_account' => 'Konto przychodów', 'decimal_places' => 'Miejsca dziesiętne', 'revenue_account_source' => 'Konto przychodów (źródło)', From 3025693178176ad4c4b1dbe4805e2701c820416d Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 23:01:50 +0100 Subject: [PATCH 328/350] New translations --- resources/lang/pl_PL/firefly.php | 126 +++++++++++++++---------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index f6b312b5ab..316641ca0d 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -522,33 +522,33 @@ return [ 'asset_deleted' => 'Successfully deleted asset account ":name"', 'expense_deleted' => 'Successfully deleted expense account ":name"', 'revenue_deleted' => 'Successfully deleted revenue account ":name"', - 'update_asset_account' => 'Update asset account', - 'update_expense_account' => 'Update expense account', - 'update_revenue_account' => 'Update revenue account', + 'update_asset_account' => 'Aktualizuj konto aktywów', + 'update_expense_account' => 'Aktualizuj konto wydatków', + 'update_revenue_account' => 'Aktualizuj konto przychodów', 'make_new_asset_account' => 'Utwórz nowe konto aktywów', - 'make_new_expense_account' => 'Create a new expense account', - 'make_new_revenue_account' => 'Create a new revenue account', + 'make_new_expense_account' => 'Utwórz nowe konto wydatków', + 'make_new_revenue_account' => 'Utwórz nowe konto przychodów', 'asset_accounts' => 'Konta aktywów', 'expense_accounts' => 'Konta wydatków', - 'revenue_accounts' => 'Revenue accounts', - 'cash_accounts' => 'Cash accounts', - 'Cash account' => 'Cash account', - 'account_type' => 'Account type', + 'revenue_accounts' => 'Konta przychodów', + 'cash_accounts' => 'Konta gotówkowe', + 'Cash account' => 'Konto gotówkowe', + 'account_type' => 'Typ konta', 'save_transactions_by_moving' => 'Save these transaction(s) by moving them to another account:', 'stored_new_account' => 'New account ":name" stored!', '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".', + 'credit_card_options' => 'Opcje karty kredytowej', + 'no_transactions_account' => 'Brak transakcji (w tym okresie) na koncie aktywów ":name".', 'no_data_for_chart' => 'Nie ma wystarczająco dużo informacji (póki co), aby wygenerować ten wykres.', 'select_more_than_one_account' => 'Proszę wybierz więcej niż jedno konto', 'select_more_than_one_category' => 'Proszę wybierz więcej niż jedną kategorię', 'select_more_than_one_budget' => 'Proszę wybierz więcej niż jeden budżet', - 'from_to' => 'From :start to :end', + 'from_to' => 'Od :start do :end', // categories: - 'new_category' => 'New category', - 'create_new_category' => 'Create a new category', - 'without_category' => 'Without a category', + 'new_category' => 'Nowa kategoria', + 'create_new_category' => 'Utwórz nową kategorię', + 'without_category' => 'Bez kategorii', 'update_category' => 'Aktualizuj kategorię', 'updated_category' => 'Zmodyfikowano kategorię ":name"', 'categories' => 'Kategorie', @@ -559,18 +559,18 @@ return [ 'deleted_category' => 'Usunięto kategorię ":name"', 'store_category' => 'Zapisz nową kategorię', 'stored_category' => 'Zapisano nową kategorię ":name"', - 'without_category_between' => 'Without category between :start and :end', + 'without_category_between' => 'Bez kategorii między :start i :end', // transactions: 'update_withdrawal' => 'Modyfikuj wypłatę', 'update_deposit' => 'Modyfikuj wpłatę', 'update_transfer' => 'Modyfikuj transfer', - 'updated_withdrawal' => 'Updated withdrawal ":description"', - 'updated_deposit' => 'Updated deposit ":description"', - 'updated_transfer' => 'Updated transfer ":description"', - 'delete_withdrawal' => 'Delete withdrawal ":description"', - 'delete_deposit' => 'Delete deposit ":description"', - 'delete_transfer' => 'Delete transfer ":description"', + 'updated_withdrawal' => 'Zaktualizowano wypłatę ":description"', + 'updated_deposit' => 'Zaktualizowano wpłatę ":description"', + 'updated_transfer' => 'Zaktualizowano transfer ":description"', + 'delete_withdrawal' => 'Usunięto wypłatę ":description"', + 'delete_deposit' => 'Usuń wpłatę ":description"', + 'delete_transfer' => 'Usuń transfer ":description"', 'deleted_withdrawal' => 'Successfully deleted withdrawal ":description"', 'deleted_deposit' => 'Successfully deleted deposit ":description"', 'deleted_transfer' => 'Successfully deleted transfer ":description"', @@ -579,12 +579,12 @@ return [ 'stop_selection' => 'Stop selecting transactions', 'edit_selected' => 'Modyfikuj zaznaczone', 'delete_selected' => 'Usuń zaznaczone', - 'mass_delete_journals' => 'Delete a number of transactions', - 'mass_edit_journals' => 'Edit a number of transactions', + 'mass_delete_journals' => 'Usuń wiele transakcji', + 'mass_edit_journals' => 'Modyfikuj wiele transakcji', 'cannot_edit_other_fields' => 'You cannot mass-edit other fields than the ones here, because there is no room to show them. Please follow the link and edit them by one-by-one, if you need to edit these fields.', 'perm-delete-many' => 'Deleting many items in one go can be very disruptive. Please be cautious.', - 'mass_deleted_transactions_success' => 'Deleted :amount transaction(s).', - 'mass_edited_transactions_success' => 'Updated :amount transaction(s)', + 'mass_deleted_transactions_success' => 'Usunięto :amount transakcję(i).', + 'mass_edited_transactions_success' => 'Zaktualizowano :amount transakcję(i)', // new user: @@ -603,7 +603,7 @@ return [ 'moneyOut' => 'Money out', 'billsToPay' => 'Rachunki do zapłacenia', 'billsPaid' => 'Zapłacone rachunki', - 'divided' => 'divided', + 'divided' => 'podzielone', 'toDivide' => 'left to divide', // menu and titles, should be recycled as often as possible: @@ -644,16 +644,16 @@ return [ 'saveOnAccount' => 'Save on account', 'unknown' => 'Unknown', 'daily' => 'Daily', - 'monthly' => 'Monthly', - 'profile' => 'Profile', - 'errors' => 'Errors', + 'monthly' => 'Miesięcznie', + 'profile' => 'Profil', + 'errors' => 'Błędy', // reports: 'report_default' => 'Default financial report between :start and :end', 'report_audit' => 'Transaction history overview between :start and :end', 'report_category' => 'Category report between :start and :end', 'report_budget' => 'Budget report between :start and :end', - 'quick_link_reports' => 'Quick links', + 'quick_link_reports' => 'Szybkie linki', 'quick_link_default_report' => 'Default financial report', 'quick_link_audit_report' => 'Transaction history overview', 'report_this_month_quick' => 'Current month, all accounts', @@ -661,33 +661,33 @@ return [ 'report_this_fiscal_year_quick' => 'Current fiscal year, all accounts', 'report_all_time_quick' => 'All-time, all accounts', 'reports_can_bookmark' => 'Remember that reports can be bookmarked.', - 'incomeVsExpenses' => 'Income vs. expenses', - 'accountBalances' => 'Account balances', - 'balanceStartOfYear' => 'Balance at start of year', - 'balanceEndOfYear' => 'Balance at end of year', - 'balanceStartOfMonth' => 'Balance at start of month', - 'balanceEndOfMonth' => 'Balance at end of month', - 'balanceStart' => 'Balance at start of period', - 'balanceEnd' => 'Balance at end of period', - 'reportsOwnAccounts' => 'Reports for your own accounts', + 'incomeVsExpenses' => 'Dochody a wydatki', + 'accountBalances' => 'Salda kont', + 'balanceStartOfYear' => 'Saldo na początku roku', + 'balanceEndOfYear' => 'Saldo na końcu roku', + 'balanceStartOfMonth' => 'Saldo na początku miesiąca', + 'balanceEndOfMonth' => 'Saldo na końcu miesiąca', + 'balanceStart' => 'Saldo na początku okresu', + 'balanceEnd' => 'Saldo na końcu okresu', + 'reportsOwnAccounts' => 'Raporty dla własnych kont', 'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts', 'splitByAccount' => 'Split by account', 'balancedByTransfersAndTags' => 'Balanced by transfers and tags', 'coveredWithTags' => 'Covered with tags', 'leftUnbalanced' => 'Left unbalanced', - 'expectedBalance' => 'Expected balance', - 'outsideOfBudgets' => 'Outside of budgets', - 'leftInBudget' => 'Left in budget', - 'sumOfSums' => 'Sum of sums', - 'noCategory' => '(no category)', + 'expectedBalance' => 'Przewidywane saldo', + 'outsideOfBudgets' => 'Poza budżetami', + 'leftInBudget' => 'Pozostało w budżecie', + 'sumOfSums' => 'Suma sum', + 'noCategory' => '(bez kategorii)', 'notCharged' => 'Not charged (yet)', - 'inactive' => 'Inactive', - 'active' => 'Active', - 'difference' => 'Difference', + 'inactive' => 'Nieaktywne', + 'active' => 'Aktywne', + 'difference' => 'Różnica', 'in' => 'In', 'out' => 'Out', 'topX' => 'top :number', - 'show_full_list' => 'Show entire list', + 'show_full_list' => 'Pokaż całą listę', 'show_only_top' => 'Show only top :number', 'sum_of_year' => 'Sum of year', 'sum_of_years' => 'Sum of years', @@ -695,7 +695,7 @@ return [ 'average_of_years' => 'Average of years', 'categories_earned_in_year' => 'Categories (by earnings)', 'categories_spent_in_year' => 'Categories (by spendings)', - 'report_type' => 'Report type', + 'report_type' => 'Typ raportu', 'report_type_default' => 'Default financial report', 'report_type_audit' => 'Transaction history overview (audit)', 'report_type_category' => 'Category report', @@ -727,27 +727,27 @@ return [ 'expense_per_account' => 'Expense per account', 'include_not_in_category' => 'Include categories not selected for this report', 'include_not_in_budget' => 'Include budgets not selected for this report', - 'everything_else' => 'Everything else', + 'everything_else' => 'Wszystko inne', 'income_and_expenses' => 'Income and expenses', - 'spent_average' => 'Spent (average)', - 'income_average' => 'Income (average)', - 'transaction_count' => 'Transaction count', - 'average_spending_per_account' => 'Average spending per account', - 'average_income_per_account' => 'Average income per account', - 'total' => 'Total', - 'description' => 'Description', + 'spent_average' => 'Wydano (średnia)', + 'income_average' => 'Dochód (średnia)', + 'transaction_count' => 'Liczba transakcji', + 'average_spending_per_account' => 'Średnie wydatki per konto', + 'average_income_per_account' => 'Średni dochód per konto', + 'total' => 'Łącznie', + 'description' => 'Opis', 'sum_of_period' => 'Sum of period', 'average_in_period' => 'Average in period', // charts: - 'chart' => 'Chart', - 'dayOfMonth' => 'Day of the month', - 'month' => 'Month', - 'budget' => 'Budget', + 'chart' => 'Wykres', + 'dayOfMonth' => 'Dzień miesiąca', + 'month' => 'Miesiąc', + 'budget' => 'Budżet', 'spent' => 'Spent', 'spent_in_budget' => 'Spent in budget', - 'left_to_spend' => 'Left to spend', + 'left_to_spend' => 'Pozostało do wydania', 'earned' => 'Earned', 'overspent' => 'Overspent', 'left' => 'Left', From 7bd4de937a7d968841cc34c8c5c7f7cb88e0b599 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 23:11:54 +0100 Subject: [PATCH 329/350] New translations --- resources/lang/pl_PL/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/pl_PL/list.php b/resources/lang/pl_PL/list.php index f6e522ae33..1dd99e4872 100644 --- a/resources/lang/pl_PL/list.php +++ b/resources/lang/pl_PL/list.php @@ -34,7 +34,7 @@ return [ 'split_number' => 'Split #', 'destination' => 'Cel', 'source' => 'Źródło', - 'next_expected_match' => 'Next expected match', + 'next_expected_match' => 'Następne oczekiwane dopasowanie', 'automatch' => 'Auto dopasowanie?', 'repeat_freq' => 'Powtarza się', 'description' => 'Opis', From d0afcb6cfaea707fe909a7771a149f9692f638cf Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 23:11:57 +0100 Subject: [PATCH 330/350] New translations --- resources/lang/pl_PL/firefly.php | 76 ++++++++++++++++---------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 316641ca0d..9304d1c340 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -748,40 +748,40 @@ return [ 'spent' => 'Spent', 'spent_in_budget' => 'Spent in budget', 'left_to_spend' => 'Pozostało do wydania', - 'earned' => 'Earned', + 'earned' => 'Zarobione', 'overspent' => 'Overspent', 'left' => 'Left', 'no_budget' => '(no budget)', 'max-amount' => 'Maximum amount', 'min-amount' => 'Minumum amount', 'journal-amount' => 'Current bill entry', - 'name' => 'Name', - 'date' => 'Date', - 'paid' => 'Paid', + 'name' => 'Nazwa', + 'date' => 'Data', + 'paid' => 'Zpłacone', 'unpaid' => 'Niezapłacone', 'day' => 'Dzień', - 'budgeted' => 'Budgeted', + 'budgeted' => 'Zabudżetowano', 'period' => 'Okres', 'balance' => 'Saldo', 'summary' => 'Podsumowanie', 'sum' => 'Suma', - 'average' => 'Average', - 'balanceFor' => 'Balance for :name', + 'average' => 'Średno', + 'balanceFor' => 'Saldo dla :name', // piggy banks: 'add_money_to_piggy' => 'Add money to piggy bank ":name"', - 'piggy_bank' => 'Piggy bank', - 'new_piggy_bank' => 'Create new piggy bank', - 'store_piggy_bank' => 'Store new piggy bank', - 'stored_piggy_bank' => 'Store new piggy bank ":name"', - 'account_status' => 'Account status', + 'piggy_bank' => 'Skarbonka', + 'new_piggy_bank' => 'Utwórz nową skarbonkę', + 'store_piggy_bank' => 'Zapisz nową skarbonkę', + 'stored_piggy_bank' => 'Zapisz nową skarbonkę ":name"', + 'account_status' => 'Status konta', 'left_for_piggy_banks' => 'Left for piggy banks', 'sum_of_piggy_banks' => 'Sum of piggy banks', - 'saved_so_far' => 'Saved so far', - 'left_to_save' => 'Left to save', - 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"', - 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"', - 'add' => 'Add', + 'saved_so_far' => 'Zaoszczędzono do tej pory', + 'left_to_save' => 'Pozostało do zaoszczędzenia', + 'add_money_to_piggy_title' => 'Dodaj pieniądze do skarbonki ":name"', + 'remove_money_from_piggy_title' => 'Usuń pieniądze ze skarbonki ":name"', + 'add' => 'Dodaj', 'remove' => 'Remove', 'max_amount_add' => 'The maximum amount you can add is', @@ -817,9 +817,9 @@ return [ 'edit_tag' => 'Edit tag ":tag"', 'updated_tag' => 'Updated tag ":tag"', 'created_tag' => 'Tag ":tag" has been created!', - 'no_year' => 'No year set', - 'no_month' => 'No month set', - 'tag_title_nothing' => 'Default tags', + 'no_year' => 'Nie ustawiono roku', + 'no_month' => 'Nie ustawiono miesiąca', + 'tag_title_nothing' => 'Domyślne tagi', 'tag_title_balancingAct' => 'Balancing act tags', 'tag_title_advancePayment' => 'Advance payment tags', 'tags_introduction' => 'Usually tags are singular words, designed to quickly band items together using things like expensive, bill or for-party. In Firefly III, tags can have more properties such as a date, description and location. This allows you to join transactions together in a more meaningful way. For example, you could make a tag called Christmas dinner with friends and add information about the restaurant. Such tags are "singular", you would only use them for a single occasion, perhaps with multiple transactions.', @@ -828,45 +828,45 @@ return [ 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', - 'total_amount' => 'Total amount', - 'number_of_decimals' => 'Number of decimals', + 'total_amount' => 'Łączna kwota', + 'number_of_decimals' => 'Ilość miejsc dziesiętnych', // administration - 'administration' => 'Administration', - 'user_administration' => 'User administration', - 'list_all_users' => 'All users', - 'all_users' => 'All users', - 'instance_configuration' => 'Configuration', - 'firefly_instance_configuration' => 'Configuration options for Firefly III', - 'setting_single_user_mode' => 'Single user mode', + 'administration' => 'Administracja', + 'user_administration' => 'Administracja użytkownikami', + 'list_all_users' => 'Wszyscy użytkownicy', + 'all_users' => 'Wszyscy użytkownicy', + 'instance_configuration' => 'Konfiguracja', + 'firefly_instance_configuration' => 'Opcje konfiguracji dla Firefly III', + 'setting_single_user_mode' => 'Tryb pojedynczego użytkownika', 'setting_single_user_mode_explain' => 'By default, Firefly III only accepts one (1) registration: you. This is a security measure, preventing others from using your instance unless you allow them to. Future registrations are blocked. When you uncheck this box, others can use your instance as wel, assuming they can reach it (when it is connected to the internet).', - 'store_configuration' => 'Store configuration', + 'store_configuration' => 'Zapisz konfigurację', 'single_user_administration' => 'User administration for :email', - 'edit_user' => 'Edit user :email', + 'edit_user' => 'Modyfikuj użytkownika :email', 'hidden_fields_preferences' => 'Not all fields are visible right now. You must enable them in your settings.', 'user_data_information' => 'User data', 'user_information' => 'User information', 'total_size' => 'total size', - 'budget_or_budgets' => 'budget(s)', + 'budget_or_budgets' => 'budżet(y)', 'budgets_with_limits' => 'budget(s) with configured amount', - 'rule_or_rules' => 'rule(s)', - 'rulegroup_or_groups' => 'rule group(s)', - 'setting_must_confirm_account' => 'Account confirmation', + 'rule_or_rules' => 'reguła(y)', + 'rulegroup_or_groups' => 'grupa(y) reguł', + 'setting_must_confirm_account' => 'Potwierdzenie konta', 'setting_must_confirm_account_explain' => 'When this setting is enabled, users must activate their account before it can be used.', 'configuration_updated' => 'The configuration has been updated', 'setting_is_demo_site' => 'Demo site', 'setting_is_demo_site_explain' => 'If you check this box, this installation will behave as if it is the demo site, which can have weird side effects.', - 'setting_send_email_notifications' => 'Send email notifications', + 'setting_send_email_notifications' => 'Wyślij powiadomienia emailem', 'setting_send_email_explain' => 'Firefly III can send you email notifications about certain events. They will be sent to :site_owner. This email address can be set in the .env file.', 'block_code_bounced' => 'Email message(s) bounced', - 'block_code_expired' => 'Demo account expired', + 'block_code_expired' => 'Demonstracyjne konto wygasło', 'no_block_code' => 'No reason for block or user not blocked', // split a transaction: 'transaction_meta_data' => 'Transaction meta-data', 'transaction_dates' => 'Transaction dates', - 'splits' => 'Splits', + 'splits' => 'Podziały', 'split_title_withdrawal' => 'Podziel swoją nową wypłatę', 'split_intro_one_withdrawal' => 'Firefly supports the "splitting" of a withdrawal.', 'split_intro_two_withdrawal' => 'It means that the amount of money you\'ve spent is divided between several destination expense accounts, budgets or categories.', From d28fcdc6a55b3c9d03d7e67a012f3e7048dda7a9 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 2 Jan 2017 23:12:00 +0100 Subject: [PATCH 331/350] Translated --- resources/lang/pl_PL/auth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/pl_PL/auth.php b/resources/lang/pl_PL/auth.php index 96f4d83e1f..a7b55af932 100644 --- a/resources/lang/pl_PL/auth.php +++ b/resources/lang/pl_PL/auth.php @@ -22,7 +22,7 @@ return [ | */ - 'failed' => 'These credentials do not match our records.', + 'failed' => 'Te poświadczenia nie zgadzają się z naszymi danymi.', 'throttle' => 'Zbyt wiele prób logowania. Spróbuj ponownie za :seconds sekund.', ]; \ No newline at end of file From 796be319b7910b34ceff169cdf2fe1be20c07c68 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 3 Jan 2017 08:27:48 +0100 Subject: [PATCH 332/350] Piggy banks for #511 [skip ci] --- resources/views/list/piggy-banks.twig | 22 +++++++++++++++++----- resources/views/piggy-banks/index.twig | 22 +++++++++++----------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/resources/views/list/piggy-banks.twig b/resources/views/list/piggy-banks.twig index 6fe3af9bff..7fa3188f14 100644 --- a/resources/views/list/piggy-banks.twig +++ b/resources/views/list/piggy-banks.twig @@ -1,4 +1,14 @@ + + + + + + + + + + {% for piggyBank in piggyBanks %} @@ -21,8 +31,8 @@ - - + diff --git a/resources/views/piggy-banks/index.twig b/resources/views/piggy-banks/index.twig index 364ec37f0e..821b731c9a 100644 --- a/resources/views/piggy-banks/index.twig +++ b/resources/views/piggy-banks/index.twig @@ -11,7 +11,7 @@

{{ 'piggyBanks'|_ }}

-
+
{% include 'list/piggy-banks' %}
@@ -29,22 +29,22 @@ - - - - - + + + + + {% for id,info in accounts %} - - - - - + + + + + {% endfor %} From c34fb7f03772db58fa8e8e17f909e1a88070ad0f Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 3 Jan 2017 17:02:17 +0100 Subject: [PATCH 333/350] Cleaned up the category and budget pie charts. --- app/Generator/Report/Support.php | 38 +-- app/Helpers/Chart/MetaPieChart.php | 278 ++++++++++++++++++ app/Helpers/Chart/MetaPieChartInterface.php | 82 ++++++ .../Chart/BudgetReportController.php | 108 ++----- .../Chart/CategoryReportController.php | 208 +++---------- app/Providers/FireflyServiceProvider.php | 3 + resources/views/reports/budget/month.twig | 4 +- resources/views/reports/category/month.twig | 8 +- 8 files changed, 447 insertions(+), 282 deletions(-) create mode 100644 app/Helpers/Chart/MetaPieChart.php create mode 100644 app/Helpers/Chart/MetaPieChartInterface.php diff --git a/app/Generator/Report/Support.php b/app/Generator/Report/Support.php index 1f71ad182a..573129ef97 100644 --- a/app/Generator/Report/Support.php +++ b/app/Generator/Report/Support.php @@ -34,27 +34,7 @@ class Support */ public static function filterExpenses(Collection $collection, array $accounts): Collection { - $result = $collection->filter( - function (Transaction $transaction) use ($accounts) { - $opposing = $transaction->opposing_account_id; - // remove internal transfer - if (in_array($opposing, $accounts)) { - Log::debug(sprintf('Filtered #%d because its opposite is in accounts.', $transaction->id)); - - return null; - } - // remove positive amount - if (bccomp($transaction->transaction_amount, '0') === 1) { - Log::debug(sprintf('Filtered #%d because amount is %f.', $transaction->id, $transaction->transaction_amount)); - - return null; - } - - return $transaction; - } - ); - - return $result; + return self::filterTransactions($collection, $accounts, 1); } /** @@ -64,9 +44,21 @@ class Support * @return Collection */ public static function filterIncome(Collection $collection, array $accounts): Collection + { + return self::filterTransactions($collection, $accounts, -1); + } + + /** + * @param Collection $collection + * @param array $accounts + * @param int $modifier + * + * @return Collection + */ + public static function filterTransactions(Collection $collection, array $accounts, int $modifier): Collection { $result = $collection->filter( - function (Transaction $transaction) use ($accounts) { + function (Transaction $transaction) use ($accounts, $modifier) { $opposing = $transaction->opposing_account_id; // remove internal transfer if (in_array($opposing, $accounts)) { @@ -75,7 +67,7 @@ class Support return null; } // remove positive amount - if (bccomp($transaction->transaction_amount, '0') === -1) { + if (bccomp($transaction->transaction_amount, '0') === $modifier) { Log::debug(sprintf('Filtered #%d because amount is %f.', $transaction->id, $transaction->transaction_amount)); return null; diff --git a/app/Helpers/Chart/MetaPieChart.php b/app/Helpers/Chart/MetaPieChart.php new file mode 100644 index 0000000000..fbeb70cc25 --- /dev/null +++ b/app/Helpers/Chart/MetaPieChart.php @@ -0,0 +1,278 @@ + ['opposing_account_id'], + 'budget' => ['transaction_journal_budget_id', 'transaction_budget_id'], + 'category' => ['transaction_journal_category_id', 'transaction_category_id'], + ]; + + /** @var array */ + protected $repositories + = [ + 'account' => AccountRepositoryInterface::class, + 'budget' => BudgetRepositoryInterface::class, + 'category' => CategoryRepositoryInterface::class, + ]; + + + /** @var Carbon */ + protected $start; + /** @var string */ + protected $total = '0'; + /** @var User */ + protected $user; + + public function __construct() + { + $this->accounts = new Collection; + $this->budgets = new Collection; + $this->categories = new Collection; + } + + /** + * @param string $direction + * @param string $group + * + * @return array + */ + public function generate(string $direction, string $group): array + { + $transactions = $this->getTransactions($direction); + $grouped = $this->groupByFields($transactions, $this->grouping[$group]); + $chartData = $this->organizeByType($group, $grouped); + + // also collect all other transactions + if ($this->collectOtherObjects && $direction === 'expense') { + /** @var JournalCollectorInterface $collector */ + $collector = app(JournalCollectorInterface::class, [$this->user]); + $collector->setAccounts($this->accounts)->setRange($this->start, $this->end)->setTypes([TransactionType::WITHDRAWAL]); + $journals = $collector->getJournals(); + $sum = strval($journals->sum('transaction_amount')); + $sum = bcmul($sum, '-1'); + $sum = bcsub($sum, $this->total); + $chartData[strval(trans('firefly.everything_else'))] = $sum; + } + + if ($this->collectOtherObjects && $direction === 'income') { + /** @var JournalCollectorInterface $collector */ + $collector = app(JournalCollectorInterface::class, [auth()->user()]); + $collector->setAccounts($this->accounts)->setRange($this->start, $this->end)->setTypes([TransactionType::DEPOSIT]); + $journals = $collector->getJournals(); + $sum = strval($journals->sum('transaction_amount')); + $sum = bcsub($sum, $this->total); + $chartData[strval(trans('firefly.everything_else'))] = $sum; + } + + return $chartData; + + } + + /** + * @param Collection $accounts + * + * @return MetaPieChartInterface + */ + public function setAccounts(Collection $accounts): MetaPieChartInterface + { + $this->accounts = $accounts; + + return $this; + } + + /** + * @param Collection $budgets + * + * @return MetaPieChartInterface + */ + public function setBudgets(Collection $budgets): MetaPieChartInterface + { + $this->budgets = $budgets; + + return $this; + } + + /** + * @param Collection $categories + * + * @return MetaPieChartInterface + */ + public function setCategories(Collection $categories): MetaPieChartInterface + { + $this->categories = $categories; + + return $this; + } + + /** + * @param bool $collectOtherObjects + * + * @return MetaPieChartInterface + */ + public function setCollectOtherObjects(bool $collectOtherObjects): MetaPieChartInterface + { + $this->collectOtherObjects = $collectOtherObjects; + + return $this; + } + + /** + * @param Carbon $end + * + * @return MetaPieChartInterface + */ + public function setEnd(Carbon $end): MetaPieChartInterface + { + $this->end = $end; + + return $this; + } + + /** + * @param Carbon $start + * + * @return MetaPieChartInterface + */ + public function setStart(Carbon $start): MetaPieChartInterface + { + $this->start = $start; + + return $this; + } + + /** + * @param User $user + * + * @return MetaPieChartInterface + */ + public function setUser(User $user): MetaPieChartInterface + { + $this->user = $user; + + return $this; + } + + protected function getTransactions(string $direction) + { + $types = [TransactionType::DEPOSIT, TransactionType::TRANSFER]; + $modifier = -1; + if ($direction === 'expense') { + $types = [TransactionType::WITHDRAWAL, TransactionType::TRANSFER]; + $modifier = 1; + } + /** @var JournalCollectorInterface $collector */ + $collector = app(JournalCollectorInterface::class, [auth()->user()]); + $collector->setAccounts($this->accounts); + $collector->setRange($this->start, $this->end); + $collector->setTypes($types); + $collector->withOpposingAccount(); + + if ($direction === 'income') { + $collector->disableFilter(); + } + + if ($this->budgets->count() > 0) { + $collector->setBudgets($this->budgets); + } + if ($this->categories->count() > 0) { + $collector->setCategories($this->categories); + } + + $accountIds = $this->accounts->pluck('id')->toArray(); + $transactions = $collector->getJournals(); + $set = Support::filterTransactions($transactions, $accountIds, $modifier); + + return $set; + } + + /** + * @param Collection $set + * @param array $fields + * + * @return array + */ + protected function groupByFields(Collection $set, array $fields) + { + $grouped = []; + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + $values = []; + foreach ($fields as $field) { + $values[] = intval($transaction->$field); + } + $value = max($values); + $grouped[$value] = $grouped[$value] ?? '0'; + $grouped[$value] = bcadd($transaction->transaction_amount, $grouped[$value]); + } + + return $grouped; + } + + /** + * @param string $type + * @param array $array + * + * @return array + */ + protected function organizeByType(string $type, array $array): array + { + $chartData = []; + $names = []; + $repository = app($this->repositories[$type], [$this->user]); + foreach ($array as $objectId => $amount) { + if (!isset($names[$objectId])) { + $object = $repository->find(intval($objectId)); + $names[$objectId] = $object->name; + } + if (bccomp($amount, '0') === -1) { + $amount = bcmul($amount, '-1'); + } + + $this->total = bcadd($this->total, $amount); + $chartData[$names[$objectId]] = $amount; + } + + return $chartData; + + } +} \ No newline at end of file diff --git a/app/Helpers/Chart/MetaPieChartInterface.php b/app/Helpers/Chart/MetaPieChartInterface.php new file mode 100644 index 0000000000..a466db8a38 --- /dev/null +++ b/app/Helpers/Chart/MetaPieChartInterface.php @@ -0,0 +1,82 @@ +addProperty('chart.budget.report.account-expense'); - $cache->addProperty($accounts); - $cache->addProperty($budgets); - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty($others); - if ($cache->has()) { - return Response::json($cache->get()); - } - - $names = []; - $set = $this->getExpenses($accounts, $budgets, $start, $end); - $grouped = $this->groupByOpposingAccount($set); - $chartData = []; - $total = '0'; - - foreach ($grouped as $accountId => $amount) { - if (!isset($names[$accountId])) { - $account = $this->accountRepository->find(intval($accountId)); - $names[$accountId] = $account->name; - } - $amount = bcmul($amount, '-1'); - $total = bcadd($total, $amount); - $chartData[$names[$accountId]] = $amount; - } - - // also collect all transactions NOT in these budgets. - if ($others) { - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class, [auth()->user()]); - $collector->setAccounts($accounts)->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL]); - $journals = $collector->getJournals(); - $sum = strval($journals->sum('transaction_amount')); - $sum = bcmul($sum, '-1'); - $sum = bcsub($sum, $total); - $chartData[strval(trans('firefly.everything_else'))] = $sum; - } - - $data = $this->generator->pieChart($chartData); - $cache->store($data); + /** @var MetaPieChartInterface $helper */ + $helper = app(MetaPieChartInterface::class); + $helper->setAccounts($accounts); + $helper->setBudgets($budgets); + $helper->setUser(auth()->user()); + $helper->setStart($start); + $helper->setEnd($end); + $helper->setCollectOtherObjects(intval($others) === 1); + $chartData = $helper->generate('expense', 'account'); + $data = $this->generator->pieChart($chartData); return Response::json($data); + } /** @@ -133,49 +102,16 @@ class BudgetReportController extends Controller */ public function budgetExpense(Collection $accounts, Collection $budgets, Carbon $start, Carbon $end, string $others) { - /** @var bool $others */ - $others = intval($others) === 1; - $cache = new CacheProperties; - $cache->addProperty('chart.budget.report.budget-expense'); - $cache->addProperty($accounts); - $cache->addProperty($budgets); - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty($others); - if ($cache->has()) { - return Response::json($cache->get()); - } - - $names = []; - $set = $this->getExpenses($accounts, $budgets, $start, $end); - $grouped = $this->groupByBudget($set); - $total = '0'; - $chartData = []; - - foreach ($grouped as $budgetId => $amount) { - if (!isset($names[$budgetId])) { - $budget = $this->budgetRepository->find(intval($budgetId)); - $names[$budgetId] = $budget->name; - } - $amount = bcmul($amount, '-1'); - $total = bcadd($total, $amount); - $chartData[$names[$budgetId]] = $amount; - } - - // also collect all transactions NOT in these budgets. - if ($others) { - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class, [auth()->user()]); - $collector->setAccounts($accounts)->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL]); - $journals = $collector->getJournals(); - $sum = strval($journals->sum('transaction_amount')); - $sum = bcmul($sum, '-1'); - $sum = bcsub($sum, $total); - $chartData[strval(trans('firefly.everything_else'))] = $sum; - } - - $data = $this->generator->pieChart($chartData); - $cache->store($data); + /** @var MetaPieChartInterface $helper */ + $helper = app(MetaPieChartInterface::class); + $helper->setAccounts($accounts); + $helper->setBudgets($budgets); + $helper->setUser(auth()->user()); + $helper->setStart($start); + $helper->setEnd($end); + $helper->setCollectOtherObjects(intval($others) === 1); + $chartData = $helper->generate('expense', 'budget'); + $data = $this->generator->pieChart($chartData); return Response::json($data); } diff --git a/app/Http/Controllers/Chart/CategoryReportController.php b/app/Http/Controllers/Chart/CategoryReportController.php index fb66e25a1d..e156becd7e 100644 --- a/app/Http/Controllers/Chart/CategoryReportController.php +++ b/app/Http/Controllers/Chart/CategoryReportController.php @@ -17,6 +17,7 @@ namespace FireflyIII\Http\Controllers\Chart; use Carbon\Carbon; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Generator\Report\Category\MonthReportGenerator; +use FireflyIII\Helpers\Chart\MetaPieChartInterface; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Category; @@ -75,49 +76,16 @@ class CategoryReportController extends Controller */ public function accountExpense(Collection $accounts, Collection $categories, Carbon $start, Carbon $end, string $others) { - /** @var bool $others */ - $others = intval($others) === 1; - $cache = new CacheProperties; - $cache->addProperty('chart.category.report.account-expense'); - $cache->addProperty($accounts); - $cache->addProperty($categories); - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty($others); - if ($cache->has()) { - return Response::json($cache->get()); - } - - $names = []; - $set = $this->getExpenses($accounts, $categories, $start, $end); - $grouped = $this->groupByOpposingAccount($set); - $chartData = []; - $total = '0'; - - foreach ($grouped as $accountId => $amount) { - if (!isset($names[$accountId])) { - $account = $this->accountRepository->find(intval($accountId)); - $names[$accountId] = $account->name; - } - $amount = bcmul($amount, '-1'); - $total = bcadd($total, $amount); - $chartData[$names[$accountId]] = $amount; - } - - // also collect all transactions NOT in these categories. - if ($others) { - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class, [auth()->user()]); - $collector->setAccounts($accounts)->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL]); - $journals = $collector->getJournals(); - $sum = strval($journals->sum('transaction_amount')); - $sum = bcmul($sum, '-1'); - $sum = bcsub($sum, $total); - $chartData[strval(trans('firefly.everything_else'))] = $sum; - } - - $data = $this->generator->pieChart($chartData); - $cache->store($data); + /** @var MetaPieChartInterface $helper */ + $helper = app(MetaPieChartInterface::class); + $helper->setAccounts($accounts); + $helper->setCategories($categories); + $helper->setUser(auth()->user()); + $helper->setStart($start); + $helper->setEnd($end); + $helper->setCollectOtherObjects(intval($others) === 1); + $chartData = $helper->generate('expense', 'account'); + $data = $this->generator->pieChart($chartData); return Response::json($data); } @@ -133,48 +101,16 @@ class CategoryReportController extends Controller */ public function accountIncome(Collection $accounts, Collection $categories, Carbon $start, Carbon $end, string $others) { - /** @var bool $others */ - $others = intval($others) === 1; - $cache = new CacheProperties; - $cache->addProperty('chart.category.report.account-income'); - $cache->addProperty($accounts); - $cache->addProperty($categories); - $cache->addProperty($start); - $cache->addProperty($others); - $cache->addProperty($end); - if ($cache->has()) { - return Response::json($cache->get()); - } - - - $names = []; - $set = $this->getIncome($accounts, $categories, $start, $end); - $grouped = $this->groupByOpposingAccount($set); - $chartData = []; - $total = '0'; - - foreach ($grouped as $accountId => $amount) { - if (!isset($names[$accountId])) { - $account = $this->accountRepository->find(intval($accountId)); - $names[$accountId] = $account->name; - } - $total = bcadd($total, $amount); - $chartData[$names[$accountId]] = $amount; - } - - // also collect others? - if ($others) { - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class, [auth()->user()]); - $collector->setAccounts($accounts)->setRange($start, $end)->setTypes([TransactionType::DEPOSIT]); - $journals = $collector->getJournals(); - $sum = strval($journals->sum('transaction_amount')); - $sum = bcsub($sum, $total); - $chartData[strval(trans('firefly.everything_else'))] = $sum; - } - - $data = $this->generator->pieChart($chartData); - $cache->store($data); + /** @var MetaPieChartInterface $helper */ + $helper = app(MetaPieChartInterface::class); + $helper->setAccounts($accounts); + $helper->setCategories($categories); + $helper->setUser(auth()->user()); + $helper->setStart($start); + $helper->setEnd($end); + $helper->setCollectOtherObjects(intval($others) === 1); + $chartData = $helper->generate('income', 'account'); + $data = $this->generator->pieChart($chartData); return Response::json($data); } @@ -190,49 +126,16 @@ class CategoryReportController extends Controller */ public function categoryExpense(Collection $accounts, Collection $categories, Carbon $start, Carbon $end, string $others) { - /** @var bool $others */ - $others = intval($others) === 1; - $cache = new CacheProperties; - $cache->addProperty('chart.category.report.category-expense'); - $cache->addProperty($accounts); - $cache->addProperty($categories); - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty($others); - if ($cache->has()) { - return Response::json($cache->get()); - } - - $names = []; - $set = $this->getExpenses($accounts, $categories, $start, $end); - $grouped = $this->groupByCategory($set); - $total = '0'; - $chartData = []; - - foreach ($grouped as $categoryId => $amount) { - if (!isset($names[$categoryId])) { - $category = $this->categoryRepository->find(intval($categoryId)); - $names[$categoryId] = $category->name; - } - $amount = bcmul($amount, '-1'); - $total = bcadd($total, $amount); - $chartData[$names[$categoryId]] = $amount; - } - - // also collect all transactions NOT in these categories. - if ($others) { - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class, [auth()->user()]); - $collector->setAccounts($accounts)->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL]); - $journals = $collector->getJournals(); - $sum = strval($journals->sum('transaction_amount')); - $sum = bcmul($sum, '-1'); - $sum = bcsub($sum, $total); - $chartData[strval(trans('firefly.everything_else'))] = $sum; - } - - $data = $this->generator->pieChart($chartData); - $cache->store($data); + /** @var MetaPieChartInterface $helper */ + $helper = app(MetaPieChartInterface::class); + $helper->setAccounts($accounts); + $helper->setCategories($categories); + $helper->setUser(auth()->user()); + $helper->setStart($start); + $helper->setEnd($end); + $helper->setCollectOtherObjects(intval($others) === 1); + $chartData = $helper->generate('expense', 'category'); + $data = $this->generator->pieChart($chartData); return Response::json($data); } @@ -248,46 +151,17 @@ class CategoryReportController extends Controller */ public function categoryIncome(Collection $accounts, Collection $categories, Carbon $start, Carbon $end, string $others) { - /** @var bool $others */ - $others = intval($others) === 1; - $cache = new CacheProperties; - $cache->addProperty('chart.category.report.category-income'); - $cache->addProperty($accounts); - $cache->addProperty($categories); - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty($others); - if ($cache->has()) { - return Response::json($cache->get()); - } - $names = []; - $set = $this->getIncome($accounts, $categories, $start, $end); - $grouped = $this->groupByCategory($set); - $total = '0'; - $chartData = []; - - foreach ($grouped as $categoryId => $amount) { - if (!isset($names[$categoryId])) { - $category = $this->categoryRepository->find(intval($categoryId)); - $names[$categoryId] = $category->name; - } - $total = bcadd($total, $amount); - $chartData[$names[$categoryId]] = $amount; - } - - if ($others) { - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class, [auth()->user()]); - $collector->setAccounts($accounts)->setRange($start, $end)->setTypes([TransactionType::DEPOSIT]); - $journals = $collector->getJournals(); - $sum = strval($journals->sum('transaction_amount')); - $sum = bcsub($sum, $total); - $chartData[strval(trans('firefly.everything_else'))] = $sum; - } - - $data = $this->generator->pieChart($chartData); - $cache->store($data); + /** @var MetaPieChartInterface $helper */ + $helper = app(MetaPieChartInterface::class); + $helper->setAccounts($accounts); + $helper->setCategories($categories); + $helper->setUser(auth()->user()); + $helper->setStart($start); + $helper->setEnd($end); + $helper->setCollectOtherObjects(intval($others) === 1); + $chartData = $helper->generate('income', 'category'); + $data = $this->generator->pieChart($chartData); return Response::json($data); } diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index 2a49d5b15e..b798f531e0 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -96,6 +96,9 @@ class FireflyServiceProvider extends ServiceProvider // chart generator: $this->app->bind('FireflyIII\Generator\Chart\Basic\GeneratorInterface', 'FireflyIII\Generator\Chart\Basic\ChartJsGenerator'); + // chart builder + $this->app->bind('FireflyIII\Helpers\Chart\MetaPieChartInterface', 'FireflyIII\Helpers\Chart\MetaPieChart'); + // other generators $this->app->bind('FireflyIII\Export\ProcessorInterface', 'FireflyIII\Export\Processor'); $this->app->bind('FireflyIII\Import\ImportProcedureInterface', 'FireflyIII\Import\ImportProcedure'); diff --git a/resources/views/reports/budget/month.twig b/resources/views/reports/budget/month.twig index e8de3bee8f..d5efaae2f7 100644 --- a/resources/views/reports/budget/month.twig +++ b/resources/views/reports/budget/month.twig @@ -80,7 +80,7 @@ @@ -97,7 +97,7 @@ diff --git a/resources/views/reports/category/month.twig b/resources/views/reports/category/month.twig index cef7514534..b50d8b4aed 100644 --- a/resources/views/reports/category/month.twig +++ b/resources/views/reports/category/month.twig @@ -90,7 +90,7 @@ @@ -104,7 +104,7 @@ @@ -119,7 +119,7 @@ @@ -133,7 +133,7 @@ From 0c6d21329661cf1b724c70d081b011207b543029 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 3 Jan 2017 17:26:31 +0100 Subject: [PATCH 334/350] Update scrutiniser configuration. --- .scrutinizer.yml | 1 + app/Http/Controllers/PreferencesController.php | 1 + 2 files changed, 2 insertions(+) diff --git a/.scrutinizer.yml b/.scrutinizer.yml index 02bb0d0f4a..ac754cc957 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -39,6 +39,7 @@ checks: avoid_fixme_comments: true avoid_multiple_statements_on_same_line: true align_assignments: true + duplication: false javascript: true coding_style: diff --git a/app/Http/Controllers/PreferencesController.php b/app/Http/Controllers/PreferencesController.php index 93efecf2a8..f4bd94c4b5 100644 --- a/app/Http/Controllers/PreferencesController.php +++ b/app/Http/Controllers/PreferencesController.php @@ -113,6 +113,7 @@ class PreferencesController extends Controller * @param TokenFormRequest $request * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @SuppressWarnings(PHPMD.UnusedFormalParameter) // it's unused but the class does some validation. */ public function postCode(TokenFormRequest $request) { From 2d59b6718d4ac6c852f896f870fd6465d5db8a9f Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 3 Jan 2017 17:46:08 +0100 Subject: [PATCH 335/350] Various code style fixes. --- app/Export/Processor.php | 7 ++++--- .../Controllers/Transaction/ConvertController.php | 12 ++++++------ app/Rules/Triggers/AbstractTrigger.php | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/Export/Processor.php b/app/Export/Processor.php index 15960d63f6..0d0421a460 100644 --- a/app/Export/Processor.php +++ b/app/Export/Processor.php @@ -155,7 +155,7 @@ class Processor implements ProcessorInterface $zip->close(); // delete the files: - $this->deleteFiles($disk); + $this->deleteFiles(); return true; } @@ -183,10 +183,11 @@ class Processor implements ProcessorInterface } /** - * @param FilesystemAdapter $disk + * */ - private function deleteFiles(FilesystemAdapter $disk) + private function deleteFiles() { + $disk = Storage::disk('export'); foreach ($this->getFiles() as $file) { $disk->delete($file); } diff --git a/app/Http/Controllers/Transaction/ConvertController.php b/app/Http/Controllers/Transaction/ConvertController.php index ebeec3b1d3..45f5583b9a 100644 --- a/app/Http/Controllers/Transaction/ConvertController.php +++ b/app/Http/Controllers/Transaction/ConvertController.php @@ -217,8 +217,8 @@ class ConvertController extends Controller switch ($joined) { default: throw new FireflyException('Cannot handle ' . $joined); - case TransactionType::WITHDRAWAL . '-' . TransactionType::DEPOSIT: # one - case TransactionType::TRANSFER . '-' . TransactionType::DEPOSIT: #six + case TransactionType::WITHDRAWAL . '-' . TransactionType::DEPOSIT: // one + case TransactionType::TRANSFER . '-' . TransactionType::DEPOSIT: // six $data = [ 'name' => $data['source_account_revenue'], 'accountType' => 'revenue', @@ -228,14 +228,14 @@ class ConvertController extends Controller ]; $source = $accountRepository->store($data); break; - case TransactionType::WITHDRAWAL . '-' . TransactionType::TRANSFER: # two - case TransactionType::TRANSFER . '-' . TransactionType::WITHDRAWAL: #five + case TransactionType::WITHDRAWAL . '-' . TransactionType::TRANSFER: // two + case TransactionType::TRANSFER . '-' . TransactionType::WITHDRAWAL: // five $source = $sourceAccount; break; - case TransactionType::DEPOSIT . '-' . TransactionType::WITHDRAWAL: # three + case TransactionType::DEPOSIT . '-' . TransactionType::WITHDRAWAL: // three $source = $destinationAccount; break; - case TransactionType::DEPOSIT . '-' . TransactionType::TRANSFER: # four + case TransactionType::DEPOSIT . '-' . TransactionType::TRANSFER: // four $source = $accountRepository->find(intval($data['source_account_asset'])); break; } diff --git a/app/Rules/Triggers/AbstractTrigger.php b/app/Rules/Triggers/AbstractTrigger.php index f3be138f8a..a2492e1a13 100644 --- a/app/Rules/Triggers/AbstractTrigger.php +++ b/app/Rules/Triggers/AbstractTrigger.php @@ -23,7 +23,7 @@ use FireflyIII\Models\TransactionJournal; * * @package FireflyIII\Rules\Triggers */ -class AbstractTrigger +final class AbstractTrigger { /** @var bool */ public $stopProcessing; From f9f21efd36a62aa1e5259eb5b2db0ccdb70e4ab7 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 3 Jan 2017 20:02:48 +0100 Subject: [PATCH 336/350] Update config to fix #519 --- config/session.php | 187 ++++----------------------------------------- 1 file changed, 13 insertions(+), 174 deletions(-) diff --git a/config/session.php b/config/session.php index 51698cb45e..f5af7f0fdc 100644 --- a/config/session.php +++ b/config/session.php @@ -13,179 +13,18 @@ declare(strict_types = 1); return [ - - /* - |-------------------------------------------------------------------------- - | Default Session Driver - |-------------------------------------------------------------------------- - | - | This option controls the default session "driver" that will be used on - | requests. By default, we will use the lightweight native driver but - | you may specify any of the other wonderful drivers provided here. - | - | Supported: "file", "cookie", "database", "apc", - | "memcached", "redis", "array" - | - */ - - 'driver' => env('SESSION_DRIVER', 'file'), - - /* - |-------------------------------------------------------------------------- - | Session Lifetime - |-------------------------------------------------------------------------- - | - | Here you may specify the number of minutes that you wish the session - | to be allowed to remain idle before it expires. If you want them - | to immediately expire on the browser closing, set that option. - | - */ - - 'lifetime' => 120, - + 'driver' => env('SESSION_DRIVER', 'file'), + 'lifetime' => 120, 'expire_on_close' => false, - - /* - |-------------------------------------------------------------------------- - | Session Encryption - |-------------------------------------------------------------------------- - | - | This option allows you to easily specify that all of your session data - | should be encrypted before it is stored. All encryption will be run - | automatically by Laravel and you can use the Session like normal. - | - */ - - 'encrypt' => true, - - /* - |-------------------------------------------------------------------------- - | Session File Location - |-------------------------------------------------------------------------- - | - | When using the native session driver, we need a location where session - | files may be stored. A default has been set for you but a different - | location may be specified. This is only needed for file sessions. - | - */ - - 'files' => storage_path('framework/sessions'), - - /* - |-------------------------------------------------------------------------- - | Session Database Connection - |-------------------------------------------------------------------------- - | - | When using the "database" or "redis" session drivers, you may specify a - | connection that should be used to manage these sessions. This should - | correspond to a connection in your database configuration options. - | - */ - - 'connection' => null, - - /* - |-------------------------------------------------------------------------- - | Session Database Table - |-------------------------------------------------------------------------- - | - | When using the "database" session driver, you may specify the table we - | should use to manage the sessions. Of course, a sensible default is - | provided for you; however, you are free to change this as needed. - | - */ - - 'table' => 'sessions', - - /* - |-------------------------------------------------------------------------- - | Session Cache Store - |-------------------------------------------------------------------------- - | - | When using the "apc" or "memcached" session drivers, you may specify a - | cache store that should be used for these sessions. This value must - | correspond with one of the application's configured cache stores. - | - */ - - 'store' => null, - - /* - |-------------------------------------------------------------------------- - | Session Sweeping Lottery - |-------------------------------------------------------------------------- - | - | Some session drivers must manually sweep their storage location to get - | rid of old sessions from storage. Here are the chances that it will - | happen on a given request. By default, the odds are 2 out of 100. - | - */ - - 'lottery' => [2, 100], - - /* - |-------------------------------------------------------------------------- - | Session Cookie Name - |-------------------------------------------------------------------------- - | - | Here you may change the name of the cookie used to identify a session - | instance by ID. The name specified here will get used every time a - | new session cookie is created by the framework for every driver. - | - */ - - 'cookie' => 'firefly_session', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Path - |-------------------------------------------------------------------------- - | - | The session cookie path determines the path for which the cookie will - | be regarded as available. Typically, this will be the root path of - | your application but you are free to change this when necessary. - | - */ - - 'path' => env('COOKIE_PATH', '/'), - - /* - |-------------------------------------------------------------------------- - | Session Cookie Domain - |-------------------------------------------------------------------------- - | - | Here you may change the domain of the cookie used to identify a session - | in your application. This will determine which domains the cookie is - | available to in your application. A sensible default has been set. - | - */ - - 'domain' => env('COOKIE_DOMAIN', null), - - /* - |-------------------------------------------------------------------------- - | HTTPS Only Cookies - |-------------------------------------------------------------------------- - | - | By setting this option to true, session cookies will only be sent back - | to the server if the browser has a HTTPS connection. This will keep - | the cookie from being sent to you if it can not be done securely. - | - */ - - 'secure' => env('COOKIE_SECURE', false), - - /* - |-------------------------------------------------------------------------- - | HTTP Access Only - |-------------------------------------------------------------------------- - | - | Setting this value to true will prevent JavaScript from accessing the - | value of the cookie and the cookie will only be accessible through - | the HTTP protocol. You are free to modify this option if needed. - | - */ - - 'http_only' => !env('COOKIE_SECURE', false), - + 'encrypt' => true, + 'files' => storage_path('framework/sessions'), + 'connection' => null, + 'table' => 'sessions', + 'store' => null, + 'lottery' => [2, 100], + 'cookie' => 'firefly_session', + 'path' => env('COOKIE_PATH', '/'), + 'domain' => env('COOKIE_DOMAIN', null), + 'secure' => env('COOKIE_SECURE', false), + 'http_only' => true, ]; From 457037ed99d39575b665f4da8094e5d0f3c06b47 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 3 Jan 2017 20:05:20 +0100 Subject: [PATCH 337/350] Should not be a final class, dummy. --- app/Rules/Triggers/AbstractTrigger.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Rules/Triggers/AbstractTrigger.php b/app/Rules/Triggers/AbstractTrigger.php index a2492e1a13..f3be138f8a 100644 --- a/app/Rules/Triggers/AbstractTrigger.php +++ b/app/Rules/Triggers/AbstractTrigger.php @@ -23,7 +23,7 @@ use FireflyIII\Models\TransactionJournal; * * @package FireflyIII\Rules\Triggers */ -final class AbstractTrigger +class AbstractTrigger { /** @var bool */ public $stopProcessing; From e2c613c422bf5d19d0522f9cf8f8f74d4ed39181 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 04:48:58 +0100 Subject: [PATCH 338/350] New config. --- config/firefly.php | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/config/firefly.php b/config/firefly.php index 444a786cd6..45e813e6eb 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -19,17 +19,11 @@ declare(strict_types = 1); return [ 'configuration' => [ - 'single_user_mode' => true, - 'is_demo_site' => false, - 'must_confirm_account' => false, - 'mail_for_lockout' => false, - 'mail_for_blocked_domain' => false, - 'mail_for_blocked_email' => false, - 'mail_for_bad_login' => false, - 'mail_for_blocked_login' => false, + 'single_user_mode' => true, + 'is_demo_site' => false, ], 'chart' => 'chartjs', - 'version' => '4.3.0', + 'version' => '4.3.1', 'csv_import_enabled' => true, 'maxUploadSize' => 5242880, 'allowedMimes' => ['image/png', 'image/jpeg', 'application/pdf'], @@ -150,7 +144,7 @@ return [ 'transaction_type' => 'FireflyIII\Models\TransactionType', 'currency' => 'FireflyIII\Models\TransactionCurrency', 'limitrepetition' => 'FireflyIII\Models\LimitRepetition', - 'budgetlimit' => 'FireflyIII\Models\BudgetLimit', + 'budgetlimit' => 'FireflyIII\Models\BudgetLimit', 'piggyBank' => 'FireflyIII\Models\PiggyBank', 'tj' => 'FireflyIII\Models\TransactionJournal', 'unfinishedJournal' => 'FireflyIII\Support\Binder\UnfinishedJournal', From 800f67908e0ad0427da1f012a8d19946841514da Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 04:49:07 +0100 Subject: [PATCH 339/350] New change log. --- CHANGELOG.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80f72c0a53..7a7d24c3a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,24 +3,29 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). -## [4.3.1] - 2017-01-xx +## [4.3.1] - 2017-01-04 ### Added -- Support for Russian. +- Support for Russian and Polish. +- Support for a proper demo website. +- Support for custom decimal places in currencies (#506, suggested by @xpfgsyb). +- Most amounts are now right-aligned (#511, suggested by @xpfgsyb). +- German is now a "complete" language, more than 75% translated! ### Changed - **[New Github repository!](github.com/firefly-iii/firefly-iii)** - -### Deprecated -- With the realization of a proper demo site many administrative functions have become deprecated, and will be removed over the coming releases. Included but not limited to the ability to block domains for registration, get email notifications for specific actions and many more. +- Better category overview. +- #502, thanks to @zjean ### Removed -- Something +- Removed a lot of administration functions. +- Removed ability to activate users. ### Fixed -- Something +- #501, thanks to @zjean +- #513, thanks to @skibbipl ### Security -- Something +- #519, thanks to @xpfgsyb ## [4.3.0] - 2015-12-26 ### Added From d3614d3505ea9e83f4f95493d3495b05fdf05b87 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 04:57:04 +0100 Subject: [PATCH 340/350] New strings for translation [skip ci] --- resources/lang/en_US/firefly.php | 7 +++++-- resources/views/reports/category/month.twig | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index fb60f4396c..ec41d10bf2 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -725,8 +725,11 @@ return [ 'expense_per_budget' => 'Expense per budget', 'income_per_account' => 'Income per account', 'expense_per_account' => 'Expense per account', - 'include_not_in_category' => 'Include categories not selected for this report', - 'include_not_in_budget' => 'Include budgets not selected for this report', + 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)', + 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)', + 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)', + 'include_income_not_in_category' => 'Included income not in the selected category(ies)', + 'include_income_not_in_account' => 'Included income not in the selected account(s)', 'everything_else' => 'Everything else', 'income_and_expenses' => 'Income and expenses', 'spent_average' => 'Spent (average)', diff --git a/resources/views/reports/category/month.twig b/resources/views/reports/category/month.twig index b50d8b4aed..4bf6652694 100644 --- a/resources/views/reports/category/month.twig +++ b/resources/views/reports/category/month.twig @@ -133,7 +133,7 @@ From 9f9a055f645af0edc865517396284bcc289ce23b Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 05:02:28 +0100 Subject: [PATCH 341/350] New translations --- resources/lang/es_ES/firefly.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/lang/es_ES/firefly.php b/resources/lang/es_ES/firefly.php index 8b0721902b..d473048255 100644 --- a/resources/lang/es_ES/firefly.php +++ b/resources/lang/es_ES/firefly.php @@ -725,8 +725,11 @@ return [ 'expense_per_budget' => 'Expense per budget', 'income_per_account' => 'Income per account', 'expense_per_account' => 'Expense per account', - 'include_not_in_category' => 'Include categories not selected for this report', - 'include_not_in_budget' => 'Include budgets not selected for this report', + 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)', + 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)', + 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)', + 'include_income_not_in_category' => 'Included income not in the selected category(ies)', + 'include_income_not_in_account' => 'Included income not in the selected account(s)', 'everything_else' => 'Everything else', 'income_and_expenses' => 'Income and expenses', 'spent_average' => 'Spent (average)', From 7cfbcec56e938fcc443334092c31e4ea404a2e4a Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 05:02:52 +0100 Subject: [PATCH 342/350] New translations --- resources/lang/pl_PL/firefly.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 9304d1c340..1d1df742d9 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -725,8 +725,11 @@ return [ 'expense_per_budget' => 'Expense per budget', 'income_per_account' => 'Income per account', 'expense_per_account' => 'Expense per account', - 'include_not_in_category' => 'Include categories not selected for this report', - 'include_not_in_budget' => 'Include budgets not selected for this report', + 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)', + 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)', + 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)', + 'include_income_not_in_category' => 'Included income not in the selected category(ies)', + 'include_income_not_in_account' => 'Included income not in the selected account(s)', 'everything_else' => 'Wszystko inne', 'income_and_expenses' => 'Income and expenses', 'spent_average' => 'Wydano (średnia)', From dbe6edd133035a0eea988cf5ee797c237a894372 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 05:03:09 +0100 Subject: [PATCH 343/350] New translations --- resources/lang/ru_RU/firefly.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/lang/ru_RU/firefly.php b/resources/lang/ru_RU/firefly.php index 8b0721902b..d473048255 100644 --- a/resources/lang/ru_RU/firefly.php +++ b/resources/lang/ru_RU/firefly.php @@ -725,8 +725,11 @@ return [ 'expense_per_budget' => 'Expense per budget', 'income_per_account' => 'Income per account', 'expense_per_account' => 'Expense per account', - 'include_not_in_category' => 'Include categories not selected for this report', - 'include_not_in_budget' => 'Include budgets not selected for this report', + 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)', + 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)', + 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)', + 'include_income_not_in_category' => 'Included income not in the selected category(ies)', + 'include_income_not_in_account' => 'Included income not in the selected account(s)', 'everything_else' => 'Everything else', 'income_and_expenses' => 'Income and expenses', 'spent_average' => 'Spent (average)', From 31789255c9108fd9be25bd24d0b22e84d2c6a21d Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 05:03:19 +0100 Subject: [PATCH 344/350] New translations --- resources/lang/hr_HR/firefly.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/lang/hr_HR/firefly.php b/resources/lang/hr_HR/firefly.php index 8b0721902b..d473048255 100644 --- a/resources/lang/hr_HR/firefly.php +++ b/resources/lang/hr_HR/firefly.php @@ -725,8 +725,11 @@ return [ 'expense_per_budget' => 'Expense per budget', 'income_per_account' => 'Income per account', 'expense_per_account' => 'Expense per account', - 'include_not_in_category' => 'Include categories not selected for this report', - 'include_not_in_budget' => 'Include budgets not selected for this report', + 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)', + 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)', + 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)', + 'include_income_not_in_category' => 'Included income not in the selected category(ies)', + 'include_income_not_in_account' => 'Included income not in the selected account(s)', 'everything_else' => 'Everything else', 'income_and_expenses' => 'Income and expenses', 'spent_average' => 'Spent (average)', From e346ae533d9ac7f909e3bb624eda9150ea999a64 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 05:03:35 +0100 Subject: [PATCH 345/350] New translations --- resources/lang/zh_TW/firefly.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/lang/zh_TW/firefly.php b/resources/lang/zh_TW/firefly.php index 701dfa38ab..a2867f6be1 100644 --- a/resources/lang/zh_TW/firefly.php +++ b/resources/lang/zh_TW/firefly.php @@ -725,8 +725,11 @@ return [ 'expense_per_budget' => 'Expense per budget', 'income_per_account' => 'Income per account', 'expense_per_account' => 'Expense per account', - 'include_not_in_category' => 'Include categories not selected for this report', - 'include_not_in_budget' => 'Include budgets not selected for this report', + 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)', + 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)', + 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)', + 'include_income_not_in_category' => 'Included income not in the selected category(ies)', + 'include_income_not_in_account' => 'Included income not in the selected account(s)', 'everything_else' => 'Everything else', 'income_and_expenses' => 'Income and expenses', 'spent_average' => 'Spent (average)', From adae8e45a9cc76bcc277835d4598ae2fabb1c4a8 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 05:03:42 +0100 Subject: [PATCH 346/350] New translations --- resources/lang/zh_HK/firefly.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/lang/zh_HK/firefly.php b/resources/lang/zh_HK/firefly.php index 8b0721902b..d473048255 100644 --- a/resources/lang/zh_HK/firefly.php +++ b/resources/lang/zh_HK/firefly.php @@ -725,8 +725,11 @@ return [ 'expense_per_budget' => 'Expense per budget', 'income_per_account' => 'Income per account', 'expense_per_account' => 'Expense per account', - 'include_not_in_category' => 'Include categories not selected for this report', - 'include_not_in_budget' => 'Include budgets not selected for this report', + 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)', + 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)', + 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)', + 'include_income_not_in_category' => 'Included income not in the selected category(ies)', + 'include_income_not_in_account' => 'Included income not in the selected account(s)', 'everything_else' => 'Everything else', 'income_and_expenses' => 'Income and expenses', 'spent_average' => 'Spent (average)', From 41a2406f07fa9cd18802db6d4605d1f478eeff43 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 05:03:46 +0100 Subject: [PATCH 347/350] New translations --- resources/lang/fr_FR/firefly.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/lang/fr_FR/firefly.php b/resources/lang/fr_FR/firefly.php index ce69c5715b..bca4877975 100644 --- a/resources/lang/fr_FR/firefly.php +++ b/resources/lang/fr_FR/firefly.php @@ -725,8 +725,11 @@ return [ 'expense_per_budget' => 'Expense per budget', 'income_per_account' => 'Income per account', 'expense_per_account' => 'Expense per account', - 'include_not_in_category' => 'Include categories not selected for this report', - 'include_not_in_budget' => 'Include budgets not selected for this report', + 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)', + 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)', + 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)', + 'include_income_not_in_category' => 'Included income not in the selected category(ies)', + 'include_income_not_in_account' => 'Included income not in the selected account(s)', 'everything_else' => 'Everything else', 'income_and_expenses' => 'Income and expenses', 'spent_average' => 'Spent (average)', From 8617ea760a9ccd770aa8b6f5094157ec2d9cc74e Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 05:03:56 +0100 Subject: [PATCH 348/350] Approved. Step name: Proofread --- resources/lang/nl_NL/firefly.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/lang/nl_NL/firefly.php b/resources/lang/nl_NL/firefly.php index 253b79d20d..a75dc28660 100644 --- a/resources/lang/nl_NL/firefly.php +++ b/resources/lang/nl_NL/firefly.php @@ -725,8 +725,11 @@ return [ 'expense_per_budget' => 'Uitgaven per budget', 'income_per_account' => 'Inkomen per rekening', 'expense_per_account' => 'Uitgaven per rekening', - 'include_not_in_category' => 'Laat ook categoriën zien van buiten dit rapport', - 'include_not_in_budget' => 'Laat ook budgetten zien van buiten dit rapport', + 'include_expense_not_in_budget' => 'Inclusief uitgaven niet in deze budget(ten)', + 'include_expense_not_in_account' => 'Inclusief uitgaven niet vanaf deze rekening(en)', + 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)', + 'include_income_not_in_category' => 'Included income not in the selected category(ies)', + 'include_income_not_in_account' => 'Inclusief inkomsten niet op deze rekening(en)', 'everything_else' => 'De rest', 'income_and_expenses' => 'Inkomsten en uitgaven', 'spent_average' => 'Uitgegeven (gemiddeld)', From c67f1a7b93d9340530882bea231368993841ef94 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 05:04:05 +0100 Subject: [PATCH 349/350] New translations --- resources/lang/de_DE/firefly.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/lang/de_DE/firefly.php b/resources/lang/de_DE/firefly.php index b61460654d..ff45ae0880 100644 --- a/resources/lang/de_DE/firefly.php +++ b/resources/lang/de_DE/firefly.php @@ -726,8 +726,11 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'expense_per_budget' => 'Ausgaben pro Budget', 'income_per_account' => 'Einnahmen pro Konto', 'expense_per_account' => 'Ausgaben pro Konto', - 'include_not_in_category' => 'Kategorien einbeziehen, die nicht für diesen Report ausgewählt wurden', - 'include_not_in_budget' => 'Budgets einbeziehen, die nicht für diesen Report ausgewählt wurden', + 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)', + 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)', + 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)', + 'include_income_not_in_category' => 'Included income not in the selected category(ies)', + 'include_income_not_in_account' => 'Included income not in the selected account(s)', 'everything_else' => 'Der Rest', 'income_and_expenses' => 'Einkommen und Ausgaben', 'spent_average' => 'Ausgaben (Durchschnitt)', From 6ececdad26addce147cd8a035ed564277cbc40b1 Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 4 Jan 2017 05:04:11 +0100 Subject: [PATCH 350/350] New translations --- resources/lang/pt_BR/firefly.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/lang/pt_BR/firefly.php b/resources/lang/pt_BR/firefly.php index 9bde6b9acb..b3003f81f2 100644 --- a/resources/lang/pt_BR/firefly.php +++ b/resources/lang/pt_BR/firefly.php @@ -725,8 +725,11 @@ return [ 'expense_per_budget' => 'Expense per budget', 'income_per_account' => 'Rendimento por conta', 'expense_per_account' => 'Por conta de despesas', - 'include_not_in_category' => 'Include categories not selected for this report', - 'include_not_in_budget' => 'Include budgets not selected for this report', + 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)', + 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)', + 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)', + 'include_income_not_in_category' => 'Included income not in the selected category(ies)', + 'include_income_not_in_account' => 'Included income not in the selected account(s)', 'everything_else' => 'Todo o resto', 'income_and_expenses' => 'Receitas e despesas', 'spent_average' => 'Gastos (média)',
 {{ 'piggy_bank'|_ }}{{ 'saved_so_far'|_ }} {{ 'target_amount'|_ }}{{ 'left_to_save'|_ }}
{{ piggyBank.name }} - {{ piggyBank.savedSoFar|formatAmountPlain }} + + {{ piggyBank.savedSoFar|formatAmount }}
{{ 'account'|_ }}{{ 'left_for_piggy_banks'|_ }}{{ 'left_for_piggy_banks'|_ }}
{{ info.name }}{{ info.leftForPiggyBanks|formatAmount }}{{ info.leftForPiggyBanks|formatAmount }}