Merge branch 'develop' into issues/509

# Conflicts:
#	public/js/ff/transactions/list.js
This commit is contained in:
Victor Mosin
2017-12-30 11:49:42 +01:00
192 changed files with 2979 additions and 3011 deletions

View File

@@ -1,5 +1,24 @@
# 4.6.1.1
# 4.6.12
- Support for Indonesian.
- New report, see [issue 384](https://github.com/firefly-iii/firefly-iii/issues/384)
- [Issue 964](https://github.com/firefly-iii/firefly-iii/issues/964) as suggested by [gavu](https://github.com/gavu)
- Greatly improved Docker support and documentation.
- [Issue 1046](https://github.com/firefly-iii/firefly-iii/issues/1046), as reported by [pkoziol](https://github.com/pkoziol)
- [Issue 1047](https://github.com/firefly-iii/firefly-iii/issues/1047), as reported by [pkoziol](https://github.com/pkoziol)
- [Issue 1048](https://github.com/firefly-iii/firefly-iii/issues/1048), as reported by [webence](https://github.com/webence)
- [Issue 1049](https://github.com/firefly-iii/firefly-iii/issues/1049), as reported by [nicoschreiner](https://github.com/nicoschreiner)
- [Issue 1015](https://github.com/firefly-iii/firefly-iii/issues/1015), as reporterd by a user on Tweakers.net
- [Issue 1056](https://github.com/firefly-iii/firefly-iii/issues/1056), as reported by [repercussion](https://github.com/repercussion)
- [Issue 1061](https://github.com/firefly-iii/firefly-iii/issues/1061), as reported by [Meizikyn](https://github.com/Meizikyn)
- [Issue 1045](https://github.com/firefly-iii/firefly-iii/issues/1045), as reported by [gavu](https://github.com/gavu)
- First code for [issue 1040](https://github.com/firefly-iii/firefly-iii/issues/1040) ([simonsmiley](https://github.com/simonsmiley))
- [Issue 1059](https://github.com/firefly-iii/firefly-iii/issues/1059), as reported by [4oo4](https://github.com/4oo4)
- [Issue 1063](https://github.com/firefly-iii/firefly-iii/issues/1063), as reported by [pkoziol](https://github.com/pkoziol)
- [Issue 1064](https://github.com/firefly-iii/firefly-iii/issues/1064), as reported by [pkoziol](https://github.com/pkoziol)
- [Issue 1066](https://github.com/firefly-iii/firefly-iii/issues/1066), reported by [wtercato](https://github.com/wtercato)
# 4.6.1.1
- Import routine can scan for matching bills, [issue 956](https://github.com/firefly-iii/firefly-iii/issues/956) - Import routine can scan for matching bills, [issue 956](https://github.com/firefly-iii/firefly-iii/issues/956)
- Import will no longer scan for rules, this has become optional. Originally suggested in [issue 956](https://github.com/firefly-iii/firefly-iii/issues/956) by [gavu](https://github.com/gavu) - Import will no longer scan for rules, this has become optional. Originally suggested in [issue 956](https://github.com/firefly-iii/firefly-iii/issues/956) by [gavu](https://github.com/gavu)
- [Issue 1033](https://github.com/firefly-iii/firefly-iii/issues/1033), as reported by [Jumanjii](https://github.com/Jumanjii) - [Issue 1033](https://github.com/firefly-iii/firefly-iii/issues/1033), as reported by [Jumanjii](https://github.com/Jumanjii)

View File

@@ -208,14 +208,6 @@ opt/app/.env.heroku
opt/app/.env.sandstorm opt/app/.env.sandstorm
opt/app/.gitattributes opt/app/.gitattributes
opt/app/.sandstorm/.gitattributes opt/app/.sandstorm/.gitattributes
opt/app/.sandstorm/.vagrant/machines/default/virtualbox/action_provision
opt/app/.sandstorm/.vagrant/machines/default/virtualbox/action_set_name
opt/app/.sandstorm/.vagrant/machines/default/virtualbox/creator_uid
opt/app/.sandstorm/.vagrant/machines/default/virtualbox/id
opt/app/.sandstorm/.vagrant/machines/default/virtualbox/index_uuid
opt/app/.sandstorm/.vagrant/machines/default/virtualbox/private_key
opt/app/.sandstorm/.vagrant/machines/default/virtualbox/synced_folders
opt/app/.sandstorm/.vagrant/machines/default/virtualbox/vagrant_cwd
opt/app/.sandstorm/Vagrantfile opt/app/.sandstorm/Vagrantfile
opt/app/.sandstorm/app-graphics/firefly-iii-128.png opt/app/.sandstorm/app-graphics/firefly-iii-128.png
opt/app/.sandstorm/app-graphics/firefly-iii-150.png opt/app/.sandstorm/app-graphics/firefly-iii-150.png
@@ -260,6 +252,7 @@ opt/app/app/Events/AdminRequestedTestMessage.php
opt/app/app/Events/Event.php opt/app/app/Events/Event.php
opt/app/app/Events/RegisteredUser.php opt/app/app/Events/RegisteredUser.php
opt/app/app/Events/RequestedNewPassword.php opt/app/app/Events/RequestedNewPassword.php
opt/app/app/Events/RequestedVersionCheckStatus.php
opt/app/app/Events/StoredTransactionJournal.php opt/app/app/Events/StoredTransactionJournal.php
opt/app/app/Events/UpdatedTransactionJournal.php opt/app/app/Events/UpdatedTransactionJournal.php
opt/app/app/Events/UserChangedEmail.php opt/app/app/Events/UserChangedEmail.php
@@ -279,6 +272,9 @@ opt/app/app/Export/Exporter/ExporterInterface.php
opt/app/app/Export/ProcessorInterface.php opt/app/app/Export/ProcessorInterface.php
opt/app/app/Generator/Chart/Basic/ChartJsGenerator.php opt/app/app/Generator/Chart/Basic/ChartJsGenerator.php
opt/app/app/Generator/Chart/Basic/GeneratorInterface.php opt/app/app/Generator/Chart/Basic/GeneratorInterface.php
opt/app/app/Generator/Report/Account/MonthReportGenerator.php
opt/app/app/Generator/Report/Account/MultiYearReportGenerator.php
opt/app/app/Generator/Report/Account/YearReportGenerator.php
opt/app/app/Generator/Report/Audit/MonthReportGenerator.php opt/app/app/Generator/Report/Audit/MonthReportGenerator.php
opt/app/app/Generator/Report/Audit/MultiYearReportGenerator.php opt/app/app/Generator/Report/Audit/MultiYearReportGenerator.php
opt/app/app/Generator/Report/Audit/YearReportGenerator.php opt/app/app/Generator/Report/Audit/YearReportGenerator.php
@@ -301,6 +297,7 @@ opt/app/app/Handlers/Events/AdminEventHandler.php
opt/app/app/Handlers/Events/StoredJournalEventHandler.php opt/app/app/Handlers/Events/StoredJournalEventHandler.php
opt/app/app/Handlers/Events/UpdatedJournalEventHandler.php opt/app/app/Handlers/Events/UpdatedJournalEventHandler.php
opt/app/app/Handlers/Events/UserEventHandler.php opt/app/app/Handlers/Events/UserEventHandler.php
opt/app/app/Handlers/Events/VersionCheckEventHandler.php
opt/app/app/Helpers/Attachments/AttachmentHelper.php opt/app/app/Helpers/Attachments/AttachmentHelper.php
opt/app/app/Helpers/Attachments/AttachmentHelperInterface.php opt/app/app/Helpers/Attachments/AttachmentHelperInterface.php
opt/app/app/Helpers/Chart/MetaPieChart.php opt/app/app/Helpers/Chart/MetaPieChart.php
@@ -339,6 +336,7 @@ opt/app/app/Http/Controllers/AccountController.php
opt/app/app/Http/Controllers/Admin/ConfigurationController.php opt/app/app/Http/Controllers/Admin/ConfigurationController.php
opt/app/app/Http/Controllers/Admin/HomeController.php opt/app/app/Http/Controllers/Admin/HomeController.php
opt/app/app/Http/Controllers/Admin/LinkController.php opt/app/app/Http/Controllers/Admin/LinkController.php
opt/app/app/Http/Controllers/Admin/UpdateController.php
opt/app/app/Http/Controllers/Admin/UserController.php opt/app/app/Http/Controllers/Admin/UserController.php
opt/app/app/Http/Controllers/AttachmentController.php opt/app/app/Http/Controllers/AttachmentController.php
opt/app/app/Http/Controllers/Auth/ForgotPasswordController.php opt/app/app/Http/Controllers/Auth/ForgotPasswordController.php
@@ -355,6 +353,7 @@ opt/app/app/Http/Controllers/Chart/BudgetController.php
opt/app/app/Http/Controllers/Chart/BudgetReportController.php opt/app/app/Http/Controllers/Chart/BudgetReportController.php
opt/app/app/Http/Controllers/Chart/CategoryController.php opt/app/app/Http/Controllers/Chart/CategoryController.php
opt/app/app/Http/Controllers/Chart/CategoryReportController.php opt/app/app/Http/Controllers/Chart/CategoryReportController.php
opt/app/app/Http/Controllers/Chart/ExpenseReportController.php
opt/app/app/Http/Controllers/Chart/PiggyBankController.php opt/app/app/Http/Controllers/Chart/PiggyBankController.php
opt/app/app/Http/Controllers/Chart/ReportController.php opt/app/app/Http/Controllers/Chart/ReportController.php
opt/app/app/Http/Controllers/Chart/TagReportController.php opt/app/app/Http/Controllers/Chart/TagReportController.php
@@ -363,9 +362,10 @@ opt/app/app/Http/Controllers/CurrencyController.php
opt/app/app/Http/Controllers/ExportController.php opt/app/app/Http/Controllers/ExportController.php
opt/app/app/Http/Controllers/HelpController.php opt/app/app/Http/Controllers/HelpController.php
opt/app/app/Http/Controllers/HomeController.php opt/app/app/Http/Controllers/HomeController.php
opt/app/app/Http/Controllers/Import/BankController.php opt/app/app/Http/Controllers/Import/ConfigurationController.php
opt/app/app/Http/Controllers/Import/FileController.php opt/app/app/Http/Controllers/Import/IndexController.php
opt/app/app/Http/Controllers/ImportController.php opt/app/app/Http/Controllers/Import/PrerequisitesController.php
opt/app/app/Http/Controllers/Import/StatusController.php
opt/app/app/Http/Controllers/JavascriptController.php opt/app/app/Http/Controllers/JavascriptController.php
opt/app/app/Http/Controllers/Json/AutoCompleteController.php opt/app/app/Http/Controllers/Json/AutoCompleteController.php
opt/app/app/Http/Controllers/Json/BoxController.php opt/app/app/Http/Controllers/Json/BoxController.php
@@ -382,6 +382,7 @@ opt/app/app/Http/Controllers/Report/AccountController.php
opt/app/app/Http/Controllers/Report/BalanceController.php opt/app/app/Http/Controllers/Report/BalanceController.php
opt/app/app/Http/Controllers/Report/BudgetController.php opt/app/app/Http/Controllers/Report/BudgetController.php
opt/app/app/Http/Controllers/Report/CategoryController.php opt/app/app/Http/Controllers/Report/CategoryController.php
opt/app/app/Http/Controllers/Report/ExpenseController.php
opt/app/app/Http/Controllers/Report/OperationsController.php opt/app/app/Http/Controllers/Report/OperationsController.php
opt/app/app/Http/Controllers/ReportController.php opt/app/app/Http/Controllers/ReportController.php
opt/app/app/Http/Controllers/RuleController.php opt/app/app/Http/Controllers/RuleController.php
@@ -400,7 +401,8 @@ opt/app/app/Http/Middleware/AuthenticateTwoFactor.php
opt/app/app/Http/Middleware/Binder.php opt/app/app/Http/Middleware/Binder.php
opt/app/app/Http/Middleware/EncryptCookies.php opt/app/app/Http/Middleware/EncryptCookies.php
opt/app/app/Http/Middleware/IsAdmin.php opt/app/app/Http/Middleware/IsAdmin.php
opt/app/app/Http/Middleware/IsLimitedUser.php opt/app/app/Http/Middleware/IsDemoUser.php
opt/app/app/Http/Middleware/IsSandStormUser.php
opt/app/app/Http/Middleware/Range.php opt/app/app/Http/Middleware/Range.php
opt/app/app/Http/Middleware/RedirectIfAuthenticated.php opt/app/app/Http/Middleware/RedirectIfAuthenticated.php
opt/app/app/Http/Middleware/RedirectIfTwoFactorAuthenticated.php opt/app/app/Http/Middleware/RedirectIfTwoFactorAuthenticated.php
@@ -420,7 +422,6 @@ opt/app/app/Http/Requests/CurrencyFormRequest.php
opt/app/app/Http/Requests/DeleteAccountFormRequest.php opt/app/app/Http/Requests/DeleteAccountFormRequest.php
opt/app/app/Http/Requests/EmailFormRequest.php opt/app/app/Http/Requests/EmailFormRequest.php
opt/app/app/Http/Requests/ExportFormRequest.php opt/app/app/Http/Requests/ExportFormRequest.php
opt/app/app/Http/Requests/ImportUploadRequest.php
opt/app/app/Http/Requests/JournalFormRequest.php opt/app/app/Http/Requests/JournalFormRequest.php
opt/app/app/Http/Requests/JournalLinkRequest.php opt/app/app/Http/Requests/JournalLinkRequest.php
opt/app/app/Http/Requests/LinkTypeFormRequest.php opt/app/app/Http/Requests/LinkTypeFormRequest.php
@@ -441,15 +442,15 @@ opt/app/app/Http/Requests/TestRuleFormRequest.php
opt/app/app/Http/Requests/TokenFormRequest.php opt/app/app/Http/Requests/TokenFormRequest.php
opt/app/app/Http/Requests/UserFormRequest.php opt/app/app/Http/Requests/UserFormRequest.php
opt/app/app/Http/Requests/UserRegistrationRequest.php opt/app/app/Http/Requests/UserRegistrationRequest.php
opt/app/app/Http/breadcrumbs.php opt/app/app/Import/Configuration/ConfiguratorInterface.php
opt/app/app/Import/Configurator/ConfiguratorInterface.php opt/app/app/Import/Configuration/FileConfigurator.php
opt/app/app/Import/Configurator/CsvConfigurator.php opt/app/app/Import/Configuration/SpectreConfigurator.php
opt/app/app/Import/Converter/Amount.php opt/app/app/Import/Converter/Amount.php
opt/app/app/Import/Converter/AmountCredit.php opt/app/app/Import/Converter/AmountCredit.php
opt/app/app/Import/Converter/AmountDebet.php opt/app/app/Import/Converter/AmountDebit.php
opt/app/app/Import/Converter/ConverterInterface.php opt/app/app/Import/Converter/ConverterInterface.php
opt/app/app/Import/Converter/INGDebetCredit.php opt/app/app/Import/Converter/INGDebitCredit.php
opt/app/app/Import/Converter/RabobankDebetCredit.php opt/app/app/Import/Converter/RabobankDebitCredit.php
opt/app/app/Import/FileProcessor/CsvProcessor.php opt/app/app/Import/FileProcessor/CsvProcessor.php
opt/app/app/Import/FileProcessor/FileProcessorInterface.php opt/app/app/Import/FileProcessor/FileProcessorInterface.php
opt/app/app/Import/Logging/CommandHandler.php opt/app/app/Import/Logging/CommandHandler.php
@@ -472,7 +473,13 @@ opt/app/app/Import/Object/ImportBudget.php
opt/app/app/Import/Object/ImportCategory.php opt/app/app/Import/Object/ImportCategory.php
opt/app/app/Import/Object/ImportCurrency.php opt/app/app/Import/Object/ImportCurrency.php
opt/app/app/Import/Object/ImportJournal.php opt/app/app/Import/Object/ImportJournal.php
opt/app/app/Import/Routine/ImportRoutine.php opt/app/app/Import/Prerequisites/BunqPrerequisites.php
opt/app/app/Import/Prerequisites/FilePrerequisites.php
opt/app/app/Import/Prerequisites/PrerequisitesInterface.php
opt/app/app/Import/Prerequisites/SpectrePrerequisites.php
opt/app/app/Import/Routine/FileRoutine.php
opt/app/app/Import/Routine/RoutineInterface.php
opt/app/app/Import/Routine/SpectreRoutine.php
opt/app/app/Import/Specifics/AbnAmroDescription.php opt/app/app/Import/Specifics/AbnAmroDescription.php
opt/app/app/Import/Specifics/IngDescription.php opt/app/app/Import/Specifics/IngDescription.php
opt/app/app/Import/Specifics/PresidentsChoice.php opt/app/app/Import/Specifics/PresidentsChoice.php
@@ -612,8 +619,18 @@ opt/app/app/Services/Bunq/Token/InstallationToken.php
opt/app/app/Services/Bunq/Token/SessionToken.php opt/app/app/Services/Bunq/Token/SessionToken.php
opt/app/app/Services/Currency/ExchangeRateInterface.php opt/app/app/Services/Currency/ExchangeRateInterface.php
opt/app/app/Services/Currency/FixerIO.php opt/app/app/Services/Currency/FixerIO.php
opt/app/app/Services/Github/Object/GithubObject.php
opt/app/app/Services/Github/Object/Release.php
opt/app/app/Services/Github/Request/GithubRequest.php
opt/app/app/Services/Github/Request/UpdateRequest.php
opt/app/app/Services/Password/PwndVerifier.php opt/app/app/Services/Password/PwndVerifier.php
opt/app/app/Services/Password/Verifier.php opt/app/app/Services/Password/Verifier.php
opt/app/app/Services/Spectre/Object/Customer.php
opt/app/app/Services/Spectre/Object/SpectreObject.php
opt/app/app/Services/Spectre/Object/Token.php
opt/app/app/Services/Spectre/Request/CreateTokenRequest.php
opt/app/app/Services/Spectre/Request/NewCustomerRequest.php
opt/app/app/Services/Spectre/Request/SpectreRequest.php
opt/app/app/Support/Amount.php opt/app/app/Support/Amount.php
opt/app/app/Support/Binder/AccountList.php opt/app/app/Support/Binder/AccountList.php
opt/app/app/Support/Binder/BinderInterface.php opt/app/app/Support/Binder/BinderInterface.php
@@ -637,13 +654,12 @@ opt/app/app/Support/Facades/Preferences.php
opt/app/app/Support/Facades/Steam.php opt/app/app/Support/Facades/Steam.php
opt/app/app/Support/FireflyConfig.php opt/app/app/Support/FireflyConfig.php
opt/app/app/Support/Import/Configuration/ConfigurationInterface.php opt/app/app/Support/Import/Configuration/ConfigurationInterface.php
opt/app/app/Support/Import/Configuration/Csv/Initial.php opt/app/app/Support/Import/Configuration/File/Initial.php
opt/app/app/Support/Import/Configuration/Csv/Map.php opt/app/app/Support/Import/Configuration/File/Map.php
opt/app/app/Support/Import/Configuration/Csv/Roles.php opt/app/app/Support/Import/Configuration/File/Roles.php
opt/app/app/Support/Import/Configuration/File/Upload.php
opt/app/app/Support/Import/Information/BunqInformation.php opt/app/app/Support/Import/Information/BunqInformation.php
opt/app/app/Support/Import/Information/InformationInterface.php opt/app/app/Support/Import/Information/InformationInterface.php
opt/app/app/Support/Import/Prerequisites/BunqPrerequisites.php
opt/app/app/Support/Import/Prerequisites/PrerequisitesInterface.php
opt/app/app/Support/Models/TransactionJournalTrait.php opt/app/app/Support/Models/TransactionJournalTrait.php
opt/app/app/Support/Navigation.php opt/app/app/Support/Navigation.php
opt/app/app/Support/Preferences.php opt/app/app/Support/Preferences.php
@@ -730,12 +746,15 @@ opt/app/composer.lock
opt/app/composer.phar opt/app/composer.phar
opt/app/config/app.php opt/app/config/app.php
opt/app/config/auth.php opt/app/config/auth.php
opt/app/config/breadcrumbs.php
opt/app/config/broadcasting.php opt/app/config/broadcasting.php
opt/app/config/cache.php opt/app/config/cache.php
opt/app/config/csv.php opt/app/config/csv.php
opt/app/config/database.php opt/app/config/database.php
opt/app/config/filesystems.php opt/app/config/filesystems.php
opt/app/config/firefly.php opt/app/config/firefly.php
opt/app/config/google2fa.php
opt/app/config/import.php
opt/app/config/intro.php opt/app/config/intro.php
opt/app/config/mail.php opt/app/config/mail.php
opt/app/config/queue.php opt/app/config/queue.php
@@ -766,9 +785,6 @@ opt/app/database/seeds/LinkTypeSeeder.php
opt/app/database/seeds/PermissionSeeder.php opt/app/database/seeds/PermissionSeeder.php
opt/app/database/seeds/TransactionCurrencySeeder.php opt/app/database/seeds/TransactionCurrencySeeder.php
opt/app/database/seeds/TransactionTypeSeeder.php opt/app/database/seeds/TransactionTypeSeeder.php
opt/app/docker-compose.dockerhub.yml
opt/app/docker-compose.override.yml
opt/app/docker-compose.prod.yml
opt/app/docker-compose.yml opt/app/docker-compose.yml
opt/app/nginx_app.conf opt/app/nginx_app.conf
opt/app/phpunit.coverage.xml opt/app/phpunit.coverage.xml
@@ -850,6 +866,10 @@ opt/app/public/images/image.png
opt/app/public/images/loading-small.gif opt/app/public/images/loading-small.gif
opt/app/public/images/loading-wide.gif opt/app/public/images/loading-wide.gif
opt/app/public/images/logos/bunq.png opt/app/public/images/logos/bunq.png
opt/app/public/images/logos/csv.png
opt/app/public/images/logos/file.png
opt/app/public/images/logos/plaid.png
opt/app/public/images/logos/spectre.png
opt/app/public/images/page_green.png opt/app/public/images/page_green.png
opt/app/public/images/page_white_acrobat.png opt/app/public/images/page_white_acrobat.png
opt/app/public/index.php opt/app/public/index.php
@@ -858,6 +878,7 @@ opt/app/public/js/ff/accounts/edit-reconciliation.js
opt/app/public/js/ff/accounts/edit.js opt/app/public/js/ff/accounts/edit.js
opt/app/public/js/ff/accounts/reconcile.js opt/app/public/js/ff/accounts/reconcile.js
opt/app/public/js/ff/accounts/show.js opt/app/public/js/ff/accounts/show.js
opt/app/public/js/ff/admin/update/index.js
opt/app/public/js/ff/bills/create.js opt/app/public/js/ff/bills/create.js
opt/app/public/js/ff/bills/edit.js opt/app/public/js/ff/bills/edit.js
opt/app/public/js/ff/bills/show.js opt/app/public/js/ff/bills/show.js
@@ -880,17 +901,16 @@ opt/app/public/js/ff/piggy-banks/edit.js
opt/app/public/js/ff/piggy-banks/index.js opt/app/public/js/ff/piggy-banks/index.js
opt/app/public/js/ff/piggy-banks/show.js opt/app/public/js/ff/piggy-banks/show.js
opt/app/public/js/ff/preferences/index.js opt/app/public/js/ff/preferences/index.js
opt/app/public/js/ff/reports/account/month.js
opt/app/public/js/ff/reports/all.js
opt/app/public/js/ff/reports/audit/all.js opt/app/public/js/ff/reports/audit/all.js
opt/app/public/js/ff/reports/budget/all.js
opt/app/public/js/ff/reports/budget/month.js opt/app/public/js/ff/reports/budget/month.js
opt/app/public/js/ff/reports/category/all.js
opt/app/public/js/ff/reports/category/month.js opt/app/public/js/ff/reports/category/month.js
opt/app/public/js/ff/reports/default/all.js opt/app/public/js/ff/reports/default/all.js
opt/app/public/js/ff/reports/default/month.js opt/app/public/js/ff/reports/default/month.js
opt/app/public/js/ff/reports/default/multi-year.js opt/app/public/js/ff/reports/default/multi-year.js
opt/app/public/js/ff/reports/default/year.js opt/app/public/js/ff/reports/default/year.js
opt/app/public/js/ff/reports/index.js opt/app/public/js/ff/reports/index.js
opt/app/public/js/ff/reports/tag/all.js
opt/app/public/js/ff/reports/tag/month.js opt/app/public/js/ff/reports/tag/month.js
opt/app/public/js/ff/rules/create-edit.js opt/app/public/js/ff/rules/create-edit.js
opt/app/public/js/ff/rules/index.js opt/app/public/js/ff/rules/index.js
@@ -975,6 +995,7 @@ opt/app/resources/lang/de_DE/demo.php
opt/app/resources/lang/de_DE/firefly.php opt/app/resources/lang/de_DE/firefly.php
opt/app/resources/lang/de_DE/form.php opt/app/resources/lang/de_DE/form.php
opt/app/resources/lang/de_DE/help.php opt/app/resources/lang/de_DE/help.php
opt/app/resources/lang/de_DE/import.php
opt/app/resources/lang/de_DE/intro.php opt/app/resources/lang/de_DE/intro.php
opt/app/resources/lang/de_DE/list.php opt/app/resources/lang/de_DE/list.php
opt/app/resources/lang/de_DE/pagination.php opt/app/resources/lang/de_DE/pagination.php
@@ -988,6 +1009,7 @@ opt/app/resources/lang/en_US/csv.php
opt/app/resources/lang/en_US/demo.php opt/app/resources/lang/en_US/demo.php
opt/app/resources/lang/en_US/firefly.php opt/app/resources/lang/en_US/firefly.php
opt/app/resources/lang/en_US/form.php opt/app/resources/lang/en_US/form.php
opt/app/resources/lang/en_US/import.php
opt/app/resources/lang/en_US/intro.php opt/app/resources/lang/en_US/intro.php
opt/app/resources/lang/en_US/list.php opt/app/resources/lang/en_US/list.php
opt/app/resources/lang/en_US/pagination.php opt/app/resources/lang/en_US/pagination.php
@@ -1002,11 +1024,26 @@ opt/app/resources/lang/fr_FR/demo.php
opt/app/resources/lang/fr_FR/firefly.php opt/app/resources/lang/fr_FR/firefly.php
opt/app/resources/lang/fr_FR/form.php opt/app/resources/lang/fr_FR/form.php
opt/app/resources/lang/fr_FR/help.php opt/app/resources/lang/fr_FR/help.php
opt/app/resources/lang/fr_FR/import.php
opt/app/resources/lang/fr_FR/intro.php opt/app/resources/lang/fr_FR/intro.php
opt/app/resources/lang/fr_FR/list.php opt/app/resources/lang/fr_FR/list.php
opt/app/resources/lang/fr_FR/pagination.php opt/app/resources/lang/fr_FR/pagination.php
opt/app/resources/lang/fr_FR/passwords.php opt/app/resources/lang/fr_FR/passwords.php
opt/app/resources/lang/fr_FR/validation.php opt/app/resources/lang/fr_FR/validation.php
opt/app/resources/lang/id_ID/auth.php
opt/app/resources/lang/id_ID/bank.php
opt/app/resources/lang/id_ID/breadcrumbs.php
opt/app/resources/lang/id_ID/config.php
opt/app/resources/lang/id_ID/csv.php
opt/app/resources/lang/id_ID/demo.php
opt/app/resources/lang/id_ID/firefly.php
opt/app/resources/lang/id_ID/form.php
opt/app/resources/lang/id_ID/import.php
opt/app/resources/lang/id_ID/intro.php
opt/app/resources/lang/id_ID/list.php
opt/app/resources/lang/id_ID/pagination.php
opt/app/resources/lang/id_ID/passwords.php
opt/app/resources/lang/id_ID/validation.php
opt/app/resources/lang/nl_NL/auth.php opt/app/resources/lang/nl_NL/auth.php
opt/app/resources/lang/nl_NL/bank.php opt/app/resources/lang/nl_NL/bank.php
opt/app/resources/lang/nl_NL/breadcrumbs.php opt/app/resources/lang/nl_NL/breadcrumbs.php
@@ -1016,6 +1053,7 @@ opt/app/resources/lang/nl_NL/demo.php
opt/app/resources/lang/nl_NL/firefly.php opt/app/resources/lang/nl_NL/firefly.php
opt/app/resources/lang/nl_NL/form.php opt/app/resources/lang/nl_NL/form.php
opt/app/resources/lang/nl_NL/help.php opt/app/resources/lang/nl_NL/help.php
opt/app/resources/lang/nl_NL/import.php
opt/app/resources/lang/nl_NL/intro.php opt/app/resources/lang/nl_NL/intro.php
opt/app/resources/lang/nl_NL/list.php opt/app/resources/lang/nl_NL/list.php
opt/app/resources/lang/nl_NL/pagination.php opt/app/resources/lang/nl_NL/pagination.php
@@ -1030,6 +1068,7 @@ opt/app/resources/lang/pl_PL/demo.php
opt/app/resources/lang/pl_PL/firefly.php opt/app/resources/lang/pl_PL/firefly.php
opt/app/resources/lang/pl_PL/form.php opt/app/resources/lang/pl_PL/form.php
opt/app/resources/lang/pl_PL/help.php opt/app/resources/lang/pl_PL/help.php
opt/app/resources/lang/pl_PL/import.php
opt/app/resources/lang/pl_PL/intro.php opt/app/resources/lang/pl_PL/intro.php
opt/app/resources/lang/pl_PL/list.php opt/app/resources/lang/pl_PL/list.php
opt/app/resources/lang/pl_PL/pagination.php opt/app/resources/lang/pl_PL/pagination.php
@@ -1057,6 +1096,7 @@ opt/app/resources/views/admin/link/delete.twig
opt/app/resources/views/admin/link/edit.twig opt/app/resources/views/admin/link/edit.twig
opt/app/resources/views/admin/link/index.twig opt/app/resources/views/admin/link/index.twig
opt/app/resources/views/admin/link/show.twig opt/app/resources/views/admin/link/show.twig
opt/app/resources/views/admin/update/index.twig
opt/app/resources/views/admin/users/delete.twig opt/app/resources/views/admin/users/delete.twig
opt/app/resources/views/admin/users/edit.twig opt/app/resources/views/admin/users/edit.twig
opt/app/resources/views/admin/users/index.twig opt/app/resources/views/admin/users/index.twig
@@ -1151,13 +1191,17 @@ opt/app/resources/views/form/text.twig
opt/app/resources/views/form/textarea.twig opt/app/resources/views/form/textarea.twig
opt/app/resources/views/import/bank/form.twig opt/app/resources/views/import/bank/form.twig
opt/app/resources/views/import/bunq/prerequisites.twig opt/app/resources/views/import/bunq/prerequisites.twig
opt/app/resources/views/import/csv/initial.twig opt/app/resources/views/import/file/initial.twig
opt/app/resources/views/import/csv/map.twig opt/app/resources/views/import/file/map.twig
opt/app/resources/views/import/csv/roles.twig opt/app/resources/views/import/file/roles.twig
opt/app/resources/views/import/file/finished.twig opt/app/resources/views/import/file/upload.twig
opt/app/resources/views/import/file/index.twig
opt/app/resources/views/import/file/status.twig
opt/app/resources/views/import/index.twig opt/app/resources/views/import/index.twig
opt/app/resources/views/import/spectre/input-fields.twig
opt/app/resources/views/import/spectre/prerequisites.twig
opt/app/resources/views/import/spectre/redirect.twig
opt/app/resources/views/import/spectre/select-country.twig
opt/app/resources/views/import/spectre/select-provider.twig
opt/app/resources/views/import/status.twig
opt/app/resources/views/index.twig opt/app/resources/views/index.twig
opt/app/resources/views/javascript/accounts.twig opt/app/resources/views/javascript/accounts.twig
opt/app/resources/views/javascript/currencies.twig opt/app/resources/views/javascript/currencies.twig
@@ -1204,6 +1248,7 @@ opt/app/resources/views/profile/change-email.twig
opt/app/resources/views/profile/change-password.twig opt/app/resources/views/profile/change-password.twig
opt/app/resources/views/profile/delete-account.twig opt/app/resources/views/profile/delete-account.twig
opt/app/resources/views/profile/index.twig opt/app/resources/views/profile/index.twig
opt/app/resources/views/reports/account/report.twig
opt/app/resources/views/reports/audit/report.twig opt/app/resources/views/reports/audit/report.twig
opt/app/resources/views/reports/budget/month.twig opt/app/resources/views/reports/budget/month.twig
opt/app/resources/views/reports/category/month.twig opt/app/resources/views/reports/category/month.twig
@@ -1211,6 +1256,7 @@ opt/app/resources/views/reports/default/month.twig
opt/app/resources/views/reports/default/multi-year.twig opt/app/resources/views/reports/default/multi-year.twig
opt/app/resources/views/reports/default/year.twig opt/app/resources/views/reports/default/year.twig
opt/app/resources/views/reports/index.twig opt/app/resources/views/reports/index.twig
opt/app/resources/views/reports/options/account.twig
opt/app/resources/views/reports/options/budget.twig opt/app/resources/views/reports/options/budget.twig
opt/app/resources/views/reports/options/category.twig opt/app/resources/views/reports/options/category.twig
opt/app/resources/views/reports/options/no-options.twig opt/app/resources/views/reports/options/no-options.twig
@@ -1222,10 +1268,14 @@ opt/app/resources/views/reports/partials/budget-period.twig
opt/app/resources/views/reports/partials/budgets.twig opt/app/resources/views/reports/partials/budgets.twig
opt/app/resources/views/reports/partials/categories.twig opt/app/resources/views/reports/partials/categories.twig
opt/app/resources/views/reports/partials/category-period.twig opt/app/resources/views/reports/partials/category-period.twig
opt/app/resources/views/reports/partials/exp-budgets.twig
opt/app/resources/views/reports/partials/exp-categories.twig
opt/app/resources/views/reports/partials/exp-not-grouped.twig
opt/app/resources/views/reports/partials/income-expenses.twig opt/app/resources/views/reports/partials/income-expenses.twig
opt/app/resources/views/reports/partials/journals-audit.twig opt/app/resources/views/reports/partials/journals-audit.twig
opt/app/resources/views/reports/partials/operations.twig opt/app/resources/views/reports/partials/operations.twig
opt/app/resources/views/reports/partials/tags.twig opt/app/resources/views/reports/partials/tags.twig
opt/app/resources/views/reports/partials/top-transactions.twig
opt/app/resources/views/reports/tag/month.twig opt/app/resources/views/reports/tag/month.twig
opt/app/resources/views/rules/index.twig opt/app/resources/views/rules/index.twig
opt/app/resources/views/rules/partials/action.twig opt/app/resources/views/rules/partials/action.twig
@@ -1246,6 +1296,7 @@ opt/app/resources/views/tags/delete.twig
opt/app/resources/views/tags/edit.twig opt/app/resources/views/tags/edit.twig
opt/app/resources/views/tags/index.twig opt/app/resources/views/tags/index.twig
opt/app/resources/views/tags/show.twig opt/app/resources/views/tags/show.twig
opt/app/resources/views/test/test.twig
opt/app/resources/views/transactions/convert.twig opt/app/resources/views/transactions/convert.twig
opt/app/resources/views/transactions/index.twig opt/app/resources/views/transactions/index.twig
opt/app/resources/views/transactions/links/delete.twig opt/app/resources/views/transactions/links/delete.twig
@@ -1257,6 +1308,7 @@ opt/app/resources/views/transactions/single/delete.twig
opt/app/resources/views/transactions/single/edit.twig opt/app/resources/views/transactions/single/edit.twig
opt/app/resources/views/transactions/split/edit.twig opt/app/resources/views/transactions/split/edit.twig
opt/app/routes/api.php opt/app/routes/api.php
opt/app/routes/breadcrumbs.php
opt/app/routes/channels.php opt/app/routes/channels.php
opt/app/routes/console.php opt/app/routes/console.php
opt/app/routes/web.php opt/app/routes/web.php
@@ -1325,14 +1377,6 @@ opt/app/vendor/bacon/bacon-qr-code/tests/BaconQrCode/Renderer/Text/TextTest.php
opt/app/vendor/bacon/bacon-qr-code/tests/bootstrap.php opt/app/vendor/bacon/bacon-qr-code/tests/bootstrap.php
opt/app/vendor/bin/commonmark opt/app/vendor/bin/commonmark
opt/app/vendor/bin/doctrine-dbal opt/app/vendor/bin/doctrine-dbal
opt/app/vendor/christian-riesen/base32/LICENSE
opt/app/vendor/christian-riesen/base32/README.md
opt/app/vendor/christian-riesen/base32/build.xml
opt/app/vendor/christian-riesen/base32/composer.json
opt/app/vendor/christian-riesen/base32/phpunit.xml.dist
opt/app/vendor/christian-riesen/base32/src/Base32.php
opt/app/vendor/christian-riesen/base32/tests/Base32Test.php
opt/app/vendor/christian-riesen/base32/tests/bootstrap.php
opt/app/vendor/composer/ClassLoader.php opt/app/vendor/composer/ClassLoader.php
opt/app/vendor/composer/LICENSE opt/app/vendor/composer/LICENSE
opt/app/vendor/composer/autoload_classmap.php opt/app/vendor/composer/autoload_classmap.php
@@ -1342,37 +1386,24 @@ opt/app/vendor/composer/autoload_psr4.php
opt/app/vendor/composer/autoload_real.php opt/app/vendor/composer/autoload_real.php
opt/app/vendor/composer/autoload_static.php opt/app/vendor/composer/autoload_static.php
opt/app/vendor/composer/installed.json opt/app/vendor/composer/installed.json
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/.editorconfig
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/README.md
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/RELEASE-CHECKLIST.md
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/composer.json opt/app/vendor/davejamesmiller/laravel-breadcrumbs/composer.json
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/config/breadcrumbs.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/config/breadcrumbs.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/scripts/test-coverage.sh opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/BreadcrumbsException.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/CurrentRoute.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/BreadcrumbsGenerator.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exception.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/BreadcrumbsManager.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Facade.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/BreadcrumbsServiceProvider.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Generator.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exceptions/DuplicateBreadcrumbException.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Manager.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exceptions/InvalidBreadcrumbException.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/ServiceProvider.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exceptions/UnnamedRouteException.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/View.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exceptions/ViewNotSetException.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/TestCase.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Facades/Breadcrumbs.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/bootstrap.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/fixtures/CustomServiceProvider.html
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/fixtures/DependantServiceProvider.html
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/fixtures/bootstrap2.html
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/fixtures/bootstrap3.html
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/fixtures/integration.html
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/integration/CustomServiceProviderTest.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/integration/DependantServiceProviderErrorTest.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/integration/DependantServiceProviderTest.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/integration/IntegrationTest.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/unit/CurrentRouteTest.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/unit/FacadeTest.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/unit/GeneratorTest.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/unit/ManagerTest.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/unit/ViewTest.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/bootstrap2.blade.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/bootstrap2.blade.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/bootstrap3.blade.php opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/bootstrap3.blade.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/bootstrap4.blade.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/bulma.blade.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/foundation6.blade.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/json-ld.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/views/materialize.blade.php
opt/app/vendor/doctrine/annotations/CHANGELOG.md opt/app/vendor/doctrine/annotations/CHANGELOG.md
opt/app/vendor/doctrine/annotations/LICENSE opt/app/vendor/doctrine/annotations/LICENSE
opt/app/vendor/doctrine/annotations/README.md opt/app/vendor/doctrine/annotations/README.md
@@ -2188,6 +2219,7 @@ opt/app/vendor/laravel/framework/src/Illuminate/Events/CallQueuedListener.php
opt/app/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php opt/app/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php
opt/app/vendor/laravel/framework/src/Illuminate/Events/EventServiceProvider.php opt/app/vendor/laravel/framework/src/Illuminate/Events/EventServiceProvider.php
opt/app/vendor/laravel/framework/src/Illuminate/Events/composer.json opt/app/vendor/laravel/framework/src/Illuminate/Events/composer.json
opt/app/vendor/laravel/framework/src/Illuminate/Filesystem/Cache.php
opt/app/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php opt/app/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php
opt/app/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php opt/app/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php
opt/app/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php opt/app/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php
@@ -2663,6 +2695,7 @@ opt/app/vendor/laravel/framework/src/Illuminate/Support/MessageBag.php
opt/app/vendor/laravel/framework/src/Illuminate/Support/NamespacedItemResolver.php opt/app/vendor/laravel/framework/src/Illuminate/Support/NamespacedItemResolver.php
opt/app/vendor/laravel/framework/src/Illuminate/Support/Optional.php opt/app/vendor/laravel/framework/src/Illuminate/Support/Optional.php
opt/app/vendor/laravel/framework/src/Illuminate/Support/Pluralizer.php opt/app/vendor/laravel/framework/src/Illuminate/Support/Pluralizer.php
opt/app/vendor/laravel/framework/src/Illuminate/Support/ProcessUtils.php
opt/app/vendor/laravel/framework/src/Illuminate/Support/ServiceProvider.php opt/app/vendor/laravel/framework/src/Illuminate/Support/ServiceProvider.php
opt/app/vendor/laravel/framework/src/Illuminate/Support/Str.php opt/app/vendor/laravel/framework/src/Illuminate/Support/Str.php
opt/app/vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/BusFake.php opt/app/vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/BusFake.php
@@ -2865,23 +2898,29 @@ opt/app/vendor/league/commonmark/src/Util/Html5Entities.php
opt/app/vendor/league/commonmark/src/Util/LinkParserHelper.php opt/app/vendor/league/commonmark/src/Util/LinkParserHelper.php
opt/app/vendor/league/commonmark/src/Util/RegexHelper.php opt/app/vendor/league/commonmark/src/Util/RegexHelper.php
opt/app/vendor/league/commonmark/src/Util/UrlEncoder.php opt/app/vendor/league/commonmark/src/Util/UrlEncoder.php
opt/app/vendor/league/commonmark/src/Util/Xml.php
opt/app/vendor/league/csv/LICENSE opt/app/vendor/league/csv/LICENSE
opt/app/vendor/league/csv/autoload.php opt/app/vendor/league/csv/autoload.php
opt/app/vendor/league/csv/composer.json opt/app/vendor/league/csv/composer.json
opt/app/vendor/league/csv/src/AbstractCsv.php opt/app/vendor/league/csv/src/AbstractCsv.php
opt/app/vendor/league/csv/src/Config/Controls.php opt/app/vendor/league/csv/src/ByteSequence.php
opt/app/vendor/league/csv/src/Config/Output.php opt/app/vendor/league/csv/src/CannotInsertRecord.php
opt/app/vendor/league/csv/src/Exception/InvalidRowException.php opt/app/vendor/league/csv/src/CharsetConverter.php
opt/app/vendor/league/csv/src/Modifier/MapIterator.php opt/app/vendor/league/csv/src/ColumnConsistency.php
opt/app/vendor/league/csv/src/Modifier/QueryFilter.php opt/app/vendor/league/csv/src/EncloseField.php
opt/app/vendor/league/csv/src/Modifier/RowFilter.php opt/app/vendor/league/csv/src/EscapeFormula.php
opt/app/vendor/league/csv/src/Modifier/StreamFilter.php opt/app/vendor/league/csv/src/Exception.php
opt/app/vendor/league/csv/src/Modifier/StreamIterator.php opt/app/vendor/league/csv/src/HTMLConverter.php
opt/app/vendor/league/csv/src/Plugin/ColumnConsistencyValidator.php opt/app/vendor/league/csv/src/MapIterator.php
opt/app/vendor/league/csv/src/Plugin/ForbiddenNullValuesValidator.php opt/app/vendor/league/csv/src/RFC4180Field.php
opt/app/vendor/league/csv/src/Plugin/SkipNullValuesFormatter.php
opt/app/vendor/league/csv/src/Reader.php opt/app/vendor/league/csv/src/Reader.php
opt/app/vendor/league/csv/src/ResultSet.php
opt/app/vendor/league/csv/src/Statement.php
opt/app/vendor/league/csv/src/Stream.php
opt/app/vendor/league/csv/src/Writer.php opt/app/vendor/league/csv/src/Writer.php
opt/app/vendor/league/csv/src/XMLConverter.php
opt/app/vendor/league/csv/src/functions.php
opt/app/vendor/league/csv/src/functions_include.php
opt/app/vendor/league/flysystem/LICENSE opt/app/vendor/league/flysystem/LICENSE
opt/app/vendor/league/flysystem/composer.json opt/app/vendor/league/flysystem/composer.json
opt/app/vendor/league/flysystem/docs/CNAME opt/app/vendor/league/flysystem/docs/CNAME
@@ -3229,6 +3268,31 @@ opt/app/vendor/nesbot/carbon/src/Carbon/Lang/uz.php
opt/app/vendor/nesbot/carbon/src/Carbon/Lang/vi.php opt/app/vendor/nesbot/carbon/src/Carbon/Lang/vi.php
opt/app/vendor/nesbot/carbon/src/Carbon/Lang/zh.php opt/app/vendor/nesbot/carbon/src/Carbon/Lang/zh.php
opt/app/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php opt/app/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php
opt/app/vendor/paragonie/constant_time_encoding/LICENSE.txt
opt/app/vendor/paragonie/constant_time_encoding/README.md
opt/app/vendor/paragonie/constant_time_encoding/composer.json
opt/app/vendor/paragonie/constant_time_encoding/phpunit.xml.dist
opt/app/vendor/paragonie/constant_time_encoding/psalm.xml
opt/app/vendor/paragonie/constant_time_encoding/src/Base32.php
opt/app/vendor/paragonie/constant_time_encoding/src/Base32Hex.php
opt/app/vendor/paragonie/constant_time_encoding/src/Base64.php
opt/app/vendor/paragonie/constant_time_encoding/src/Base64DotSlash.php
opt/app/vendor/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php
opt/app/vendor/paragonie/constant_time_encoding/src/Base64UrlSafe.php
opt/app/vendor/paragonie/constant_time_encoding/src/Binary.php
opt/app/vendor/paragonie/constant_time_encoding/src/EncoderInterface.php
opt/app/vendor/paragonie/constant_time_encoding/src/Encoding.php
opt/app/vendor/paragonie/constant_time_encoding/src/Hex.php
opt/app/vendor/paragonie/constant_time_encoding/src/RFC4648.php
opt/app/vendor/paragonie/constant_time_encoding/tests/Base32HexTest.php
opt/app/vendor/paragonie/constant_time_encoding/tests/Base32Test.php
opt/app/vendor/paragonie/constant_time_encoding/tests/Base64DotSlashOrderedTest.php
opt/app/vendor/paragonie/constant_time_encoding/tests/Base64DotSlashTest.php
opt/app/vendor/paragonie/constant_time_encoding/tests/Base64Test.php
opt/app/vendor/paragonie/constant_time_encoding/tests/Base64UrlSafeTest.php
opt/app/vendor/paragonie/constant_time_encoding/tests/EncodingTest.php
opt/app/vendor/paragonie/constant_time_encoding/tests/HexTest.php
opt/app/vendor/paragonie/constant_time_encoding/tests/RFC4648Test.php
opt/app/vendor/paragonie/random_compat/LICENSE opt/app/vendor/paragonie/random_compat/LICENSE
opt/app/vendor/paragonie/random_compat/build-phar.sh opt/app/vendor/paragonie/random_compat/build-phar.sh
opt/app/vendor/paragonie/random_compat/composer.json opt/app/vendor/paragonie/random_compat/composer.json
@@ -3247,19 +3311,45 @@ opt/app/vendor/paragonie/random_compat/lib/random_int.php
opt/app/vendor/paragonie/random_compat/other/build_phar.php opt/app/vendor/paragonie/random_compat/other/build_phar.php
opt/app/vendor/paragonie/random_compat/psalm-autoload.php opt/app/vendor/paragonie/random_compat/psalm-autoload.php
opt/app/vendor/paragonie/random_compat/psalm.xml opt/app/vendor/paragonie/random_compat/psalm.xml
opt/app/vendor/pragmarx/google2fa-laravel/LICENSE
opt/app/vendor/pragmarx/google2fa-laravel/changelog.md
opt/app/vendor/pragmarx/google2fa-laravel/composer.json
opt/app/vendor/pragmarx/google2fa-laravel/docs/middleware.jpg
opt/app/vendor/pragmarx/google2fa-laravel/phpspec.yml
opt/app/vendor/pragmarx/google2fa-laravel/readme.md
opt/app/vendor/pragmarx/google2fa-laravel/src/Events/OneTimePasswordRequested.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Exceptions/InvalidOneTimePassword.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Exceptions/InvalidSecretKey.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Facade.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Middleware.php
opt/app/vendor/pragmarx/google2fa-laravel/src/ServiceProvider.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Auth.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Authenticator.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Config.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Constants.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Support/ErrorBag.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Input.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Request.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Response.php
opt/app/vendor/pragmarx/google2fa-laravel/src/Support/Session.php
opt/app/vendor/pragmarx/google2fa-laravel/src/config/config.php
opt/app/vendor/pragmarx/google2fa-laravel/tests/spec/Support/AuthenticatorSpec.php
opt/app/vendor/pragmarx/google2fa-laravel/upgrading.md
opt/app/vendor/pragmarx/google2fa/LICENSE opt/app/vendor/pragmarx/google2fa/LICENSE
opt/app/vendor/pragmarx/google2fa/changelog.md opt/app/vendor/pragmarx/google2fa/changelog.md
opt/app/vendor/pragmarx/google2fa/composer.json opt/app/vendor/pragmarx/google2fa/composer.json
opt/app/vendor/pragmarx/google2fa/phpspec.yml opt/app/vendor/pragmarx/google2fa/docs/playground.jpg
opt/app/vendor/pragmarx/google2fa/readme.md opt/app/vendor/pragmarx/google2fa/readme.md
opt/app/vendor/pragmarx/google2fa/src/Contracts/Google2FA.php opt/app/vendor/pragmarx/google2fa/src/Exceptions/IncompatibleWithGoogleAuthenticatorException.php
opt/app/vendor/pragmarx/google2fa/src/Exceptions/InvalidCharactersException.php opt/app/vendor/pragmarx/google2fa/src/Exceptions/InvalidCharactersException.php
opt/app/vendor/pragmarx/google2fa/src/Exceptions/SecretKeyTooShortException.php opt/app/vendor/pragmarx/google2fa/src/Exceptions/SecretKeyTooShortException.php
opt/app/vendor/pragmarx/google2fa/src/Google2FA.php opt/app/vendor/pragmarx/google2fa/src/Google2FA.php
opt/app/vendor/pragmarx/google2fa/src/Support/Base32.php
opt/app/vendor/pragmarx/google2fa/src/Support/Constants.php
opt/app/vendor/pragmarx/google2fa/src/Support/QRCode.php
opt/app/vendor/pragmarx/google2fa/src/Support/Url.php opt/app/vendor/pragmarx/google2fa/src/Support/Url.php
opt/app/vendor/pragmarx/google2fa/src/Vendor/Laravel/Facade.php opt/app/vendor/pragmarx/google2fa/tests/Google2FATest.php
opt/app/vendor/pragmarx/google2fa/src/Vendor/Laravel/ServiceProvider.php opt/app/vendor/pragmarx/google2fa/tests/bootstrap.php
opt/app/vendor/pragmarx/google2fa/tests/spec/Google2FASpec.php
opt/app/vendor/pragmarx/google2fa/upgrading.md opt/app/vendor/pragmarx/google2fa/upgrading.md
opt/app/vendor/psr/container/LICENSE opt/app/vendor/psr/container/LICENSE
opt/app/vendor/psr/container/README.md opt/app/vendor/psr/container/README.md
@@ -4245,10 +4335,11 @@ opt/app/vendor/symfony/debug/Tests/Fixtures/reallyNotPsr0.php
opt/app/vendor/symfony/debug/Tests/Fixtures2/RequiredTwice.php opt/app/vendor/symfony/debug/Tests/Fixtures2/RequiredTwice.php
opt/app/vendor/symfony/debug/Tests/HeaderMock.php opt/app/vendor/symfony/debug/Tests/HeaderMock.php
opt/app/vendor/symfony/debug/Tests/MockExceptionHandler.php opt/app/vendor/symfony/debug/Tests/MockExceptionHandler.php
opt/app/vendor/symfony/debug/Tests/phpt/exception_rethrown.phpt
opt/app/vendor/symfony/debug/Tests/phpt/fatal_with_nested_handlers.phpt
opt/app/vendor/symfony/debug/composer.json opt/app/vendor/symfony/debug/composer.json
opt/app/vendor/symfony/debug/phpunit.xml.dist opt/app/vendor/symfony/debug/phpunit.xml.dist
opt/app/vendor/symfony/event-dispatcher/CHANGELOG.md opt/app/vendor/symfony/event-dispatcher/CHANGELOG.md
opt/app/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php
opt/app/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php opt/app/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
opt/app/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php opt/app/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php
opt/app/vendor/symfony/event-dispatcher/Debug/WrappedListener.php opt/app/vendor/symfony/event-dispatcher/Debug/WrappedListener.php
@@ -4262,7 +4353,6 @@ opt/app/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php
opt/app/vendor/symfony/event-dispatcher/LICENSE opt/app/vendor/symfony/event-dispatcher/LICENSE
opt/app/vendor/symfony/event-dispatcher/README.md opt/app/vendor/symfony/event-dispatcher/README.md
opt/app/vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php opt/app/vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php
opt/app/vendor/symfony/event-dispatcher/Tests/ContainerAwareEventDispatcherTest.php
opt/app/vendor/symfony/event-dispatcher/Tests/Debug/TraceableEventDispatcherTest.php opt/app/vendor/symfony/event-dispatcher/Tests/Debug/TraceableEventDispatcherTest.php
opt/app/vendor/symfony/event-dispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php opt/app/vendor/symfony/event-dispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php
opt/app/vendor/symfony/event-dispatcher/Tests/EventDispatcherTest.php opt/app/vendor/symfony/event-dispatcher/Tests/EventDispatcherTest.php
@@ -4453,6 +4543,8 @@ opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/st
opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.php
opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.expected opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.expected
opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.php
opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.expected
opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.php
opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php
opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php
opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php opt/app/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php
@@ -4529,9 +4621,12 @@ opt/app/vendor/symfony/http-kernel/DependencyInjection/ControllerArgumentValueRe
opt/app/vendor/symfony/http-kernel/DependencyInjection/Extension.php opt/app/vendor/symfony/http-kernel/DependencyInjection/Extension.php
opt/app/vendor/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php opt/app/vendor/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php
opt/app/vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php opt/app/vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php
opt/app/vendor/symfony/http-kernel/DependencyInjection/LoggerPass.php
opt/app/vendor/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php opt/app/vendor/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php
opt/app/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php opt/app/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php
opt/app/vendor/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php opt/app/vendor/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php
opt/app/vendor/symfony/http-kernel/DependencyInjection/ResettableServicePass.php
opt/app/vendor/symfony/http-kernel/DependencyInjection/ServicesResetter.php
opt/app/vendor/symfony/http-kernel/Event/FilterControllerArgumentsEvent.php opt/app/vendor/symfony/http-kernel/Event/FilterControllerArgumentsEvent.php
opt/app/vendor/symfony/http-kernel/Event/FilterControllerEvent.php opt/app/vendor/symfony/http-kernel/Event/FilterControllerEvent.php
opt/app/vendor/symfony/http-kernel/Event/FilterResponseEvent.php opt/app/vendor/symfony/http-kernel/Event/FilterResponseEvent.php
@@ -4600,11 +4695,14 @@ opt/app/vendor/symfony/http-kernel/KernelEvents.php
opt/app/vendor/symfony/http-kernel/KernelInterface.php opt/app/vendor/symfony/http-kernel/KernelInterface.php
opt/app/vendor/symfony/http-kernel/LICENSE opt/app/vendor/symfony/http-kernel/LICENSE
opt/app/vendor/symfony/http-kernel/Log/DebugLoggerInterface.php opt/app/vendor/symfony/http-kernel/Log/DebugLoggerInterface.php
opt/app/vendor/symfony/http-kernel/Log/Logger.php
opt/app/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php opt/app/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php
opt/app/vendor/symfony/http-kernel/Profiler/Profile.php opt/app/vendor/symfony/http-kernel/Profiler/Profile.php
opt/app/vendor/symfony/http-kernel/Profiler/Profiler.php opt/app/vendor/symfony/http-kernel/Profiler/Profiler.php
opt/app/vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php opt/app/vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php
opt/app/vendor/symfony/http-kernel/README.md opt/app/vendor/symfony/http-kernel/README.md
opt/app/vendor/symfony/http-kernel/RebootableInterface.php
opt/app/vendor/symfony/http-kernel/Resources/welcome.html.php
opt/app/vendor/symfony/http-kernel/TerminableInterface.php opt/app/vendor/symfony/http-kernel/TerminableInterface.php
opt/app/vendor/symfony/http-kernel/Tests/Bundle/BundleTest.php opt/app/vendor/symfony/http-kernel/Tests/Bundle/BundleTest.php
opt/app/vendor/symfony/http-kernel/Tests/CacheClearer/ChainCacheClearerTest.php opt/app/vendor/symfony/http-kernel/Tests/CacheClearer/ChainCacheClearerTest.php
@@ -4614,11 +4712,13 @@ opt/app/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerTest.php
opt/app/vendor/symfony/http-kernel/Tests/ClientTest.php opt/app/vendor/symfony/http-kernel/Tests/ClientTest.php
opt/app/vendor/symfony/http-kernel/Tests/Config/EnvParametersResourceTest.php opt/app/vendor/symfony/http-kernel/Tests/Config/EnvParametersResourceTest.php
opt/app/vendor/symfony/http-kernel/Tests/Config/FileLocatorTest.php opt/app/vendor/symfony/http-kernel/Tests/Config/FileLocatorTest.php
opt/app/vendor/symfony/http-kernel/Tests/Controller/ArgumentResolver/ServiceValueResolverTest.php
opt/app/vendor/symfony/http-kernel/Tests/Controller/ArgumentResolverTest.php opt/app/vendor/symfony/http-kernel/Tests/Controller/ArgumentResolverTest.php
opt/app/vendor/symfony/http-kernel/Tests/Controller/ContainerControllerResolverTest.php opt/app/vendor/symfony/http-kernel/Tests/Controller/ContainerControllerResolverTest.php
opt/app/vendor/symfony/http-kernel/Tests/Controller/ControllerResolverTest.php opt/app/vendor/symfony/http-kernel/Tests/Controller/ControllerResolverTest.php
opt/app/vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataFactoryTest.php opt/app/vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataFactoryTest.php
opt/app/vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataTest.php opt/app/vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataTest.php
opt/app/vendor/symfony/http-kernel/Tests/DataCollector/Compiler.log
opt/app/vendor/symfony/http-kernel/Tests/DataCollector/ConfigDataCollectorTest.php opt/app/vendor/symfony/http-kernel/Tests/DataCollector/ConfigDataCollectorTest.php
opt/app/vendor/symfony/http-kernel/Tests/DataCollector/DataCollectorTest.php opt/app/vendor/symfony/http-kernel/Tests/DataCollector/DataCollectorTest.php
opt/app/vendor/symfony/http-kernel/Tests/DataCollector/DumpDataCollectorTest.php opt/app/vendor/symfony/http-kernel/Tests/DataCollector/DumpDataCollectorTest.php
@@ -4634,9 +4734,13 @@ opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/AddAnnotatedClasses
opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/ControllerArgumentValueResolverPassTest.php opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/ControllerArgumentValueResolverPassTest.php
opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/FragmentRendererPassTest.php opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/FragmentRendererPassTest.php
opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php
opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/LoggerPassTest.php
opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php
opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php
opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPassTest.php opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPassTest.php
opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/ResettableServicePassTest.php
opt/app/vendor/symfony/http-kernel/Tests/DependencyInjection/ServicesResetterTest.php
opt/app/vendor/symfony/http-kernel/Tests/Event/FilterControllerArgumentsEventTest.php
opt/app/vendor/symfony/http-kernel/Tests/Event/GetResponseForExceptionEventTest.php opt/app/vendor/symfony/http-kernel/Tests/Event/GetResponseForExceptionEventTest.php
opt/app/vendor/symfony/http-kernel/Tests/EventListener/AddRequestFormatsListenerTest.php opt/app/vendor/symfony/http-kernel/Tests/EventListener/AddRequestFormatsListenerTest.php
opt/app/vendor/symfony/http-kernel/Tests/EventListener/DebugHandlersListenerTest.php opt/app/vendor/symfony/http-kernel/Tests/EventListener/DebugHandlersListenerTest.php
@@ -4676,6 +4780,7 @@ opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/foo.txt
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Bundle2Bundle/foo.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Bundle2Bundle/foo.txt
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/foo.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/foo.txt
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/hide.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/hide.txt
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/ClearableService.php
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Controller/BasicTypesController.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Controller/BasicTypesController.php
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingRequest.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingRequest.php
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingSession.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingSession.php
@@ -4694,6 +4799,7 @@ opt/app/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/Extensi
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/KernelForOverrideName.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/KernelForOverrideName.php
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/KernelForTest.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/KernelForTest.php
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/KernelWithoutBundles.php opt/app/vendor/symfony/http-kernel/Tests/Fixtures/KernelWithoutBundles.php
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/ResettableService.php
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Resources/BaseBundle/hide.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Resources/BaseBundle/hide.txt
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt
opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Resources/ChildBundle/foo.txt opt/app/vendor/symfony/http-kernel/Tests/Fixtures/Resources/ChildBundle/foo.txt
@@ -4716,6 +4822,7 @@ opt/app/vendor/symfony/http-kernel/Tests/HttpCache/TestHttpKernel.php
opt/app/vendor/symfony/http-kernel/Tests/HttpCache/TestMultipleHttpKernel.php opt/app/vendor/symfony/http-kernel/Tests/HttpCache/TestMultipleHttpKernel.php
opt/app/vendor/symfony/http-kernel/Tests/HttpKernelTest.php opt/app/vendor/symfony/http-kernel/Tests/HttpKernelTest.php
opt/app/vendor/symfony/http-kernel/Tests/KernelTest.php opt/app/vendor/symfony/http-kernel/Tests/KernelTest.php
opt/app/vendor/symfony/http-kernel/Tests/Log/LoggerTest.php
opt/app/vendor/symfony/http-kernel/Tests/Logger.php opt/app/vendor/symfony/http-kernel/Tests/Logger.php
opt/app/vendor/symfony/http-kernel/Tests/Profiler/FileProfilerStorageTest.php opt/app/vendor/symfony/http-kernel/Tests/Profiler/FileProfilerStorageTest.php
opt/app/vendor/symfony/http-kernel/Tests/Profiler/ProfilerTest.php opt/app/vendor/symfony/http-kernel/Tests/Profiler/ProfilerTest.php
@@ -5297,6 +5404,7 @@ opt/app/vendor/twig/twig/lib/Twig/Cache/Null.php
opt/app/vendor/twig/twig/lib/Twig/CacheInterface.php opt/app/vendor/twig/twig/lib/Twig/CacheInterface.php
opt/app/vendor/twig/twig/lib/Twig/Compiler.php opt/app/vendor/twig/twig/lib/Twig/Compiler.php
opt/app/vendor/twig/twig/lib/Twig/CompilerInterface.php opt/app/vendor/twig/twig/lib/Twig/CompilerInterface.php
opt/app/vendor/twig/twig/lib/Twig/ContainerRuntimeLoader.php
opt/app/vendor/twig/twig/lib/Twig/Environment.php opt/app/vendor/twig/twig/lib/Twig/Environment.php
opt/app/vendor/twig/twig/lib/Twig/Error.php opt/app/vendor/twig/twig/lib/Twig/Error.php
opt/app/vendor/twig/twig/lib/Twig/Error/Loader.php opt/app/vendor/twig/twig/lib/Twig/Error/Loader.php
@@ -5417,6 +5525,7 @@ opt/app/vendor/twig/twig/lib/Twig/Node/SetTemp.php
opt/app/vendor/twig/twig/lib/Twig/Node/Spaceless.php opt/app/vendor/twig/twig/lib/Twig/Node/Spaceless.php
opt/app/vendor/twig/twig/lib/Twig/Node/Text.php opt/app/vendor/twig/twig/lib/Twig/Node/Text.php
opt/app/vendor/twig/twig/lib/Twig/Node/With.php opt/app/vendor/twig/twig/lib/Twig/Node/With.php
opt/app/vendor/twig/twig/lib/Twig/NodeCaptureInterface.php
opt/app/vendor/twig/twig/lib/Twig/NodeInterface.php opt/app/vendor/twig/twig/lib/Twig/NodeInterface.php
opt/app/vendor/twig/twig/lib/Twig/NodeOutputInterface.php opt/app/vendor/twig/twig/lib/Twig/NodeOutputInterface.php
opt/app/vendor/twig/twig/lib/Twig/NodeTraverser.php opt/app/vendor/twig/twig/lib/Twig/NodeTraverser.php
@@ -5427,6 +5536,7 @@ opt/app/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php
opt/app/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php opt/app/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php
opt/app/vendor/twig/twig/lib/Twig/Parser.php opt/app/vendor/twig/twig/lib/Twig/Parser.php
opt/app/vendor/twig/twig/lib/Twig/ParserInterface.php opt/app/vendor/twig/twig/lib/Twig/ParserInterface.php
opt/app/vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.php
opt/app/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php opt/app/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php
opt/app/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php opt/app/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php
opt/app/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php opt/app/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php
@@ -5486,15 +5596,188 @@ opt/app/vendor/twig/twig/lib/Twig/TokenStream.php
opt/app/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php opt/app/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php
opt/app/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php opt/app/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php
opt/app/vendor/twig/twig/phpunit.xml.dist opt/app/vendor/twig/twig/phpunit.xml.dist
opt/app/vendor/twig/twig/src/Cache/CacheInterface.php
opt/app/vendor/twig/twig/src/Cache/FilesystemCache.php
opt/app/vendor/twig/twig/src/Cache/NullCache.php
opt/app/vendor/twig/twig/src/Compiler.php
opt/app/vendor/twig/twig/src/Environment.php
opt/app/vendor/twig/twig/src/Error/Error.php
opt/app/vendor/twig/twig/src/Error/LoaderError.php
opt/app/vendor/twig/twig/src/Error/RuntimeError.php
opt/app/vendor/twig/twig/src/Error/SyntaxError.php
opt/app/vendor/twig/twig/src/ExpressionParser.php
opt/app/vendor/twig/twig/src/Extension/AbstractExtension.php
opt/app/vendor/twig/twig/src/Extension/CoreExtension.php
opt/app/vendor/twig/twig/src/Extension/DebugExtension.php
opt/app/vendor/twig/twig/src/Extension/EscaperExtension.php
opt/app/vendor/twig/twig/src/Extension/ExtensionInterface.php
opt/app/vendor/twig/twig/src/Extension/GlobalsInterface.php
opt/app/vendor/twig/twig/src/Extension/InitRuntimeInterface.php
opt/app/vendor/twig/twig/src/Extension/OptimizerExtension.php
opt/app/vendor/twig/twig/src/Extension/ProfilerExtension.php
opt/app/vendor/twig/twig/src/Extension/RuntimeExtensionInterface.php
opt/app/vendor/twig/twig/src/Extension/SandboxExtension.php
opt/app/vendor/twig/twig/src/Extension/StagingExtension.php
opt/app/vendor/twig/twig/src/Extension/StringLoaderExtension.php
opt/app/vendor/twig/twig/src/FileExtensionEscapingStrategy.php
opt/app/vendor/twig/twig/src/Lexer.php
opt/app/vendor/twig/twig/src/Loader/ArrayLoader.php
opt/app/vendor/twig/twig/src/Loader/ChainLoader.php
opt/app/vendor/twig/twig/src/Loader/ExistsLoaderInterface.php
opt/app/vendor/twig/twig/src/Loader/FilesystemLoader.php
opt/app/vendor/twig/twig/src/Loader/LoaderInterface.php
opt/app/vendor/twig/twig/src/Loader/SourceContextLoaderInterface.php
opt/app/vendor/twig/twig/src/Markup.php
opt/app/vendor/twig/twig/src/Node/AutoEscapeNode.php
opt/app/vendor/twig/twig/src/Node/BlockNode.php
opt/app/vendor/twig/twig/src/Node/BlockReferenceNode.php
opt/app/vendor/twig/twig/src/Node/BodyNode.php
opt/app/vendor/twig/twig/src/Node/CheckSecurityNode.php
opt/app/vendor/twig/twig/src/Node/DoNode.php
opt/app/vendor/twig/twig/src/Node/EmbedNode.php
opt/app/vendor/twig/twig/src/Node/Expression/AbstractExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/ArrayExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/AssignNameExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/InBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php
opt/app/vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/CallExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/ConditionalExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/ConstantExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php
opt/app/vendor/twig/twig/src/Node/Expression/FilterExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/FunctionExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/GetAttrExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/MethodCallExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/NameExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/ParentExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/TempNameExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php
opt/app/vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php
opt/app/vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php
opt/app/vendor/twig/twig/src/Node/Expression/Test/EvenTest.php
opt/app/vendor/twig/twig/src/Node/Expression/Test/NullTest.php
opt/app/vendor/twig/twig/src/Node/Expression/Test/OddTest.php
opt/app/vendor/twig/twig/src/Node/Expression/Test/SameasTest.php
opt/app/vendor/twig/twig/src/Node/Expression/TestExpression.php
opt/app/vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php
opt/app/vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php
opt/app/vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php
opt/app/vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php
opt/app/vendor/twig/twig/src/Node/FlushNode.php
opt/app/vendor/twig/twig/src/Node/ForLoopNode.php
opt/app/vendor/twig/twig/src/Node/ForNode.php
opt/app/vendor/twig/twig/src/Node/IfNode.php
opt/app/vendor/twig/twig/src/Node/ImportNode.php
opt/app/vendor/twig/twig/src/Node/IncludeNode.php
opt/app/vendor/twig/twig/src/Node/MacroNode.php
opt/app/vendor/twig/twig/src/Node/ModuleNode.php
opt/app/vendor/twig/twig/src/Node/Node.php
opt/app/vendor/twig/twig/src/Node/NodeCaptureInterface.php
opt/app/vendor/twig/twig/src/Node/NodeOutputInterface.php
opt/app/vendor/twig/twig/src/Node/PrintNode.php
opt/app/vendor/twig/twig/src/Node/SandboxNode.php
opt/app/vendor/twig/twig/src/Node/SandboxedPrintNode.php
opt/app/vendor/twig/twig/src/Node/SetNode.php
opt/app/vendor/twig/twig/src/Node/SetTempNode.php
opt/app/vendor/twig/twig/src/Node/SpacelessNode.php
opt/app/vendor/twig/twig/src/Node/TextNode.php
opt/app/vendor/twig/twig/src/Node/WithNode.php
opt/app/vendor/twig/twig/src/NodeTraverser.php
opt/app/vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php
opt/app/vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php
opt/app/vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php
opt/app/vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php
opt/app/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php
opt/app/vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php
opt/app/vendor/twig/twig/src/Parser.php
opt/app/vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php
opt/app/vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php
opt/app/vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php
opt/app/vendor/twig/twig/src/Profiler/Dumper/TextDumper.php
opt/app/vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php
opt/app/vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php
opt/app/vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php
opt/app/vendor/twig/twig/src/Profiler/Profile.php
opt/app/vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php
opt/app/vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php
opt/app/vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php
opt/app/vendor/twig/twig/src/Sandbox/SecurityError.php
opt/app/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php
opt/app/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php
opt/app/vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php
opt/app/vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php
opt/app/vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php
opt/app/vendor/twig/twig/src/Sandbox/SecurityPolicy.php
opt/app/vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php
opt/app/vendor/twig/twig/src/Source.php
opt/app/vendor/twig/twig/src/Template.php
opt/app/vendor/twig/twig/src/TemplateWrapper.php
opt/app/vendor/twig/twig/src/Test/IntegrationTestCase.php
opt/app/vendor/twig/twig/src/Test/NodeTestCase.php
opt/app/vendor/twig/twig/src/Token.php
opt/app/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/BlockTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/DoTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/FilterTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/FlushTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/ForTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/FromTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/IfTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/ImportTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/IncludeTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/MacroTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/SandboxTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/SetTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/SpacelessTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/TokenParserInterface.php
opt/app/vendor/twig/twig/src/TokenParser/UseTokenParser.php
opt/app/vendor/twig/twig/src/TokenParser/WithTokenParser.php
opt/app/vendor/twig/twig/src/TokenStream.php
opt/app/vendor/twig/twig/src/TwigFilter.php
opt/app/vendor/twig/twig/src/TwigFunction.php
opt/app/vendor/twig/twig/src/TwigTest.php
opt/app/vendor/twig/twig/src/Util/DeprecationCollector.php
opt/app/vendor/twig/twig/src/Util/TemplateDirIterator.php
opt/app/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php opt/app/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/Cache/FilesystemTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Cache/FilesystemTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/CompilerTest.php opt/app/vendor/twig/twig/test/Twig/Tests/CompilerTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/ContainerRuntimeLoaderTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/CustomExtensionTest.php opt/app/vendor/twig/twig/test/Twig/Tests/CustomExtensionTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php opt/app/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/ErrorTest.php opt/app/vendor/twig/twig/test/Twig/Tests/ErrorTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php opt/app/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/FactoryRuntimeLoaderTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php opt/app/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/FileExtensionEscapingStrategyTest.php opt/app/vendor/twig/twig/test/Twig/Tests/FileExtensionEscapingStrategyTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/FilesystemHelper.php opt/app/vendor/twig/twig/test/Twig/Tests/FilesystemHelper.php
@@ -5561,6 +5844,7 @@ opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_html_attr.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_html_attr.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_javascript.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test
@@ -5751,6 +6035,7 @@ opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block2.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block2.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block3.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block3.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/use_with_parent.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test
opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test opt/app/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test
@@ -5851,12 +6136,11 @@ opt/app/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php opt/app/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/RuntimeFactoryLoaderTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/TemplateTest.php opt/app/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/TemplateWrapperTest.php opt/app/vendor/twig/twig/test/Twig/Tests/TemplateWrapperTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php opt/app/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/Util/DeprecationCollectorTest.php
opt/app/vendor/twig/twig/test/Twig/Tests/escapingTest.php opt/app/vendor/twig/twig/test/Twig/Tests/escapingTest.php
opt/app/vendor/twig/twig/test/bootstrap.php
opt/app/vendor/vlucas/phpdotenv/LICENSE.txt opt/app/vendor/vlucas/phpdotenv/LICENSE.txt
opt/app/vendor/vlucas/phpdotenv/composer.json opt/app/vendor/vlucas/phpdotenv/composer.json
opt/app/vendor/vlucas/phpdotenv/src/Dotenv.php opt/app/vendor/vlucas/phpdotenv/src/Dotenv.php
@@ -6010,6 +6294,8 @@ usr/lib/x86_64-linux-gnu/libxml2.so.2
usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1 usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1
usr/lib/x86_64-linux-gnu/libxslt.so.1 usr/lib/x86_64-linux-gnu/libxslt.so.1
usr/lib/x86_64-linux-gnu/libxslt.so.1.1.28 usr/lib/x86_64-linux-gnu/libxslt.so.1.1.28
usr/lib/x86_64-linux-gnu/libzip.so.5
usr/lib/x86_64-linux-gnu/libzip.so.5.0.0
usr/sbin/mysqld usr/sbin/mysqld
usr/sbin/nginx usr/sbin/nginx
usr/sbin/php-fpm7.1 usr/sbin/php-fpm7.1

View File

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

View File

@@ -2,6 +2,31 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/). This project adheres to [Semantic Versioning](http://semver.org/).
## [4.6.12] - 2017-12-31
### Added
- Support for Indonesian.
- New report, see [issue 384](https://github.com/firefly-iii/firefly-iii/issues/384)
- [Issue 964](https://github.com/firefly-iii/firefly-iii/issues/964) as suggested by [gavu](https://github.com/gavu)
### Changed
- Greatly improved Docker support and documentation.
### Fixed
- [Issue 1046](https://github.com/firefly-iii/firefly-iii/issues/1046), as reported by [pkoziol](https://github.com/pkoziol)
- [Issue 1047](https://github.com/firefly-iii/firefly-iii/issues/1047), as reported by [pkoziol](https://github.com/pkoziol)
- [Issue 1048](https://github.com/firefly-iii/firefly-iii/issues/1048), as reported by [webence](https://github.com/webence)
- [Issue 1049](https://github.com/firefly-iii/firefly-iii/issues/1049), as reported by [nicoschreiner](https://github.com/nicoschreiner)
- [Issue 1015](https://github.com/firefly-iii/firefly-iii/issues/1015), as reporterd by a user on Tweakers.net
- [Issue 1056](https://github.com/firefly-iii/firefly-iii/issues/1056), as reported by [repercussion](https://github.com/repercussion)
- [Issue 1061](https://github.com/firefly-iii/firefly-iii/issues/1061), as reported by [Meizikyn](https://github.com/Meizikyn)
- [Issue 1045](https://github.com/firefly-iii/firefly-iii/issues/1045), as reported by [gavu](https://github.com/gavu)
- First code for [issue 1040](https://github.com/firefly-iii/firefly-iii/issues/1040) ([simonsmiley](https://github.com/simonsmiley))
- [Issue 1059](https://github.com/firefly-iii/firefly-iii/issues/1059), as reported by [4oo4](https://github.com/4oo4)
- [Issue 1063](https://github.com/firefly-iii/firefly-iii/issues/1063), as reported by [pkoziol](https://github.com/pkoziol)
- [Issue 1064](https://github.com/firefly-iii/firefly-iii/issues/1064), as reported by [pkoziol](https://github.com/pkoziol)
- [Issue 1066](https://github.com/firefly-iii/firefly-iii/issues/1066), reported by [wtercato](https://github.com/wtercato)
## [4.6.11.1] - 2017-12-08 ## [4.6.11.1] - 2017-12-08
### Added ### Added
- Import routine can scan for matching bills, [issue 956](https://github.com/firefly-iii/firefly-iii/issues/956) - Import routine can scan for matching bills, [issue 956](https://github.com/firefly-iii/firefly-iii/issues/956)

View File

@@ -150,7 +150,9 @@ class CreateImport extends Command
$this->error(sprintf('Error importing line #%d: %s', $index, $error)); $this->error(sprintf('Error importing line #%d: %s', $index, $error));
} }
$this->line( $this->line(
sprintf('The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->lines) sprintf(
'The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->getLines()
)
); );
} }

View File

@@ -98,11 +98,13 @@ class Import extends Command
$routine->run(); $routine->run();
/** @var MessageBag $error */ /** @var MessageBag $error */
foreach ($routine->errors as $index => $error) { foreach ($routine->getErrors() as $index => $error) {
$this->error(sprintf('Error importing line #%d: %s', $index, $error)); $this->error(sprintf('Error importing line #%d: %s', $index, $error));
} }
$this->line(sprintf('The import has finished. %d transactions have been imported out of %d records.', $routine->journals->count(), $routine->lines)); $this->line(
sprintf('The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->getLines())
);
return; return;
} }

View File

@@ -57,6 +57,12 @@ class UseEncryption extends Command
*/ */
public function handle() public function handle()
{ {
if (config('firefly.encryption') === true) {
$this->info('Firefly III configuration calls for encrypted data.');
}
if (config('firefly.encryption') === false) {
$this->info('Firefly III configuration calls for unencrypted data.');
}
$this->handleObjects('Account', 'name', 'encrypted'); $this->handleObjects('Account', 'name', 'encrypted');
$this->handleObjects('Bill', 'name', 'name_encrypted'); $this->handleObjects('Bill', 'name', 'name_encrypted');
$this->handleObjects('Bill', 'match', 'match_encrypted'); $this->handleObjects('Bill', 'match', 'match_encrypted');
@@ -76,7 +82,7 @@ class UseEncryption extends Command
public function handleObjects(string $class, string $field, string $indicator) public function handleObjects(string $class, string $field, string $indicator)
{ {
$fqn = sprintf('FireflyIII\Models\%s', $class); $fqn = sprintf('FireflyIII\Models\%s', $class);
$encrypt = config('firefly.encryption') ? 0 : 1; $encrypt = config('firefly.encryption') === true ? 0 : 1;
$set = $fqn::where($indicator, $encrypt)->get(); $set = $fqn::where($indicator, $encrypt)->get();
foreach ($set as $entry) { foreach ($set as $entry) {

View File

@@ -1,6 +1,6 @@
<?php <?php
/** /**
* Login.php * RequestedVersionCheckStatus.php
* Copyright (c) 2017 thegrumpydictator@gmail.com * Copyright (c) 2017 thegrumpydictator@gmail.com
* *
* This file is part of Firefly III. * This file is part of Firefly III.
@@ -21,12 +21,32 @@
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Object; namespace FireflyIII\Events;
use FireflyIII\User;
use Illuminate\Queue\SerializesModels;
/** /**
* Class Login * Class RequestedVersionCheckStatus
*/ */
class Login extends SpectreObject class RequestedVersionCheckStatus extends Event
{ {
use SerializesModels;
/**
* @var User
*/
public $user;
/**
* Create a new event instance. This event is triggered when Firefly III wants to know
* what the deal is with the version checker.
*
* @param User $user
*/
public function __construct(User $user)
{
$this->user = $user;
}
} }

View File

@@ -203,7 +203,7 @@ final class Entry
$entry->description = $transaction->transaction_description . '(' . $transaction->description . ')'; $entry->description = $transaction->transaction_description . '(' . $transaction->description . ')';
} }
$entry->currency_code = $transaction->transactionCurrency->code; $entry->currency_code = $transaction->transactionCurrency->code;
$entry->amount = round($transaction->transaction_amount, $transaction->transactionCurrency->decimal_places); $entry->amount = strval(round($transaction->transaction_amount, $transaction->transactionCurrency->decimal_places));
$entry->foreign_currency_code = null === $transaction->foreign_currency_id ? null : $transaction->foreignCurrency->code; $entry->foreign_currency_code = null === $transaction->foreign_currency_id ? null : $transaction->foreignCurrency->code;
$entry->foreign_amount = null === $transaction->foreign_currency_id $entry->foreign_amount = null === $transaction->foreign_currency_id
@@ -216,14 +216,14 @@ final class Entry
); );
$entry->transaction_type = $transaction->transaction_type_type; $entry->transaction_type = $transaction->transaction_type_type;
$entry->asset_account_id = $transaction->account_id; $entry->asset_account_id = strval($transaction->account_id);
$entry->asset_account_name = app('steam')->tryDecrypt($transaction->account_name); $entry->asset_account_name = app('steam')->tryDecrypt($transaction->account_name);
$entry->asset_account_iban = $transaction->account_iban; $entry->asset_account_iban = $transaction->account_iban;
$entry->asset_account_number = $transaction->account_number; $entry->asset_account_number = $transaction->account_number;
$entry->asset_account_bic = $transaction->account_bic; $entry->asset_account_bic = $transaction->account_bic;
$entry->asset_currency_code = $transaction->account_currency_code; $entry->asset_currency_code = $transaction->account_currency_code;
$entry->opposing_account_id = $transaction->opposing_account_id; $entry->opposing_account_id = strval($transaction->opposing_account_id);
$entry->opposing_account_name = app('steam')->tryDecrypt($transaction->opposing_account_name); $entry->opposing_account_name = app('steam')->tryDecrypt($transaction->opposing_account_name);
$entry->opposing_account_iban = $transaction->opposing_account_iban; $entry->opposing_account_iban = $transaction->opposing_account_iban;
$entry->opposing_account_number = $transaction->opposing_account_number; $entry->opposing_account_number = $transaction->opposing_account_number;
@@ -231,7 +231,7 @@ final class Entry
$entry->opposing_currency_code = $transaction->opposing_currency_code; $entry->opposing_currency_code = $transaction->opposing_currency_code;
// budget // budget
$entry->budget_id = $transaction->transaction_budget_id; $entry->budget_id = strval($transaction->transaction_budget_id);
$entry->budget_name = app('steam')->tryDecrypt($transaction->transaction_budget_name); $entry->budget_name = app('steam')->tryDecrypt($transaction->transaction_budget_name);
if (null === $transaction->transaction_budget_id) { if (null === $transaction->transaction_budget_id) {
$entry->budget_id = $transaction->transaction_journal_budget_id; $entry->budget_id = $transaction->transaction_journal_budget_id;
@@ -239,7 +239,7 @@ final class Entry
} }
// category // category
$entry->category_id = $transaction->transaction_category_id; $entry->category_id = strval($transaction->transaction_category_id);
$entry->category_name = app('steam')->tryDecrypt($transaction->transaction_category_name); $entry->category_name = app('steam')->tryDecrypt($transaction->transaction_category_name);
if (null === $transaction->transaction_category_id) { if (null === $transaction->transaction_category_id) {
$entry->category_id = $transaction->transaction_journal_category_id; $entry->category_id = $transaction->transaction_journal_category_id;
@@ -247,7 +247,7 @@ final class Entry
} }
// budget // budget
$entry->bill_id = $transaction->bill_id; $entry->bill_id = strval($transaction->bill_id);
$entry->bill_name = app('steam')->tryDecrypt($transaction->bill_name); $entry->bill_name = app('steam')->tryDecrypt($transaction->bill_name);
$entry->tags = $transaction->tags; $entry->tags = $transaction->tags;

View File

@@ -24,8 +24,6 @@ namespace FireflyIII\Export\Exporter;
use FireflyIII\Export\Entry\Entry; use FireflyIII\Export\Entry\Entry;
use League\Csv\Writer; use League\Csv\Writer;
use SplFileObject;
use SplTempFileObject;
use Storage; use Storage;
/** /**
@@ -66,11 +64,8 @@ class CsvExporter extends BasicExporter implements ExporterInterface
$fullPath = storage_path('export') . DIRECTORY_SEPARATOR . $this->fileName; $fullPath = storage_path('export') . DIRECTORY_SEPARATOR . $this->fileName;
//we create the CSV into memory //we create the CSV into memory
//$writer = Writer::createFromFileObject(new SplTempFileObject());
$writer = Writer::createFromPath($fullPath); $writer = Writer::createFromPath($fullPath);
//$writer = Writer::createFromPath(new SplFileObject($fullPath, 'a+'), 'w');
$rows = []; $rows = [];
// get field names for header row: // get field names for header row:
@@ -91,8 +86,6 @@ class CsvExporter extends BasicExporter implements ExporterInterface
$rows[] = $line; $rows[] = $line;
} }
$writer->insertAll($rows); $writer->insertAll($rows);
//$writer->output($fullPath);
//$writer->
return true; return true;
} }

View File

@@ -65,6 +65,7 @@ class MonthReportGenerator extends Support implements ReportGeneratorInterface
/** /**
* @return string * @return string
* @throws \Throwable
*/ */
public function generate(): string public function generate(): string
{ {

View File

@@ -76,6 +76,7 @@ class UserEventHandler
{ {
Log::debug('In checkSingleUserIsAdmin'); Log::debug('In checkSingleUserIsAdmin');
/** @var User $user */
$user = $event->user; $user = $event->user;
$count = User::count(); $count = User::count();

View File

@@ -23,20 +23,21 @@ declare(strict_types=1);
namespace FireflyIII\Handlers\Events; namespace FireflyIII\Handlers\Events;
use FireflyConfig;
use FireflyIII\Events\RequestedVersionCheckStatus;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Auth\Events\Login;
use Log; use Log;
use Preferences;
/** /**
* Class VersionCheckEventHandler * Class VersionCheckEventHandler
*/ */
class VersionCheckEventHandler class VersionCheckEventHandler
{ {
/** /**
* @param Login $event * @param RequestedVersionCheckStatus $event
*/ */
public function checkForUpdates(Login $event) public function checkForUpdates(RequestedVersionCheckStatus $event)
{ {
// in Sandstorm, cannot check for updates: // in Sandstorm, cannot check for updates:
$sandstorm = 1 === intval(getenv('SANDSTORM')); $sandstorm = 1 === intval(getenv('SANDSTORM'));
@@ -46,8 +47,12 @@ class VersionCheckEventHandler
/** @var User $user */ /** @var User $user */
$user = $event->user; $user = $event->user;
$permission = Preferences::getForUser($user, 'permission_update_check', -1); if (!$user->hasRole('owner')) {
$lastCheckTime = Preferences::getForUser($user, 'last_update_check', time()); return;
}
$permission = FireflyConfig::get('permission_update_check', -1);
$lastCheckTime = FireflyConfig::get('last_update_check', time());
$now = time(); $now = time();
if ($now - $lastCheckTime->data < 604800) { if ($now - $lastCheckTime->data < 604800) {
Log::debug('Checked for updates less than a week ago.'); Log::debug('Checked for updates less than a week ago.');
@@ -66,6 +71,8 @@ class VersionCheckEventHandler
return; return;
} }
// actually check for update and inform the user.
} }
} }

View File

@@ -101,13 +101,12 @@ class AccountController extends Controller
} }
/** /**
* @param Request $request
* @param AccountRepositoryInterface $repository * @param AccountRepositoryInterface $repository
* @param Account $account * @param Account $account
* *
* @return View * @return View
*/ */
public function delete(Request $request, AccountRepositoryInterface $repository, Account $account) public function delete(AccountRepositoryInterface $repository, Account $account)
{ {
$typeName = config('firefly.shortNamesByFullName.' . $account->accountType->type); $typeName = config('firefly.shortNamesByFullName.' . $account->accountType->type);
$subTitle = trans('firefly.delete_' . $typeName . '_account', ['name' => $account->name]); $subTitle = trans('firefly.delete_' . $typeName . '_account', ['name' => $account->name]);

View File

@@ -22,6 +22,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Admin; namespace FireflyIII\Http\Controllers\Admin;
use FireflyConfig;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
@@ -30,7 +31,6 @@ use FireflyIII\Services\Github\Object\Release;
use FireflyIII\Services\Github\Request\UpdateRequest; use FireflyIII\Services\Github\Request\UpdateRequest;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Log; use Log;
use Preferences;
use Response; use Response;
use Session; use Session;
@@ -67,7 +67,7 @@ class UpdateController extends Controller
{ {
$subTitle = trans('firefly.update_check_title'); $subTitle = trans('firefly.update_check_title');
$subTitleIcon = 'fa-star'; $subTitleIcon = 'fa-star';
$permission = app('preferences')->get('permission_update_check', -1); $permission = app('fireflyconfig')->get('permission_update_check', -1);
$selected = $permission->data; $selected = $permission->data;
$options = [ $options = [
'-1' => trans('firefly.updates_ask_me_later'), '-1' => trans('firefly.updates_ask_me_later'),
@@ -86,9 +86,9 @@ class UpdateController extends Controller
public function post(Request $request) public function post(Request $request)
{ {
$checkForUpdates = intval($request->get('check_for_updates')); $checkForUpdates = intval($request->get('check_for_updates'));
Preferences::set('permission_update_check', $checkForUpdates); FireflyConfig::set('permission_update_check', $checkForUpdates);
FireflyConfig::set('last_update_check', time());
Session::flash('success', strval(trans('firefly.configuration_updated'))); Session::flash('success', strval(trans('firefly.configuration_updated')));
Preferences::mark();
return redirect(route('admin.update-check')); return redirect(route('admin.update-check'));
} }
@@ -99,17 +99,19 @@ class UpdateController extends Controller
public function updateCheck() public function updateCheck()
{ {
$current = config('firefly.version'); $current = config('firefly.version');
$request = new UpdateRequest(); /** @var UpdateRequest $request */
$request = app(UpdateRequest::class);
$check = -2; $check = -2;
$first = new Release(['id' => '0', 'title' => '0', 'updated' => '2017-01-01', 'content' => '']);
$string = '';
try { try {
$request->call(); $request->call();
$releases = $request->getReleases(); $releases = $request->getReleases();
// first entry should be the latest entry: // first entry should be the latest entry:
/** @var Release $first */ /** @var Release $first */
$first = reset($releases); $first = reset($releases);
$string = '';
$check = version_compare($current, $first->getTitle()); $check = version_compare($current, $first->getTitle());
Preferences::set('last_update_check', time()); FireflyConfig::set('last_update_check', time());
} catch (FireflyException $e) { } catch (FireflyException $e) {
Log::error(sprintf('Could not check for updates: %s', $e->getMessage())); Log::error(sprintf('Could not check for updates: %s', $e->getMessage()));
} }
@@ -119,7 +121,12 @@ class UpdateController extends Controller
if ($check === -1) { if ($check === -1) {
// there is a new FF version! // there is a new FF version!
$string = strval(trans('firefly.update_new_version_alert', ['your_version' => $current, 'new_version' => $first->getTitle()])); $string = strval(
trans(
'firefly.update_new_version_alert',
['your_version' => $current, 'new_version' => $first->getTitle(), 'date' => $first->getUpdated()->formatLocalized($this->monthAndDayFormat)]
)
);
} }
if ($check === 0) { if ($check === 0) {
// you are running the current version! // you are running the current version!

View File

@@ -59,12 +59,11 @@ class AttachmentController extends Controller
} }
/** /**
* @param Request $request
* @param Attachment $attachment * @param Attachment $attachment
* *
* @return View * @return View
*/ */
public function delete(Request $request, Attachment $attachment) public function delete(Attachment $attachment)
{ {
$subTitle = trans('firefly.delete_attachment', ['name' => $attachment->filename]); $subTitle = trans('firefly.delete_attachment', ['name' => $attachment->filename]);

View File

@@ -64,7 +64,7 @@ class LoginController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Http\Response|\Symfony\Component\HttpFoundation\Response|void * @return \Illuminate\Http\Response|\Symfony\Component\HttpFoundation\Response
* *
* @throws \Illuminate\Validation\ValidationException * @throws \Illuminate\Validation\ValidationException
*/ */
@@ -102,7 +102,7 @@ class LoginController extends Controller
* @param Request $request * @param Request $request
* @param CookieJar $cookieJar * @param CookieJar $cookieJar
* *
* @return $this * @return $this|\Illuminate\Http\RedirectResponse
*/ */
public function logout(Request $request, CookieJar $cookieJar) public function logout(Request $request, CookieJar $cookieJar)
{ {

View File

@@ -91,12 +91,11 @@ class BillController extends Controller
} }
/** /**
* @param Request $request
* @param Bill $bill * @param Bill $bill
* *
* @return View * @return View
*/ */
public function delete(Request $request, Bill $bill) public function delete(Bill $bill)
{ {
// put previous url in session // put previous url in session
$this->rememberPreviousUri('bills.delete.uri'); $this->rememberPreviousUri('bills.delete.uri');

View File

@@ -118,12 +118,11 @@ class BudgetController extends Controller
} }
/** /**
* @param Request $request
* @param Budget $budget * @param Budget $budget
* *
* @return View * @return View
*/ */
public function delete(Request $request, Budget $budget) public function delete(Budget $budget)
{ {
$subTitle = trans('firefly.delete_budget', ['name' => $budget->name]); $subTitle = trans('firefly.delete_budget', ['name' => $budget->name]);

View File

@@ -80,12 +80,11 @@ class CategoryController extends Controller
} }
/** /**
* @param Request $request
* @param Category $category * @param Category $category
* *
* @return View * @return View
*/ */
public function delete(Request $request, Category $category) public function delete(Category $category)
{ {
$subTitle = trans('firefly.delete_category', ['name' => $category->name]); $subTitle = trans('firefly.delete_category', ['name' => $category->name]);

View File

@@ -25,6 +25,8 @@ namespace FireflyIII\Http\Controllers;
use Artisan; use Artisan;
use Carbon\Carbon; use Carbon\Carbon;
use DB; use DB;
use Exception;
use FireflyIII\Events\RequestedVersionCheckStatus;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Helpers\Collector\JournalCollectorInterface;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
@@ -38,7 +40,6 @@ use Illuminate\Support\Collection;
use Log; use Log;
use Monolog\Handler\RotatingFileHandler; use Monolog\Handler\RotatingFileHandler;
use Preferences; use Preferences;
use ReflectionException;
use Response; use Response;
use Route as RouteFacade; use Route as RouteFacade;
use View; use View;
@@ -185,7 +186,7 @@ class HomeController extends Controller
Log::debug('Call twig:clean...'); Log::debug('Call twig:clean...');
try { try {
Artisan::call('twig:clean'); Artisan::call('twig:clean');
} catch (ReflectionException $e) { } catch (Exception $e) {
// dont care // dont care
} }
Log::debug('Call view:clear...'); Log::debug('Call view:clear...');
@@ -234,6 +235,9 @@ class HomeController extends Controller
$transactions[] = [$set, $account]; $transactions[] = [$set, $account];
} }
// fire check update event:
event(new RequestedVersionCheckStatus(auth()->user()));
return view( return view(
'index', 'index',
compact('count', 'subTitle', 'transactions', 'showDeps', 'billCount', 'start', 'end', 'today') compact('count', 'subTitle', 'transactions', 'showDeps', 'billCount', 'start', 'end', 'today')

View File

@@ -60,7 +60,7 @@ class PrerequisitesController extends Controller
* *
* @param string $bank * @param string $bank
* *
* @return \Illuminate\Http\RedirectResponse|null * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse
* *
* @throws FireflyException * @throws FireflyException
*/ */

View File

@@ -108,8 +108,6 @@ class StatusController extends Controller
$result['running'] = true; $result['running'] = true;
} }
// TODO cannot handle 'error'
return Response::json($result); return Response::json($result);
} }
} }

View File

@@ -29,7 +29,6 @@ use FireflyIII\Models\AccountType;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\CacheProperties; use FireflyIII\Support\CacheProperties;
use Log;
use Response; use Response;
/** /**

View File

@@ -46,6 +46,7 @@ class IntroController
$specificSteps = $this->getSpecificSteps($route, $specificPage); $specificSteps = $this->getSpecificSteps($route, $specificPage);
if (0 === count($specificSteps)) { if (0 === count($specificSteps)) {
Log::debug(sprintf('No specific steps for route "%s" and page "%s"', $route, $specificPage)); Log::debug(sprintf('No specific steps for route "%s" and page "%s"', $route, $specificPage));
return Response::json($steps); return Response::json($steps);
} }
if ($this->hasOutroStep($route)) { if ($this->hasOutroStep($route)) {

View File

@@ -26,8 +26,8 @@ use FireflyIII\Http\Requests\TokenFormRequest;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use Illuminate\Http\Request;
use Google2FA; use Google2FA;
use Illuminate\Http\Request;
use Preferences; use Preferences;
use Session; use Session;
use View; use View;

View File

@@ -231,7 +231,7 @@ class ExpenseController extends Controller
$cache->addProperty($accounts->pluck('id')->toArray()); $cache->addProperty($accounts->pluck('id')->toArray());
$cache->addProperty($expense->pluck('id')->toArray()); $cache->addProperty($expense->pluck('id')->toArray());
if ($cache->has()) { if ($cache->has()) {
//return $cache->get(); // @codeCoverageIgnore return $cache->get(); // @codeCoverageIgnore
} }
$combined = $this->combineAccounts($expense); $combined = $this->combineAccounts($expense);
$all = new Collection; $all = new Collection;

View File

@@ -59,12 +59,10 @@ class SplitController extends Controller
/** @var CurrencyRepositoryInterface */ /** @var CurrencyRepositoryInterface */
private $currencies; private $currencies;
/** @var JournalTaskerInterface */
private $tasker;
/** @var JournalRepositoryInterface */ /** @var JournalRepositoryInterface */
private $repository; private $repository;
/** @var JournalTaskerInterface */
private $tasker;
/** /**
* *

View File

@@ -22,13 +22,7 @@ declare(strict_types=1);
namespace FireflyIII\Import\Configuration; namespace FireflyIII\Import\Configuration;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob; use FireflyIII\Models\ImportJob;
use FireflyIII\Support\Import\Configuration\ConfigurationInterface;
use FireflyIII\Support\Import\Configuration\Spectre\InputMandatory;
use FireflyIII\Support\Import\Configuration\Spectre\SelectCountry;
use FireflyIII\Support\Import\Configuration\Spectre\SelectProvider;
use Log;
/** /**
* Class SpectreConfigurator. * Class SpectreConfigurator.
@@ -54,58 +48,35 @@ class SpectreConfigurator implements ConfiguratorInterface
* @param array $data * @param array $data
* *
* @return bool * @return bool
*
* @throws FireflyException
*/ */
public function configureJob(array $data): bool public function configureJob(array $data): bool
{ {
$class = $this->getConfigurationClass(); die('cannot store config');
$job = $this->job;
/** @var ConfigurationInterface $object */
$object = new $class($this->job);
$object->setJob($job);
$result = $object->storeConfiguration($data);
$this->warning = $object->getWarningMessage();
return $result;
} }
/** /**
* Return the data required for the next step in the job configuration. * Return the data required for the next step in the job configuration.
* *
* @return array * @return array
*
* @throws FireflyException
*/ */
public function getNextData(): array public function getNextData(): array
{ {
$class = $this->getConfigurationClass(); // update config to tell Firefly we've redirected the user.
$job = $this->job; $config = $this->job->configuration;
/** @var ConfigurationInterface $object */ $config['is-redirected'] = true;
$object = app($class); $this->job->configuration = $config;
$object->setJob($job); $this->job->status = 'configured';
$this->job->save();
return $object->getData(); return $this->job->configuration;
} }
/** /**
* @return string * @return string
*
* @throws FireflyException
*/ */
public function getNextView(): string public function getNextView(): string
{ {
if (!$this->job->configuration['selected-country']) { return 'import.spectre.redirect';
return 'import.spectre.select-country';
}
if (!$this->job->configuration['selected-provider']) {
return 'import.spectre.select-provider';
}
if (!$this->job->configuration['has-input-mandatory']) {
return 'import.spectre.input-fields';
}
throw new FireflyException('No view for state');
} }
/** /**
@@ -123,16 +94,9 @@ class SpectreConfigurator implements ConfiguratorInterface
*/ */
public function isJobConfigured(): bool public function isJobConfigured(): bool
{ {
// job is configured (and can start) when token is empty:
$config = $this->job->configuration; $config = $this->job->configuration;
$config['selected-country'] = $config['selected-country'] ?? false; if ($config['has-token'] === false) {
$config['selected-provider'] = $config['selected-provider'] ?? false;
$config['has-input-mandatory'] = $config['has-input-mandatory'] ?? false;
$config['has-input-interactive'] = $config['has-input-interactive'] ?? true; // defaults to true.
$this->job->configuration = $config;
$this->job->save();
if ($config['selected-country'] && $config['selected-provider'] && $config['has-input-mandatory'] && $config['has-input-interactive']) {
// give job another status
return true; return true;
} }
@@ -144,45 +108,19 @@ class SpectreConfigurator implements ConfiguratorInterface
*/ */
public function setJob(ImportJob $job) public function setJob(ImportJob $job)
{ {
$this->job = $job; $defaultConfig = [
if (null === $this->job->configuration || 0 === count($this->job->configuration)) { 'has-token' => false,
Log::debug(sprintf('Gave import job %s initial configuration.', $this->job->key)); 'token' => '',
$this->job->configuration = [ 'token-expires' => 0,
'selected-country' => false, 'token-url' => '',
'is-redirected' => false,
]; ];
$this->job->save();
}
}
/** $config = $job->configuration;
* @return string $finalConfig = array_merge($defaultConfig, $config);
* $job->configuration = $finalConfig;
* @throws FireflyException $job->save();
*/ $this->job = $job;
private function getConfigurationClass(): string
{
$class = false;
switch (true) {
case !$this->job->configuration['selected-country']:
$class = SelectCountry::class;
break;
case !$this->job->configuration['selected-provider']:
$class = SelectProvider::class;
break;
case !$this->job->configuration['has-input-mandatory']:
$class = InputMandatory::class;
// no break
default:
break;
}
if (false === $class || 0 === strlen($class)) {
throw new FireflyException('Cannot handle current job state in getConfigurationClass().');
}
if (!class_exists($class)) {
throw new FireflyException(sprintf('Class %s does not exist in getConfigurationClass().', $class));
}
return $class;
} }
} }

View File

@@ -72,6 +72,7 @@ class CsvProcessor implements FileProcessorInterface
* @return bool * @return bool
* *
* @throws \League\Csv\Exception * @throws \League\Csv\Exception
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/ */
public function run(): bool public function run(): bool
{ {

View File

@@ -359,7 +359,7 @@ class ImportAccount
'name' => $this->accountName['value'] ?? '(no name)', 'name' => $this->accountName['value'] ?? '(no name)',
'iban' => $this->accountIban['value'] ?? null, 'iban' => $this->accountIban['value'] ?? null,
'active' => true, 'active' => true,
'virtualBalance' => null, 'virtualBalance' => '0',
]; ];
$this->account = $this->repository->store($data); $this->account = $this->repository->store($data);

View File

@@ -330,6 +330,7 @@ class ImportJournal
*/ */
private function selectAmountInput() private function selectAmountInput()
{ {
$info = [];
$converterClass = ''; $converterClass = '';
if (!is_null($this->amount)) { if (!is_null($this->amount)) {
Log::debug('Amount value is not NULL, assume this is the correct value.'); Log::debug('Amount value is not NULL, assume this is the correct value.');

View File

@@ -22,7 +22,6 @@ declare(strict_types=1);
namespace FireflyIII\Import\Prerequisites; namespace FireflyIII\Import\Prerequisites;
use FireflyIII\Jobs\GetSpectreProviders;
use FireflyIII\Models\Preference; use FireflyIII\Models\Preference;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -86,10 +85,6 @@ class SpectrePrerequisites implements PrerequisitesInterface
} }
Log::debug('All prerequisites are here!'); Log::debug('All prerequisites are here!');
// at this point, check if all providers are present. Providers are shared amongst
// users in a multi-user environment.
GetSpectreProviders::dispatch($this->user);
return false; return false;
} }

View File

@@ -22,11 +22,11 @@ declare(strict_types=1);
namespace FireflyIII\Import\Routine; namespace FireflyIII\Import\Routine;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob; use FireflyIII\Models\ImportJob;
use FireflyIII\Models\SpectreProvider;
use FireflyIII\Services\Spectre\Object\Customer; use FireflyIII\Services\Spectre\Object\Customer;
use FireflyIII\Services\Spectre\Request\CreateLoginRequest; use FireflyIII\Services\Spectre\Object\Token;
use FireflyIII\Services\Spectre\Request\ListLoginsRequest; use FireflyIII\Services\Spectre\Request\CreateTokenRequest;
use FireflyIII\Services\Spectre\Request\NewCustomerRequest; use FireflyIII\Services\Spectre\Request\NewCustomerRequest;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Log; use Log;
@@ -90,32 +90,49 @@ class SpectreRoutine implements RoutineInterface
return false; return false;
} }
set_time_limit(0);
Log::info(sprintf('Start with import job %s using Spectre.', $this->job->key)); Log::info(sprintf('Start with import job %s using Spectre.', $this->job->key));
set_time_limit(0);
// check if job has token first!
$config = $this->job->configuration;
$hasToken = $config['has-token'] ?? false;
if ($hasToken === false) {
Log::debug('Job has no token');
// create customer if user does not have one: // create customer if user does not have one:
$customer = $this->getCustomer(); $customer = $this->getCustomer();
Log::debug(sprintf('Customer ID is %s', $customer->getId()));
// use customer to request a token:
$uri = route('import.status', [$this->job->key]);
$token = $this->getToken($customer, $uri);
Log::debug(sprintf('Token is %s', $token->getToken()));
// list all logins present at Spectre // update job, give it the token:
$logins = $this->listLogins($customer); $config = $this->job->configuration;
$config['has-token'] = true;
$config['token'] = $token->getToken();
$config['token-expires'] = $token->getExpiresAt()->format('U');
$config['token-url'] = $token->getConnectUrl();
$this->job->configuration = $config;
// use latest (depending on status, and if login exists for selected country + provider) Log::debug('Job config is now', $config);
$country = $this->job->configuration['country'];
$providerId = $this->job->configuration['provider'];
$login = $this->filterLogins($logins, $country, $providerId);
// create new login if list is empty or no login exists. // update job, set status to "configuring".
if (is_null($login)) { $this->job->status = 'configuring';
$login = $this->createLogin($customer); $this->job->save();
var_dump($login); Log::debug(sprintf('Job status is now %s', $this->job->status));
exit;
}
echo '<pre>';
print_r($logins);
exit;
return true; return true;
} }
$isRedirected = $config['is-redirected'] ?? false;
if ($isRedirected === true) {
// assume user has "used" the token.
// ...
// now what?
throw new FireflyException('Application cannot handle this.');
}
throw new FireflyException('Application cannot handle this.');
}
/** /**
* @param ImportJob $job * @param ImportJob $job
@@ -135,49 +152,12 @@ class SpectreRoutine implements RoutineInterface
$newCustomerRequest->call(); $newCustomerRequest->call();
$customer = $newCustomerRequest->getCustomer(); $customer = $newCustomerRequest->getCustomer();
// store customer. Not sure where. User preference? TODO Preferences::setForUser($this->job->user, 'spectre_customer', $customer->toArray());
return $customer; return $customer;
} }
/**
* @param Customer $customer
*/
protected function createLogin(Customer $customer)
{
$providerId = intval($this->job->configuration['provider']);
$provider = $this->findProvider($providerId);
$createLoginRequest = new CreateLoginRequest($this->job->user);
$createLoginRequest->setCustomer($customer);
$createLoginRequest->setProvider($provider);
$createLoginRequest->setMandatoryFields($this->decrypt($this->job->configuration['mandatory-fields']));
$createLoginRequest->call();
echo '123';
// country code, provider code (find by spectre ID)
// credentials
// daily_refresh=true
// fetch_type=recent
// include_fake_providers=true
// store_credentials=true
var_dump($this->job->configuration);
exit;
}
/**
* @param int $providerId
*
* @return SpectreProvider|null
*/
protected function findProvider(int $providerId): ?SpectreProvider
{
return SpectreProvider::where('spectre_id', $providerId)->first();
}
/** /**
* @return Customer * @return Customer
* @throws \FireflyIII\Exceptions\FireflyException * @throws \FireflyIII\Exceptions\FireflyException
@@ -188,61 +168,27 @@ class SpectreRoutine implements RoutineInterface
if (is_null($preference)) { if (is_null($preference)) {
return $this->createCustomer(); return $this->createCustomer();
} }
var_dump($preference->data); $customer = new Customer($preference->data);
exit;
return $customer;
} }
/** /**
* @param Customer $customer * @param Customer $customer
* @param string $returnUri
* *
* @return array * @return Token
* @throws \FireflyIII\Exceptions\FireflyException * @throws \FireflyIII\Exceptions\FireflyException
*/ */
protected function listLogins(Customer $customer): array protected function getToken(Customer $customer, string $returnUri): Token
{ {
$listLoginRequest = new ListLoginsRequest($this->job->user); $request = new CreateTokenRequest($this->job->user);
$listLoginRequest->setCustomer($customer); $request->setUri($returnUri);
$listLoginRequest->call(); $request->setCustomer($customer);
$request->call();
Log::debug('Call to get token is finished');
$logins = $listLoginRequest->getLogins(); return $request->getToken();
return $logins;
}
/**
* @param array $configuration
*
* @return array
*/
private function decrypt(array $configuration): array
{
$new = [];
foreach ($configuration as $key => $value) {
$new[$key] = app('steam')->tryDecrypt($value);
}
return $new;
}
/**
* Return login belonging to country and provider
* TODO must return Login object, not array
*
* @param array $logins
* @param string $country
* @param int $providerId
*
* @return array|null
*/
private function filterLogins(array $logins, string $country, int $providerId): ?array
{
if (count($logins) === 0) {
return null;
}
foreach ($logins as $login) {
die('do some filter');
}
return null;
} }
} }

View File

@@ -236,7 +236,6 @@ class ImportStorage
// match bills if config calls for it. // match bills if config calls for it.
if (true === $this->matchBills) { if (true === $this->matchBills) {
//$this->/applyRules($journal);
Log::info('Cannot match bills (yet).'); Log::info('Cannot match bills (yet).');
$this->matchBills($journal); $this->matchBills($journal);
} }

View File

@@ -1,109 +0,0 @@
<?php
declare(strict_types=1);
/**
* GetSpectreProviders.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Jobs;
use FireflyIII\Models\Configuration;
use FireflyIII\Models\SpectreProvider;
use FireflyIII\Services\Spectre\Request\ListProvidersRequest;
use FireflyIII\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
/**
* Class GetSpectreProviders
*/
class GetSpectreProviders implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* @var User
*/
protected $user;
/**
* Create a new job instance.
*
* @param User $user
*/
public function __construct(User $user)
{
$this->user = $user;
Log::debug('Constructed job GetSpectreProviders');
}
/**
* Execute the job.
*
* @throws \Illuminate\Container\EntryNotFoundException
* @throws \Exception
*/
public function handle()
{
/** @var Configuration $configValue */
$configValue = app('fireflyconfig')->get('spectre_provider_download', 0);
$now = time();
if ($now - intval($configValue->data) < 86400) {
Log::debug(sprintf('Difference is %d, so will NOT execute job.', ($now - intval($configValue->data))));
return;
}
Log::debug(sprintf('Difference is %d, so will execute job.', ($now - intval($configValue->data))));
// get user
// fire away!
$request = new ListProvidersRequest($this->user);
$request->call();
// store all providers:
$providers = $request->getProviders();
foreach ($providers as $provider) {
// find provider?
$dbProvider = SpectreProvider::where('spectre_id', $provider['id'])->first();
if (is_null($dbProvider)) {
$dbProvider = new SpectreProvider;
}
// update fields:
$dbProvider->spectre_id = $provider['id'];
$dbProvider->code = $provider['code'];
$dbProvider->mode = $provider['mode'];
$dbProvider->status = $provider['status'];
$dbProvider->interactive = 1 === $provider['interactive'];
$dbProvider->automatic_fetch = 1 === $provider['automatic_fetch'];
$dbProvider->country_code = $provider['country_code'];
$dbProvider->data = $provider;
$dbProvider->save();
Log::debug(sprintf('Stored provider #%d under ID #%d', $provider['id'], $dbProvider->id));
}
app('fireflyconfig')->set('spectre_provider_download', time());
return;
}
}

View File

@@ -189,6 +189,7 @@ class Account extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param string $fieldName * @param string $fieldName
* *
* @return string * @return string
@@ -206,6 +207,7 @@ class Account extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return string * @return string
@@ -299,6 +301,7 @@ class Account extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param EloquentBuilder $query * @param EloquentBuilder $query
* @param array $types * @param array $types
*/ */
@@ -313,6 +316,7 @@ class Account extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param EloquentBuilder $query * @param EloquentBuilder $query
* @param string $name * @param string $name
* @param string $value * @param string $value
@@ -331,7 +335,9 @@ class Account extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function setIbanAttribute($value) public function setIbanAttribute($value)
@@ -341,6 +347,7 @@ class Account extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setNameAttribute($value) public function setNameAttribute($value)
@@ -352,7 +359,9 @@ class Account extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function setVirtualBalanceAttribute($value) public function setVirtualBalanceAttribute($value)

View File

@@ -69,6 +69,7 @@ class AccountMeta extends Model
/** /**
* @param $value * @param $value
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function setDataAttribute($value) public function setDataAttribute($value)

View File

@@ -70,6 +70,7 @@ class Attachment extends Model
/** /**
* Get all of the owning attachable models. * Get all of the owning attachable models.
*
* @codeCoverageIgnore * @codeCoverageIgnore
* *
* @return MorphTo * @return MorphTo
@@ -81,6 +82,7 @@ class Attachment extends Model
/** /**
* Returns the expected filename for this attachment. * Returns the expected filename for this attachment.
*
* @codeCoverageIgnore * @codeCoverageIgnore
* @return string * @return string
*/ */
@@ -91,6 +93,7 @@ class Attachment extends Model
/** /**
* @param $value * @param $value
*
* @codeCoverageIgnore * @codeCoverageIgnore
* @return null|string * @return null|string
*/ */
@@ -105,6 +108,7 @@ class Attachment extends Model
/** /**
* @param $value * @param $value
*
* @codeCoverageIgnore * @codeCoverageIgnore
* @return null|string * @return null|string
*/ */
@@ -119,6 +123,7 @@ class Attachment extends Model
/** /**
* @param $value * @param $value
*
* @codeCoverageIgnore * @codeCoverageIgnore
* @return null|string * @return null|string
*/ */
@@ -133,6 +138,7 @@ class Attachment extends Model
/** /**
* @param $value * @param $value
*
* @codeCoverageIgnore * @codeCoverageIgnore
* @return null|string * @return null|string
*/ */
@@ -147,6 +153,7 @@ class Attachment extends Model
/** /**
* @param $value * @param $value
*
* @codeCoverageIgnore * @codeCoverageIgnore
* @return null|string * @return null|string
*/ */
@@ -161,6 +168,7 @@ class Attachment extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param string $value * @param string $value
*/ */
public function setDescriptionAttribute(string $value) public function setDescriptionAttribute(string $value)
@@ -170,6 +178,7 @@ class Attachment extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param string $value * @param string $value
*/ */
public function setFilenameAttribute(string $value) public function setFilenameAttribute(string $value)
@@ -179,6 +188,7 @@ class Attachment extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param string $value * @param string $value
*/ */
public function setMimeAttribute(string $value) public function setMimeAttribute(string $value)
@@ -188,6 +198,7 @@ class Attachment extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param string $value * @param string $value
*/ */
public function setNotesAttribute(string $value) public function setNotesAttribute(string $value)
@@ -197,6 +208,7 @@ class Attachment extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param string $value * @param string $value
*/ */
public function setTitleAttribute(string $value) public function setTitleAttribute(string $value)

View File

@@ -96,6 +96,7 @@ class Bill extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return string * @return string
@@ -111,6 +112,7 @@ class Bill extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return string * @return string
@@ -135,6 +137,7 @@ class Bill extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setAmountMaxAttribute($value) public function setAmountMaxAttribute($value)
@@ -144,6 +147,7 @@ class Bill extends Model
/** /**
* @param $value * @param $value
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function setAmountMinAttribute($value) public function setAmountMinAttribute($value)
@@ -153,6 +157,7 @@ class Bill extends Model
/** /**
* @param $value * @param $value
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function setMatchAttribute($value) public function setMatchAttribute($value)
@@ -164,6 +169,7 @@ class Bill extends Model
/** /**
* @param $value * @param $value
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function setNameAttribute($value) public function setNameAttribute($value)

View File

@@ -84,7 +84,7 @@ class Budget extends Model
} }
/** /**
* @param Budget $value * @param string $value
* *
* @return Budget * @return Budget
*/ */
@@ -111,6 +111,7 @@ class Budget extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return string * @return string
@@ -126,6 +127,7 @@ class Budget extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setNameAttribute($value) public function setNameAttribute($value)

View File

@@ -77,6 +77,7 @@ class BudgetLimit extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setAmountAttribute($value) public function setAmountAttribute($value)

View File

@@ -83,7 +83,7 @@ class Category extends Model
} }
/** /**
* @param Category $value * @param string $value
* *
* @return Category * @return Category
*/ */
@@ -101,6 +101,7 @@ class Category extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return string * @return string
@@ -116,6 +117,7 @@ class Category extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setNameAttribute($value) public function setNameAttribute($value)

View File

@@ -49,6 +49,7 @@ class Configuration extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return mixed * @return mixed
@@ -60,6 +61,7 @@ class Configuration extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setDataAttribute($value) public function setDataAttribute($value)

View File

@@ -61,6 +61,7 @@ class ExportJob extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $status * @param $status
*/ */
public function change($status) public function change($status)

View File

@@ -127,6 +127,7 @@ class ImportJob extends Model
public function change(string $status): void public function change(string $status): void
{ {
if (in_array($status, $this->validStatus)) { if (in_array($status, $this->validStatus)) {
Log::debug(sprintf('Job status set (in model) to "%s"', $status));
$this->status = $status; $this->status = $status;
$this->save(); $this->save();
@@ -169,6 +170,7 @@ class ImportJob extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setConfigurationAttribute($value) public function setConfigurationAttribute($value)
@@ -178,6 +180,7 @@ class ImportJob extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setExtendedStatusAttribute($value) public function setExtendedStatusAttribute($value)

View File

@@ -69,7 +69,7 @@ class PiggyBank extends Model
{ {
if (auth()->check()) { if (auth()->check()) {
$piggyBankId = intval($value); $piggyBankId = intval($value);
$piggyBank = PiggyBank::where('piggy_banks.id', $piggyBankId) $piggyBank = self::where('piggy_banks.id', $piggyBankId)
->leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id') ->leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id')
->where('accounts.user_id', auth()->user()->id)->first(['piggy_banks.*']); ->where('accounts.user_id', auth()->user()->id)->first(['piggy_banks.*']);
if (!is_null($piggyBank)) { if (!is_null($piggyBank)) {
@@ -111,6 +111,7 @@ class PiggyBank extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return string * @return string
@@ -196,6 +197,7 @@ class PiggyBank extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setNameAttribute($value) public function setNameAttribute($value)
@@ -207,6 +209,7 @@ class PiggyBank extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setTargetamountAttribute($value) public function setTargetamountAttribute($value)

View File

@@ -62,6 +62,7 @@ class PiggyBankEvent extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setAmountAttribute($value) public function setAmountAttribute($value)

View File

@@ -60,6 +60,7 @@ class PiggyBankRepetition extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param EloquentBuilder $query * @param EloquentBuilder $query
* @param Carbon $start * @param Carbon $start
* @param Carbon $target * @param Carbon $target
@@ -73,6 +74,7 @@ class PiggyBankRepetition extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param EloquentBuilder $query * @param EloquentBuilder $query
* @param Carbon $date * @param Carbon $date
* *
@@ -96,6 +98,7 @@ class PiggyBankRepetition extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setCurrentamountAttribute($value) public function setCurrentamountAttribute($value)

View File

@@ -80,6 +80,7 @@ class Preference extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setDataAttribute($value) public function setDataAttribute($value)

View File

@@ -1,52 +0,0 @@
<?php
/**
* SpectreProvider.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Models;
use Illuminate\Database\Eloquent\Model;
/**
* Class SpectreProvider
*/
class SpectreProvider extends Model
{
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts
= [
'spectre_id' => 'int',
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
'interactive' => 'boolean',
'automatic_fetch' => 'boolean',
'data' => 'array',
];
/**
* @var array
*/
protected $fillable = ['spectre_id', 'code', 'mode', 'name', 'status', 'interactive', 'automatic_fetch', 'country_code', 'data'];
}

View File

@@ -123,6 +123,7 @@ class Tag extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return string * @return string
@@ -138,6 +139,7 @@ class Tag extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return string * @return string
@@ -171,6 +173,7 @@ class Tag extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setDescriptionAttribute($value) public function setDescriptionAttribute($value)
@@ -180,6 +183,7 @@ class Tag extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setTagAttribute($value) public function setTagAttribute($value)

View File

@@ -108,6 +108,7 @@ class Transaction extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param Builder $query * @param Builder $query
* @param string $table * @param string $table
* *
@@ -168,6 +169,7 @@ class Transaction extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return float|int * @return float|int
@@ -179,6 +181,7 @@ class Transaction extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param Builder $query * @param Builder $query
* @param Carbon $date * @param Carbon $date
*/ */
@@ -192,6 +195,7 @@ class Transaction extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param Builder $query * @param Builder $query
* @param Carbon $date * @param Carbon $date
*/ */
@@ -205,6 +209,7 @@ class Transaction extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param Builder $query * @param Builder $query
* @param array $types * @param array $types
*/ */
@@ -222,6 +227,7 @@ class Transaction extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setAmountAttribute($value) public function setAmountAttribute($value)

View File

@@ -59,7 +59,7 @@ class TransactionCurrency extends Model
{ {
if (auth()->check()) { if (auth()->check()) {
$currencyId = intval($value); $currencyId = intval($value);
$currency = TransactionCurrency::find($currencyId); $currency = self::find($currencyId);
if (!is_null($currency)) { if (!is_null($currency)) {
return $currency; return $currency;
} }

View File

@@ -141,6 +141,7 @@ class TransactionJournal extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param string $name * @param string $name
* *
* @return bool * @return bool
@@ -163,6 +164,7 @@ class TransactionJournal extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return string * @return string
@@ -214,6 +216,7 @@ class TransactionJournal extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param string $name * @param string $name
* *
* @return bool * @return bool
@@ -311,6 +314,7 @@ class TransactionJournal extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param EloquentBuilder $query * @param EloquentBuilder $query
* @param Carbon $date * @param Carbon $date
* *
@@ -323,6 +327,7 @@ class TransactionJournal extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param EloquentBuilder $query * @param EloquentBuilder $query
* @param Carbon $date * @param Carbon $date
* *
@@ -335,6 +340,7 @@ class TransactionJournal extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param EloquentBuilder $query * @param EloquentBuilder $query
*/ */
public function scopeSortCorrectly(EloquentBuilder $query) public function scopeSortCorrectly(EloquentBuilder $query)
@@ -346,6 +352,7 @@ class TransactionJournal extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param EloquentBuilder $query * @param EloquentBuilder $query
* @param array $types * @param array $types
*/ */
@@ -361,6 +368,7 @@ class TransactionJournal extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setDescriptionAttribute($value) public function setDescriptionAttribute($value)

View File

@@ -72,6 +72,7 @@ class TransactionJournalLink extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return null|string * @return null|string
@@ -96,6 +97,7 @@ class TransactionJournalLink extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setCommentAttribute($value): void public function setCommentAttribute($value): void

View File

@@ -50,6 +50,7 @@ class TransactionJournalMeta extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
* *
* @return mixed * @return mixed
@@ -61,6 +62,7 @@ class TransactionJournalMeta extends Model
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*
* @param $value * @param $value
*/ */
public function setDataAttribute($value) public function setDataAttribute($value)

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Providers; namespace FireflyIII\Providers;
use FireflyIII\Events\RegisteredUser; use FireflyIII\Events\RegisteredUser;
use FireflyIII\Events\RequestedVersionCheckStatus;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBank;
use FireflyIII\Models\PiggyBankRepetition; use FireflyIII\Models\PiggyBankRepetition;
@@ -54,6 +55,9 @@ class EventServiceProvider extends ServiceProvider
// is a User related event. // is a User related event.
Login::class => [ Login::class => [
'FireflyIII\Handlers\Events\UserEventHandler@checkSingleUserIsAdmin', 'FireflyIII\Handlers\Events\UserEventHandler@checkSingleUserIsAdmin',
],
RequestedVersionCheckStatus::class => [
'FireflyIII\Handlers\Events\VersionCheckEventHandler@checkForUpdates', 'FireflyIII\Handlers\Events\VersionCheckEventHandler@checkForUpdates',
], ],

View File

@@ -190,7 +190,7 @@ class AccountRepository implements AccountRepositoryInterface
// update the account: // update the account:
$account->name = $data['name']; $account->name = $data['name'];
$account->active = $data['active']; $account->active = $data['active'];
$account->virtual_balance = $data['virtualBalance']; $account->virtual_balance = trim($data['virtualBalance']) === '' ? '0' : $data['virtualBalance'];
$account->iban = $data['iban']; $account->iban = $data['iban'];
$account->save(); $account->save();
@@ -424,7 +424,7 @@ class AccountRepository implements AccountRepositoryInterface
'name' => $name . ' initial balance', 'name' => $name . ' initial balance',
'active' => false, 'active' => false,
'iban' => '', 'iban' => '',
'virtualBalance' => 0, 'virtualBalance' => '0',
]; ];
Log::debug('Going to create an opening balance opposing account.'); Log::debug('Going to create an opening balance opposing account.');

View File

@@ -252,7 +252,7 @@ trait FindAccountsTrait
'accountType' => 'reconcile', 'accountType' => 'reconcile',
'name' => $name, 'name' => $name,
'iban' => null, 'iban' => null,
'virtualBalance' => null, 'virtualBalance' => '0',
'active' => true, 'active' => true,
]; ];
$account = $this->storeAccount($data); $account = $this->storeAccount($data);

View File

@@ -26,7 +26,6 @@ use FireflyIII\Models\Account;
use FireflyIII\Models\Note; use FireflyIII\Models\Note;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionJournalLink;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
@@ -54,13 +53,6 @@ interface JournalRepositoryInterface
*/ */
public function countTransactions(TransactionJournal $journal): int; public function countTransactions(TransactionJournal $journal): int;
/**
* @param TransactionJournal $journal
*
* @return Note|null
*/
public function getNote(TransactionJournal $journal): ?Note;
/** /**
* Deletes a journal. * Deletes a journal.
* *
@@ -107,6 +99,13 @@ interface JournalRepositoryInterface
*/ */
public function getAssetTransaction(TransactionJournal $journal): ?Transaction; public function getAssetTransaction(TransactionJournal $journal): ?Transaction;
/**
* @param TransactionJournal $journal
*
* @return Note|null
*/
public function getNote(TransactionJournal $journal): ?Note;
/** /**
* @return Collection * @return Collection
*/ */

View File

@@ -37,20 +37,6 @@ interface UserRepositoryInterface
*/ */
public function all(): Collection; public function all(): Collection;
/**
* Returns the first user in the DB. Generally only works when there is just one.
*
* @return null|User
*/
public function first(): ?User;
/**
* @param array $data
*
* @return User
*/
public function store(array $data): User;
/** /**
* Gives a user a role. * Gives a user a role.
* *
@@ -119,6 +105,13 @@ interface UserRepositoryInterface
*/ */
public function findByEmail(string $email): ?User; public function findByEmail(string $email): ?User;
/**
* Returns the first user in the DB. Generally only works when there is just one.
*
* @return null|User
*/
public function first(): ?User;
/** /**
* Return basic user information. * Return basic user information.
* *
@@ -136,6 +129,13 @@ interface UserRepositoryInterface
*/ */
public function hasRole(User $user, string $role): bool; public function hasRole(User $user, string $role): bool;
/**
* @param array $data
*
* @return User
*/
public function store(array $data): User;
/** /**
* @param User $user * @param User $user
*/ */

View File

@@ -93,4 +93,16 @@ class Customer extends SpectreObject
{ {
$this->secret = $secret; $this->secret = $secret;
} }
/**
* @return array
*/
public function toArray(): array
{
return [
'id' => $this->id,
'identifier' => $this->identifier,
'secret' => $this->secret,
];
}
} }

View File

@@ -0,0 +1,76 @@
<?php
/**
* Token.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Object;
use Carbon\Carbon;
/**
* Class Token
*/
class Token extends SpectreObject
{
/** @var string */
private $connectUrl;
/** @var Carbon */
private $expiresAt;
/** @var string */
private $token;
/**
* Token constructor.
*
* @param array $data
*/
public function __construct(array $data)
{
$this->token = $data['token'];
$this->expiresAt = new Carbon($data['expires_at']);
$this->connectUrl = $data['connect_url'];
}
/**
* @return string
*/
public function getConnectUrl(): string
{
return $this->connectUrl;
}
/**
* @return Carbon
*/
public function getExpiresAt(): Carbon
{
return $this->expiresAt;
}
/**
* @return string
*/
public function getToken(): string
{
return $this->token;
}
}

View File

@@ -1,109 +0,0 @@
<?php
/**
* CreateLoginRequest.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Request;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\SpectreProvider;
use FireflyIII\Services\Spectre\Object\Customer;
/**
* Class CreateLoginRequest
*/
class CreateLoginRequest extends SpectreRequest
{
/** @var Customer */
private $customer;
/** @var array */
private $mandatoryFields = [];
/** @var SpectreProvider */
private $provider;
/**
*
* @throws FireflyException
*/
public function call(): void
{
// add mandatory fields to login object
$data = [
'customer_id' => $this->customer->getId(),
'country_code' => $this->provider->country_code,
'provider_code' => $this->provider->code,
'credentials' => $this->buildCredentials(),
'daily_refresh' => true,
'fetch_type' => 'recent',
'include_fake_providers' => true,
];
$uri = '/api/v3/logins';
$response = $this->sendSignedSpectrePost($uri, $data);
echo '<pre>';
print_r($response);
exit;
}
/**
* @param Customer $customer
*/
public function setCustomer(Customer $customer): void
{
$this->customer = $customer;
}
/**
* @param array $mandatoryFields
*/
public function setMandatoryFields(array $mandatoryFields): void
{
$this->mandatoryFields = $mandatoryFields;
}
/**
* @param SpectreProvider $provider
*/
public function setProvider(SpectreProvider $provider): void
{
$this->provider = $provider;
}
/**
* @return array
* @throws FireflyException
*/
private function buildCredentials(): array
{
$return = [];
/** @var array $requiredField */
foreach ($this->provider->data['required_fields'] as $requiredField) {
$fieldName = $requiredField['name'];
if (!isset($this->mandatoryFields[$fieldName])) {
throw new FireflyException(sprintf('Mandatory field "%s" is missing from job.', $fieldName));
}
$return[$fieldName] = $this->mandatoryFields[$fieldName];
}
return $return;
}
}

View File

@@ -0,0 +1,94 @@
<?php
/**
* CreateTokenRequest.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Request;
use FireflyIII\Services\Spectre\Object\Customer;
use FireflyIII\Services\Spectre\Object\Token;
/**
* Class CreateTokenRequest
*/
class CreateTokenRequest extends SpectreRequest
{
/** @var Customer */
private $customer;
/** @var Token */
private $token;
/** @var string */
private $uri;
/**
*
* @throws \FireflyIII\Exceptions\FireflyException
*/
public function call(): void
{
// add mandatory fields to login object
$data = [
'data' => [
'customer_id' => $this->customer->getId(),
'fetch_type' => 'recent',
'daily_refresh' => true,
'include_fake_providers' => true,
'show_consent_confirmation' => true,
'credentials_strategy' => 'ask',
'return_to' => $this->uri,
],
];
$uri = '/api/v3/tokens/create';
$response = $this->sendSignedSpectrePost($uri, $data);
$this->token = new Token($response['data']);
return;
}
/**
* @return Token
*/
public function getToken(): Token
{
return $this->token;
}
/**
* @param Customer $customer
*/
public function setCustomer(Customer $customer): void
{
$this->customer = $customer;
}
/**
* @param string $uri
*/
public function setUri(string $uri): void
{
$this->uri = $uri;
}
}

View File

@@ -1,101 +0,0 @@
<?php
/**
* ListLoginsRequest.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Request;
use FireflyIII\Services\Spectre\Object\Customer;
use Log;
/**
* Class ListLoginsRequest
*/
class ListLoginsRequest extends SpectreRequest
{
/** @var Customer */
protected $customer;
/** @var array */
protected $logins = [];
/**
*
* @throws \FireflyIII\Exceptions\FireflyException
*/
public function call(): void
{
$hasNextPage = true;
$nextId = 0;
while ($hasNextPage) {
Log::debug(sprintf('Now calling list-logins for next_id %d', $nextId));
$parameters = ['customer_id' => $this->customer->getId(), 'from_id' => $nextId];
$uri = '/api/v3/logins?' . http_build_query($parameters);
$response = $this->sendSignedSpectreGet($uri, []);
// count entries:
Log::debug(sprintf('Found %d entries in data-array', count($response['data'])));
// extract next ID
$hasNextPage = false;
if (isset($response['meta']['next_id']) && intval($response['meta']['next_id']) > $nextId) {
$hasNextPage = true;
$nextId = $response['meta']['next_id'];
Log::debug(sprintf('Next ID is now %d.', $nextId));
} else {
Log::debug('No next page.');
}
// store providers:
foreach ($response['data'] as $loginArray) {
var_dump($loginArray);
exit;
}
}
return;
}
/**
* @return Customer
*/
public function getCustomer(): Customer
{
return $this->customer;
}
/**
* @param Customer $customer
*/
public function setCustomer(Customer $customer): void
{
$this->customer = $customer;
}
/**
* @return array
*/
public function getLogins(): array
{
return $this->logins;
}
}

View File

@@ -1,81 +0,0 @@
<?php
/**
* ListProvidersRequest.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Request;
use Log;
/**
* Class ListProvidersRequest
*/
class ListProvidersRequest extends SpectreRequest
{
/**
* @var array
*/
protected $providers = [];
/**
* @throws \Exception
*/
public function call(): void
{
$hasNextPage = true;
$nextId = 0;
while ($hasNextPage) {
Log::debug(sprintf('Now calling for next_id %d', $nextId));
$parameters = ['include_fake_providers' => 'true', 'include_provider_fields' => 'true', 'from_id' => $nextId];
$uri = '/api/v3/providers?' . http_build_query($parameters);
$response = $this->sendSignedSpectreGet($uri, []);
// count entries:
Log::debug(sprintf('Found %d entries in data-array', count($response['data'])));
// extract next ID
$hasNextPage = false;
if (isset($response['meta']['next_id']) && intval($response['meta']['next_id']) > $nextId) {
$hasNextPage = true;
$nextId = $response['meta']['next_id'];
Log::debug(sprintf('Next ID is now %d.', $nextId));
} else {
Log::debug('No next page.');
}
// store providers:
foreach ($response['data'] as $providerArray) {
$providerId = $providerArray['id'];
$this->providers[$providerId] = $providerArray;
Log::debug(sprintf('Stored provider #%d', $providerId));
}
}
return;
}
/**
* @return array
*/
public function getProviders(): array
{
return $this->providers;
}
}

View File

@@ -43,13 +43,7 @@ class NewCustomerRequest extends SpectreRequest
], ],
]; ];
$uri = '/api/v3/customers/'; $uri = '/api/v3/customers/';
//$response = $this->sendSignedSpectrePost($uri, $data); $response = $this->sendSignedSpectrePost($uri, $data);
$response = ['data' => [
'id' => 527858,
'identifier' => 'default_ff3_customer',
'secret' => 'qpZjRPJRTb6mMcQgwDkssZ3fQVVDPIH04zBlkKC6MvI',
],
];
// create customer: // create customer:
$this->customer = new Customer($response['data']); $this->customer = new Customer($response['data']);

View File

@@ -40,8 +40,6 @@ abstract class SpectreRequest
* @var int * @var int
*/ */
protected $expiresAt = 0; protected $expiresAt = 0;
/** @var ServerPublicKey */
protected $serverPublicKey;
/** @var string */ /** @var string */
protected $serviceSecret = ''; protected $serviceSecret = '';
/** @var string */ /** @var string */
@@ -104,22 +102,6 @@ abstract class SpectreRequest
return $this->server; return $this->server;
} }
/**
* @return ServerPublicKey
*/
public function getServerPublicKey(): ServerPublicKey
{
return $this->serverPublicKey;
}
/**
* @param ServerPublicKey $serverPublicKey
*/
public function setServerPublicKey(ServerPublicKey $serverPublicKey)
{
$this->serverPublicKey = $serverPublicKey;
}
/** /**
* @return string * @return string
*/ */
@@ -144,14 +126,6 @@ abstract class SpectreRequest
$this->privateKey = $privateKey; $this->privateKey = $privateKey;
} }
/**
* @param string $secret
*/
public function setSecret(string $secret)
{
$this->secret = $secret;
}
/** /**
* @param string $method * @param string $method
* @param string $uri * @param string $uri
@@ -169,8 +143,6 @@ abstract class SpectreRequest
if ('get' === strtolower($method) || 'delete' === strtolower($method)) { if ('get' === strtolower($method) || 'delete' === strtolower($method)) {
$data = ''; $data = '';
} }
// base64(sha1_signature(private_key, "Expires-at|request_method|original_url|post_body|md5_of_uploaded_file|")))
// Prepare the signature
$toSign = $this->expiresAt . '|' . strtoupper($method) . '|' . $uri . '|' . $data . ''; // no file so no content there. $toSign = $this->expiresAt . '|' . strtoupper($method) . '|' . $uri . '|' . $data . ''; // no file so no content there.
Log::debug(sprintf('String to sign: "%s"', $toSign)); Log::debug(sprintf('String to sign: "%s"', $toSign));
$signature = ''; $signature = '';

View File

@@ -202,7 +202,7 @@ class Amount
/** /**
* @return \FireflyIII\Models\TransactionCurrency * @return \FireflyIII\Models\TransactionCurrency
* *
* @throws FireflyException * @throws \FireflyIII\Exceptions\FireflyException
*/ */
public function getDefaultCurrency(): TransactionCurrency public function getDefaultCurrency(): TransactionCurrency
{ {
@@ -216,7 +216,7 @@ class Amount
* *
* @return \FireflyIII\Models\TransactionCurrency * @return \FireflyIII\Models\TransactionCurrency
* *
* @throws FireflyException * @throws \FireflyIII\Exceptions\FireflyException
*/ */
public function getDefaultCurrencyByUser(User $user): TransactionCurrency public function getDefaultCurrencyByUser(User $user): TransactionCurrency
{ {

View File

@@ -24,7 +24,6 @@ namespace FireflyIII\Support\Binder;
use Carbon\Carbon; use Carbon\Carbon;
use Exception; use Exception;
use FireflyIII\Helpers\FiscalHelper;
use FireflyIII\Helpers\FiscalHelperInterface; use FireflyIII\Helpers\FiscalHelperInterface;
use Illuminate\Routing\Route; use Illuminate\Routing\Route;
use Log; use Log;

View File

@@ -25,6 +25,7 @@ namespace FireflyIII\Support;
use Amount as Amt; use Amount as Amt;
use Carbon\Carbon; use Carbon\Carbon;
use Eloquent; use Eloquent;
use FireflyIII\Exceptions\FireflyException;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\MessageBag; use Illuminate\Support\MessageBag;
use RuntimeException; use RuntimeException;
@@ -36,11 +37,12 @@ use Session;
class ExpandedForm class ExpandedForm
{ {
/** /**
* @param $name * @param string $name
* @param null $value * @param null $value
* @param array $options * @param array $options
* *
* @return string * @return string
* @throws \FireflyIII\Exceptions\FireflyException
*/ */
public function amount(string $name, $value = null, array $options = []): string public function amount(string $name, $value = null, array $options = []): string
{ {
@@ -53,6 +55,7 @@ class ExpandedForm
* @param array $options * @param array $options
* *
* @return string * @return string
* @throws \FireflyIII\Exceptions\FireflyException
*/ */
public function amountSmall(string $name, $value = null, array $options = []): string public function amountSmall(string $name, $value = null, array $options = []): string
{ {
@@ -65,6 +68,8 @@ class ExpandedForm
* @param array $options * @param array $options
* *
* @return string * @return string
* @throws \FireflyIII\Exceptions\FireflyException
*
*/ */
public function balance(string $name, $value = null, array $options = []): string public function balance(string $name, $value = null, array $options = []): string
{ {
@@ -594,8 +599,7 @@ class ExpandedForm
* *
* @return string * @return string
* *
* @throws \Throwable * @throws \FireflyIII\Exceptions\FireflyException
* @throws Facades\FireflyException
*/ */
private function currencyField(string $name, string $view, $value = null, array $options = []): string private function currencyField(string $name, string $view, $value = null, array $options = []): string
{ {

View File

@@ -1,121 +0,0 @@
<?php
/**
* InputMandatory.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Import\Configuration\Spectre;
use Crypt;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Models\SpectreProvider;
use FireflyIII\Support\Import\Configuration\ConfigurationInterface;
/**
* Class InputMandatory
*/
class InputMandatory implements ConfigurationInterface
{
/** @var ImportJob */
private $job;
/**
* Get the data necessary to show the configuration screen.
*
* @return array
*
* @throws FireflyException
*/
public function getData(): array
{
$config = $this->job->configuration;
$providerId = $config['provider'];
$provider = SpectreProvider::where('spectre_id', $providerId)->first();
if (is_null($provider)) {
throw new FireflyException(sprintf('Cannot find Spectre provider with ID #%d', $providerId));
}
$fields = $provider->data['required_fields'] ?? [];
$positions = [];
// Obtain a list of columns
foreach ($fields as $key => $row) {
$positions[$key] = $row['position'];
}
array_multisort($positions, SORT_ASC, $fields);
$country = SelectCountry::$allCountries[$config['country']] ?? $config['country'];
return compact('provider', 'country', 'fields');
}
/**
* Return possible warning to user.
*
* @return string
*/
public function getWarningMessage(): string
{
return '';
}
/**
* @param ImportJob $job
*/
public function setJob(ImportJob $job)
{
$this->job = $job;
}
/**
* Store the result.
*
* @param array $data
*
* @return bool
*
* @throws FireflyException
*/
public function storeConfiguration(array $data): bool
{
$config = $this->job->configuration;
$providerId = $config['provider'];
$provider = SpectreProvider::where('spectre_id', $providerId)->first();
if (is_null($provider)) {
throw new FireflyException(sprintf('Cannot find Spectre provider with ID #%d', $providerId));
}
$mandatory = [];
$fields = $provider->data['required_fields'] ?? [];
foreach ($fields as $field) {
$name = $field['name'];
$mandatory[$name] = Crypt::encrypt($data[$name]) ?? null;
}
// store in config of job:
$config['mandatory-fields'] = $mandatory;
$config['has-input-mandatory'] = true;
$this->job->configuration = $config;
$this->job->save();
// try to grab login for this job. See what happens?
// fire job that creates login object. user is redirected to "wait here" page (status page). Page should
// refresh and go back to interactive when user is supposed to enter SMS code or something.
// otherwise start downloading stuff
return true;
}
}

View File

@@ -1,348 +0,0 @@
<?php
/**
* SelectCountry.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Import\Configuration\Spectre;
use FireflyIII\Models\ImportJob;
use FireflyIII\Models\SpectreProvider;
use FireflyIII\Support\Import\Configuration\ConfigurationInterface;
/**
* Class SelectCountry
*/
class SelectCountry implements ConfigurationInterface
{
/**
* @var array
*/
public static $allCountries
= [
'AF' => 'Afghanistan',
'AX' => 'Aland Islands',
'AL' => 'Albania',
'DZ' => 'Algeria',
'AS' => 'American Samoa',
'AD' => 'Andorra',
'AO' => 'Angola',
'AI' => 'Anguilla',
'AQ' => 'Antarctica',
'AG' => 'Antigua and Barbuda',
'AR' => 'Argentina',
'AM' => 'Armenia',
'AW' => 'Aruba',
'AU' => 'Australia',
'AT' => 'Austria',
'AZ' => 'Azerbaijan',
'BS' => 'Bahamas',
'BH' => 'Bahrain',
'BD' => 'Bangladesh',
'BB' => 'Barbados',
'BY' => 'Belarus',
'BE' => 'Belgium',
'BZ' => 'Belize',
'BJ' => 'Benin',
'BM' => 'Bermuda',
'BT' => 'Bhutan',
'BO' => 'Bolivia',
'BQ' => 'Bonaire, Saint Eustatius and Saba',
'BA' => 'Bosnia and Herzegovina',
'BW' => 'Botswana',
'BV' => 'Bouvet Island',
'BR' => 'Brazil',
'IO' => 'British Indian Ocean Territory',
'VG' => 'British Virgin Islands',
'BN' => 'Brunei',
'BG' => 'Bulgaria',
'BF' => 'Burkina Faso',
'BI' => 'Burundi',
'KH' => 'Cambodia',
'CM' => 'Cameroon',
'CA' => 'Canada',
'CV' => 'Cape Verde',
'KY' => 'Cayman Islands',
'CF' => 'Central African Republic',
'TD' => 'Chad',
'CL' => 'Chile',
'CN' => 'China',
'CX' => 'Christmas Island',
'CC' => 'Cocos Islands',
'CO' => 'Colombia',
'KM' => 'Comoros',
'CK' => 'Cook Islands',
'CR' => 'Costa Rica',
'HR' => 'Croatia',
'CU' => 'Cuba',
'CW' => 'Curacao',
'CY' => 'Cyprus',
'CZ' => 'Czech Republic',
'CD' => 'Democratic Republic of the Congo',
'DK' => 'Denmark',
'DJ' => 'Djibouti',
'DM' => 'Dominica',
'DO' => 'Dominican Republic',
'TL' => 'East Timor',
'EC' => 'Ecuador',
'EG' => 'Egypt',
'SV' => 'El Salvador',
'GQ' => 'Equatorial Guinea',
'ER' => 'Eritrea',
'EE' => 'Estonia',
'ET' => 'Ethiopia',
'FK' => 'Falkland Islands',
'FO' => 'Faroe Islands',
'FJ' => 'Fiji',
'FI' => 'Finland',
'FR' => 'France',
'GF' => 'French Guiana',
'PF' => 'French Polynesia',
'TF' => 'French Southern Territories',
'GA' => 'Gabon',
'GM' => 'Gambia',
'GE' => 'Georgia',
'DE' => 'Germany',
'GH' => 'Ghana',
'GI' => 'Gibraltar',
'GR' => 'Greece',
'GL' => 'Greenland',
'GD' => 'Grenada',
'GP' => 'Guadeloupe',
'GU' => 'Guam',
'GT' => 'Guatemala',
'GG' => 'Guernsey',
'GN' => 'Guinea',
'GW' => 'Guinea-Bissau',
'GY' => 'Guyana',
'HT' => 'Haiti',
'HM' => 'Heard Island and McDonald Islands',
'HN' => 'Honduras',
'HK' => 'Hong Kong',
'HU' => 'Hungary',
'IS' => 'Iceland',
'IN' => 'India',
'ID' => 'Indonesia',
'IR' => 'Iran',
'IQ' => 'Iraq',
'IE' => 'Ireland',
'IM' => 'Isle of Man',
'IL' => 'Israel',
'IT' => 'Italy',
'CI' => 'Ivory Coast',
'JM' => 'Jamaica',
'JP' => 'Japan',
'JE' => 'Jersey',
'JO' => 'Jordan',
'KZ' => 'Kazakhstan',
'KE' => 'Kenya',
'KI' => 'Kiribati',
'XK' => 'Kosovo',
'KW' => 'Kuwait',
'KG' => 'Kyrgyzstan',
'LA' => 'Laos',
'LV' => 'Latvia',
'LB' => 'Lebanon',
'LS' => 'Lesotho',
'LR' => 'Liberia',
'LY' => 'Libya',
'LI' => 'Liechtenstein',
'LT' => 'Lithuania',
'LU' => 'Luxembourg',
'MO' => 'Macao',
'MK' => 'Macedonia',
'MG' => 'Madagascar',
'MW' => 'Malawi',
'MY' => 'Malaysia',
'MV' => 'Maldives',
'ML' => 'Mali',
'MT' => 'Malta',
'MH' => 'Marshall Islands',
'MQ' => 'Martinique',
'MR' => 'Mauritania',
'MU' => 'Mauritius',
'YT' => 'Mayotte',
'MX' => 'Mexico',
'FM' => 'Micronesia',
'MD' => 'Moldova',
'MC' => 'Monaco',
'MN' => 'Mongolia',
'ME' => 'Montenegro',
'MS' => 'Montserrat',
'MA' => 'Morocco',
'MZ' => 'Mozambique',
'MM' => 'Myanmar',
'NA' => 'Namibia',
'NR' => 'Nauru',
'NP' => 'Nepal',
'NL' => 'Netherlands',
'NC' => 'New Caledonia',
'NZ' => 'New Zealand',
'NI' => 'Nicaragua',
'NE' => 'Niger',
'NG' => 'Nigeria',
'NU' => 'Niue',
'NF' => 'Norfolk Island',
'KP' => 'North Korea',
'MP' => 'Northern Mariana Islands',
'NO' => 'Norway',
'OM' => 'Oman',
'PK' => 'Pakistan',
'PW' => 'Palau',
'PS' => 'Palestinian Territory',
'PA' => 'Panama',
'PG' => 'Papua New Guinea',
'PY' => 'Paraguay',
'PE' => 'Peru',
'PH' => 'Philippines',
'PN' => 'Pitcairn',
'PL' => 'Poland',
'PT' => 'Portugal',
'PR' => 'Puerto Rico',
'QA' => 'Qatar',
'CG' => 'Republic of the Congo',
'RE' => 'Reunion',
'RO' => 'Romania',
'RU' => 'Russia',
'RW' => 'Rwanda',
'BL' => 'Saint Barthelemy',
'SH' => 'Saint Helena',
'KN' => 'Saint Kitts and Nevis',
'LC' => 'Saint Lucia',
'MF' => 'Saint Martin',
'PM' => 'Saint Pierre and Miquelon',
'VC' => 'Saint Vincent and the Grenadines',
'WS' => 'Samoa',
'SM' => 'San Marino',
'ST' => 'Sao Tome and Principe',
'SA' => 'Saudi Arabia',
'SN' => 'Senegal',
'RS' => 'Serbia',
'SC' => 'Seychelles',
'SL' => 'Sierra Leone',
'SG' => 'Singapore',
'SX' => 'Sint Maarten',
'SK' => 'Slovakia',
'SI' => 'Slovenia',
'SB' => 'Solomon Islands',
'SO' => 'Somalia',
'ZA' => 'South Africa',
'GS' => 'South Georgia and the South Sandwich Islands',
'KR' => 'South Korea',
'SS' => 'South Sudan',
'ES' => 'Spain',
'LK' => 'Sri Lanka',
'SD' => 'Sudan',
'SR' => 'Suriname',
'SJ' => 'Svalbard and Jan Mayen',
'SZ' => 'Swaziland',
'SE' => 'Sweden',
'CH' => 'Switzerland',
'SY' => 'Syria',
'TW' => 'Taiwan',
'TJ' => 'Tajikistan',
'TZ' => 'Tanzania',
'TH' => 'Thailand',
'TG' => 'Togo',
'TK' => 'Tokelau',
'TO' => 'Tonga',
'TT' => 'Trinidad and Tobago',
'TN' => 'Tunisia',
'TR' => 'Turkey',
'TM' => 'Turkmenistan',
'TC' => 'Turks and Caicos Islands',
'TV' => 'Tuvalu',
'VI' => 'U.S. Virgin Islands',
'UG' => 'Uganda',
'UA' => 'Ukraine',
'AE' => 'United Arab Emirates',
'GB' => 'United Kingdom',
'US' => 'United States',
'UM' => 'United States Minor Outlying Islands',
'UY' => 'Uruguay',
'UZ' => 'Uzbekistan',
'VU' => 'Vanuatu',
'VA' => 'Vatican',
'VE' => 'Venezuela',
'VN' => 'Vietnam',
'WF' => 'Wallis and Futuna',
'EH' => 'Western Sahara',
'YE' => 'Yemen',
'ZM' => 'Zambia',
'ZW' => 'Zimbabwe',
'XF' => 'Fake Country (for testing)',
'XO' => 'Other financial applications',
];
/** @var ImportJob */
private $job;
/**
* Get the data necessary to show the configuration screen.
*
* @return array
*/
public function getData(): array
{
$providers = SpectreProvider::get();
$countries = [];
/** @var SpectreProvider $provider */
foreach ($providers as $provider) {
$countries[$provider->country_code] = self::$allCountries[$provider->country_code] ?? $provider->country_code;
}
asort($countries);
return compact('countries');
}
/**
* Return possible warning to user.
*
* @return string
*/
public function getWarningMessage(): string
{
return '';
}
/**
* @param ImportJob $job
*/
public function setJob(ImportJob $job)
{
$this->job = $job;
}
/**
* Store the result.
*
* @param array $data
*
* @return bool
*/
public function storeConfiguration(array $data): bool
{
$config = $this->job->configuration;
$config['country'] = $data['country_code'] ?? 'XF'; // default to fake country.
$config['selected-country'] = true;
$this->job->configuration = $config;
$this->job->save();
return true;
}
}

View File

@@ -1,93 +0,0 @@
<?php
/**
* SelectProvider.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Import\Configuration\Spectre;
use FireflyIII\Models\ImportJob;
use FireflyIII\Models\SpectreProvider;
use FireflyIII\Support\Import\Configuration\ConfigurationInterface;
/**
* Class SelectProvider
*/
class SelectProvider implements ConfigurationInterface
{
/** @var ImportJob */
private $job;
/**
* Get the data necessary to show the configuration screen.
*
* @return array
*/
public function getData(): array
{
$config = $this->job->configuration;
$selection = SpectreProvider::where('country_code', $config['country'])->where('status', 'active')->get();
$providers = [];
/** @var SpectreProvider $provider */
foreach ($selection as $provider) {
$providerId = $provider->spectre_id;
$name = $provider->data['name'];
$providers[$providerId] = $name;
}
$country = SelectCountry::$allCountries[$config['country']] ?? $config['country'];
return compact('providers', 'country');
}
/**
* Return possible warning to user.
*
* @return string
*/
public function getWarningMessage(): string
{
return '';
}
/**
* @param ImportJob $job
*/
public function setJob(ImportJob $job)
{
$this->job = $job;
}
/**
* Store the result.
*
* @param array $data
*
* @return bool
*/
public function storeConfiguration(array $data): bool
{
$config = $this->job->configuration;
$config['provider'] = intval($data['provider_code']) ?? 0; // default to fake country.
$config['selected-provider'] = true;
$this->job->configuration = $config;
$this->job->save();
return true;
}
}

View File

@@ -63,6 +63,7 @@ class BunqInformation implements InformationInterface
* @return array * @return array
* *
* @throws FireflyException * @throws FireflyException
* @throws \Exception
*/ */
public function getAccounts(): array public function getAccounts(): array
{ {

View File

@@ -1,217 +0,0 @@
<?php
/**
* SpectreInformation.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Support\Import\Information;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Services\Bunq\Object\Alias;
use FireflyIII\Services\Bunq\Object\MonetaryAccountBank;
use FireflyIII\Services\Bunq\Request\DeleteDeviceSessionRequest;
use FireflyIII\Services\Bunq\Request\DeviceSessionRequest;
use FireflyIII\Services\Bunq\Request\ListMonetaryAccountRequest;
use FireflyIII\Services\Bunq\Request\ListUserRequest;
use FireflyIII\Services\Bunq\Token\SessionToken;
use FireflyIII\Support\CacheProperties;
use FireflyIII\User;
use Illuminate\Support\Collection;
use Log;
use Preferences;
/**
* Class SpectreInformation
*/
class SpectreInformation implements InformationInterface
{
/** @var User */
private $user;
/**
* Returns a collection of accounts. Preferrably, these follow a uniform Firefly III format so they can be managed over banks.
*
* The format for these bank accounts is basically this:
*
* id: bank specific id
* name: bank appointed name
* number: account number (usually IBAN)
* currency: ISO code of currency
* balance: current balance
*
*
* any other fields are optional but can be useful:
* image: logo or account specific thing
* color: any associated color.
*
* @return array
*
* @throws FireflyException
* @throws \Exception
*/
public function getAccounts(): array
{
// cache for an hour:
$cache = new CacheProperties;
$cache->addProperty('bunq.get-accounts');
$cache->addProperty(date('dmy h'));
if ($cache->has()) {
return $cache->get(); // @codeCoverageIgnore
}
Log::debug('Now in getAccounts()');
$sessionToken = $this->startSession();
$userId = $this->getUserInformation($sessionToken);
// get list of Bunq accounts:
$accounts = $this->getMonetaryAccounts($sessionToken, $userId);
$return = [];
/** @var MonetaryAccountBank $account */
foreach ($accounts as $account) {
$current = [
'id' => $account->getId(),
'name' => $account->getDescription(),
'currency' => $account->getCurrency(),
'balance' => $account->getBalance()->getValue(),
'color' => $account->getSetting()->getColor(),
];
/** @var Alias $alias */
foreach ($account->getAliases() as $alias) {
if ('IBAN' === $alias->getType()) {
$current['number'] = $alias->getValue();
}
}
$return[] = $current;
}
$cache->store($return);
$this->closeSession($sessionToken);
return $return;
}
/**
* Set the user for this Prerequisites-routine. Class is expected to implement and save this.
*
* @param User $user
*/
public function setUser(User $user): void
{
$this->user = $user;
}
/**
* @param SessionToken $sessionToken
*
* @throws \Exception
*/
private function closeSession(SessionToken $sessionToken): void
{
Log::debug('Going to close session');
$apiKey = Preferences::getForUser($this->user, 'bunq_api_key')->data;
$serverPublicKey = Preferences::getForUser($this->user, 'bunq_server_public_key')->data;
$privateKey = Preferences::getForUser($this->user, 'bunq_private_key')->data;
$request = new DeleteDeviceSessionRequest();
$request->setSecret($apiKey);
$request->setPrivateKey($privateKey);
$request->setServerPublicKey($serverPublicKey);
$request->setSessionToken($sessionToken);
$request->call();
return;
}
/**
* @param SessionToken $sessionToken
* @param int $userId
*
* @return Collection
*
* @throws \Exception
*/
private function getMonetaryAccounts(SessionToken $sessionToken, int $userId): Collection
{
$apiKey = Preferences::getForUser($this->user, 'bunq_api_key')->data;
$serverPublicKey = Preferences::getForUser($this->user, 'bunq_server_public_key')->data;
$privateKey = Preferences::getForUser($this->user, 'bunq_private_key')->data;
$request = new ListMonetaryAccountRequest;
$request->setSessionToken($sessionToken);
$request->setSecret($apiKey);
$request->setServerPublicKey($serverPublicKey);
$request->setPrivateKey($privateKey);
$request->setUserId($userId);
$request->call();
return $request->getMonetaryAccounts();
}
/**
* @param SessionToken $sessionToken
*
* @return int
*
* @throws FireflyException
* @throws \Exception
*/
private function getUserInformation(SessionToken $sessionToken): int
{
$apiKey = Preferences::getForUser($this->user, 'bunq_api_key')->data;
$serverPublicKey = Preferences::getForUser($this->user, 'bunq_server_public_key')->data;
$privateKey = Preferences::getForUser($this->user, 'bunq_private_key')->data;
$request = new ListUserRequest;
$request->setSessionToken($sessionToken);
$request->setSecret($apiKey);
$request->setServerPublicKey($serverPublicKey);
$request->setPrivateKey($privateKey);
$request->call();
// return the first that isn't null?
$company = $request->getUserCompany();
if ($company->getId() > 0) {
return $company->getId();
}
$user = $request->getUserPerson();
if ($user->getId() > 0) {
return $user->getId();
}
throw new FireflyException('Expected user or company from Bunq, but got neither.');
}
/**
* @return SessionToken
*
* @throws \Exception
*/
private function startSession(): SessionToken
{
Log::debug('Now in startSession.');
$apiKey = Preferences::getForUser($this->user, 'bunq_api_key')->data;
$serverPublicKey = Preferences::getForUser($this->user, 'bunq_server_public_key')->data;
$privateKey = Preferences::getForUser($this->user, 'bunq_private_key')->data;
$installationToken = Preferences::getForUser($this->user, 'bunq_installation_token')->data;
$request = new DeviceSessionRequest();
$request->setSecret($apiKey);
$request->setServerPublicKey($serverPublicKey);
$request->setPrivateKey($privateKey);
$request->setInstallationToken($installationToken);
$request->call();
$sessionToken = $request->getSessionToken();
Log::debug(sprintf('Now have got session token: %s', serialize($sessionToken)));
return $sessionToken;
}
}

View File

@@ -473,6 +473,7 @@ class Navigation
$date->subMonths($subtract); $date->subMonths($subtract);
Log::debug(sprintf('%s is in modifier map with value %d, execute subMonths with argument %d', $repeatFreq, $modifierMap[$repeatFreq], $subtract)); Log::debug(sprintf('%s is in modifier map with value %d, execute subMonths with argument %d', $repeatFreq, $modifierMap[$repeatFreq], $subtract));
Log::debug(sprintf('subtractPeriod: resulting date is %s', $date->format('Y-m-d'))); Log::debug(sprintf('subtractPeriod: resulting date is %s', $date->format('Y-m-d')));
return $date; return $date;
} }
// a custom range requires the session start // a custom range requires the session start

View File

@@ -29,6 +29,7 @@ use FireflyIII\Models\TransactionJournal;
* This class will be magical! * This class will be magical!
* *
* Class AbstractTrigger * Class AbstractTrigger
* @method triggered
*/ */
class AbstractTrigger class AbstractTrigger
{ {
@@ -43,15 +44,6 @@ class AbstractTrigger
/** @var string Trigger value */ /** @var string Trigger value */
protected $triggerValue; protected $triggerValue;
/**
* AbstractTrigger constructor.
*
* @codeCoverageIgnore
*/
private function __construct()
{
}
/** /**
* Make a new trigger from the value given in the string. * Make a new trigger from the value given in the string.
* *

View File

@@ -340,7 +340,7 @@ class FireflyValidator extends Validator
* *
* @return bool * @return bool
*/ */
public function validateUniqueAccountNumberForUser($attribute, $value, $parameters): bool public function validateUniqueAccountNumberForUser($attribute, $value): bool
{ {
$accountId = $this->data['id'] ?? 0; $accountId = $this->data['id'] ?? 0;

10
composer.lock generated
View File

@@ -748,16 +748,16 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v5.5.27", "version": "v5.5.28",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "b4fb6eeb227b7327b4ca7f92263b693ec9ac9875" "reference": "cfafae1f2043208390a7c984e3070696f4969605"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/b4fb6eeb227b7327b4ca7f92263b693ec9ac9875", "url": "https://api.github.com/repos/laravel/framework/zipball/cfafae1f2043208390a7c984e3070696f4969605",
"reference": "b4fb6eeb227b7327b4ca7f92263b693ec9ac9875", "reference": "cfafae1f2043208390a7c984e3070696f4969605",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -878,7 +878,7 @@
"framework", "framework",
"laravel" "laravel"
], ],
"time": "2017-12-20T15:43:48+00:00" "time": "2017-12-26T16:24:40+00:00"
}, },
{ {
"name": "laravelcollective/html", "name": "laravelcollective/html",

View File

@@ -1,67 +0,0 @@
<?php
declare(strict_types=1);
/*
* 2017_12_09_111046_changes_for_spectre.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Class ChangesForSpectre
*/
class ChangesForSpectre extends Migration
{
/**
* Reverse the migrations.
*/
public function down()
{
}
/**
* Run the migrations.
*/
public function up()
{
// create provider table:
if (!Schema::hasTable('spectre_providers')) {
Schema::create(
'spectre_providers',
function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->softDeletes();
//'spectre_id', 'code', 'mode', 'name', 'status', 'interactive', 'automatic_fetch', 'country_code', 'data'
$table->integer('spectre_id', false, true);
$table->string('code', 100);
$table->string('mode', 20);
$table->string('status', 20);
$table->boolean('interactive')->default(0);
$table->boolean('automatic_fetch')->default(0);
$table->string('country_code', 3);
$table->text('data');
}
);
}
}
}

View File

@@ -92,7 +92,6 @@ function storeReconcile() {
transactions: ids, transactions: ids,
cleared: cleared, cleared: cleared,
}; };
console.log
var uri = overviewUri.replace('%start%', $('input[name="start_date"]').val()).replace('%end%', $('input[name="end_date"]').val()); var uri = overviewUri.replace('%start%', $('input[name="start_date"]').val()).replace('%end%', $('input[name="end_date"]').val());

View File

@@ -18,7 +18,7 @@
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>. * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** global: chartUri, incomeCategoryUri, expenseCategoryUri, expenseBudgetUri */ /** global: chartUri, incomeCategoryUri, expenseCategoryUri, expenseBudgetUri, token */
var fixHelper = function (e, tr) { var fixHelper = function (e, tr) {
"use strict"; "use strict";

View File

@@ -18,6 +18,8 @@
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>. * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** global: updateCheckUri */
$(function () { $(function () {
"use strict"; "use strict";

View File

@@ -18,7 +18,7 @@
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>. * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** global: infoIncomeUri, spent, budgeted, available, currencySymbol, budgetIndexUri, updateIncomeUri, periodStart, periodEnd, budgetAmountUri, accounting */ /** global: infoIncomeUri, token, spent, budgeted, available, currencySymbol, budgetIndexUri, updateIncomeUri, periodStart, periodEnd, budgetAmountUri, accounting */
/** /**
* *
*/ */

View File

@@ -35,8 +35,7 @@ function formatLabel(str, maxwidth){
var temp = ""; var temp = "";
words.forEach(function (item, index) { words.forEach(function (item, index) {
if(temp.length > 0) if (temp.length > 0) {
{
var concat = temp + ' ' + item; var concat = temp + ' ' + item;
if (concat.length > maxwidth) { if (concat.length > maxwidth) {
@@ -44,8 +43,7 @@ function formatLabel(str, maxwidth){
temp = ""; temp = "";
} }
else { else {
if(index === (words.length-1)) if (index === (words.length - 1)) {
{
sections.push(concat); sections.push(concat);
return; return;
} }
@@ -56,8 +54,7 @@ function formatLabel(str, maxwidth){
} }
} }
if(index === (words.length-1)) if (index === (words.length - 1)) {
{
sections.push(item); sections.push(item);
return; return;
} }

View File

@@ -17,7 +17,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>. * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** global: token */
$(function () { $(function () {
"use strict"; "use strict";
$('#help').click(showHelp); $('#help').click(showHelp);

View File

@@ -18,7 +18,7 @@
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>. * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** global: langImportSingleError, langImportMultiError, jobStartUrl, langImportTimeOutError, langImportFinished, langImportFatalError */ /** global: job, langImportSingleError, langImportMultiError, jobStartUrl, langImportTimeOutError, langImportFinished, langImportFatalError */
var timeOutId; var timeOutId;
var startInterval = 1000; var startInterval = 1000;
@@ -34,10 +34,12 @@ var knownErrors = 0;
$(function () { $(function () {
"use strict"; "use strict";
console.log('in start');
timeOutId = setTimeout(checkJobStatus, startInterval); timeOutId = setTimeout(checkJobStatus, startInterval);
$('.start-job').click(startJob); $('.start-job').click(startJob);
if (job.configuration['auto-start']) { if (job.configuration['auto-start']) {
console.log('Called startJob()!');
startJob(); startJob();
} }
}); });
@@ -46,6 +48,7 @@ $(function () {
* Downloads some JSON and responds to its content to see what the status is of the current import. * Downloads some JSON and responds to its content to see what the status is of the current import.
*/ */
function checkJobStatus() { function checkJobStatus() {
console.log('in checkJobStatus');
$.getJSON(jobStatusUri).done(reportOnJobStatus).fail(reportFailedJob); $.getJSON(jobStatusUri).done(reportOnJobStatus).fail(reportFailedJob);
} }
@@ -53,6 +56,7 @@ function checkJobStatus() {
* This method is called when the JSON query returns an error. If possible, this error is relayed to the user. * This method is called when the JSON query returns an error. If possible, this error is relayed to the user.
*/ */
function reportFailedJob(jqxhr, textStatus, error) { function reportFailedJob(jqxhr, textStatus, error) {
console.log('in reportFailedJob');
// hide all possible boxes: // hide all possible boxes:
$('.statusbox').hide(); $('.statusbox').hide();
@@ -72,6 +76,7 @@ function reportFailedJob(jqxhr, textStatus, error) {
* @param data * @param data
*/ */
function reportOnJobStatus(data) { function reportOnJobStatus(data) {
console.log('in reportOnJobStatus: ' + data.status);
switch (data.status) { switch (data.status) {
case "configured": case "configured":
@@ -80,6 +85,10 @@ function reportOnJobStatus(data) {
$('.statusbox').hide(); $('.statusbox').hide();
$('.status_configured').show(); $('.status_configured').show();
} }
if (job.configuration['auto-start']) {
console.log('Job is auto start. Check status again in 500ms.');
timeOutId = setTimeout(checkJobStatus, interval);
}
break; break;
case "running": case "running":
// job is running! Show the running box: // job is running! Show the running box:
@@ -122,7 +131,13 @@ function reportOnJobStatus(data) {
// show the fatal error box: // show the fatal error box:
$('.fatal_error').show(); $('.fatal_error').show();
break; break;
case "configuring":
// redirect back to configure screen.
console.log('Will now redirect to ' + jobConfigureUri);
window.location = jobConfigureUri;
break;
default: default:
console.error('Cannot handle job status ' + data.status);
break; break;
} }

View File

@@ -17,7 +17,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>. * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** global: token */
var fixHelper = function (e, tr) { var fixHelper = function (e, tr) {
"use strict"; "use strict";
var $originals = tr.children(); var $originals = tr.children();

View File

@@ -1,4 +1,3 @@
/* /*
* month.js * month.js
* Copyright (c) 2017 thegrumpydictator@gmail.com * Copyright (c) 2017 thegrumpydictator@gmail.com
@@ -18,10 +17,10 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>. * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** global: spentUri, categoryUri, budgetUri, expenseUri, incomeUri, mainUri */
$(function () { $(function () {
"use strict"; "use strict";
drawChart(); doubleYChart(mainUri, 'in-out-chart');
loadAjaxPartial('inOutAccounts', spentUri); loadAjaxPartial('inOutAccounts', spentUri);
loadAjaxPartial('inOutCategory', categoryUri); loadAjaxPartial('inOutCategory', categoryUri);
@@ -31,9 +30,3 @@ $(function () {
}); });
function drawChart() {
"use strict";
// month view:
doubleYChart(mainUri, 'in-out-chart');
}

View File

@@ -17,7 +17,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>. * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** global: startDate, endDate, accountIds */
function loadAjaxPartial(holder, uri) { function loadAjaxPartial(holder, uri) {
"use strict"; "use strict";
$.get(uri).done(function (data) { $.get(uri).done(function (data) {

View File

@@ -139,7 +139,6 @@ function setOptionalFromCookies() {
$('#inputExpRevAccounts').multiselect(defaultMultiSelect); $('#inputExpRevAccounts').multiselect(defaultMultiSelect);
} }
function catchSubmit() { function catchSubmit() {

View File

@@ -17,7 +17,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>. * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** global: token */
var fixHelper = function (e, tr) { var fixHelper = function (e, tr) {
"use strict"; "use strict";
var $originals = tr.children(); var $originals = tr.children();

View File

@@ -18,7 +18,7 @@
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>. * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** global: searchQuery,searchUri */ /** global: searchQuery,searchUri,token */

View File

@@ -48,7 +48,7 @@ $(function () {
}).addTo(mymap); }).addTo(mymap);
if (doPlaceMarker) { if (doPlaceMarker) {
var marker = L.marker([latitude, longitude]).addTo(mymap); L.marker([latitude, longitude]).addTo(mymap);
} }
} }
}); });

View File

@@ -18,7 +18,7 @@
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>. * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** global: edit_selected_txt, edit_bulk_selected_txt, delete_selected_txt */ /** global: edit_selected_txt, edit_bulk_selected_txt, delete_selected_txt, token */
/** /**
* *

View File

@@ -142,6 +142,22 @@ return [
'invalid_locale_settings' => 'Firefly III kann keine Geldbeträge formatieren, da auf Ihrem Server die erforderlichen Pakete fehlen. Es gibt <a href="https://github.com/firefly-iii/help/wiki/Missing-locale-packages">eine Anleitung</a>, wie dies behoben werden kann.', 'invalid_locale_settings' => 'Firefly III kann keine Geldbeträge formatieren, da auf Ihrem Server die erforderlichen Pakete fehlen. Es gibt <a href="https://github.com/firefly-iii/help/wiki/Missing-locale-packages">eine Anleitung</a>, wie dies behoben werden kann.',
'quickswitch' => 'Schnellauswahl', 'quickswitch' => 'Schnellauswahl',
// check for updates:
'update_check_title' => 'Check for updates',
'admin_update_check_title' => 'Automatically check for update',
'admin_update_check_explain' => 'Firefly III can check for updates automatically. When you enable this setting, it will contact Github to see if a new version of Firefly III is available. When it is, you will get a notification. You can test this notification using the button on the right. Please indicate below if you want Firefly III to check for updates.',
'check_for_updates_permission' => 'Firefly III can check for updates, but it needs your permission to do so. Please go to the <a href=":link">administration</a> to indicate if you would like this feature to be enabled.',
'updates_ask_me_later' => 'Ask me later',
'updates_do_not_check' => 'Do not check for updates',
'updates_enable_check' => 'Enable the check for updates',
'admin_update_check_now_title' => 'Check for updates now',
'admin_update_check_now_explain' => 'If you press the button, Firefly III will see if your current version is the latest.',
'check_for_updates_button' => 'Check now!',
'update_new_version_alert' => 'A new version is available. You are running v:your_version, the latest version is v:new_version which was released on :date.',
'update_current_version_alert' => 'You are running v:version, which is the latest available release.',
'update_newer_version_alert' => 'You are running v:your_version, which is newer than the latest release, v:new_version.',
'update_check_error' => 'An error occurred while checking for updates. Please view the log files.',
// search // search
'search' => 'Suche', 'search' => 'Suche',
'search_query' => 'Abfrage', 'search_query' => 'Abfrage',
@@ -245,7 +261,7 @@ return [
'apply_rule_selection' => 'Übernehmen Sie die Regel ":title" auf eine Auswahl Ihrer Transaktionen', 'apply_rule_selection' => 'Übernehmen Sie die Regel ":title" auf eine Auswahl Ihrer Transaktionen',
'apply_rule_selection_intro' => 'Regeln wie ":title" werden in der Regel nur auf neue oder aktualisierte Transaktionen angewandt, aber Sie können die Regel auch auf eine Auswahl Ihrer bestehenden Transaktionen anwenden. Dies kann nützlich sein, wenn Sie eine Regel aktualisiert haben und Sie die Änderungen benötigen, auf andere Transaktionen zu aktualisieren.', 'apply_rule_selection_intro' => 'Regeln wie ":title" werden in der Regel nur auf neue oder aktualisierte Transaktionen angewandt, aber Sie können die Regel auch auf eine Auswahl Ihrer bestehenden Transaktionen anwenden. Dies kann nützlich sein, wenn Sie eine Regel aktualisiert haben und Sie die Änderungen benötigen, auf andere Transaktionen zu aktualisieren.',
'include_transactions_from_accounts' => 'Überweisungen von diesem Konto einbeziehen', 'include_transactions_from_accounts' => 'Überweisungen von diesem Konto einbeziehen',
'applied_rule_selection' => 'Regel ": Titel" wurde auf Ihre Auswahl angewendet.', 'applied_rule_selection' => 'Regel ":title" wurde auf Ihre Auswahl angewendet.',
'execute' => 'Ausführen', 'execute' => 'Ausführen',
'apply_rule_group_selection' => 'Anwenden der Regelgruppe ":title" auf eine Auswahl Ihrer Transaktionen', 'apply_rule_group_selection' => 'Anwenden der Regelgruppe ":title" auf eine Auswahl Ihrer Transaktionen',
'apply_rule_group_selection_intro' => 'Regelgruppen wie ":title" werden in der Regel nur auf neue oder aktualisierte Transaktionen angewandt, aber Sie können die Gruppe auch auf eine Auswahl Ihrer bestehenden Transaktionen anwenden. Dies kann nützlich sein, wenn Sie eine Gruppe aktualisiert haben und Sie die Änderungen benötigen, auf andere Transaktionen zu aktualisieren.', 'apply_rule_group_selection_intro' => 'Regelgruppen wie ":title" werden in der Regel nur auf neue oder aktualisierte Transaktionen angewandt, aber Sie können die Gruppe auch auf eine Auswahl Ihrer bestehenden Transaktionen anwenden. Dies kann nützlich sein, wenn Sie eine Gruppe aktualisiert haben und Sie die Änderungen benötigen, auf andere Transaktionen zu aktualisieren.',
@@ -270,7 +286,7 @@ return [
'rule_trigger_to_account_contains_choice' => 'Zielkonto enthält..', 'rule_trigger_to_account_contains_choice' => 'Zielkonto enthält..',
'rule_trigger_to_account_contains' => 'Zielkonto enthält ":trigger_value"', 'rule_trigger_to_account_contains' => 'Zielkonto enthält ":trigger_value"',
'rule_trigger_transaction_type_choice' => 'Überweisung ist vom Typ..', 'rule_trigger_transaction_type_choice' => 'Überweisung ist vom Typ..',
'rule_trigger_transaction_type' => 'Transaktion ist vom Typ ": Trigger_value"', 'rule_trigger_transaction_type' => 'Transaktion ist vom Typ ":trigger_value"',
'rule_trigger_category_is_choice' => 'Kategorie ist..', 'rule_trigger_category_is_choice' => 'Kategorie ist..',
'rule_trigger_category_is' => 'Kategorie ist ":trigger_value"', 'rule_trigger_category_is' => 'Kategorie ist ":trigger_value"',
'rule_trigger_amount_less_choice' => 'Betrag ist geringer als..', 'rule_trigger_amount_less_choice' => 'Betrag ist geringer als..',

View File

@@ -169,6 +169,7 @@ return [
'budget_keep_transactions' => 'Die eine Überweisung, die mit diesem Budget verknüpft ist, wird nicht gelöscht. | Keines der :count Budgets, die mit dieser Rechnung verknüpft sind, werden gelöscht.', 'budget_keep_transactions' => 'Die eine Überweisung, die mit diesem Budget verknüpft ist, wird nicht gelöscht. | Keines der :count Budgets, die mit dieser Rechnung verknüpft sind, werden gelöscht.',
'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.', '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.', '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.',
'check_for_updates' => 'Check for updates',
'email' => 'E-Mail Adresse', 'email' => 'E-Mail Adresse',
'password' => 'Passwort', 'password' => 'Passwort',

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