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 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)

View File

@@ -208,14 +208,6 @@ opt/app/.env.heroku
opt/app/.env.sandstorm
opt/app/.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/app-graphics/firefly-iii-128.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/RegisteredUser.php
opt/app/app/Events/RequestedNewPassword.php
opt/app/app/Events/RequestedVersionCheckStatus.php
opt/app/app/Events/StoredTransactionJournal.php
opt/app/app/Events/UpdatedTransactionJournal.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/Generator/Chart/Basic/ChartJsGenerator.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/MultiYearReportGenerator.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/UpdatedJournalEventHandler.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/AttachmentHelperInterface.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/HomeController.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/AttachmentController.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/CategoryController.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/ReportController.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/HelpController.php
opt/app/app/Http/Controllers/HomeController.php
opt/app/app/Http/Controllers/Import/BankController.php
opt/app/app/Http/Controllers/Import/FileController.php
opt/app/app/Http/Controllers/ImportController.php
opt/app/app/Http/Controllers/Import/ConfigurationController.php
opt/app/app/Http/Controllers/Import/IndexController.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/Json/AutoCompleteController.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/BudgetController.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/ReportController.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/EncryptCookies.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/RedirectIfAuthenticated.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/EmailFormRequest.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/JournalLinkRequest.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/UserFormRequest.php
opt/app/app/Http/Requests/UserRegistrationRequest.php
opt/app/app/Http/breadcrumbs.php
opt/app/app/Import/Configurator/ConfiguratorInterface.php
opt/app/app/Import/Configurator/CsvConfigurator.php
opt/app/app/Import/Configuration/ConfiguratorInterface.php
opt/app/app/Import/Configuration/FileConfigurator.php
opt/app/app/Import/Configuration/SpectreConfigurator.php
opt/app/app/Import/Converter/Amount.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/INGDebetCredit.php
opt/app/app/Import/Converter/RabobankDebetCredit.php
opt/app/app/Import/Converter/INGDebitCredit.php
opt/app/app/Import/Converter/RabobankDebitCredit.php
opt/app/app/Import/FileProcessor/CsvProcessor.php
opt/app/app/Import/FileProcessor/FileProcessorInterface.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/ImportCurrency.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/IngDescription.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/Currency/ExchangeRateInterface.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/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/Binder/AccountList.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/FireflyConfig.php
opt/app/app/Support/Import/Configuration/ConfigurationInterface.php
opt/app/app/Support/Import/Configuration/Csv/Initial.php
opt/app/app/Support/Import/Configuration/Csv/Map.php
opt/app/app/Support/Import/Configuration/Csv/Roles.php
opt/app/app/Support/Import/Configuration/File/Initial.php
opt/app/app/Support/Import/Configuration/File/Map.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/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/Navigation.php
opt/app/app/Support/Preferences.php
@@ -730,12 +746,15 @@ opt/app/composer.lock
opt/app/composer.phar
opt/app/config/app.php
opt/app/config/auth.php
opt/app/config/breadcrumbs.php
opt/app/config/broadcasting.php
opt/app/config/cache.php
opt/app/config/csv.php
opt/app/config/database.php
opt/app/config/filesystems.php
opt/app/config/firefly.php
opt/app/config/google2fa.php
opt/app/config/import.php
opt/app/config/intro.php
opt/app/config/mail.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/TransactionCurrencySeeder.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/nginx_app.conf
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-wide.gif
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_white_acrobat.png
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/reconcile.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/edit.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/show.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/budget/all.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/default/all.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/year.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/rules/create-edit.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/form.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/list.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/firefly.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/list.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/form.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/list.php
opt/app/resources/lang/fr_FR/pagination.php
opt/app/resources/lang/fr_FR/passwords.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/bank.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/form.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/list.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/form.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/list.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/index.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/edit.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/import/bank/form.twig
opt/app/resources/views/import/bunq/prerequisites.twig
opt/app/resources/views/import/csv/initial.twig
opt/app/resources/views/import/csv/map.twig
opt/app/resources/views/import/csv/roles.twig
opt/app/resources/views/import/file/finished.twig
opt/app/resources/views/import/file/index.twig
opt/app/resources/views/import/file/status.twig
opt/app/resources/views/import/file/initial.twig
opt/app/resources/views/import/file/map.twig
opt/app/resources/views/import/file/roles.twig
opt/app/resources/views/import/file/upload.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/javascript/accounts.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/delete-account.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/budget/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/year.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/category.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/categories.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/journals-audit.twig
opt/app/resources/views/reports/partials/operations.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/rules/index.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/index.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/index.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/split/edit.twig
opt/app/routes/api.php
opt/app/routes/breadcrumbs.php
opt/app/routes/channels.php
opt/app/routes/console.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/bin/commonmark
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/LICENSE
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_static.php
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/config/breadcrumbs.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/scripts/test-coverage.sh
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/CurrentRoute.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exception.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Facade.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Generator.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Manager.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/ServiceProvider.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/View.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/tests/TestCase.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/src/BreadcrumbsException.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/BreadcrumbsGenerator.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/BreadcrumbsManager.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/BreadcrumbsServiceProvider.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exceptions/DuplicateBreadcrumbException.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exceptions/InvalidBreadcrumbException.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exceptions/UnnamedRouteException.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Exceptions/ViewNotSetException.php
opt/app/vendor/davejamesmiller/laravel-breadcrumbs/src/Facades/Breadcrumbs.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/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/LICENSE
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/EventServiceProvider.php
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/FilesystemAdapter.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/Optional.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/Str.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/RegexHelper.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/autoload.php
opt/app/vendor/league/csv/composer.json
opt/app/vendor/league/csv/src/AbstractCsv.php
opt/app/vendor/league/csv/src/Config/Controls.php
opt/app/vendor/league/csv/src/Config/Output.php
opt/app/vendor/league/csv/src/Exception/InvalidRowException.php
opt/app/vendor/league/csv/src/Modifier/MapIterator.php
opt/app/vendor/league/csv/src/Modifier/QueryFilter.php
opt/app/vendor/league/csv/src/Modifier/RowFilter.php
opt/app/vendor/league/csv/src/Modifier/StreamFilter.php
opt/app/vendor/league/csv/src/Modifier/StreamIterator.php
opt/app/vendor/league/csv/src/Plugin/ColumnConsistencyValidator.php
opt/app/vendor/league/csv/src/Plugin/ForbiddenNullValuesValidator.php
opt/app/vendor/league/csv/src/Plugin/SkipNullValuesFormatter.php
opt/app/vendor/league/csv/src/ByteSequence.php
opt/app/vendor/league/csv/src/CannotInsertRecord.php
opt/app/vendor/league/csv/src/CharsetConverter.php
opt/app/vendor/league/csv/src/ColumnConsistency.php
opt/app/vendor/league/csv/src/EncloseField.php
opt/app/vendor/league/csv/src/EscapeFormula.php
opt/app/vendor/league/csv/src/Exception.php
opt/app/vendor/league/csv/src/HTMLConverter.php
opt/app/vendor/league/csv/src/MapIterator.php
opt/app/vendor/league/csv/src/RFC4180Field.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/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/composer.json
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/zh.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/build-phar.sh
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/psalm-autoload.php
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/changelog.md
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/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/SecretKeyTooShortException.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/Vendor/Laravel/Facade.php
opt/app/vendor/pragmarx/google2fa/src/Vendor/Laravel/ServiceProvider.php
opt/app/vendor/pragmarx/google2fa/tests/spec/Google2FASpec.php
opt/app/vendor/pragmarx/google2fa/tests/Google2FATest.php
opt/app/vendor/pragmarx/google2fa/tests/bootstrap.php
opt/app/vendor/pragmarx/google2fa/upgrading.md
opt/app/vendor/psr/container/LICENSE
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/HeaderMock.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/phpunit.xml.dist
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/TraceableEventDispatcherInterface.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/README.md
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/DependencyInjection/RegisterListenersPassTest.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/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_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/MemcachedSessionHandlerTest.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/FragmentRendererPass.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/RegisterControllerArgumentLocatorsPass.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/FilterControllerEvent.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/LICENSE
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/Profile.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/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/Tests/Bundle/BundleTest.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/Config/EnvParametersResourceTest.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/ContainerControllerResolverTest.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/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/DataCollectorTest.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/FragmentRendererPassTest.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/RegisterControllerArgumentLocatorsPassTest.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/EventListener/AddRequestFormatsListenerTest.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/ChildBundle/Resources/foo.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/ExtendingRequest.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/KernelForTest.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/Bundle1Bundle/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/HttpKernelTest.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/Profiler/FileProfilerStorageTest.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/Compiler.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/Error.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/Text.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/NodeOutputInterface.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/Parser.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/Html.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/TemplateDirIterator.php
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/Cache/FilesystemTest.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/EnvironmentTest.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/Extension/CoreTest.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/FileExtensionEscapingStrategyTest.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/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_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/first.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_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/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/mixed_usage_with_raw.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/TextTest.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/TemplateWrapperTest.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/bootstrap.php
opt/app/vendor/vlucas/phpdotenv/LICENSE.txt
opt/app/vendor/vlucas/phpdotenv/composer.json
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/libxslt.so.1
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/nginx
usr/sbin/php-fpm7.1

View File

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

View File

@@ -2,6 +2,31 @@
All notable changes to this project will be documented in this file.
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
### Added
- 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->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();
/** @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->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;
}

View File

@@ -57,6 +57,12 @@ class UseEncryption extends Command
*/
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('Bill', 'name', 'name_encrypted');
$this->handleObjects('Bill', 'match', 'match_encrypted');
@@ -76,7 +82,7 @@ class UseEncryption extends Command
public function handleObjects(string $class, string $field, string $indicator)
{
$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();
foreach ($set as $entry) {

View File

@@ -1,6 +1,6 @@
<?php
/**
* Login.php
* RequestedVersionCheckStatus.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
@@ -21,12 +21,32 @@
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->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_amount = null === $transaction->foreign_currency_id
@@ -216,14 +216,14 @@ final class Entry
);
$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_iban = $transaction->account_iban;
$entry->asset_account_number = $transaction->account_number;
$entry->asset_account_bic = $transaction->account_bic;
$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_iban = $transaction->opposing_account_iban;
$entry->opposing_account_number = $transaction->opposing_account_number;
@@ -231,7 +231,7 @@ final class Entry
$entry->opposing_currency_code = $transaction->opposing_currency_code;
// 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);
if (null === $transaction->transaction_budget_id) {
$entry->budget_id = $transaction->transaction_journal_budget_id;
@@ -239,7 +239,7 @@ final class Entry
}
// 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);
if (null === $transaction->transaction_category_id) {
$entry->category_id = $transaction->transaction_journal_category_id;
@@ -247,7 +247,7 @@ final class Entry
}
// budget
$entry->bill_id = $transaction->bill_id;
$entry->bill_id = strval($transaction->bill_id);
$entry->bill_name = app('steam')->tryDecrypt($transaction->bill_name);
$entry->tags = $transaction->tags;

View File

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

View File

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

View File

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

View File

@@ -23,20 +23,21 @@ declare(strict_types=1);
namespace FireflyIII\Handlers\Events;
use FireflyConfig;
use FireflyIII\Events\RequestedVersionCheckStatus;
use FireflyIII\User;
use Illuminate\Auth\Events\Login;
use Log;
use Preferences;
/**
* 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:
$sandstorm = 1 === intval(getenv('SANDSTORM'));
@@ -46,8 +47,12 @@ class VersionCheckEventHandler
/** @var User $user */
$user = $event->user;
$permission = Preferences::getForUser($user, 'permission_update_check', -1);
$lastCheckTime = Preferences::getForUser($user, 'last_update_check', time());
if (!$user->hasRole('owner')) {
return;
}
$permission = FireflyConfig::get('permission_update_check', -1);
$lastCheckTime = FireflyConfig::get('last_update_check', time());
$now = time();
if ($now - $lastCheckTime->data < 604800) {
Log::debug('Checked for updates less than a week ago.');
@@ -66,6 +71,8 @@ class VersionCheckEventHandler
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 Account $account
*
* @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);
$subTitle = trans('firefly.delete_' . $typeName . '_account', ['name' => $account->name]);

View File

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

View File

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

View File

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

View File

@@ -91,12 +91,11 @@ class BillController extends Controller
}
/**
* @param Request $request
* @param Bill $bill
*
* @return View
*/
public function delete(Request $request, Bill $bill)
public function delete(Bill $bill)
{
// put previous url in session
$this->rememberPreviousUri('bills.delete.uri');
@@ -194,7 +193,7 @@ class BillController extends Controller
}
);
// paginate bills
$bills= new LengthAwarePaginator($collection, $total, $pageSize, $page);
$bills = new LengthAwarePaginator($collection, $total, $pageSize, $page);
$bills->setPath(route('bills.index'));
return view('bills.index', compact('bills'));

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -238,7 +238,7 @@ class ReportController extends Controller
private function parseAttributes(array $attributes): array
{
$attributes['location'] = $attributes['location'] ?? '';
$attributes['accounts'] = AccountList::routeBinder($attributes['accounts'] ?? '', new Route('get','',[]));
$attributes['accounts'] = AccountList::routeBinder($attributes['accounts'] ?? '', new Route('get', '', []));
try {
$attributes['startDate'] = Carbon::createFromFormat('Ymd', $attributes['startDate']);
} catch (InvalidArgumentException $e) {

View File

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

View File

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

View File

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

View File

@@ -22,13 +22,7 @@ declare(strict_types=1);
namespace FireflyIII\Import\Configuration;
use FireflyIII\Exceptions\FireflyException;
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.
@@ -54,58 +48,35 @@ class SpectreConfigurator implements ConfiguratorInterface
* @param array $data
*
* @return bool
*
* @throws FireflyException
*/
public function configureJob(array $data): bool
{
$class = $this->getConfigurationClass();
$job = $this->job;
/** @var ConfigurationInterface $object */
$object = new $class($this->job);
$object->setJob($job);
$result = $object->storeConfiguration($data);
$this->warning = $object->getWarningMessage();
return $result;
die('cannot store config');
}
/**
* Return the data required for the next step in the job configuration.
*
* @return array
*
* @throws FireflyException
*/
public function getNextData(): array
{
$class = $this->getConfigurationClass();
$job = $this->job;
/** @var ConfigurationInterface $object */
$object = app($class);
$object->setJob($job);
// update config to tell Firefly we've redirected the user.
$config = $this->job->configuration;
$config['is-redirected'] = true;
$this->job->configuration = $config;
$this->job->status = 'configured';
$this->job->save();
return $object->getData();
return $this->job->configuration;
}
/**
* @return string
*
* @throws FireflyException
*/
public function getNextView(): string
{
if (!$this->job->configuration['selected-country']) {
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');
return 'import.spectre.redirect';
}
/**
@@ -123,16 +94,9 @@ class SpectreConfigurator implements ConfiguratorInterface
*/
public function isJobConfigured(): bool
{
// job is configured (and can start) when token is empty:
$config = $this->job->configuration;
$config['selected-country'] = $config['selected-country'] ?? 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
if ($config['has-token'] === false) {
return true;
}
@@ -144,45 +108,19 @@ class SpectreConfigurator implements ConfiguratorInterface
*/
public function setJob(ImportJob $job)
{
$this->job = $job;
if (null === $this->job->configuration || 0 === count($this->job->configuration)) {
Log::debug(sprintf('Gave import job %s initial configuration.', $this->job->key));
$this->job->configuration = [
'selected-country' => false,
$defaultConfig = [
'has-token' => false,
'token' => '',
'token-expires' => 0,
'token-url' => '',
'is-redirected' => false,
];
$this->job->save();
}
}
/**
* @return string
*
* @throws FireflyException
*/
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;
$config = $job->configuration;
$finalConfig = array_merge($defaultConfig, $config);
$job->configuration = $finalConfig;
$job->save();
$this->job = $job;
}
}

View File

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

View File

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

View File

@@ -330,6 +330,7 @@ class ImportJournal
*/
private function selectAmountInput()
{
$info = [];
$converterClass = '';
if (!is_null($this->amount)) {
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;
use FireflyIII\Jobs\GetSpectreProviders;
use FireflyIII\Models\Preference;
use FireflyIII\User;
use Illuminate\Http\Request;
@@ -86,10 +85,6 @@ class SpectrePrerequisites implements PrerequisitesInterface
}
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;
}

View File

@@ -22,11 +22,11 @@ declare(strict_types=1);
namespace FireflyIII\Import\Routine;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Models\SpectreProvider;
use FireflyIII\Services\Spectre\Object\Customer;
use FireflyIII\Services\Spectre\Request\CreateLoginRequest;
use FireflyIII\Services\Spectre\Request\ListLoginsRequest;
use FireflyIII\Services\Spectre\Object\Token;
use FireflyIII\Services\Spectre\Request\CreateTokenRequest;
use FireflyIII\Services\Spectre\Request\NewCustomerRequest;
use Illuminate\Support\Collection;
use Log;
@@ -90,32 +90,49 @@ class SpectreRoutine implements RoutineInterface
return false;
}
set_time_limit(0);
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:
$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
$logins = $this->listLogins($customer);
// update job, give it the token:
$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)
$country = $this->job->configuration['country'];
$providerId = $this->job->configuration['provider'];
$login = $this->filterLogins($logins, $country, $providerId);
Log::debug('Job config is now', $config);
// create new login if list is empty or no login exists.
if (is_null($login)) {
$login = $this->createLogin($customer);
var_dump($login);
exit;
}
echo '<pre>';
print_r($logins);
exit;
// update job, set status to "configuring".
$this->job->status = 'configuring';
$this->job->save();
Log::debug(sprintf('Job status is now %s', $this->job->status));
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
@@ -135,49 +152,12 @@ class SpectreRoutine implements RoutineInterface
$newCustomerRequest->call();
$customer = $newCustomerRequest->getCustomer();
// store customer. Not sure where. User preference? TODO
Preferences::setForUser($this->job->user, 'spectre_customer', $customer->toArray());
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
* @throws \FireflyIII\Exceptions\FireflyException
@@ -188,61 +168,27 @@ class SpectreRoutine implements RoutineInterface
if (is_null($preference)) {
return $this->createCustomer();
}
var_dump($preference->data);
exit;
$customer = new Customer($preference->data);
return $customer;
}
/**
* @param Customer $customer
* @param string $returnUri
*
* @return array
* @return Token
* @throws \FireflyIII\Exceptions\FireflyException
*/
protected function listLogins(Customer $customer): array
protected function getToken(Customer $customer, string $returnUri): Token
{
$listLoginRequest = new ListLoginsRequest($this->job->user);
$listLoginRequest->setCustomer($customer);
$listLoginRequest->call();
$request = new CreateTokenRequest($this->job->user);
$request->setUri($returnUri);
$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.
if (true === $this->matchBills) {
//$this->/applyRules($journal);
Log::info('Cannot match bills (yet).');
$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
*
* @param string $fieldName
*
* @return string
@@ -206,6 +207,7 @@ class Account extends Model
/**
* @codeCoverageIgnore
*
* @param $value
*
* @return string
@@ -299,6 +301,7 @@ class Account extends Model
/**
* @codeCoverageIgnore
*
* @param EloquentBuilder $query
* @param array $types
*/
@@ -313,6 +316,7 @@ class Account extends Model
/**
* @codeCoverageIgnore
*
* @param EloquentBuilder $query
* @param string $name
* @param string $value
@@ -331,7 +335,9 @@ class Account extends Model
/**
* @codeCoverageIgnore
*
* @param $value
*
* @codeCoverageIgnore
*/
public function setIbanAttribute($value)
@@ -341,6 +347,7 @@ class Account extends Model
/**
* @codeCoverageIgnore
*
* @param $value
*/
public function setNameAttribute($value)
@@ -352,7 +359,9 @@ class Account extends Model
/**
* @codeCoverageIgnore
*
* @param $value
*
* @codeCoverageIgnore
*/
public function setVirtualBalanceAttribute($value)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -80,6 +80,7 @@ class Preference extends Model
/**
* @codeCoverageIgnore
*
* @param $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
*
* @param $value
*
* @return string
@@ -138,6 +139,7 @@ class Tag extends Model
/**
* @codeCoverageIgnore
*
* @param $value
*
* @return string
@@ -171,6 +173,7 @@ class Tag extends Model
/**
* @codeCoverageIgnore
*
* @param $value
*/
public function setDescriptionAttribute($value)
@@ -180,6 +183,7 @@ class Tag extends Model
/**
* @codeCoverageIgnore
*
* @param $value
*/
public function setTagAttribute($value)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -37,20 +37,6 @@ interface UserRepositoryInterface
*/
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.
*
@@ -119,6 +105,13 @@ interface UserRepositoryInterface
*/
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.
*
@@ -136,6 +129,13 @@ interface UserRepositoryInterface
*/
public function hasRole(User $user, string $role): bool;
/**
* @param array $data
*
* @return User
*/
public function store(array $data): User;
/**
* @param User $user
*/

View File

@@ -93,4 +93,16 @@ class Customer extends SpectreObject
{
$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/';
//$response = $this->sendSignedSpectrePost($uri, $data);
$response = ['data' => [
'id' => 527858,
'identifier' => 'default_ff3_customer',
'secret' => 'qpZjRPJRTb6mMcQgwDkssZ3fQVVDPIH04zBlkKC6MvI',
],
];
$response = $this->sendSignedSpectrePost($uri, $data);
// create customer:
$this->customer = new Customer($response['data']);

View File

@@ -40,8 +40,6 @@ abstract class SpectreRequest
* @var int
*/
protected $expiresAt = 0;
/** @var ServerPublicKey */
protected $serverPublicKey;
/** @var string */
protected $serviceSecret = '';
/** @var string */
@@ -104,22 +102,6 @@ abstract class SpectreRequest
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
*/
@@ -144,14 +126,6 @@ abstract class SpectreRequest
$this->privateKey = $privateKey;
}
/**
* @param string $secret
*/
public function setSecret(string $secret)
{
$this->secret = $secret;
}
/**
* @param string $method
* @param string $uri
@@ -169,8 +143,6 @@ abstract class SpectreRequest
if ('get' === strtolower($method) || 'delete' === strtolower($method)) {
$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.
Log::debug(sprintf('String to sign: "%s"', $toSign));
$signature = '';

View File

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

View File

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

View File

@@ -25,6 +25,7 @@ namespace FireflyIII\Support;
use Amount as Amt;
use Carbon\Carbon;
use Eloquent;
use FireflyIII\Exceptions\FireflyException;
use Illuminate\Support\Collection;
use Illuminate\Support\MessageBag;
use RuntimeException;
@@ -36,11 +37,12 @@ use Session;
class ExpandedForm
{
/**
* @param $name
* @param string $name
* @param null $value
* @param array $options
*
* @return string
* @throws \FireflyIII\Exceptions\FireflyException
*/
public function amount(string $name, $value = null, array $options = []): string
{
@@ -53,6 +55,7 @@ class ExpandedForm
* @param array $options
*
* @return string
* @throws \FireflyIII\Exceptions\FireflyException
*/
public function amountSmall(string $name, $value = null, array $options = []): string
{
@@ -65,6 +68,8 @@ class ExpandedForm
* @param array $options
*
* @return string
* @throws \FireflyIII\Exceptions\FireflyException
*
*/
public function balance(string $name, $value = null, array $options = []): string
{
@@ -594,8 +599,7 @@ class ExpandedForm
*
* @return string
*
* @throws \Throwable
* @throws Facades\FireflyException
* @throws \FireflyIII\Exceptions\FireflyException
*/
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
*
* @throws FireflyException
* @throws \Exception
*/
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);
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')));
return $date;
}
// a custom range requires the session start

View File

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

View File

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

10
composer.lock generated
View File

@@ -748,16 +748,16 @@
},
{
"name": "laravel/framework",
"version": "v5.5.27",
"version": "v5.5.28",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "b4fb6eeb227b7327b4ca7f92263b693ec9ac9875"
"reference": "cfafae1f2043208390a7c984e3070696f4969605"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/b4fb6eeb227b7327b4ca7f92263b693ec9ac9875",
"reference": "b4fb6eeb227b7327b4ca7f92263b693ec9ac9875",
"url": "https://api.github.com/repos/laravel/framework/zipball/cfafae1f2043208390a7c984e3070696f4969605",
"reference": "cfafae1f2043208390a7c984e3070696f4969605",
"shasum": ""
},
"require": {
@@ -878,7 +878,7 @@
"framework",
"laravel"
],
"time": "2017-12-20T15:43:48+00:00"
"time": "2017-12-26T16:24:40+00:00"
},
{
"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,
cleared: cleared,
};
console.log
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/>.
*/
/** global: chartUri, incomeCategoryUri, expenseCategoryUri, expenseBudgetUri */
/** global: chartUri, incomeCategoryUri, expenseCategoryUri, expenseBudgetUri, token */
var fixHelper = function (e, tr) {
"use strict";

View File

@@ -18,6 +18,8 @@
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
/** global: updateCheckUri */
$(function () {
"use strict";
@@ -31,7 +33,7 @@ function checkUpdate() {
// do post update check:
$.post(updateCheckUri).done(function (data) {
alert(data.result);
}).fail(function() {
}).fail(function () {
alert('Error while checking.');
});

View File

@@ -18,7 +18,7 @@
* 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 */
/**
*
*/
@@ -104,7 +104,7 @@ function updateBudgetedAmounts(e) {
var target = $(e.target);
var id = target.data('id');
var leftCell = $('td[class$="left"][data-id="' + id + '"]');
var link = $('a[data-id="'+id+'"][class="budget-link"]');
var link = $('a[data-id="' + id + '"][class="budget-link"]');
var value = target.val();
var original = target.data('original');
@@ -112,7 +112,7 @@ function updateBudgetedAmounts(e) {
target.prop('disabled', true);
// replace link (for now)
link.attr('href','#');
link.attr('href', '#');
// replace "left" with spinner.
leftCell.empty().html('<i class="fa fa-fw fa-spin fa-spinner"></i>');

View File

@@ -29,40 +29,37 @@
* @param maxwidth
* @returns {Array}
*/
function formatLabel(str, maxwidth){
function formatLabel(str, maxwidth) {
var sections = [];
var words = str.split(" ");
var temp = "";
words.forEach(function(item, index){
if(temp.length > 0)
{
words.forEach(function (item, index) {
if (temp.length > 0) {
var concat = temp + ' ' + item;
if(concat.length > maxwidth){
if (concat.length > maxwidth) {
sections.push(temp);
temp = "";
}
else{
if(index === (words.length-1))
{
else {
if (index === (words.length - 1)) {
sections.push(concat);
return;
}
else{
else {
temp = concat;
return;
}
}
}
if(index === (words.length-1))
{
if (index === (words.length - 1)) {
sections.push(item);
return;
}
if(item.length < maxwidth) {
if (item.length < maxwidth) {
temp = item;
}
else {

View File

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

View File

@@ -18,7 +18,7 @@
* 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 startInterval = 1000;
@@ -34,10 +34,12 @@ var knownErrors = 0;
$(function () {
"use strict";
console.log('in start');
timeOutId = setTimeout(checkJobStatus, startInterval);
$('.start-job').click(startJob);
if (job.configuration['auto-start']) {
console.log('Called 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.
*/
function checkJobStatus() {
console.log('in checkJobStatus');
$.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.
*/
function reportFailedJob(jqxhr, textStatus, error) {
console.log('in reportFailedJob');
// hide all possible boxes:
$('.statusbox').hide();
@@ -72,6 +76,7 @@ function reportFailedJob(jqxhr, textStatus, error) {
* @param data
*/
function reportOnJobStatus(data) {
console.log('in reportOnJobStatus: ' + data.status);
switch (data.status) {
case "configured":
@@ -80,6 +85,10 @@ function reportOnJobStatus(data) {
$('.statusbox').hide();
$('.status_configured').show();
}
if (job.configuration['auto-start']) {
console.log('Job is auto start. Check status again in 500ms.');
timeOutId = setTimeout(checkJobStatus, interval);
}
break;
case "running":
// job is running! Show the running box:
@@ -122,7 +131,13 @@ function reportOnJobStatus(data) {
// show the fatal error box:
$('.fatal_error').show();
break;
case "configuring":
// redirect back to configure screen.
console.log('Will now redirect to ' + jobConfigureUri);
window.location = jobConfigureUri;
break;
default:
console.error('Cannot handle job status ' + data.status);
break;
}

View File

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

View File

@@ -1,4 +1,3 @@
/*
* month.js
* Copyright (c) 2017 thegrumpydictator@gmail.com
@@ -18,10 +17,10 @@
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
/** global: spentUri, categoryUri, budgetUri, expenseUri, incomeUri, mainUri */
$(function () {
"use strict";
drawChart();
doubleYChart(mainUri, 'in-out-chart');
loadAjaxPartial('inOutAccounts', spentUri);
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
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
/** global: startDate, endDate, accountIds */
function loadAjaxPartial(holder, uri) {
"use strict";
$.get(uri).done(function (data) {

View File

@@ -139,7 +139,6 @@ function setOptionalFromCookies() {
$('#inputExpRevAccounts').multiselect(defaultMultiSelect);
}
function catchSubmit() {
@@ -161,7 +160,7 @@ function catchSubmit() {
createCookie('report-categories', categories, 365);
createCookie('report-budgets', budgets, 365);
createCookie('report-tags', tags, 365);
createCookie('report-exp-rev', expRev , 365);
createCookie('report-exp-rev', expRev, 365);
createCookie('report-start', moment(picker.startDate).format("YYYYMMDD"), 365);
createCookie('report-end', moment(picker.endDate).format("YYYYMMDD"), 365);

View File

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

View File

@@ -18,7 +18,7 @@
* 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);
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/>.
*/
/** 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

@@ -27,7 +27,7 @@ return [
'accounts-index' => 'Vermögenskonten sind Ihre persönlichen Bank-Konten. Aufwandskonten sind Konten, denen Sie Geld zahlen, z. B. Läden und Freunde. Einnahmekonten sind Konten von denen Sie Geld erhalten, z. B. Ihr Arbeitgeber und andere Einkommensquellen. Auf dieser Seite können Sie diese bearbeiten oder entfernen.',
'budgets-index' => 'Diese Seite zeigt Ihnen einen Überblick über Ihre Budgets. Die obere Leiste zeigt den Betrag, der zur Verfügung steht. Dieser kann für einen Zeitraum angepasst werden, indem Sie auf den Betrag auf der rechten Seite klicken. Wie viel bisher ausgegeben wurde wird darunter angezeigt. Darunter sind die Aufwendungen pro Haushalt und wie viel dafür veranschlagt ist.',
'reports-index-start' => 'Firefly III supports a number of types of reports. Read about them by clicking on the <i class="fa fa-question-circle"></i>-icon in the top right corner.',
'reports-index-examples' => 'Sehen Sie sich auch diese Beispiele an: <a href=":one"> eine monatliche Finanzübersicht</a>, <a href=":two"> eine jährliche Finanzübersicht</a> und <a href=":three"> eine Haushaltsübersicht</a>.',
'reports-index-examples' => 'Sehen Sie sich auch diese Beispiele an: <a href=":one">eine monatliche Finanzübersicht</a>, <a href=":two">eine jährliche Finanzübersicht</a> und <a href=":three">eine Haushaltsübersicht</a>.',
'currencies-index' => 'Firefly III unterstützt mehrere Währungen. Obwohl es den Euro standardmäßig nutzt, ist es möglich US-Dollar oder viele andere Währungen zu verwenden. Wie Sie sehen können, ist eine kleine Auswahl an Währungen aufgenommen worden, aber Sie können Ihre eigenen hinzufügen. Die Standardwährung zu ändern, wird die Währung der vorhandenen Buchungen jedoch nicht ändern: Firefly III unterstützt die Verwendung mehrerer Währungen zur gleichen Zeit.',
'transactions-index' => 'Diese Aufwendungen, Einzahlungen und Überweisungen sind nicht besonders einfallsreich. Sie wurden automatisch generiert.',
'piggy-banks-index' => 'Wie Sie sehen können, gibt es drei Sparschweine. Benutzen die Plus- und Minusknöpfe um die Menge des Geldes in den Sparschweinen zu beeinflussen. Klicken Sie auf den Namen des Sparschweins um Details einzusehen.',

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