diff --git a/.env.example b/.env.example index 87540a4f1c..04528da7fc 100755 --- a/.env.example +++ b/.env.example @@ -43,6 +43,7 @@ CACHE_PREFIX=firefly GOOGLE_MAPS_API_KEY= ANALYTICS_ID= SITE_OWNER=mail@example.com +USE_ENCRYPTION=true PUSHER_KEY= PUSHER_SECRET= diff --git a/.github/CONTRIBUTING b/.github/CONTRIBUTING deleted file mode 100644 index 2a1338d94d..0000000000 --- a/.github/CONTRIBUTING +++ /dev/null @@ -1 +0,0 @@ -If you are requesting a new feature, please check out the list of [often requested features](https://firefly-iii.github.io/requested-features/) first. Thanks! \ No newline at end of file diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000000..2d9bcc0192 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,7 @@ +## Hi there! + +Thank you for taking the time to report an issue or requesting a new feature. + +Please take note that there are NO rules or regulations when you submit an issue. + +If you are requesting a new feature, please check out the list of [often requested features](https://firefly-iii.github.io/requested-features/). diff --git a/.travis.yml b/.travis.yml index bcba948aa5..040654a669 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,18 @@ language: php -sudo: false php: - - '7.0' + - 7.0 + - 7.1 + +cache: + directories: + - vendor + - $HOME/.composer/cache install: - - phpenv config-rm xdebug.ini + - if [[ "$(php -v | grep 'PHP 7')" ]]; then phpenv config-rm xdebug.ini; fi - rm composer.lock - composer update --no-scripts + - cp .env.testing .env - php artisan clear-compiled - php artisan optimize - php artisan env diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e278c4994..5dc3f748c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,28 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [4.3.3] - 2017-01-30 + +_The 100th release of Firefly!_ + +### Added +- Add locales to Docker (#534) by @elohmeier. +- Optional database encryption. On by default. +- Datepicker for Firefox and other browsers. +- New instruction block for updating and installing. +- Ability to clone transactions. +- Use multi-select Bootstrap thing instead of massive lists of checkboxes. + +### Removed +- Lots of old Javascript + +### Fixed +- Missing sort broke various charts +- Bug in reports that made amounts behave weird +- Various bug fixes + +### Security +- Tested FF against the naughty string list. ## [4.3.2] - 2017-01-09 diff --git a/app/Console/Commands/EncryptFile.php b/app/Console/Commands/EncryptFile.php index 415649f9a4..1ff271a9e5 100644 --- a/app/Console/Commands/EncryptFile.php +++ b/app/Console/Commands/EncryptFile.php @@ -35,7 +35,7 @@ class EncryptFile extends Command * * @var string */ - protected $signature = 'firefly:encrypt {file} {key}'; + protected $signature = 'firefly:encrypt-file {file} {key}'; /** * Create a new command instance. diff --git a/app/Console/Commands/UpgradeFireflyInstructions.php b/app/Console/Commands/UpgradeFireflyInstructions.php index 866884de56..a88c8ab79c 100644 --- a/app/Console/Commands/UpgradeFireflyInstructions.php +++ b/app/Console/Commands/UpgradeFireflyInstructions.php @@ -33,7 +33,7 @@ class UpgradeFireflyInstructions extends Command * * @var string */ - protected $signature = 'firefly:upgrade-instructions'; + protected $signature = 'firefly:instructions {task}'; /** * Create a new command instance. @@ -49,11 +49,60 @@ class UpgradeFireflyInstructions extends Command */ public function handle() { - // + + if ($this->argument('task') == 'update') { + $this->updateInstructions(); + } + if ($this->argument('task') == 'install') { + $this->installInstructions(); + } + } + + /** + * Show a nice box + * + * @param string $text + */ + private function boxed(string $text) + { + $parts = explode("\n", wordwrap($text)); + foreach ($parts as $string) { + $this->line('| ' . sprintf('%-77s', $string) . '|'); + } + } + + /** + * Show a nice info box + * + * @param string $text + */ + private function boxedInfo(string $text) + { + $parts = explode("\n", wordwrap($text)); + foreach ($parts as $string) { + $this->info('| ' . sprintf('%-77s', $string) . '|'); + } + } + + /** + * Show a line + */ + private function showLine() + { + $line = '+'; + for ($i = 0; $i < 78; $i++) { + $line .= '-'; + } + $line .= '+'; + $this->line($line); + + } + + private function installInstructions() { /** @var string $version */ $version = config('firefly.version'); - $config = config('upgrade.text'); - $text = null; + $config = config('upgrade.text.install'); + $text = ''; foreach (array_keys($config) as $compare) { // if string starts with: $len = strlen($compare); @@ -62,22 +111,53 @@ class UpgradeFireflyInstructions extends Command } } - + $this->showLine(); + $this->boxed(''); if (is_null($text)) { - $this->line(sprintf('Thank you for installing Firefly III, v%s', $version)); - $this->info('There are no extra upgrade instructions.'); - $this->line('Firefly III should be ready for use.'); + $this->boxed(sprintf('Thank you for installin Firefly III, v%s!', $version)); + $this->boxedInfo('There are no extra installation instructions.'); + $this->boxed('Firefly III should be ready for use.'); + $this->boxed(''); + $this->showLine(); return; } - $this->line('+------------------------------------------------------------------------------+'); - $this->line(''); - $this->line(sprintf('Thank you for installing Firefly III, v%s', $version)); - $this->info(wordwrap($text)); - $this->line(''); - $this->line('+------------------------------------------------------------------------------+'); + $this->boxed(sprintf('Thank you for installing Firefly III, v%s!', $version)); + $this->boxedInfo($text); + $this->boxed(''); + $this->showLine(); + } + private function updateInstructions() + { + /** @var string $version */ + $version = config('firefly.version'); + $config = config('upgrade.text.upgrade'); + $text = ''; + foreach (array_keys($config) as $compare) { + // if string starts with: + $len = strlen($compare); + if (substr($version, 0, $len) === $compare) { + $text = $config[$compare]; + } + } + $this->showLine(); + $this->boxed(''); + if (is_null($text)) { + + $this->boxed(sprintf('Thank you for updating to Firefly III, v%s', $version)); + $this->boxedInfo('There are no extra upgrade instructions.'); + $this->boxed('Firefly III should be ready for use.'); + $this->boxed(''); + $this->showLine(); + return; + } + + $this->boxed(sprintf('Thank you for updating to Firefly III, v%s!', $version)); + $this->boxedInfo($text); + $this->boxed(''); + $this->showLine(); } } diff --git a/app/Console/Commands/UseEncryption.php b/app/Console/Commands/UseEncryption.php new file mode 100644 index 0000000000..d3c3e178c0 --- /dev/null +++ b/app/Console/Commands/UseEncryption.php @@ -0,0 +1,66 @@ +handleObjects('Account', 'name', 'encrypted'); + $this->handleObjects('Bill', 'name', 'name_encrypted'); + $this->handleObjects('Bill', 'match', 'match_encrypted'); + $this->handleObjects('Budget', 'name', 'encrypted'); + $this->handleObjects('Category', 'name', 'encrypted'); + $this->handleObjects('PiggyBank', 'name', 'encrypted'); + $this->handleObjects('TransactionJournal', 'description', 'encrypted'); + } + + /** + * @param string $class + * @param string $field + * @param string $indicator + */ + public function handleObjects(string $class, string $field, string $indicator) + { + $fqn = sprintf('FireflyIII\Models\%s', $class); + $encrypt = config('firefly.encryption') ? 0 : 1; + $set = $fqn::where($indicator, $encrypt)->get(); + + foreach ($set as $entry) { + $newName = $entry->$field; + $entry->$field = $newName; + $entry->save(); + } + + $this->line(sprintf('Updated %d %s.', $set->count(), strtolower(Str::plural($class)))); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 61537ce4e8..8ea0f88014 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -16,10 +16,10 @@ namespace FireflyIII\Console; use FireflyIII\Console\Commands\CreateImport; use FireflyIII\Console\Commands\EncryptFile; use FireflyIII\Console\Commands\Import; -use FireflyIII\Console\Commands\MoveRepository; use FireflyIII\Console\Commands\ScanAttachments; use FireflyIII\Console\Commands\UpgradeDatabase; use FireflyIII\Console\Commands\UpgradeFireflyInstructions; +use FireflyIII\Console\Commands\UseEncryption; use FireflyIII\Console\Commands\VerifyDatabase; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; @@ -63,6 +63,7 @@ class Kernel extends ConsoleKernel EncryptFile::class, ScanAttachments::class, UpgradeDatabase::class, + UseEncryption::class, ]; /** diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index c61dac5629..00b359d148 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -111,9 +111,9 @@ class Handler extends ExceptionHandler /** * Convert an authentication exception into an unauthenticated response. * - * @param \Illuminate\Http\Request $request + * @param $request * - * @return \Illuminate\Http\Response + * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse */ protected function unauthenticated($request) { diff --git a/app/Export/Entry/Entry.php b/app/Export/Entry/Entry.php index 53ace9643b..0afc40ada4 100644 --- a/app/Export/Entry/Entry.php +++ b/app/Export/Entry/Entry.php @@ -51,7 +51,6 @@ final class Entry public $destination_account_id; public $destination_account_name; - public $budget_id; public $budget_name; public $category_id; @@ -74,15 +73,15 @@ final class Entry { $entry = new self; $entry->journal_id = $object->transaction_journal_id; - $entry->description = self::decrypt($object->journal_encrypted, $object->journal_description); + $entry->description = self::decrypt(intval($object->journal_encrypted), $object->journal_description); $entry->amount = $object->amount; $entry->date = $object->date; $entry->transaction_type = $object->transaction_type; $entry->currency_code = $object->transaction_currency_code; $entry->source_account_id = $object->account_id; - $entry->source_account_name = self::decrypt($object->account_name_encrypted, $object->account_name); + $entry->source_account_name = self::decrypt(intval($object->account_name_encrypted), $object->account_name); $entry->destination_account_id = $object->opposing_account_id; - $entry->destination_account_name = self::decrypt($object->opposing_account_encrypted, $object->opposing_account_name); + $entry->destination_account_name = self::decrypt(intval($object->opposing_account_encrypted), $object->opposing_account_name); $entry->category_id = $object->category_id ?? ''; $entry->category_name = $object->category_name ?? ''; $entry->budget_id = $object->budget_id ?? ''; diff --git a/app/Helpers/Attachments/AttachmentHelper.php b/app/Helpers/Attachments/AttachmentHelper.php index 501842a7ce..c7f7902109 100644 --- a/app/Helpers/Attachments/AttachmentHelper.php +++ b/app/Helpers/Attachments/AttachmentHelper.php @@ -32,9 +32,9 @@ class AttachmentHelper implements AttachmentHelperInterface /** @var MessageBag */ public $messages; /** @var array */ - protected $allowedMimes; + protected $allowedMimes = []; /** @var int */ - protected $maxUploadSize; + protected $maxUploadSize = 0; /** @var \Illuminate\Contracts\Filesystem\Filesystem */ protected $uploadDisk; @@ -44,8 +44,8 @@ class AttachmentHelper implements AttachmentHelperInterface */ public function __construct() { - $this->maxUploadSize = config('firefly.maxUploadSize'); - $this->allowedMimes = config('firefly.allowedMimes'); + $this->maxUploadSize = intval(config('firefly.maxUploadSize')); + $this->allowedMimes = (array) config('firefly.allowedMimes'); $this->errors = new MessageBag; $this->messages = new MessageBag; $this->uploadDisk = Storage::disk('upload'); diff --git a/app/Helpers/Collection/Account.php b/app/Helpers/Collection/Account.php deleted file mode 100644 index e3fc70e702..0000000000 --- a/app/Helpers/Collection/Account.php +++ /dev/null @@ -1,107 +0,0 @@ -accounts = new Collection; - } - - /** - * @return Collection - */ - public function getAccounts(): Collection - { - return $this->accounts; - } - - /** - * @param Collection $accounts - */ - public function setAccounts(Collection $accounts) - { - $this->accounts = $accounts; - } - - /** - * @return string - */ - public function getDifference(): string - { - return $this->difference; - } - - /** - * @param string $difference - */ - public function setDifference(string $difference) - { - $this->difference = $difference; - } - - /** - * @return string - */ - public function getEnd(): string - { - return $this->end; - } - - /** - * @param string $end - */ - public function setEnd(string $end) - { - $this->end = $end; - } - - /** - * @return string - */ - public function getStart(): string - { - return $this->start; - } - - /** - * @param string $start - */ - public function setStart(string $start) - { - $this->start = $start; - } - - -} diff --git a/app/Helpers/Collector/JournalCollector.php b/app/Helpers/Collector/JournalCollector.php index d5d881196a..c198da7764 100644 --- a/app/Helpers/Collector/JournalCollector.php +++ b/app/Helpers/Collector/JournalCollector.php @@ -167,6 +167,7 @@ class JournalCollector implements JournalCollectorInterface public function getJournals(): Collection { $this->run = true; + /** @var Collection $set */ $set = $this->query->get(array_values($this->fields)); Log::debug(sprintf('Count of set is %d', $set->count())); $set = $this->filterTransfers($set); diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 42eec4e59b..b3b007cb9e 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -75,6 +75,11 @@ class AccountController extends Controller $defaultCurrency = Amount::getDefaultCurrency(); $subTitleIcon = config('firefly.subIconsByIdentifier.' . $what); $subTitle = trans('firefly.make_new_' . $what . '_account'); + $roles = []; + foreach (config('firefly.accountRoles') as $role) { + $roles[$role] = strval(trans('firefly.account_role_' . $role)); + } + // pre fill some data Session::flash('preFilled', ['currency_id' => $defaultCurrency->id,]); @@ -87,7 +92,7 @@ class AccountController extends Controller Session::flash('gaEventCategory', 'accounts'); Session::flash('gaEventAction', 'create-' . $what); - return view('accounts.create', compact('subTitleIcon', 'what', 'subTitle', 'currencies')); + return view('accounts.create', compact('subTitleIcon', 'what', 'subTitle', 'currencies', 'roles')); } @@ -155,6 +160,11 @@ class AccountController extends Controller /** @var CurrencyRepositoryInterface $repository */ $repository = app(CurrencyRepositoryInterface::class); $currencies = ExpandedForm::makeSelectList($repository->get()); + $roles = []; + foreach (config('firefly.accountRoles') as $role) { + $roles[$role] = strval(trans('firefly.account_role_' . $role)); + } + // put previous url in session if not redirect from store (not "return_to_edit"). if (session('accounts.edit.fromUpdate') !== true) { @@ -185,7 +195,7 @@ class AccountController extends Controller Session::flash('gaEventCategory', 'accounts'); Session::flash('gaEventAction', 'edit-' . $what); - return view('accounts.edit', compact('currencies', 'account', 'subTitle', 'subTitleIcon', 'openingBalance', 'what')); + return view('accounts.edit', compact('currencies', 'account', 'subTitle', 'subTitleIcon', 'openingBalance', 'what', 'roles')); } /** diff --git a/app/Http/Controllers/AttachmentController.php b/app/Http/Controllers/AttachmentController.php index 8febccf3e4..2b154defea 100644 --- a/app/Http/Controllers/AttachmentController.php +++ b/app/Http/Controllers/AttachmentController.php @@ -18,6 +18,7 @@ use FireflyIII\Exceptions\FireflyException; use FireflyIII\Http\Requests\AttachmentFormRequest; use FireflyIII\Models\Attachment; use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; +use Illuminate\Http\Response as LaravelResponse; use Preferences; use Response; use Session; @@ -100,7 +101,9 @@ class AttachmentController extends Controller $content = $repository->getContent($attachment); $quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\')); - return response($content, 200) + /** @var LaravelResponse $response */ + $response = response($content, 200); + $response ->header('Content-Description', 'File Transfer') ->header('Content-Type', 'application/octet-stream') ->header('Content-Disposition', 'attachment; filename=' . $quoted) @@ -110,6 +113,8 @@ class AttachmentController extends Controller ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') ->header('Pragma', 'public') ->header('Content-Length', strlen($content)); + + return $response; } throw new FireflyException('Could not find the indicated attachment. The file is no longer there.'); } diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index d9b5cc2a27..0d8ce65937 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -278,8 +278,6 @@ class BudgetController extends Controller throw new FireflyException('This budget limit is not part of this budget.'); } - /** @var AccountRepositoryInterface $accountRepository */ - $accountRepository = app(AccountRepositoryInterface::class); $page = intval($request->get('page')) == 0 ? 1 : intval($request->get('page')); $pageSize = intval(Preferences::get('transactionPageSize', 50)->data); $subTitle = trans( @@ -289,7 +287,6 @@ class BudgetController extends Controller 'end' => $budgetLimit->end_date->formatLocalized($this->monthAndDayFormat), ] ); - $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET, AccountType::CASH]); // collector: /** @var JournalCollectorInterface $collector */ diff --git a/app/Http/Controllers/ExportController.php b/app/Http/Controllers/ExportController.php index 7f9d29eb7f..1ace8118c1 100644 --- a/app/Http/Controllers/ExportController.php +++ b/app/Http/Controllers/ExportController.php @@ -24,6 +24,7 @@ use FireflyIII\Models\ExportJob; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\ExportJob\ExportJobRepositoryInterface; use FireflyIII\Repositories\ExportJob\ExportJobRepositoryInterface as EJRI; +use Illuminate\Http\Response as LaravelResponse; use Preferences; use Response; use View; @@ -73,8 +74,9 @@ class ExportController extends Controller $job->change('export_downloaded'); - - return response($content, 200) + /** @var LaravelResponse $response */ + $response = response($content, 200); + $response ->header('Content-Description', 'File Transfer') ->header('Content-Type', 'application/octet-stream') ->header('Content-Disposition', 'attachment; filename=' . $quoted) @@ -85,6 +87,8 @@ class ExportController extends Controller ->header('Pragma', 'public') ->header('Content-Length', strlen($content)); + return $response; + } /** @@ -128,8 +132,7 @@ class ExportController extends Controller * @param AccountRepositoryInterface $repository * @param EJRI $jobs * - * @return string - * + * @return \Illuminate\Http\JsonResponse */ public function postIndex(ExportFormRequest $request, AccountRepositoryInterface $repository, EJRI $jobs) { diff --git a/app/Http/Controllers/ImportController.php b/app/Http/Controllers/ImportController.php index 12fc16c3af..ef812a8a1b 100644 --- a/app/Http/Controllers/ImportController.php +++ b/app/Http/Controllers/ImportController.php @@ -21,6 +21,7 @@ use FireflyIII\Models\ImportJob; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface; use Illuminate\Http\Request; +use Illuminate\Http\Response as LaravelResponse; use Log; use Response; use Session; @@ -120,15 +121,18 @@ class ImportController extends Controller $result = json_encode($config, JSON_PRETTY_PRINT); $name = sprintf('"%s"', addcslashes('import-configuration-' . date('Y-m-d') . '.json', '"\\')); - return response($result, 200) - ->header('Content-disposition', 'attachment; filename=' . $name) - ->header('Content-Type', 'application/json') - ->header('Content-Description', 'File Transfer') - ->header('Connection', 'Keep-Alive') - ->header('Expires', '0') - ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') - ->header('Pragma', 'public') - ->header('Content-Length', strlen($result)); + /** @var LaravelResponse $response */ + $response = response($result, 200); + $response->header('Content-disposition', 'attachment; filename=' . $name) + ->header('Content-Type', 'application/json') + ->header('Content-Description', 'File Transfer') + ->header('Connection', 'Keep-Alive') + ->header('Expires', '0') + ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') + ->header('Pragma', 'public') + ->header('Content-Length', strlen($result)); + + return $response; } diff --git a/app/Http/Controllers/JavascriptController.php b/app/Http/Controllers/JavascriptController.php new file mode 100644 index 0000000000..67c3d268d7 --- /dev/null +++ b/app/Http/Controllers/JavascriptController.php @@ -0,0 +1,132 @@ +getDateRangePicker(); + $start = Session::get('start'); + $end = Session::get('end'); + $linkTitle = sprintf('%s - %s', $start->formatLocalized($this->monthAndDayFormat), $end->formatLocalized($this->monthAndDayFormat)); + $firstDate = session('first')->format('Y-m-d'); + $localeconv = localeconv(); + $accounting = Amount::getJsConfig($localeconv); + $localeconv = localeconv(); + $defaultCurrency = Amount::getDefaultCurrency(); + $localeconv['frac_digits'] = $defaultCurrency->decimal_places; + $pref = Preferences::get('language', config('firefly.default_language', 'en_US')); + $lang = $pref->data; + $data = [ + 'picker' => $picker, + 'linkTitle' => $linkTitle, + 'firstDate' => $firstDate, + 'currencyCode' => Amount::getCurrencyCode(), + 'currencySymbol' => Amount::getCurrencySymbol(), + 'accounting' => $accounting, + 'localeconv' => $localeconv, + 'language' => $lang, + ]; + + return response() + ->view('javascript.variables', $data, 200) + ->header('Content-Type', 'text/javascript'); + } + + /** + * @return array + * @throws FireflyException + */ + private function getDateRangePicker(): array + { + $viewRange = Preferences::get('viewRange', '1M')->data; + $start = Session::get('start'); + $end = Session::get('end'); + + $prevStart = clone $start; + $prevEnd = clone $start; + $nextStart = clone $end; + $nextEnd = clone $end; + if ($viewRange === 'custom') { + $days = $start->diffInDays($end); + $prevStart->subDays($days); + $nextEnd->addDays($days); + unset($days); + } + + if ($viewRange !== 'custom') { + $prevStart = Navigation::subtractPeriod($start, $viewRange);// subtract for previous period + $prevEnd = Navigation::endOfPeriod($prevStart, $viewRange); + $nextStart = Navigation::addPeriod($start, $viewRange, 0); // add for previous period + $nextEnd = Navigation::endOfPeriod($nextStart, $viewRange); + } + + $ranges = []; + $ranges['current'] = [$start->format('Y-m-d'), $end->format('Y-m-d')]; + $ranges['previous'] = [$prevStart->format('Y-m-d'), $prevEnd->format('Y-m-d')]; + $ranges['next'] = [$nextStart->format('Y-m-d'), $nextEnd->format('Y-m-d')]; + + switch ($viewRange) { + default: + throw new FireflyException('The date picker does not yet support "' . $viewRange . '".'); + case '1D': + case 'custom': + $format = (string)trans('config.month_and_day'); + break; + case '3M': + $format = (string)trans('config.quarter_in_year'); + break; + case '6M': + $format = (string)trans('config.half_year'); + break; + case '1Y': + $format = (string)trans('config.year'); + break; + case '1M': + $format = (string)trans('config.month'); + break; + case '1W': + $format = (string)trans('config.week_in_year'); + break; + } + + $current = $start->formatLocalized($format); + $next = $nextStart->formatLocalized($format); + $prev = $prevStart->formatLocalized($format); + + return [ + 'start' => $start->format('Y-m-d'), + 'end' => $end->format('Y-m-d'), + 'current' => $current, + 'previous' => $prev, + 'next' => $next, + 'ranges' => $ranges, + ]; + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/JsonController.php b/app/Http/Controllers/JsonController.php index d38012e6a2..4d95c51fc9 100644 --- a/app/Http/Controllers/JsonController.php +++ b/app/Http/Controllers/JsonController.php @@ -20,7 +20,9 @@ use FireflyIII\Models\AccountType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountTaskerInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface; -use FireflyIII\Repositories\Category\CategoryRepositoryInterface as CRI; +use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Repositories\Category\CategoryRepositoryInterface; +use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Support\CacheProperties; use Illuminate\Http\Request; @@ -61,6 +63,43 @@ class JsonController extends Controller return Response::json(['html' => $view]); } + /** + * Returns a JSON list of all accounts. + * + * @param AccountRepositoryInterface $repository + * + * @return \Illuminate\Http\JsonResponse + * + */ + public function allAccounts(AccountRepositoryInterface $repository) + { + $return = array_unique( + $repository->getAccountsByType( + [AccountType::REVENUE, AccountType::EXPENSE, AccountType::BENEFICIARY, AccountType::DEFAULT, AccountType::ASSET] + )->pluck('name')->toArray() + ); + sort($return); + + return Response::json($return); + + } + + /** + * @param JournalCollectorInterface $collector + * + * @return \Illuminate\Http\JsonResponse + */ + public function allTransactionJournals(JournalCollectorInterface $collector) + { + $collector->setLimit(100)->setPage(1); + $return = array_unique($collector->getJournals()->pluck('description')->toArray()); + sort($return); + + return Response::json($return); + + + } + /** * @param BillRepositoryInterface $repository * @@ -158,19 +197,29 @@ class JsonController extends Controller } /** - * Returns a list of categories. - * - * @param CRI $repository + * @param BudgetRepositoryInterface $repository * * @return \Illuminate\Http\JsonResponse */ - public function categories(CRI $repository) + public function budgets(BudgetRepositoryInterface $repository) { - $list = $repository->getCategories(); - $return = []; - foreach ($list as $entry) { - $return[] = $entry->name; - } + $return = array_unique($repository->getBudgets()->pluck('name')->toArray()); + sort($return); + + return Response::json($return); + } + + /** + * Returns a list of categories. + * + * @param CategoryRepositoryInterface $repository + * + * @return \Illuminate\Http\JsonResponse + */ + public function categories(CategoryRepositoryInterface $repository) + { + $return = array_unique($repository->getCategories()->pluck('name')->toArray()); + sort($return); return Response::json($return); } @@ -195,14 +244,10 @@ class JsonController extends Controller */ public function expenseAccounts(AccountRepositoryInterface $repository) { - $list = $repository->getAccountsByType([AccountType::EXPENSE, AccountType::BENEFICIARY]); - $return = []; - foreach ($list as $entry) { - $return[] = $entry->name; - } + $return = array_unique($repository->getAccountsByType([AccountType::EXPENSE, AccountType::BENEFICIARY])->pluck('name')->toArray()); + sort($return); return Response::json($return); - } /** @@ -213,14 +258,10 @@ class JsonController extends Controller */ public function revenueAccounts(AccountRepositoryInterface $repository) { - $list = $repository->getAccountsByType([AccountType::REVENUE]); - $return = []; - foreach ($list as $entry) { - $return[] = $entry->name; - } + $return = array_unique($repository->getAccountsByType([AccountType::REVENUE])->pluck('name')->toArray()); + sort($return); return Response::json($return); - } /** @@ -232,11 +273,8 @@ class JsonController extends Controller */ public function tags(TagRepositoryInterface $tagRepository) { - $list = $tagRepository->get(); - $return = []; - foreach ($list as $entry) { - $return[] = $entry->tag; - } + $return = array_unique($tagRepository->get()->pluck('tag')->toArray()); + sort($return); return Response::json($return); @@ -278,25 +316,29 @@ class JsonController extends Controller */ public function transactionJournals(JournalCollectorInterface $collector, string $what) { - $descriptions = []; - $type = config('firefly.transactionTypesByWhat.' . $what); - $types = [$type]; + $type = config('firefly.transactionTypesByWhat.' . $what); + $types = [$type]; - // use journal collector instead: $collector->setTypes($types)->setLimit(100)->setPage(1); - $journals = $collector->getJournals(); - foreach ($journals as $j) { - $descriptions[] = $j->description; - } + $return = array_unique($collector->getJournals()->pluck('description')->toArray()); + sort($return); - $descriptions = array_unique($descriptions); - sort($descriptions); - - return Response::json($descriptions); + return Response::json($return); } + /** + * + */ + public function transactionTypes(JournalRepositoryInterface $repository) + { + $return = array_unique($repository->getTransactionTypes()->pluck('type')->toArray()); + sort($return); + + return Response::json($return); + } + /** * @param Request $request * diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php index f155623fdc..260adc97e3 100644 --- a/app/Http/Controllers/TagController.php +++ b/app/Http/Controllers/TagController.php @@ -230,6 +230,8 @@ class TagController extends Controller public function show(Request $request, JournalCollectorInterface $collector, Tag $tag, string $moment = '') { $range = Preferences::get('viewRange', '1M')->data; + $start = new Carbon; + $end = new Carbon; if (strlen($moment) > 0) { try { diff --git a/app/Http/Controllers/Transaction/MassController.php b/app/Http/Controllers/Transaction/MassController.php index 5676e902a8..d139f0f414 100644 --- a/app/Http/Controllers/Transaction/MassController.php +++ b/app/Http/Controllers/Transaction/MassController.php @@ -163,11 +163,11 @@ class MassController extends Controller $journal->transaction_count = $journal->transactions()->count(); if (!is_null($sources->first())) { $journal->source_account_id = $sources->first()->id; - $journal->source_account_name = $sources->first()->name; + $journal->source_account_name = $sources->first()->editname; } if (!is_null($destinations->first())) { $journal->destination_account_id = $destinations->first()->id; - $journal->destination_account_name = $destinations->first()->name; + $journal->destination_account_name = $destinations->first()->editname; } } ); @@ -178,7 +178,7 @@ class MassController extends Controller $journals = $filtered; - return view('transactions.mass-edit', compact('journals', 'subTitle', 'accountList')); + return view('transactions.mass.edit', compact('journals', 'subTitle', 'accountList')); } /** diff --git a/app/Http/Controllers/Transaction/SingleController.php b/app/Http/Controllers/Transaction/SingleController.php index b1133686f3..9c006617bd 100644 --- a/app/Http/Controllers/Transaction/SingleController.php +++ b/app/Http/Controllers/Transaction/SingleController.php @@ -82,6 +82,42 @@ class SingleController extends Controller } + public function cloneTransaction(TransactionJournal $journal) + { + $source = TransactionJournal::sourceAccountList($journal)->first(); + $destination = TransactionJournal::destinationAccountList($journal)->first(); + $budget = $journal->budgets()->first(); + $budgetId = is_null($budget) ? 0 : $budget->id; + $category = $journal->categories()->first(); + $categoryName = is_null($category) ? '' : $category->name; + $tags = join(',', $journal->tags()->get()->pluck('tag')->toArray()); + + + $preFilled = [ + 'description' => $journal->description, + 'source_account_id' => $source->id, + 'source_account_name' => $source->name, + 'destination_account_id' => $destination->id, + 'destination_account_name' => $destination->name, + 'amount' => TransactionJournal::amountPositive($journal), + 'date' => $journal->date->format('Y-m-d'), + 'budget_id' => $budgetId, + 'category' => $categoryName, + 'tags' => $tags, + 'interest_date' => $journal->getMeta('interest_date'), + 'book_date' => $journal->getMeta('book_date'), + 'process_date' => $journal->getMeta('process_date'), + 'due_date' => $journal->getMeta('due_date'), + 'payment_date' => $journal->getMeta('payment_date'), + 'invoice_date' => $journal->getMeta('invoice_date'), + 'internal_reference' => $journal->getMeta('internal_reference'), + 'notes' => $journal->getMeta('notes'), + ]; + Session::flash('preFilled', $preFilled); + + return redirect(route('transactions.create', [strtolower($journal->transactionType->type)])); + } + /** * @param string $what * @@ -113,7 +149,10 @@ class SingleController extends Controller asort($piggies); - return view('transactions.create', compact('assetAccounts', 'subTitleIcon', 'uploadSize', 'budgets', 'what', 'piggies', 'subTitle', 'optionalFields')); + return view( + 'transactions.single.create', + compact('assetAccounts', 'subTitleIcon', 'uploadSize', 'budgets', 'what', 'piggies', 'subTitle', 'optionalFields', 'preFilled') + ); } /** @@ -137,7 +176,7 @@ class SingleController extends Controller Session::flash('gaEventCategory', 'transactions'); Session::flash('gaEventAction', 'delete-' . $what); - return view('transactions.delete', compact('journal', 'subTitle', 'what')); + return view('transactions.single.delete', compact('journal', 'subTitle', 'what')); } @@ -241,7 +280,7 @@ class SingleController extends Controller Session::forget('transactions.edit.fromUpdate'); return view( - 'transactions.edit', + 'transactions.single.edit', compact('journal', 'optionalFields', 'assetAccounts', 'what', 'budgetList', 'subTitle') )->with('data', $preFilled); } @@ -265,6 +304,7 @@ class SingleController extends Controller return redirect(route('transactions.create', [$request->input('what')]))->withInput(); } + /** @var array $files */ $files = $request->hasFile('attachments') ? $request->file('attachments') : null; $this->attachments->saveAttachmentsForModel($journal, $files); @@ -315,7 +355,8 @@ class SingleController extends Controller $data = $request->getJournalData(); $journal = $repository->update($journal, $data); - $files = $request->hasFile('attachments') ? $request->file('attachments') : null; + /** @var array $files */ + $files = $request->hasFile('attachments') ? $request->file('attachments') : null; $this->attachments->saveAttachmentsForModel($journal, $files); // flash errors diff --git a/app/Http/Controllers/Transaction/SplitController.php b/app/Http/Controllers/Transaction/SplitController.php index 7d4cd17761..91b35ddfce 100644 --- a/app/Http/Controllers/Transaction/SplitController.php +++ b/app/Http/Controllers/Transaction/SplitController.php @@ -112,7 +112,7 @@ class SplitController extends Controller Session::forget('transactions.edit-split.fromUpdate'); return view( - 'transactions.edit-split', + 'transactions.split.edit', compact( 'subTitleIcon', 'currencies', 'optionalFields', 'preFilled', 'subTitle', 'amount', 'sourceAccounts', 'uploadSize', 'destinationAccounts', 'assetAccounts', @@ -138,6 +138,7 @@ class SplitController extends Controller $data = $this->arrayFromInput($request); $journal = $repository->updateSplitJournal($journal, $data); + /** @var array $files */ $files = $request->hasFile('attachments') ? $request->file('attachments') : null; // save attachments: $this->attachments->saveAttachmentsForModel($journal, $files); diff --git a/app/Http/Middleware/Range.php b/app/Http/Middleware/Range.php index 4371d473d7..fdf5322a4d 100644 --- a/app/Http/Middleware/Range.php +++ b/app/Http/Middleware/Range.php @@ -72,9 +72,6 @@ class Range // set view variables. $this->configureView(); - // get variables for date range: - $this->datePicker(); - // set more view variables: $this->configureList(); } @@ -96,7 +93,6 @@ class Range { $pref = Preferences::get('language', config('firefly.default_language', 'en_US')); $lang = $pref->data; - App::setLocale($lang); Carbon::setLocale(substr($lang, 0, 2)); $locale = explode(',', trans('config.locale')); @@ -105,94 +101,15 @@ class Range setlocale(LC_TIME, $locale); setlocale(LC_MONETARY, $locale); + // save some formats: - $monthFormat = (string)trans('config.month'); $monthAndDayFormat = (string)trans('config.month_and_day'); $dateTimeFormat = (string)trans('config.date_time'); $defaultCurrency = Amount::getDefaultCurrency(); - $localeconv = localeconv(); - $accounting = Amount::getJsConfig($localeconv); - // decimal places is overruled by TransactionCurrency - $localeconv['frac_digits'] = $defaultCurrency->decimal_places; - - View::share('monthFormat', $monthFormat); View::share('monthAndDayFormat', $monthAndDayFormat); View::share('dateTimeFormat', $dateTimeFormat); - View::share('language', $lang); - View::share('localeconv', $localeconv); View::share('defaultCurrency', $defaultCurrency); - View::share('accountingConfig', $accounting); - } - - /** - * @throws FireflyException - */ - private function datePicker() - { - $viewRange = Preferences::get('viewRange', '1M')->data; - /** @var Carbon $start */ - $start = Session::get('start'); - /** @var Carbon $end */ - $end = Session::get('end'); - - $prevStart = clone $start; - $prevEnd = clone $start; - $nextStart = clone $end; - $nextEnd = clone $end; - if ($viewRange === 'custom') { - $days = $start->diffInDays($end); - $prevStart->subDays($days); - $nextEnd->addDays($days); - unset($days); - } - - if ($viewRange !== 'custom') { - $prevStart = Navigation::subtractPeriod($start, $viewRange);// subtract for previous period - $prevEnd = Navigation::endOfPeriod($prevStart, $viewRange); - $nextStart = Navigation::addPeriod($start, $viewRange, 0); // add for previous period - $nextEnd = Navigation::endOfPeriod($nextStart, $viewRange); - } - - $ranges = []; - $ranges['current'] = [$start->format('Y-m-d'), $end->format('Y-m-d')]; - $ranges['previous'] = [$prevStart->format('Y-m-d'), $prevEnd->format('Y-m-d')]; - $ranges['next'] = [$nextStart->format('Y-m-d'), $nextEnd->format('Y-m-d')]; - - switch ($viewRange) { - default: - throw new FireflyException('The date picker does not yet support "' . $viewRange . '".'); - case '1D': - case 'custom': - $format = (string)trans('config.month_and_day'); - break; - case '3M': - $format = (string)trans('config.quarter_in_year'); - break; - case '6M': - $format = (string)trans('config.half_year'); - break; - case '1Y': - $format = (string)trans('config.year'); - break; - case '1M': - $format = (string)trans('config.month'); - break; - case '1W': - $format = (string)trans('config.week_in_year'); - break; - } - - - $current = $start->formatLocalized($format); - $next = $nextStart->formatLocalized($format); - $prev = $prevStart->formatLocalized($format); - View::share('dpStart', $start->format('Y-m-d')); - View::share('dpEnd', $end->format('Y-m-d')); - View::share('dpCurrent', $current); - View::share('dpPrevious', $prev); - View::share('dpNext', $next); - View::share('dpRanges', $ranges); } /** diff --git a/app/Http/Requests/AccountFormRequest.php b/app/Http/Requests/AccountFormRequest.php index 364898614c..91b05abcb0 100644 --- a/app/Http/Requests/AccountFormRequest.php +++ b/app/Http/Requests/AccountFormRequest.php @@ -13,7 +13,6 @@ declare(strict_types = 1); namespace FireflyIII\Http\Requests; -use Carbon\Carbon; use FireflyIII\Repositories\Account\AccountRepositoryInterface; /** @@ -39,21 +38,21 @@ class AccountFormRequest extends Request public function getAccountData(): array { return [ - 'name' => trim(strval($this->input('name'))), - 'active' => intval($this->input('active')) === 1, - 'accountType' => $this->input('what'), - 'currency_id' => intval($this->input('currency_id')), - 'virtualBalance' => round($this->input('virtualBalance'), 12), - 'virtualBalanceCurrency' => intval($this->input('amount_currency_id_virtualBalance')), - 'iban' => trim(strval($this->input('iban'))), - 'BIC' => trim(strval($this->input('BIC'))), - 'accountNumber' => trim(strval($this->input('accountNumber'))), - 'accountRole' => $this->input('accountRole'), - 'openingBalance' => round($this->input('openingBalance'), 12), - 'openingBalanceDate' => new Carbon((string)$this->input('openingBalanceDate')), - 'openingBalanceCurrency' => intval($this->input('amount_currency_id_openingBalance')), - 'ccType' => $this->input('ccType'), - 'ccMonthlyPaymentDate' => $this->input('ccMonthlyPaymentDate'), + 'name' => $this->string('name'), + 'active' => $this->boolean('active'), + 'accountType' => $this->string('what'), + 'currency_id' => $this->integer('currency_id'), + 'virtualBalance' => $this->float('virtualBalance'), + 'virtualBalanceCurrency' => $this->integer('amount_currency_id_virtualBalance'), + 'iban' => $this->string('iban'), + 'BIC' => $this->string('BIC'), + 'accountNumber' => $this->string('accountNumber'), + 'accountRole' => $this->string('accountRole'), + 'openingBalance' => $this->float('openingBalance'), + 'openingBalanceDate' => $this->date('openingBalanceDate'), + 'openingBalanceCurrency' => $this->integer('amount_currency_id_openingBalance'), + 'ccType' => $this->string('ccType'), + 'ccMonthlyPaymentDate' => $this->string('ccMonthlyPaymentDate'), ]; } @@ -72,7 +71,7 @@ class AccountFormRequest extends Request $idRule = ''; if (!is_null($repository->find(intval($this->get('id')))->id)) { $idRule = 'belongsToUser:accounts'; - $nameRule = 'required|min:1|uniqueAccountForUser:' . $this->get('id'); + $nameRule = 'required|min:1|uniqueAccountForUser:' . intval($this->get('id')); } return [ diff --git a/app/Http/Requests/AttachmentFormRequest.php b/app/Http/Requests/AttachmentFormRequest.php index 16028cab37..6f7608bc46 100644 --- a/app/Http/Requests/AttachmentFormRequest.php +++ b/app/Http/Requests/AttachmentFormRequest.php @@ -36,9 +36,9 @@ class AttachmentFormRequest extends Request public function getAttachmentData(): array { return [ - 'title' => trim($this->input('title')), - 'description' => trim($this->input('description')), - 'notes' => trim($this->input('notes')), + 'title' => $this->string('title'), + 'description' => $this->string('description'), + 'notes' => $this->string('notes'), ]; } diff --git a/app/Http/Requests/BillFormRequest.php b/app/Http/Requests/BillFormRequest.php index 0b0b85e29d..992542eca1 100644 --- a/app/Http/Requests/BillFormRequest.php +++ b/app/Http/Requests/BillFormRequest.php @@ -13,8 +13,6 @@ declare(strict_types = 1); namespace FireflyIII\Http\Requests; -use Carbon\Carbon; - /** * Class BillFormRequest * @@ -38,17 +36,17 @@ class BillFormRequest extends Request public function getBillData() { return [ - 'name' => $this->get('name'), - 'match' => $this->get('match'), - 'amount_min' => round($this->get('amount_min'), 12), - 'amount_currency_id_amount_min' => intval($this->get('amount_currency_id_amount_min')), - 'amount_currency_id_amount_max' => intval($this->get('amount_currency_id_amount_max')), - 'amount_max' => round($this->get('amount_max'), 12), - 'date' => new Carbon($this->get('date')), - 'repeat_freq' => $this->get('repeat_freq'), - 'skip' => intval($this->get('skip')), - 'automatch' => intval($this->get('automatch')) === 1, - 'active' => intval($this->get('active')) === 1, + 'name' => $this->string('name'), + 'match' => $this->string('match'), + 'amount_min' => $this->float('amount_min'), + 'amount_currency_id_amount_min' => $this->integer('amount_currency_id_amount_min'), + 'amount_currency_id_amount_max' => $this->integer('amount_currency_id_amount_max'), + 'amount_max' => $this->float('amount_max'), + 'date' => $this->date('date'), + 'repeat_freq' => $this->string('repeat_freq'), + 'skip' => $this->integer('skip'), + 'automatch' => $this->boolean('automatch'), + 'active' => $this->boolean('active'), ]; } diff --git a/app/Http/Requests/BudgetFormRequest.php b/app/Http/Requests/BudgetFormRequest.php index 3ca9d0fb37..c7d9d0de63 100644 --- a/app/Http/Requests/BudgetFormRequest.php +++ b/app/Http/Requests/BudgetFormRequest.php @@ -37,8 +37,8 @@ class BudgetFormRequest extends Request public function getBudgetData(): array { return [ - 'name' => trim($this->input('name')), - 'active' => intval($this->input('active')) == 1, + 'name' => $this->string('name'), + 'active' => $this->boolean('active'), ]; } diff --git a/app/Http/Requests/CategoryFormRequest.php b/app/Http/Requests/CategoryFormRequest.php index 34347608af..b7b5e94a5e 100644 --- a/app/Http/Requests/CategoryFormRequest.php +++ b/app/Http/Requests/CategoryFormRequest.php @@ -38,7 +38,7 @@ class CategoryFormRequest extends Request public function getCategoryData(): array { return [ - 'name' => trim($this->input('name')), + 'name' => $this->string('name'), ]; } diff --git a/app/Http/Requests/ConfigurationRequest.php b/app/Http/Requests/ConfigurationRequest.php index d6bd5d7ca2..452e613e73 100644 --- a/app/Http/Requests/ConfigurationRequest.php +++ b/app/Http/Requests/ConfigurationRequest.php @@ -36,8 +36,8 @@ class ConfigurationRequest extends Request public function getConfigurationData(): array { return [ - 'single_user_mode' => intval($this->get('single_user_mode')) === 1, - 'is_demo_site' => intval($this->get('is_demo_site')) === 1, + 'single_user_mode' => $this->boolean('single_user_mode'), + 'is_demo_site' => $this->boolean('is_demo_site'), ]; } diff --git a/app/Http/Requests/CurrencyFormRequest.php b/app/Http/Requests/CurrencyFormRequest.php index ffbfa7e399..0449f9b4ab 100644 --- a/app/Http/Requests/CurrencyFormRequest.php +++ b/app/Http/Requests/CurrencyFormRequest.php @@ -36,10 +36,10 @@ class CurrencyFormRequest extends Request public function getCurrencyData() { return [ - 'name' => $this->get('name'), - 'code' => $this->get('code'), - 'symbol' => $this->get('symbol'), - 'decimal_places' => intval($this->get('decimal_places')), + 'name' => $this->string('name'), + 'code' => $this->string('code'), + 'symbol' => $this->string('symbol'), + 'decimal_places' => $this->integer('decimal_places'), ]; } diff --git a/app/Http/Requests/JournalFormRequest.php b/app/Http/Requests/JournalFormRequest.php index 2ecc96af87..62dc5656d2 100644 --- a/app/Http/Requests/JournalFormRequest.php +++ b/app/Http/Requests/JournalFormRequest.php @@ -13,7 +13,6 @@ declare(strict_types = 1); namespace FireflyIII\Http\Requests; -use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\TransactionType; @@ -43,30 +42,30 @@ class JournalFormRequest extends Request { $data = [ 'what' => $this->get('what'), // type. can be 'deposit', 'withdrawal' or 'transfer' - 'date' => new Carbon($this->get('date')), - 'tags' => explode(',', $this->getFieldOrEmptyString('tags')), - 'currency_id' => intval($this->get('amount_currency_id_amount')), + 'date' => $this->date('date'), + 'tags' => explode(',', $this->string('tags')), + 'currency_id' => $this->integer('amount_currency_id_amount'), // all custom fields: - 'interest_date' => $this->getDateOrNull('interest_date'), - 'book_date' => $this->getDateOrNull('book_date'), - 'process_date' => $this->getDateOrNull('process_date'), - 'due_date' => $this->getDateOrNull('due_date'), - 'payment_date' => $this->getDateOrNull('payment_date'), - 'invoice_date' => $this->getDateOrNull('invoice_date'), - 'internal_reference' => trim(strval($this->get('internal_reference'))), - 'notes' => trim(strval($this->get('notes'))), + 'interest_date' => $this->date('interest_date'), + 'book_date' => $this->date('book_date'), + 'process_date' => $this->date('process_date'), + 'due_date' => $this->date('due_date'), + 'payment_date' => $this->date('payment_date'), + 'invoice_date' => $this->date('invoice_date'), + 'internal_reference' => $this->string('internal_reference'), + 'notes' => $this->string('notes'), // transaction / journal data: - 'description' => $this->getFieldOrEmptyString('description'), - 'amount' => round($this->get('amount'), 12), - 'budget_id' => intval($this->get('budget_id')), - 'category' => $this->getFieldOrEmptyString('category'), - 'source_account_id' => intval($this->get('source_account_id')), - 'source_account_name' => $this->getFieldOrEmptyString('source_account_name'), - 'destination_account_id' => $this->getFieldOrEmptyString('destination_account_id'), - 'destination_account_name' => $this->getFieldOrEmptyString('destination_account_name'), - 'piggy_bank_id' => intval($this->get('piggy_bank_id')), + 'description' => $this->string('description'), + 'amount' => $this->float('amount'), + 'budget_id' => $this->integer('budget_id'), + 'category' => $this->string('category'), + 'source_account_id' => $this->integer('source_account_id'), + 'source_account_name' => $this->string('source_account_name'), + 'destination_account_id' => $this->string('destination_account_id'), + 'destination_account_name' => $this->string('destination_account_name'), + 'piggy_bank_id' => $this->integer('piggy_bank_id'), ]; @@ -142,26 +141,4 @@ class JournalFormRequest extends Request return $rules; } - - /** - * @param string $field - * - * @return Carbon|null - */ - private function getDateOrNull(string $field) - { - return $this->get($field) ? new Carbon($this->get($field)) : null; - } - - /** - * @param string $field - * - * @return string - */ - private function getFieldOrEmptyString(string $field): string - { - $string = $this->get($field) ?? ''; - - return trim($string); - } } diff --git a/app/Http/Requests/PiggyBankFormRequest.php b/app/Http/Requests/PiggyBankFormRequest.php index d0e6889d62..ba969dcf64 100644 --- a/app/Http/Requests/PiggyBankFormRequest.php +++ b/app/Http/Requests/PiggyBankFormRequest.php @@ -38,12 +38,12 @@ class PiggyBankFormRequest extends Request public function getPiggyBankData(): array { return [ - 'name' => trim($this->get('name')), + 'name' => $this->string('name'), 'startdate' => new Carbon, - 'account_id' => intval($this->get('account_id')), - 'targetamount' => round($this->get('targetamount'), 12), - 'targetdate' => strlen(strval($this->get('targetdate'))) > 0 ? new Carbon($this->get('targetdate')) : null, - 'note' => trim(strval($this->get('note'))), + 'account_id' => $this->integer('account_id'), + 'targetamount' => $this->float('targetamount'), + 'targetdate' => $this->date('targetdate'), + 'note' => $this->string('note'), ]; } diff --git a/app/Http/Requests/Request.php b/app/Http/Requests/Request.php index 84cb318d3e..e73b17ac60 100644 --- a/app/Http/Requests/Request.php +++ b/app/Http/Requests/Request.php @@ -13,6 +13,7 @@ declare(strict_types = 1); namespace FireflyIII\Http\Requests; +use Carbon\Carbon; use Illuminate\Foundation\Http\FormRequest; /** @@ -20,7 +21,123 @@ use Illuminate\Foundation\Http\FormRequest; * * @package FireflyIII\Http\Requests */ -abstract class Request extends FormRequest +class Request extends FormRequest { - // + /** + * @param string $field + * + * @return bool + */ + protected function boolean(string $field): bool + { + return intval($this->input($field)) === 1; + } + + /** + * @param string $field + * + * @return Carbon|null + */ + protected function date(string $field) + { + return $this->get($field) ? new Carbon($this->get($field)) : null; + } + + /** + * @param string $field + * + * @return float + */ + protected function float(string $field): float + { + return round($this->input($field), 12); + } + + /** + * @param string $field + * @param string $type + * + * @return array + */ + protected function getArray(string $field, string $type): array + { + $original = $this->get($field); + $return = []; + foreach ($original as $index => $value) { + $return[$index] = $this->$type($value); + } + + return $return; + } + + /** + * @param string $field + * + * @return int + */ + protected function integer(string $field): int + { + return intval($this->get($field)); + } + + /** + * @param string $field + * + * @return string + */ + protected function string(string $field): string + { + $string = $this->get($field) ?? ''; + $search = [ + "\u{0001}", // start of heading + "\u{0002}", // start of text + "\u{0003}", // end of text + "\u{0004}", // end of transmission + "\u{0005}", // enquiry + "\u{0006}", // ACK + "\u{0007}", // BEL + "\u{0008}", // backspace + "\u{000E}", // shift out + "\u{000F}", // shift in + "\u{0010}", // data link escape + "\u{0011}", // DC1 + "\u{0012}", // DC2 + "\u{0013}", // DC3 + "\u{0014}", // DC4 + "\u{0015}", // NAK + "\u{0016}", // SYN + "\u{0017}", // ETB + "\u{0018}", // CAN + "\u{0019}", // EM + "\u{001A}", // SUB + "\u{001B}", // escape + "\u{001C}", // file separator + "\u{001D}", // group separator + "\u{001E}", // record separator + "\u{001F}", // unit separator + "\u{007F}", // DEL + "\u{00A0}", // non-breaking space + "\u{1680}", // ogham space mark + "\u{180E}", // mongolian vowel separator + "\u{2000}", // en quad + "\u{2001}", // em quad + "\u{2002}", // en space + "\u{2003}", // em space + "\u{2004}", // three-per-em space + "\u{2005}", // four-per-em space + "\u{2006}", // six-per-em space + "\u{2007}", // figure space + "\u{2008}", // punctuation space + "\u{2009}", // thin space + "\u{200A}", // hair space + "\u{200B}", // zero width space + "\u{202F}", // narrow no-break space + "\u{3000}", // ideographic space + "\u{FEFF}", // zero width no -break space + ]; + $replace = "\x20"; // plain old normal space + $string = str_replace($search, $replace, $string); + + return trim($string); + } } diff --git a/app/Http/Requests/RuleFormRequest.php b/app/Http/Requests/RuleFormRequest.php index 814f0c560d..6295bd9e3f 100644 --- a/app/Http/Requests/RuleFormRequest.php +++ b/app/Http/Requests/RuleFormRequest.php @@ -38,17 +38,17 @@ class RuleFormRequest extends Request public function getRuleData(): array { return [ - 'title' => trim($this->get('title')), - 'active' => intval($this->get('active')) == 1, - 'trigger' => trim($this->get('trigger')), - 'description' => trim($this->get('description')), + 'title' => $this->string('title'), + 'active' => $this->boolean('active'), + 'trigger' => $this->string('trigger'), + 'description' => $this->string('description'), 'rule-triggers' => $this->get('rule-trigger'), 'rule-trigger-values' => $this->get('rule-trigger-value'), 'rule-trigger-stop' => $this->get('rule-trigger-stop'), 'rule-actions' => $this->get('rule-action'), 'rule-action-values' => $this->get('rule-action-value'), 'rule-action-stop' => $this->get('rule-action-stop'), - 'stop_processing' => intval($this->get('stop_processing')) === 1, + 'stop_processing' => $this->boolean('stop_processing'), ]; } diff --git a/app/Http/Requests/RuleGroupFormRequest.php b/app/Http/Requests/RuleGroupFormRequest.php index b5420c5ce5..fcf92d0105 100644 --- a/app/Http/Requests/RuleGroupFormRequest.php +++ b/app/Http/Requests/RuleGroupFormRequest.php @@ -38,8 +38,8 @@ class RuleGroupFormRequest extends Request public function getRuleGroupData(): array { return [ - 'title' => trim($this->input('title')), - 'description' => trim($this->input('description')), + 'title' => $this->string('title'), + 'description' => $this->string('description'), ]; } diff --git a/app/Http/Requests/SplitJournalFormRequest.php b/app/Http/Requests/SplitJournalFormRequest.php index 2bf7100677..5efba69243 100644 --- a/app/Http/Requests/SplitJournalFormRequest.php +++ b/app/Http/Requests/SplitJournalFormRequest.php @@ -13,8 +13,6 @@ declare(strict_types = 1); namespace FireflyIII\Http\Requests; -use Carbon\Carbon; - /** * Class SplitJournalFormRequest @@ -38,18 +36,18 @@ class SplitJournalFormRequest extends Request public function getSplitData(): array { $data = [ - 'id' => $this->get('id') ?? 0, - 'journal_description' => $this->get('journal_description'), - 'journal_currency_id' => intval($this->get('journal_currency_id')), - 'journal_source_account_id' => intval($this->get('journal_source_account_id')), - 'journal_source_account_name' => $this->get('journal_source_account_name'), - 'journal_destination_account_id' => intval($this->get('journal_destination_account_id')), - 'journal_destination_account_name' => $this->get('journal_source_destination_name'), - 'date' => new Carbon($this->get('date')), - 'what' => $this->get('what'), - 'interest_date' => $this->get('interest_date') ? new Carbon($this->get('interest_date')) : null, - 'book_date' => $this->get('book_date') ? new Carbon($this->get('book_date')) : null, - 'process_date' => $this->get('process_date') ? new Carbon($this->get('process_date')) : null, + 'id' => $this->integer('id'), + 'journal_description' => $this->string('journal_description'), + 'journal_currency_id' => $this->integer('journal_currency_id'), + 'journal_source_account_id' => $this->integer('journal_source_account_id'), + 'journal_source_account_name' => $this->string('journal_source_account_name'), + 'journal_destination_account_id' => $this->integer('journal_destination_account_id'), + 'journal_destination_account_name' => $this->string('journal_source_destination_name'), + 'date' => $this->date('date'), + 'what' => $this->string('what'), + 'interest_date' => $this->date('interest_date'), + 'book_date' => $this->date('book_date'), + 'process_date' => $this->date('process_date'), 'transactions' => $this->getTransactionData(), ]; @@ -87,28 +85,30 @@ class SplitJournalFormRequest extends Request */ private function getTransactionData(): array { + $descriptions = $this->getArray('description', 'string'); + $categories = $this->getArray('category', 'string'); + $amounts = $this->getArray('amount', 'float'); + $budgets = $this->getArray('amount', 'integer'); + $srcAccountIds = $this->getArray('source_account_id', 'integer'); + $srcAccountNames = $this->getArray('source_account_name', 'string'); + $dstAccountIds = $this->getArray('destination_account_id', 'integer'); + $dstAccountNames = $this->getArray('destination_account_name', 'string'); + $piggyBankIds = $this->getArray('piggy_bank_id', 'integer'); + $return = []; // description is leading because it is one of the mandatory fields. - foreach ($this->get('description') as $index => $description) { - $category = $this->get('category')[$index] ?? ''; + foreach ($descriptions as $index => $description) { + $category = $categories[$index] ?? ''; $transaction = [ 'description' => $description, - 'amount' => round($this->get('amount')[$index], 12), - 'budget_id' => $this->get('budget_id')[$index] ? intval($this->get('budget_id')[$index]) : 0, - 'category' => trim($category), - 'source_account_id' => isset($this->get('source_account_id')[$index]) - ? intval($this->get('source_account_id')[$index]) - : intval( - $this->get('journal_source_account_id') - ), - 'source_account_name' => $this->get('source_account_name')[$index] ?? '', - 'piggy_bank_id' => isset($this->get('piggy_bank_id')[$index]) ? intval($this->get('piggy_bank_id')[$index]) : 0, - 'destination_account_id' => isset($this->get('destination_account_id')[$index]) - ? intval($this->get('destination_account_id')[$index]) - : intval( - $this->get('journal_destination_account_id') - ), - 'destination_account_name' => $this->get('destination_account_name')[$index] ?? '', + 'amount' => $amounts[$index], + 'budget_id' => $budgets[$index] ?? 0, + 'category' => $category, + 'source_account_id' => $srcAccountIds[$index] ?? $this->get('journal_source_account_id'), + 'source_account_name' => $srcAccountNames[$index] ?? '', + 'piggy_bank_id' => $piggyBankIds[$index] ?? 0, + 'destination_account_id' => $dstAccountIds[$index] ?? $this->get('journal_destination_account_id'), + 'destination_account_name' => $dstAccountNames[$index] ?? '', ]; $return[] = $transaction; } diff --git a/app/Http/Requests/TagFormRequest.php b/app/Http/Requests/TagFormRequest.php index d7bdb63f54..544b53c0b0 100644 --- a/app/Http/Requests/TagFormRequest.php +++ b/app/Http/Requests/TagFormRequest.php @@ -38,9 +38,9 @@ class TagFormRequest extends Request public function collectTagData(): array { if ($this->get('setTag') == 'true') { - $latitude = $this->get('latitude'); - $longitude = $this->get('longitude'); - $zoomLevel = $this->get('zoomLevel'); + $latitude = $this->string('latitude'); + $longitude = $this->string('longitude'); + $zoomLevel = $this->integer('zoomLevel'); } else { $latitude = null; $longitude = null; @@ -49,13 +49,13 @@ class TagFormRequest extends Request $date = $this->get('date') ?? ''; $data = [ - 'tag' => $this->get('tag'), - 'date' => strlen($date) > 0 ? new Carbon($date) : null, - 'description' => $this->get('description') ?? '', + 'tag' => $this->string('tag'), + 'date' => $this->date($date), + 'description' => $this->string('description'), 'latitude' => $latitude, 'longitude' => $longitude, 'zoomLevel' => $zoomLevel, - 'tagMode' => $this->get('tagMode'), + 'tagMode' => $this->string('tagMode'), ]; return $data; diff --git a/app/Http/Requests/UserFormRequest.php b/app/Http/Requests/UserFormRequest.php index faf12136e1..436e3c9d33 100644 --- a/app/Http/Requests/UserFormRequest.php +++ b/app/Http/Requests/UserFormRequest.php @@ -36,11 +36,10 @@ class UserFormRequest extends Request public function getUserData(): array { return [ - 'email' => trim($this->get('email')), - 'blocked' => intval($this->get('blocked')), - 'blocked_code' => trim($this->get('blocked_code')), - 'password' => trim($this->get('password')), - + 'email' => $this->string('email'), + 'blocked' => $this->integer('blocked'), + 'blocked_code' => $this->string('blocked_code'), + 'password' => $this->string('password'), ]; } diff --git a/app/Models/Account.php b/app/Models/Account.php index 4810c6006e..11b337ba10 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -85,7 +85,7 @@ class Account extends Model foreach ($search as $name => $value) { $query->where($name, $value); } - $set = $query->get(['accounts.*']); + $set = $query->get(['accounts.*']); // account must have a name. If not set, use IBAN. if (!isset($fields['name'])) { @@ -93,7 +93,6 @@ class Account extends Model } - /** @var Account $account */ foreach ($set as $account) { if ($account->name == $fields['name']) { @@ -316,8 +315,9 @@ class Account extends Model */ public function setNameAttribute($value) { - $this->attributes['name'] = $value; - $this->attributes['encrypted'] = false; + $encrypt = config('firefly.encryption'); + $this->attributes['name'] = $encrypt ? Crypt::encrypt($value) : $value; + $this->attributes['encrypted'] = $encrypt; } /** diff --git a/app/Models/Bill.php b/app/Models/Bill.php index bf67e0f730..54a7429746 100644 --- a/app/Models/Bill.php +++ b/app/Models/Bill.php @@ -35,7 +35,7 @@ class Bill extends Model * @var array */ protected $casts - = [ + = [ 'created_at' => 'date', 'updated_at' => 'date', 'deleted_at' => 'date', @@ -47,7 +47,7 @@ class Bill extends Model 'match_encrypted' => 'boolean', ]; /** @var array */ - protected $dates = ['created_at', 'updated_at', 'deleted_at']; + protected $dates = ['created_at', 'updated_at', 'deleted_at']; protected $fillable = ['name', 'match', 'amount_min', 'match_encrypted', 'name_encrypted', 'user_id', 'amount_max', 'date', 'repeat_freq', 'skip', 'automatch', 'active',]; @@ -120,8 +120,9 @@ class Bill extends Model */ public function setMatchAttribute($value) { - $this->attributes['match'] = Crypt::encrypt($value); - $this->attributes['match_encrypted'] = true; + $encrypt = config('firefly.encryption'); + $this->attributes['match'] = $encrypt ? Crypt::encrypt($value) : $value; + $this->attributes['match_encrypted'] = $encrypt; } /** @@ -129,8 +130,9 @@ class Bill extends Model */ public function setNameAttribute($value) { - $this->attributes['name'] = Crypt::encrypt($value); - $this->attributes['name_encrypted'] = true; + $encrypt = config('firefly.encryption'); + $this->attributes['name'] = $encrypt ? Crypt::encrypt($value) : $value; + $this->attributes['name_encrypted'] = $encrypt; } /** diff --git a/app/Models/Budget.php b/app/Models/Budget.php index d62e195352..504802e05a 100644 --- a/app/Models/Budget.php +++ b/app/Models/Budget.php @@ -121,8 +121,9 @@ class Budget extends Model */ public function setNameAttribute($value) { - $this->attributes['name'] = $value; - $this->attributes['encrypted'] = false; + $encrypt = config('firefly.encryption'); + $this->attributes['name'] = $encrypt ? Crypt::encrypt($value) : $value; + $this->attributes['encrypted'] = $encrypt; } /** diff --git a/app/Models/Category.php b/app/Models/Category.php index e8e665bff2..50349e9b44 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -115,8 +115,9 @@ class Category extends Model */ public function setNameAttribute($value) { - $this->attributes['name'] = $value; - $this->attributes['encrypted'] = false; + $encrypt = config('firefly.encryption'); + $this->attributes['name'] = $encrypt ? Crypt::encrypt($value) : $value; + $this->attributes['encrypted'] = $encrypt; } /** diff --git a/app/Models/PiggyBank.php b/app/Models/PiggyBank.php index 34c742bd7f..d5b2b00187 100644 --- a/app/Models/PiggyBank.php +++ b/app/Models/PiggyBank.php @@ -159,8 +159,9 @@ class PiggyBank extends Model */ public function setNameAttribute($value) { - $this->attributes['name'] = $value; - $this->attributes['encrypted'] = false; + $encrypt = config('firefly.encryption'); + $this->attributes['name'] = $encrypt ? Crypt::encrypt($value) : $value; + $this->attributes['encrypted'] = $encrypt; } /** diff --git a/app/Models/PiggyBankRepetition.php b/app/Models/PiggyBankRepetition.php index 1d9dca1eb0..00c8221582 100644 --- a/app/Models/PiggyBankRepetition.php +++ b/app/Models/PiggyBankRepetition.php @@ -89,7 +89,7 @@ class PiggyBankRepetition extends Model */ public function setCurrentamountAttribute($value) { - $this->attributes['currentamount'] = strval(round($value, 2)); + $this->attributes['currentamount'] = strval(round($value, 12)); } } diff --git a/app/Models/TransactionJournal.php b/app/Models/TransactionJournal.php index 1cf5faf17f..1808955271 100644 --- a/app/Models/TransactionJournal.php +++ b/app/Models/TransactionJournal.php @@ -371,8 +371,9 @@ class TransactionJournal extends TransactionJournalSupport */ public function setDescriptionAttribute($value) { - $this->attributes['description'] = $value; - $this->attributes['encrypted'] = false; + $encrypt = config('firefly.encryption'); + $this->attributes['description'] = $encrypt ? Crypt::encrypt($value) : $value; + $this->attributes['encrypted'] = $encrypt; } /** diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index ab2cc761bd..d740291f68 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -283,6 +283,29 @@ class AccountRepository implements AccountRepositoryInterface return $last; } + /** + * Returns the date of the very first transaction in this account. + * + * @param Account $account + * + * @return TransactionJournal + */ + public function oldestJournal(Account $account): TransactionJournal + { + $first = $account->transactions() + ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') + ->orderBy('transaction_journals.date', 'ASC') + ->orderBy('transaction_journals.order', 'DESC') + ->where('transaction_journals.user_id', $this->user->id) + ->orderBy('transaction_journals.id', 'ASC') + ->first(['transaction_journals.id']); + if (!is_null($first)) { + return TransactionJournal::find(intval($first->id)); + } + + return new TransactionJournal(); + } + /** * Returns the date of the very first transaction in this account. * @@ -292,18 +315,12 @@ class AccountRepository implements AccountRepositoryInterface */ public function oldestJournalDate(Account $account): Carbon { - $first = new Carbon; - $date = $account->transactions() - ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') - ->orderBy('transaction_journals.date', 'ASC') - ->orderBy('transaction_journals.order', 'DESC') - ->orderBy('transaction_journals.id', 'ASC') - ->first(['transaction_journals.date']); - if (!is_null($date)) { - $first = new Carbon($date->date); + $journal = $this->oldestJournal($account); + if (is_null($journal->id)) { + return new Carbon; } - return $first; + return $journal->date; } /** @@ -477,7 +494,6 @@ class AccountRepository implements AccountRepositoryInterface } /** - * @param float $amount * @param string $name * * @return Account diff --git a/app/Repositories/Account/AccountRepositoryInterface.php b/app/Repositories/Account/AccountRepositoryInterface.php index 6aca02047e..428e48144d 100644 --- a/app/Repositories/Account/AccountRepositoryInterface.php +++ b/app/Repositories/Account/AccountRepositoryInterface.php @@ -15,6 +15,7 @@ namespace FireflyIII\Repositories\Account; use Carbon\Carbon; use FireflyIII\Models\Account; +use FireflyIII\Models\TransactionJournal; use Illuminate\Support\Collection; /** @@ -105,6 +106,15 @@ interface AccountRepositoryInterface */ public function newestJournalDate(Account $account): Carbon; + /** + * Returns the date of the very first transaction in this account. + * + * @param Account $account + * + * @return TransactionJournal + */ + public function oldestJournal(Account $account): TransactionJournal; + /** * Returns the date of the very first transaction in this account. * diff --git a/app/Repositories/Account/AccountTasker.php b/app/Repositories/Account/AccountTasker.php index 5a85a93201..126d084e8d 100644 --- a/app/Repositories/Account/AccountTasker.php +++ b/app/Repositories/Account/AccountTasker.php @@ -14,8 +14,6 @@ declare(strict_types = 1); namespace FireflyIII\Repositories\Account; use Carbon\Carbon; -use FireflyIII\Helpers\Collection\Account as AccountCollection; -use FireflyIII\Models\Account; use FireflyIII\Models\Transaction; use FireflyIII\User; use Illuminate\Database\Query\JoinClause; @@ -106,55 +104,55 @@ class AccountTasker implements AccountTaskerInterface * @param Carbon $start * @param Carbon $end * - * @return AccountCollection + * @return array */ - public function getAccountReport(Collection $accounts, Carbon $start, Carbon $end): AccountCollection + public function getAccountReport(Collection $accounts, Carbon $start, Carbon $end): array { - $startAmount = '0'; - $endAmount = '0'; - $diff = '0'; $ids = $accounts->pluck('id')->toArray(); $yesterday = clone $start; $yesterday->subDay(); - $startSet = Steam::balancesById($ids, $yesterday); - $backupSet = Steam::balancesById($ids, $start); - $endSet = Steam::balancesById($ids, $end); + $startSet = Steam::balancesById($ids, $yesterday); + $endSet = Steam::balancesById($ids, $end); - Log::debug( - sprintf( - 'getAccountReport from %s to %s for %d accounts.', - $start->format('Y-m-d'), - $end->format('Y-m-d'), - $accounts->count() - ) - ); - $accounts->each( - function (Account $account) use ($startSet, $endSet, $backupSet) { - $account->startBalance = $startSet[$account->id] ?? '0'; - $account->endBalance = $endSet[$account->id] ?? '0'; + Log::debug('Start of accountreport'); - // check backup set just in case: - if ($account->startBalance === '0' && isset($backupSet[$account->id])) { - $account->startBalance = $backupSet[$account->id]; - } - } - ); + /** @var AccountRepositoryInterface $repository */ + $repository = app(AccountRepositoryInterface::class); + + $return = [ + 'start' => '0', + 'end' => '0', + 'difference' => '0', + 'accounts' => [], + ]; - // summarize: foreach ($accounts as $account) { - $startAmount = bcadd($startAmount, $account->startBalance); - $endAmount = bcadd($endAmount, $account->endBalance); - $diff = bcadd($diff, bcsub($account->endBalance, $account->startBalance)); + $id = $account->id; + $entry = [ + 'name' => $account->name, + 'id' => $account->id, + 'start_balance' => '0', + 'end_balance' => '0', + ]; + + // get first journal date: + $first = $repository->oldestJournal($account); + $entry['start_balance'] = $startSet[$account->id] ?? '0'; + $entry['end_balance'] = $endSet[$account->id] ?? '0'; + if (!is_null($first->id) && $yesterday < $first->date && $end >= $first->date) { + // something about balance? + $entry['start_balance'] = $first->transactions()->where('account_id', $account->id)->first()->amount; + Log::debug(sprintf('Account was opened before %s, so opening balance is %f', $yesterday->format('Y-m-d'), $entry['start_balance'])); + } + $return['start'] = bcadd($return['start'], $entry['start_balance']); + $return['end'] = bcadd($return['end'], $entry['end_balance']); + + $return['accounts'][$id] = $entry; } - $object = new AccountCollection; - $object->setStart($startAmount); - $object->setEnd($endAmount); - $object->setDifference($diff); - $object->setAccounts($accounts); + $return['difference'] = bcsub($return['end'], $return['start']); - - return $object; + return $return; } /** diff --git a/app/Repositories/Account/AccountTaskerInterface.php b/app/Repositories/Account/AccountTaskerInterface.php index 67ab246ed9..57fbebaa79 100644 --- a/app/Repositories/Account/AccountTaskerInterface.php +++ b/app/Repositories/Account/AccountTaskerInterface.php @@ -14,7 +14,6 @@ declare(strict_types = 1); namespace FireflyIII\Repositories\Account; use Carbon\Carbon; -use FireflyIII\Helpers\Collection\Account as AccountCollection; use Illuminate\Support\Collection; /** @@ -54,8 +53,8 @@ interface AccountTaskerInterface * @param Carbon $start * @param Carbon $end * - * @return AccountCollection + * @return array */ - public function getAccountReport(Collection $accounts, Carbon $start, Carbon $end): AccountCollection; + public function getAccountReport(Collection $accounts, Carbon $start, Carbon $end): array; } diff --git a/app/Repositories/ExportJob/ExportJobRepositoryInterface.php b/app/Repositories/ExportJob/ExportJobRepositoryInterface.php index dbb4a04418..6f3c7a30b1 100644 --- a/app/Repositories/ExportJob/ExportJobRepositoryInterface.php +++ b/app/Repositories/ExportJob/ExportJobRepositoryInterface.php @@ -50,7 +50,7 @@ interface ExportJobRepositoryInterface /** * @param string $key * - * @return ExportJob|null + * @return ExportJob */ public function findByKey(string $key): ExportJob; diff --git a/app/Repositories/Journal/JournalRepository.php b/app/Repositories/Journal/JournalRepository.php index 2093793c8d..9ee336cddf 100644 --- a/app/Repositories/Journal/JournalRepository.php +++ b/app/Repositories/Journal/JournalRepository.php @@ -137,6 +137,14 @@ class JournalRepository implements JournalRepositoryInterface return $entry; } + /** + * @return Collection + */ + public function getTransactionTypes(): Collection + { + return TransactionType::orderBy('type', 'ASC')->get(); + } + /** * @param array $data * @@ -208,40 +216,6 @@ class JournalRepository implements JournalRepositoryInterface } - /** - * Store journal only, uncompleted, with attachments if necessary. - * - * @param array $data - * - * @return TransactionJournal - */ - public function storeJournal(array $data): TransactionJournal - { - // find transaction type. - $transactionType = TransactionType::where('type', ucfirst($data['what']))->first(); - - // store actual journal. - $journal = new TransactionJournal( - [ - 'user_id' => $this->user->id, - 'transaction_type_id' => $transactionType->id, - 'transaction_currency_id' => $data['amount_currency_id_amount'], - 'description' => $data['description'], - 'completed' => 0, - 'date' => $data['date'], - ] - ); - - $result = $journal->save(); - if ($result) { - return $journal; - } - - return new TransactionJournal(); - - - } - /** * @param TransactionJournal $journal * @param array $data diff --git a/app/Repositories/Journal/JournalRepositoryInterface.php b/app/Repositories/Journal/JournalRepositoryInterface.php index fb9779eec3..0b62a5729a 100644 --- a/app/Repositories/Journal/JournalRepositoryInterface.php +++ b/app/Repositories/Journal/JournalRepositoryInterface.php @@ -16,6 +16,7 @@ namespace FireflyIII\Repositories\Journal; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; +use Illuminate\Support\Collection; use Illuminate\Support\MessageBag; /** @@ -36,6 +37,11 @@ interface JournalRepositoryInterface */ public function convert(TransactionJournal $journal, TransactionType $type, Account $source, Account $destination): MessageBag; + /** + * @return Collection + */ + public function getTransactionTypes(): Collection; + /** * Deletes a journal. * @@ -69,15 +75,6 @@ interface JournalRepositoryInterface */ public function store(array $data): TransactionJournal; - /** - * Store journal only, uncompleted, with attachments if necessary. - * - * @param array $data - * - * @return TransactionJournal - */ - public function storeJournal(array $data): TransactionJournal; - /** * @param TransactionJournal $journal * @param array $data diff --git a/app/Repositories/RuleGroup/RuleGroupRepository.php b/app/Repositories/RuleGroup/RuleGroupRepository.php index 247078221e..b294e19937 100644 --- a/app/Repositories/RuleGroup/RuleGroupRepository.php +++ b/app/Repositories/RuleGroup/RuleGroupRepository.php @@ -49,8 +49,8 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface } /** - * @param RuleGroup $ruleGroup - * @param RuleGroup $moveTo + * @param RuleGroup $ruleGroup + * @param RuleGroup|null $moveTo * * @return bool */ diff --git a/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php b/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php index a321b04e98..985a121b92 100644 --- a/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php +++ b/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php @@ -35,8 +35,8 @@ interface RuleGroupRepositoryInterface public function count(): int; /** - * @param RuleGroup $ruleGroup - * @param RuleGroup $moveTo + * @param RuleGroup $ruleGroup + * @param RuleGroup|null $moveTo * * @return bool */ diff --git a/app/Rules/Triggers/AbstractTrigger.php b/app/Rules/Triggers/AbstractTrigger.php index f3be138f8a..0fd9a3bfd8 100644 --- a/app/Rules/Triggers/AbstractTrigger.php +++ b/app/Rules/Triggers/AbstractTrigger.php @@ -74,6 +74,8 @@ class AbstractTrigger return $self; } + + /** * @param RuleTrigger $trigger * @param TransactionJournal $journal diff --git a/app/Rules/Triggers/BudgetIs.php b/app/Rules/Triggers/BudgetIs.php new file mode 100644 index 0000000000..fa444f3ffc --- /dev/null +++ b/app/Rules/Triggers/BudgetIs.php @@ -0,0 +1,95 @@ +budgets()->first(); + if (!is_null($budget)) { + $name = strtolower($budget->name); + // match on journal: + if ($name === strtolower($this->triggerValue)) { + Log::debug(sprintf('RuleTrigger BudgetIs for journal #%d: "%s" is "%s", return true.', $journal->id, $name, $this->triggerValue)); + + return true; + } + } + + if (is_null($budget)) { + // perhaps transactions have this budget? + /** @var Transaction $transaction */ + foreach ($journal->transactions as $transaction) { + $budget = $transaction->budgets()->first(); + if (!is_null($budget)) { + $name = strtolower($budget->name); + if ($name === strtolower($this->triggerValue)) { + Log::debug( + sprintf( + 'RuleTrigger BudgetIs for journal #%d (transaction #%d): "%s" is "%s", return true.', + $journal->id, $transaction->id, $name, $this->triggerValue + ) + ); + + return true; + } + } + } + } + + Log::debug(sprintf('RuleTrigger BudgetIs for journal #%d: does not have budget "%s", return false.', $journal->id, $this->triggerValue)); + + return false; + } +} diff --git a/app/Rules/Triggers/CategoryIs.php b/app/Rules/Triggers/CategoryIs.php new file mode 100644 index 0000000000..28dcddb086 --- /dev/null +++ b/app/Rules/Triggers/CategoryIs.php @@ -0,0 +1,95 @@ +categories()->first(); + if (!is_null($category)) { + $name = strtolower($category->name); + // match on journal: + if ($name === strtolower($this->triggerValue)) { + Log::debug(sprintf('RuleTrigger CategoryIs for journal #%d: "%s" is "%s", return true.', $journal->id, $name, $this->triggerValue)); + + return true; + } + } + + if (is_null($category)) { + // perhaps transactions have this category? + /** @var Transaction $transaction */ + foreach ($journal->transactions as $transaction) { + $category = $transaction->categories()->first(); + if (!is_null($category)) { + $name = strtolower($category->name); + if ($name === strtolower($this->triggerValue)) { + Log::debug( + sprintf( + 'RuleTrigger CategoryIs for journal #%d (transaction #%d): "%s" is "%s", return true.', + $journal->id, $transaction->id, $name, $this->triggerValue + ) + ); + + return true; + } + } + } + } + + Log::debug(sprintf('RuleTrigger CategoryIs for journal #%d: does not have category "%s", return false.', $journal->id, $this->triggerValue)); + + return false; + } +} diff --git a/app/Rules/Triggers/TagIs.php b/app/Rules/Triggers/TagIs.php new file mode 100644 index 0000000000..684d806760 --- /dev/null +++ b/app/Rules/Triggers/TagIs.php @@ -0,0 +1,74 @@ +tags()->get(); + /** @var Tag $tag */ + foreach ($tags as $tag) { + $name = strtolower($tag->tag); + // match on journal: + if ($name === strtolower($this->triggerValue)) { + Log::debug(sprintf('RuleTrigger TagIs for journal #%d: is tagged with "%s", return true.', $journal->id, $name)); + + return true; + } + } + Log::debug(sprintf('RuleTrigger TagIs for journal #%d: is not tagged with "%s", return false.', $journal->id, $this->triggerValue)); + + return false; + } +} diff --git a/app/Support/Amount.php b/app/Support/Amount.php index de7fcce12f..9434352b80 100644 --- a/app/Support/Amount.php +++ b/app/Support/Amount.php @@ -90,11 +90,11 @@ class Amount $pos_c = $sign; } - // default: (amount before currency) + // default is amount before currency $format = $pos_a . $pos_d . '%v' . $space . $pos_b . '%s' . $pos_c . $pos_e; if ($csPrecedes) { - // (currency before amount) + // alternative is currency before amount $format = $pos_a . $pos_b . '%s' . $pos_c . $space . $pos_d . '%v' . $pos_e; } Log::debug(sprintf('Final format: "%s"', $format)); diff --git a/app/Support/ExpandedForm.php b/app/Support/ExpandedForm.php index 28b6972ed7..85b85fd5d2 100644 --- a/app/Support/ExpandedForm.php +++ b/app/Support/ExpandedForm.php @@ -285,7 +285,6 @@ class ExpandedForm /** * @param $name - * @param null $value * @param array $options * * @return string diff --git a/app/Support/Steam.php b/app/Support/Steam.php index 65e4b148a6..0185a93caf 100644 --- a/app/Support/Steam.php +++ b/app/Support/Steam.php @@ -124,6 +124,8 @@ class Steam ->where('transaction_journals.date', '>=', $start->format('Y-m-d')) ->where('transaction_journals.date', '<=', $end->format('Y-m-d')) ->groupBy('transaction_journals.date') + ->orderBy('transaction_journals.date', 'ASC') + ->whereNull('transaction_journals.deleted_at') ->get(['transaction_journals.date', DB::raw('SUM(transactions.amount) AS modified')]); $currentBalance = $startBalance; foreach ($set as $entry) { @@ -150,7 +152,7 @@ class Steam public function balancesById(array $ids, Carbon $date): array { - // abuse chart properties: + // cache this property. $cache = new CacheProperties; $cache->addProperty($ids); $cache->addProperty('balances'); @@ -163,6 +165,7 @@ class Steam ->where('transaction_journals.date', '<=', $date->format('Y-m-d')) ->groupBy('transactions.account_id') ->whereIn('transactions.account_id', $ids) + ->whereNull('transaction_journals.deleted_at') ->get(['transactions.account_id', DB::raw('sum(transactions.amount) AS aggregate')]); $result = []; diff --git a/app/Support/Twig/General.php b/app/Support/Twig/General.php index 04336c3163..cfd98fcafc 100644 --- a/app/Support/Twig/General.php +++ b/app/Support/Twig/General.php @@ -14,7 +14,6 @@ declare(strict_types = 1); namespace FireflyIII\Support\Twig; use Carbon\Carbon; -use Config; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionJournal; use Route; @@ -42,7 +41,6 @@ class General extends Twig_Extension $this->formatAmountPlain(), $this->formatJournal(), $this->balance(), - $this->getAccountRole(), $this->formatFilesize(), $this->mimeIcon(), ]; @@ -234,18 +232,6 @@ class General extends Twig_Extension ); } - /** - * @return Twig_SimpleFilter - */ - protected function getAccountRole(): Twig_SimpleFilter - { - return new Twig_SimpleFilter( - 'getAccountRole', function (string $name): string { - return Config::get('firefly.accountRoles.' . $name); - } - ); - } - /** * @return Twig_SimpleFunction */ diff --git a/bootstrap/app.php b/bootstrap/app.php index 88ef952626..b026728e73 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -25,7 +25,6 @@ declare(strict_types = 1); bcscale(12); - $app = new Illuminate\Foundation\Application( realpath(__DIR__.'/../') ); diff --git a/composer.json b/composer.json index 222bdc6cf0..6f7bea2597 100755 --- a/composer.json +++ b/composer.json @@ -5,16 +5,36 @@ "finance", "finances", "manager", + "management", "euro", + "dollar", "laravel", "money", + "currency", "financials", + "financial", "budgets", + "administration", + "tool", + "tooling", + "help", + "helper", + "assistant", + "planning", + "organizing", + "bills", + "personal finance", + "budgets", + "budgeting", + "budgeting tool", + "budgeting application", "transactions", + "self hosted", + "self-hosted", "transfers", "management" ], - "license": "MIT", + "license": "Creative Commons Attribution-ShareAlike 4.0 International License", "homepage": "https://github.com/firefly-iii/firefly-iii", "type": "project", "authors": [ @@ -28,7 +48,7 @@ "require": { "php": ">=7.0.0", "ext-intl": "*", - "laravel/framework": "5.3.28", + "laravel/framework": "5.3.29", "davejamesmiller/laravel-breadcrumbs": "^3.0", "watson/validating": "3.*", "doctrine/dbal": "^2.5", @@ -73,13 +93,14 @@ ], "post-install-cmd": [ "Illuminate\\Foundation\\ComposerScripts::postInstall", - "php artisan optimize" + "php artisan optimize", + "php artisan firefly:instructions install" ], "post-update-cmd": [ "Illuminate\\Foundation\\ComposerScripts::postUpdate", - "php artisan firefly:upgrade-instructions", "php artisan firefly:upgrade-database", "php artisan firefly:verify", + "php artisan firefly:instructions update", "php artisan optimize" ] }, diff --git a/composer.lock b/composer.lock index 7cc131d34a..ae477e0989 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "c1354d0797f44315708cc46642aca068", + "content-hash": "db26ae145d3656fe05d8a222fc21e263", "packages": [ { "name": "bacon/bacon-qr-code", @@ -378,28 +378,29 @@ }, { "name": "doctrine/collections", - "version": "v1.3.0", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a" + "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a", - "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a", + "url": "https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba", + "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "^5.6 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "doctrine/coding-standard": "~0.1@dev", + "phpunit/phpunit": "^5.7" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -440,20 +441,20 @@ "collections", "iterator" ], - "time": "2015-04-14T22:21:58+00:00" + "time": "2017-01-03T10:49:41+00:00" }, { "name": "doctrine/common", - "version": "v2.6.2", + "version": "v2.7.2", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "7bce00698899aa2c06fe7365c76e4d78ddb15fa3" + "reference": "930297026c8009a567ac051fd545bf6124150347" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/7bce00698899aa2c06fe7365c76e4d78ddb15fa3", - "reference": "7bce00698899aa2c06fe7365c76e4d78ddb15fa3", + "url": "https://api.github.com/repos/doctrine/common/zipball/930297026c8009a567ac051fd545bf6124150347", + "reference": "930297026c8009a567ac051fd545bf6124150347", "shasum": "" }, "require": { @@ -462,10 +463,10 @@ "doctrine/collections": "1.*", "doctrine/inflector": "1.*", "doctrine/lexer": "1.*", - "php": "~5.5|~7.0" + "php": "~5.6|~7.0" }, "require-dev": { - "phpunit/phpunit": "~4.8|~5.0" + "phpunit/phpunit": "^5.4.6" }, "type": "library", "extra": { @@ -513,24 +514,24 @@ "persistence", "spl" ], - "time": "2016-11-30T16:50:46+00:00" + "time": "2017-01-13T14:02:13+00:00" }, { "name": "doctrine/dbal", - "version": "v2.5.5", + "version": "v2.5.10", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "9f8c05cd5225a320d56d4bfdb4772f10d045a0c9" + "reference": "fc376f7a61498e18520cd6fa083752a4ca08072b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/9f8c05cd5225a320d56d4bfdb4772f10d045a0c9", - "reference": "9f8c05cd5225a320d56d4bfdb4772f10d045a0c9", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/fc376f7a61498e18520cd6fa083752a4ca08072b", + "reference": "fc376f7a61498e18520cd6fa083752a4ca08072b", "shasum": "" }, "require": { - "doctrine/common": ">=2.4,<2.7-dev", + "doctrine/common": ">=2.4,<2.8-dev", "php": ">=5.3.2" }, "require-dev": { @@ -584,7 +585,7 @@ "persistence", "queryobject" ], - "time": "2016-09-09T19:13:33+00:00" + "time": "2017-01-23T23:17:10+00:00" }, { "name": "doctrine/inflector", @@ -854,16 +855,16 @@ }, { "name": "laravel/framework", - "version": "v5.3.28", + "version": "v5.3.29", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "a64fc4f8958091ca39623b2e8c8f173cb34fa47a" + "reference": "6fd76dec90466dc3f703d8df72e38130f2ee6a32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/a64fc4f8958091ca39623b2e8c8f173cb34fa47a", - "reference": "a64fc4f8958091ca39623b2e8c8f173cb34fa47a", + "url": "https://api.github.com/repos/laravel/framework/zipball/6fd76dec90466dc3f703d8df72e38130f2ee6a32", + "reference": "6fd76dec90466dc3f703d8df72e38130f2ee6a32", "shasum": "" }, "require": { @@ -880,7 +881,7 @@ "php": ">=5.6.4", "psy/psysh": "0.7.*|0.8.*", "ramsey/uuid": "~3.0", - "swiftmailer/swiftmailer": "~5.1", + "swiftmailer/swiftmailer": "~5.4", "symfony/console": "3.1.*", "symfony/debug": "3.1.*", "symfony/finder": "3.1.*", @@ -978,20 +979,20 @@ "framework", "laravel" ], - "time": "2016-12-15T18:03:17+00:00" + "time": "2017-01-06T14:33:56+00:00" }, { "name": "laravelcollective/html", - "version": "v5.3.0", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/LaravelCollective/html.git", - "reference": "961ce141c16c6b085128f209496c26efd3e681ca" + "reference": "2f7f2e127c6fed47f269ea29ab5efeb8f65e9d35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/961ce141c16c6b085128f209496c26efd3e681ca", - "reference": "961ce141c16c6b085128f209496c26efd3e681ca", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/2f7f2e127c6fed47f269ea29ab5efeb8f65e9d35", + "reference": "2f7f2e127c6fed47f269ea29ab5efeb8f65e9d35", "shasum": "" }, "require": { @@ -1032,7 +1033,7 @@ ], "description": "HTML and Form Builders for the Laravel Framework", "homepage": "http://laravelcollective.com", - "time": "2016-08-27T23:52:43+00:00" + "time": "2016-12-13T14:23:36+00:00" }, { "name": "league/commonmark", @@ -1105,16 +1106,16 @@ }, { "name": "league/csv", - "version": "8.1.2", + "version": "8.2.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "33447984f7a7038fefaa5a6177e8407b66bc85b4" + "reference": "ef7eef710810c8bd0cf9371582ccd0123ff96d4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/33447984f7a7038fefaa5a6177e8407b66bc85b4", - "reference": "33447984f7a7038fefaa5a6177e8407b66bc85b4", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/ef7eef710810c8bd0cf9371582ccd0123ff96d4b", + "reference": "ef7eef710810c8bd0cf9371582ccd0123ff96d4b", "shasum": "" }, "require": { @@ -1128,7 +1129,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "8.1-dev" + "dev-master": "8.2-dev" } }, "autoload": { @@ -1158,20 +1159,20 @@ "read", "write" ], - "time": "2016-10-27T11:21:24+00:00" + "time": "2017-01-25T13:32:07+00:00" }, { "name": "league/flysystem", - "version": "1.0.32", + "version": "1.0.33", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "1b5c4a0031697f46e779a9d1b309c2e1b24daeab" + "reference": "5c7f98498b12d47f9de90ec9186a90000125777c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1b5c4a0031697f46e779a9d1b309c2e1b24daeab", - "reference": "1b5c4a0031697f46e779a9d1b309c2e1b24daeab", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/5c7f98498b12d47f9de90ec9186a90000125777c", + "reference": "5c7f98498b12d47f9de90ec9186a90000125777c", "shasum": "" }, "require": { @@ -1241,7 +1242,7 @@ "sftp", "storage" ], - "time": "2016-10-19T20:38:46+00:00" + "time": "2017-01-23T10:32:09+00:00" }, { "name": "monolog/monolog", @@ -1323,16 +1324,16 @@ }, { "name": "mtdowling/cron-expression", - "version": "v1.1.0", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/mtdowling/cron-expression.git", - "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5" + "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/c9ee7886f5a12902b225a1a12f36bb45f9ab89e5", - "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5", + "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad", + "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad", "shasum": "" }, "require": { @@ -1343,8 +1344,8 @@ }, "type": "library", "autoload": { - "psr-0": { - "Cron": "src/" + "psr-4": { + "Cron\\": "src/Cron/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1363,30 +1364,36 @@ "cron", "schedule" ], - "time": "2016-01-26T21:23:30+00:00" + "time": "2017-01-23T04:29:33+00:00" }, { "name": "nesbot/carbon", - "version": "1.21.0", + "version": "1.22.1", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7" + "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7b08ec6f75791e130012f206e3f7b0e76e18e3d7", - "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc", + "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc", "shasum": "" }, "require": { "php": ">=5.3.0", - "symfony/translation": "~2.6|~3.0" + "symfony/translation": "~2.6 || ~3.0" }, "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" + "friendsofphp/php-cs-fixer": "~2", + "phpunit/phpunit": "~4.0 || ~5.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.23-dev" + } + }, "autoload": { "psr-4": { "Carbon\\": "src/Carbon/" @@ -1410,7 +1417,7 @@ "datetime", "time" ], - "time": "2015-11-04T20:07:17+00:00" + "time": "2017-01-16T07:55:07+00:00" }, { "name": "nikic/php-parser", @@ -1621,16 +1628,16 @@ }, { "name": "psy/psysh", - "version": "v0.8.0", + "version": "v0.8.1", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "4a8860e13aa68a4bbf2476c014f8a1f14f1bf991" + "reference": "701e8a1cc426ee170f1296f5d9f6b8a26ad25c4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4a8860e13aa68a4bbf2476c014f8a1f14f1bf991", - "reference": "4a8860e13aa68a4bbf2476c014f8a1f14f1bf991", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/701e8a1cc426ee170f1296f5d9f6b8a26ad25c4a", + "reference": "701e8a1cc426ee170f1296f5d9f6b8a26ad25c4a", "shasum": "" }, "require": { @@ -1660,7 +1667,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-develop": "0.8.x-dev" + "dev-develop": "0.9.x-dev" } }, "autoload": { @@ -1690,7 +1697,7 @@ "interactive", "shell" ], - "time": "2016-12-07T17:15:07+00:00" + "time": "2017-01-15T17:54:13+00:00" }, { "name": "ramsey/uuid", @@ -1776,23 +1783,23 @@ }, { "name": "rcrowe/twigbridge", - "version": "v0.9.3", + "version": "v0.9.4", "source": { "type": "git", "url": "https://github.com/rcrowe/TwigBridge.git", - "reference": "6226d33331bbb1cdf64593a786f7efd1670200a7" + "reference": "effda159c436b08eae1a9d9ba3d28bee8f7b0f3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rcrowe/TwigBridge/zipball/6226d33331bbb1cdf64593a786f7efd1670200a7", - "reference": "6226d33331bbb1cdf64593a786f7efd1670200a7", + "url": "https://api.github.com/repos/rcrowe/TwigBridge/zipball/effda159c436b08eae1a9d9ba3d28bee8f7b0f3f", + "reference": "effda159c436b08eae1a9d9ba3d28bee8f7b0f3f", "shasum": "" }, "require": { - "illuminate/support": "5.0.*|5.1.*|5.2.*|5.3.*", - "illuminate/view": "5.0.*|5.1.*|5.2.*|5.3.*", + "illuminate/support": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*", + "illuminate/view": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*", "php": ">=5.4.0", - "twig/twig": "~1.15|~2.0" + "twig/twig": "~1.30" }, "require-dev": { "laravel/framework": "5.0.*", @@ -1836,7 +1843,7 @@ "laravel", "twig" ], - "time": "2016-05-01T16:43:38+00:00" + "time": "2017-01-21T14:33:47+00:00" }, { "name": "rmccue/requests", @@ -1943,16 +1950,16 @@ }, { "name": "symfony/console", - "version": "v3.1.8", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "221a60fb2f369a065eea1ed96b61183219fdfa6e" + "reference": "047f16485d68c083bd5d9b73ff16f9cb9c1a9f52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/221a60fb2f369a065eea1ed96b61183219fdfa6e", - "reference": "221a60fb2f369a065eea1ed96b61183219fdfa6e", + "url": "https://api.github.com/repos/symfony/console/zipball/047f16485d68c083bd5d9b73ff16f9cb9c1a9f52", + "reference": "047f16485d68c083bd5d9b73ff16f9cb9c1a9f52", "shasum": "" }, "require": { @@ -2000,20 +2007,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2016-12-08T14:58:14+00:00" + "time": "2017-01-08T20:43:43+00:00" }, { "name": "symfony/debug", - "version": "v3.1.8", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "c058661c32f5b462722e36d120905940089cbd9a" + "reference": "c6661361626b3cf5cf2089df98b3b5006a197e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/c058661c32f5b462722e36d120905940089cbd9a", - "reference": "c058661c32f5b462722e36d120905940089cbd9a", + "url": "https://api.github.com/repos/symfony/debug/zipball/c6661361626b3cf5cf2089df98b3b5006a197e85", + "reference": "c6661361626b3cf5cf2089df98b3b5006a197e85", "shasum": "" }, "require": { @@ -2057,20 +2064,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2016-11-15T12:55:20+00:00" + "time": "2017-01-28T00:04:57+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.2.1", + "version": "v3.2.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "e8f47a327c2f0fd5aa04fa60af2b693006ed7283" + "reference": "9137eb3a3328e413212826d63eeeb0217836e2b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e8f47a327c2f0fd5aa04fa60af2b693006ed7283", - "reference": "e8f47a327c2f0fd5aa04fa60af2b693006ed7283", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9137eb3a3328e413212826d63eeeb0217836e2b6", + "reference": "9137eb3a3328e413212826d63eeeb0217836e2b6", "shasum": "" }, "require": { @@ -2117,20 +2124,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2016-10-13T06:29:04+00:00" + "time": "2017-01-02T20:32:22+00:00" }, { "name": "symfony/finder", - "version": "v3.1.8", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "74dcd370c8d057882575e535616fde935e411b19" + "reference": "59687a255d1562f2c17b012418273862083d85f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/74dcd370c8d057882575e535616fde935e411b19", - "reference": "74dcd370c8d057882575e535616fde935e411b19", + "url": "https://api.github.com/repos/symfony/finder/zipball/59687a255d1562f2c17b012418273862083d85f7", + "reference": "59687a255d1562f2c17b012418273862083d85f7", "shasum": "" }, "require": { @@ -2166,20 +2173,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2016-12-13T09:38:21+00:00" + "time": "2017-01-02T20:31:54+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.1.8", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "88a1d3cee2dbd06f7103ff63938743b903b65a92" + "reference": "cef0ad49a2e90455cfc649522025b5a2929648c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/88a1d3cee2dbd06f7103ff63938743b903b65a92", - "reference": "88a1d3cee2dbd06f7103ff63938743b903b65a92", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cef0ad49a2e90455cfc649522025b5a2929648c0", + "reference": "cef0ad49a2e90455cfc649522025b5a2929648c0", "shasum": "" }, "require": { @@ -2219,20 +2226,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2016-11-27T04:21:07+00:00" + "time": "2017-01-08T20:43:43+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.1.8", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "d7a4671a6f8e4174127770263dcd95bee5713f76" + "reference": "c830387dec1b48c100473d10a6a356c3c3ae2a13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d7a4671a6f8e4174127770263dcd95bee5713f76", - "reference": "d7a4671a6f8e4174127770263dcd95bee5713f76", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c830387dec1b48c100473d10a6a356c3c3ae2a13", + "reference": "c830387dec1b48c100473d10a6a356c3c3ae2a13", "shasum": "" }, "require": { @@ -2301,7 +2308,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2016-12-13T12:52:10+00:00" + "time": "2017-01-28T02:53:17+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -2472,16 +2479,16 @@ }, { "name": "symfony/process", - "version": "v3.1.8", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "d23427a7f97a373129f61bc3b876fe4c66e2b3c7" + "reference": "2605753c5f8c531623d24d002825ebb1d6a22248" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d23427a7f97a373129f61bc3b876fe4c66e2b3c7", - "reference": "d23427a7f97a373129f61bc3b876fe4c66e2b3c7", + "url": "https://api.github.com/repos/symfony/process/zipball/2605753c5f8c531623d24d002825ebb1d6a22248", + "reference": "2605753c5f8c531623d24d002825ebb1d6a22248", "shasum": "" }, "require": { @@ -2517,20 +2524,20 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2016-11-24T01:08:05+00:00" + "time": "2017-01-21T17:13:55+00:00" }, { "name": "symfony/routing", - "version": "v3.1.8", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "4beb3dceb14cf2dd63dd222d1825ca981a2952cb" + "reference": "f25581d4eb0a82962c291917f826166f0dcd8a9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/4beb3dceb14cf2dd63dd222d1825ca981a2952cb", - "reference": "4beb3dceb14cf2dd63dd222d1825ca981a2952cb", + "url": "https://api.github.com/repos/symfony/routing/zipball/f25581d4eb0a82962c291917f826166f0dcd8a9a", + "reference": "f25581d4eb0a82962c291917f826166f0dcd8a9a", "shasum": "" }, "require": { @@ -2592,20 +2599,20 @@ "uri", "url" ], - "time": "2016-11-25T12:27:14+00:00" + "time": "2017-01-28T00:04:57+00:00" }, { "name": "symfony/translation", - "version": "v3.1.8", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "2f4b6114b75c506dd1ee7eb485b35facbcb2d873" + "reference": "d5a20fab5f63f44c233c69b3041c3cb1d4945e45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/2f4b6114b75c506dd1ee7eb485b35facbcb2d873", - "reference": "2f4b6114b75c506dd1ee7eb485b35facbcb2d873", + "url": "https://api.github.com/repos/symfony/translation/zipball/d5a20fab5f63f44c233c69b3041c3cb1d4945e45", + "reference": "d5a20fab5f63f44c233c69b3041c3cb1d4945e45", "shasum": "" }, "require": { @@ -2656,20 +2663,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2016-11-18T21:15:08+00:00" + "time": "2017-01-21T17:01:39+00:00" }, { "name": "symfony/var-dumper", - "version": "v3.1.8", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "5ccbd23a97035886e595ce497dbe94bc88ac0b57" + "reference": "16df11647e5b992d687cb4eeeb9a882d5f5c26b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/5ccbd23a97035886e595ce497dbe94bc88ac0b57", - "reference": "5ccbd23a97035886e595ce497dbe94bc88ac0b57", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/16df11647e5b992d687cb4eeeb9a882d5f5c26b9", + "reference": "16df11647e5b992d687cb4eeeb9a882d5f5c26b9", "shasum": "" }, "require": { @@ -2719,7 +2726,7 @@ "debug", "dump" ], - "time": "2016-12-08T14:58:14+00:00" + "time": "2017-01-24T13:02:38+00:00" }, { "name": "twig/twig", @@ -2886,16 +2893,16 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v2.3.1", + "version": "v2.3.2", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "65b0465e38a9524c9d5eb2dfc0389aba23090625" + "reference": "24e4f0261e352d3fd86d0447791b56ae49398674" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/65b0465e38a9524c9d5eb2dfc0389aba23090625", - "reference": "65b0465e38a9524c9d5eb2dfc0389aba23090625", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/24e4f0261e352d3fd86d0447791b56ae49398674", + "reference": "24e4f0261e352d3fd86d0447791b56ae49398674", "shasum": "" }, "require": { @@ -2936,27 +2943,27 @@ "profiler", "webprofiler" ], - "time": "2017-01-05T08:53:44+00:00" + "time": "2017-01-19T08:19:49+00:00" }, { "name": "barryvdh/laravel-ide-helper", - "version": "v2.2.2", + "version": "v2.2.3", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "105f14a50d0959a0e80004a15b3350fdf78f9623" + "reference": "a7fc2ec489aada6062d3a63ddc915004a21e38af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/105f14a50d0959a0e80004a15b3350fdf78f9623", - "reference": "105f14a50d0959a0e80004a15b3350fdf78f9623", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/a7fc2ec489aada6062d3a63ddc915004a21e38af", + "reference": "a7fc2ec489aada6062d3a63ddc915004a21e38af", "shasum": "" }, "require": { "barryvdh/reflection-docblock": "^2.0.4", - "illuminate/console": "^5.0,<5.4", - "illuminate/filesystem": "^5.0,<5.4", - "illuminate/support": "^5.0,<5.4", + "illuminate/console": "^5.0,<5.5", + "illuminate/filesystem": "^5.0,<5.5", + "illuminate/support": "^5.0,<5.5", "php": ">=5.4.0", "symfony/class-loader": "^2.3|^3.0" }, @@ -3002,7 +3009,7 @@ "phpstorm", "sublime" ], - "time": "2016-11-15T08:21:23+00:00" + "time": "2017-01-05T21:20:42+00:00" }, { "name": "barryvdh/reflection-docblock", @@ -3378,16 +3385,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.5.5", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108" + "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/399c1f9781e222f6eb6cc238796f5200d1b7f108", - "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/5a5a9fc8025a08d8919be87d6884d5a92520cefe", + "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe", "shasum": "" }, "require": { @@ -3416,7 +3423,7 @@ "object", "object graph" ], - "time": "2016-10-31T17:19:45+00:00" + "time": "2017-01-26T22:05:40+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -3629,16 +3636,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c14196e64a78570034afd0b7a9f3757ba71c2a0a" + "reference": "c19cfc7cbb0e9338d8c469c7eedecc2a428b0971" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c14196e64a78570034afd0b7a9f3757ba71c2a0a", - "reference": "c14196e64a78570034afd0b7a9f3757ba71c2a0a", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c19cfc7cbb0e9338d8c469c7eedecc2a428b0971", + "reference": "c19cfc7cbb0e9338d8c469c7eedecc2a428b0971", "shasum": "" }, "require": { @@ -3688,7 +3695,7 @@ "testing", "xunit" ], - "time": "2016-12-20T15:22:42+00:00" + "time": "2017-01-20T15:06:43+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3873,16 +3880,16 @@ }, { "name": "phpunit/phpunit", - "version": "5.7.5", + "version": "5.7.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "50fd2be8f3e23e91da825f36f08e5f9633076ffe" + "reference": "69f832b87c731d5cacad7f91948778fe98335fdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/50fd2be8f3e23e91da825f36f08e5f9633076ffe", - "reference": "50fd2be8f3e23e91da825f36f08e5f9633076ffe", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/69f832b87c731d5cacad7f91948778fe98335fdd", + "reference": "69f832b87c731d5cacad7f91948778fe98335fdd", "shasum": "" }, "require": { @@ -3894,7 +3901,7 @@ "myclabs/deep-copy": "~1.3", "php": "^5.6 || ^7.0", "phpspec/prophecy": "^1.6.2", - "phpunit/php-code-coverage": "^4.0.3", + "phpunit/php-code-coverage": "^4.0.4", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", "phpunit/php-timer": "^1.0.6", @@ -3951,7 +3958,7 @@ "testing", "xunit" ], - "time": "2016-12-28T07:18:51+00:00" + "time": "2017-01-28T06:14:33+00:00" }, { "name": "phpunit/phpunit-mock-objects", @@ -4059,16 +4066,16 @@ }, { "name": "sebastian/comparator", - "version": "1.2.2", + "version": "1.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f" + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f", - "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", "shasum": "" }, "require": { @@ -4119,7 +4126,7 @@ "compare", "equality" ], - "time": "2016-11-19T09:18:40+00:00" + "time": "2017-01-29T09:50:25+00:00" }, { "name": "sebastian/diff", @@ -4527,16 +4534,16 @@ }, { "name": "symfony/class-loader", - "version": "v3.2.1", + "version": "v3.2.2", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", - "reference": "87cd4e69435d98de01d0162c5f9c0ac017075c63" + "reference": "0152f7a47acd564ca62c652975c2b32ac6d613a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/class-loader/zipball/87cd4e69435d98de01d0162c5f9c0ac017075c63", - "reference": "87cd4e69435d98de01d0162c5f9c0ac017075c63", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/0152f7a47acd564ca62c652975c2b32ac6d613a6", + "reference": "0152f7a47acd564ca62c652975c2b32ac6d613a6", "shasum": "" }, "require": { @@ -4579,20 +4586,20 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2016-11-29T08:26:13+00:00" + "time": "2017-01-10T14:14:38+00:00" }, { "name": "symfony/css-selector", - "version": "v3.1.8", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "a37b3359566415a91cba55a2d95820b3fa1a9658" + "reference": "722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/a37b3359566415a91cba55a2d95820b3fa1a9658", - "reference": "a37b3359566415a91cba55a2d95820b3fa1a9658", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d", + "reference": "722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d", "shasum": "" }, "require": { @@ -4632,20 +4639,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2016-11-03T08:04:31+00:00" + "time": "2017-01-02T20:31:54+00:00" }, { "name": "symfony/dom-crawler", - "version": "v3.1.8", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "51e979357eba65b1e6aac7cba75cf5aa6379b8f3" + "reference": "7eede2a901a19928494194f7d1815a77b9a473a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/51e979357eba65b1e6aac7cba75cf5aa6379b8f3", - "reference": "51e979357eba65b1e6aac7cba75cf5aa6379b8f3", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7eede2a901a19928494194f7d1815a77b9a473a0", + "reference": "7eede2a901a19928494194f7d1815a77b9a473a0", "shasum": "" }, "require": { @@ -4688,20 +4695,20 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2016-12-10T14:24:45+00:00" + "time": "2017-01-21T17:13:55+00:00" }, { "name": "symfony/yaml", - "version": "v3.2.1", + "version": "v3.2.2", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "a7095af4b97a0955f85c8989106c249fa649011f" + "reference": "50eadbd7926e31842893c957eca362b21592a97d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/a7095af4b97a0955f85c8989106c249fa649011f", - "reference": "a7095af4b97a0955f85c8989106c249fa649011f", + "url": "https://api.github.com/repos/symfony/yaml/zipball/50eadbd7926e31842893c957eca362b21592a97d", + "reference": "50eadbd7926e31842893c957eca362b21592a97d", "shasum": "" }, "require": { @@ -4743,7 +4750,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2016-12-10T10:07:06+00:00" + "time": "2017-01-03T13:51:32+00:00" }, { "name": "webmozart/assert", diff --git a/config/firefly.php b/config/firefly.php index 73ae9563e8..7d0627c636 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -22,8 +22,9 @@ return [ 'single_user_mode' => true, 'is_demo_site' => false, ], + 'encryption' => (is_null(env('USE_ENCRYPTION')) || env('USE_ENCRYPTION') === true), 'chart' => 'chartjs', - 'version' => '4.3.2', + 'version' => '4.3.3', 'csv_import_enabled' => true, 'maxUploadSize' => 5242880, 'allowedMimes' => ['image/png', 'image/jpeg', 'application/pdf'], @@ -40,12 +41,7 @@ return [ 'default_export_format' => 'csv', 'default_import_format' => 'csv', 'bill_periods' => ['weekly', 'monthly', 'quarterly', 'half-year', 'yearly'], - 'accountRoles' => [ - 'defaultAsset' => 'Default asset account', - 'sharedAsset' => 'Shared asset account', - 'savingAsset' => 'Savings account', - 'ccAsset' => 'Credit card', - ], + 'accountRoles' => ['defaultAsset', 'sharedAsset', 'savingAsset', 'ccAsset',], 'ccTypes' => [ 'monthlyFull' => 'Full payment every month', ], @@ -170,7 +166,6 @@ return [ 'to_account_ends' => 'FireflyIII\Rules\Triggers\ToAccountEnds', 'to_account_is' => 'FireflyIII\Rules\Triggers\ToAccountIs', 'to_account_contains' => 'FireflyIII\Rules\Triggers\ToAccountContains', - 'transaction_type' => 'FireflyIII\Rules\Triggers\TransactionType', 'amount_less' => 'FireflyIII\Rules\Triggers\AmountLess', 'amount_exactly' => 'FireflyIII\Rules\Triggers\AmountExactly', 'amount_more' => 'FireflyIII\Rules\Triggers\AmountMore', @@ -178,6 +173,10 @@ return [ 'description_ends' => 'FireflyIII\Rules\Triggers\DescriptionEnds', 'description_contains' => 'FireflyIII\Rules\Triggers\DescriptionContains', 'description_is' => 'FireflyIII\Rules\Triggers\DescriptionIs', + 'transaction_type' => 'FireflyIII\Rules\Triggers\TransactionType', + 'category_is' => 'FireflyIII\Rules\Triggers\CategoryIs', + 'budget_is' => 'FireflyIII\Rules\Triggers\BudgetIs', + 'tag_is' => 'FireflyIII\Rules\Triggers\TagIs', ], 'rule-actions' => [ 'set_category' => 'FireflyIII\Rules\Actions\SetCategory', diff --git a/config/upgrade.php b/config/upgrade.php index e88f92c76e..199596e690 100644 --- a/config/upgrade.php +++ b/config/upgrade.php @@ -12,5 +12,14 @@ declare(strict_types = 1); return [ - 'text' => [], + 'text' => [ + 'upgrade' => + [ + '4.3' => 'Make sure you run the migrations and clear your cache. If you need more help, please check Github or the Firefly III website.', + ], + 'install' => + [ + '4.3' => 'Welcome to Firefly! Make sure you follow the installation guide. If you need more help, please check Github or the Firefly III website. The installation guide has a FAQ which you should check out as well.', + ], + ], ]; diff --git a/public/css/bootstrap-multiselect.css b/public/css/bootstrap-multiselect.css new file mode 100755 index 0000000000..5acaf9f7ab --- /dev/null +++ b/public/css/bootstrap-multiselect.css @@ -0,0 +1 @@ +span.multiselect-native-select{position:relative}span.multiselect-native-select select{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px -1px -1px -3px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;left:50%;top:30px}.multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px 3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.radio,.multiselect-container>li>a>label.checkbox{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0} diff --git a/public/css/firefly.css b/public/css/firefly.css index d7958dabc0..cc051e6442 100644 --- a/public/css/firefly.css +++ b/public/css/firefly.css @@ -31,7 +31,7 @@ body.waiting * { } .preferences-box { - border:1px #ddd solid; + border: 1px #ddd solid; border-radius: 4px 4px 0 0; padding: 15px; margin: 15px; @@ -101,4 +101,13 @@ body.waiting * { a[href]:after { content: none !important; } -} \ No newline at end of file +} + +.edit_tr_buttons { + white-space: nowrap; +} + +.edit_tr_buttons .btn { + float: none; + display: inline-block; +} diff --git a/public/css/jquery-ui/images/ui-icons_444444_256x240.png b/public/css/jquery-ui/images/ui-icons_444444_256x240.png new file mode 100644 index 0000000000..19f664d970 Binary files /dev/null and b/public/css/jquery-ui/images/ui-icons_444444_256x240.png differ diff --git a/public/css/jquery-ui/images/ui-icons_555555_256x240.png b/public/css/jquery-ui/images/ui-icons_555555_256x240.png new file mode 100644 index 0000000000..e965f6d97c Binary files /dev/null and b/public/css/jquery-ui/images/ui-icons_555555_256x240.png differ diff --git a/public/css/jquery-ui/images/ui-icons_777620_256x240.png b/public/css/jquery-ui/images/ui-icons_777620_256x240.png new file mode 100644 index 0000000000..9785948a29 Binary files /dev/null and b/public/css/jquery-ui/images/ui-icons_777620_256x240.png differ diff --git a/public/css/jquery-ui/images/ui-icons_777777_256x240.png b/public/css/jquery-ui/images/ui-icons_777777_256x240.png new file mode 100644 index 0000000000..323c4564a7 Binary files /dev/null and b/public/css/jquery-ui/images/ui-icons_777777_256x240.png differ diff --git a/public/css/jquery-ui/images/ui-icons_cc0000_256x240.png b/public/css/jquery-ui/images/ui-icons_cc0000_256x240.png new file mode 100644 index 0000000000..45ac7787cd Binary files /dev/null and b/public/css/jquery-ui/images/ui-icons_cc0000_256x240.png differ diff --git a/public/css/jquery-ui/images/ui-icons_ffffff_256x240.png b/public/css/jquery-ui/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000000..fe41d2d0fd Binary files /dev/null and b/public/css/jquery-ui/images/ui-icons_ffffff_256x240.png differ diff --git a/public/css/jquery-ui/jquery-ui.structure.min.css b/public/css/jquery-ui/jquery-ui.structure.min.css new file mode 100644 index 0000000000..882d445bde --- /dev/null +++ b/public/css/jquery-ui/jquery-ui.structure.min.css @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.12.1 - 2017-01-15 +* http://jqueryui.com +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em} \ No newline at end of file diff --git a/public/css/jquery-ui/jquery-ui.theme.min.css b/public/css/jquery-ui/jquery-ui.theme.min.css new file mode 100644 index 0000000000..4c88d3c36b --- /dev/null +++ b/public/css/jquery-ui/jquery-ui.theme.min.css @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.12.1 - 2017-01-15 +* http://jqueryui.com +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} \ No newline at end of file diff --git a/public/js/ff/accounts/create.js b/public/js/ff/accounts/create.js new file mode 100644 index 0000000000..675a5fe730 --- /dev/null +++ b/public/js/ff/accounts/create.js @@ -0,0 +1,20 @@ +/* + * create.js + * Copyright (c) 2017 thegrumpydictator@gmail.com + * This software may be modified and distributed under the terms of the Creative Commons Attribution-ShareAlike 4.0 International License. + * + * See the LICENSE file for details. + */ + +/** global: Modernizr */ + +$(document).ready(function () { + "use strict"; + if (!Modernizr.inputtypes.date) { + $('input[type="date"]').datepicker( + { + dateFormat: 'yy-mm-dd' + } + ); + } +}); diff --git a/public/js/ff/accounts/edit.js b/public/js/ff/accounts/edit.js new file mode 100644 index 0000000000..675a5fe730 --- /dev/null +++ b/public/js/ff/accounts/edit.js @@ -0,0 +1,20 @@ +/* + * create.js + * Copyright (c) 2017 thegrumpydictator@gmail.com + * This software may be modified and distributed under the terms of the Creative Commons Attribution-ShareAlike 4.0 International License. + * + * See the LICENSE file for details. + */ + +/** global: Modernizr */ + +$(document).ready(function () { + "use strict"; + if (!Modernizr.inputtypes.date) { + $('input[type="date"]').datepicker( + { + dateFormat: 'yy-mm-dd' + } + ); + } +}); diff --git a/public/js/ff/accounts/show.js b/public/js/ff/accounts/show.js index a1db23e92a..b3b1093c7a 100644 --- a/public/js/ff/accounts/show.js +++ b/public/js/ff/accounts/show.js @@ -54,7 +54,7 @@ $(function () { ui.placeholder.html('
"+this._get(t,"weekHeader")+" | ":"",w=0;7>w;w++)P=(w+c)%7,M+="=5?" class='ui-datepicker-week-end'":"")+">"+""+p[P]+" | ";for(I+=M+"
---|---|
"+this._get(t,"calculateWeek")(z)+" | ":"",w=0;7>w;w++)W=m?m.apply(t.input?t.input[0]:null,[z]):[!0,""],F=z.getMonth()!==Z,L=F&&!v||!W[0]||J&&J>z||Q&&z>Q,E+=""+(F&&!_?" ":L?""+z.getDate()+"":""+z.getDate()+"")+" | ",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);I+=E+"
:site_owner
. This email address can be set in the .env
file.',
'block_code_bounced' => 'Email message(s) bounced',
- 'block_code_expired' => 'Demo account expired',
- 'no_block_code' => 'No reason for block or user not blocked',
+ 'block_code_expired' => 'Demo-Konto abgelaufen',
+ 'no_block_code' => 'Kein Grund für Block oder Benutzer nicht blockiert',
// split a transaction:
'transaction_meta_data' => 'Transaktions Metadaten',
'transaction_dates' => 'Überweisungsdatum',
- 'splits' => 'Splits',
- 'split_title_withdrawal' => 'Split your new withdrawal',
- 'split_intro_one_withdrawal' => 'Firefly supports the "splitting" of a withdrawal.',
- 'split_intro_two_withdrawal' => 'It means that the amount of money you\'ve spent is divided between several destination expense accounts, budgets or categories.',
+ 'splits' => 'Geteilte',
+ 'split_title_withdrawal' => 'Teilen Sie Ihre neue Ausgabe',
+ 'split_intro_one_withdrawal' => 'Firefly unterstützt die "Aufteilung" einer Ausgabe.',
+ 'split_intro_two_withdrawal' => 'Es bedeutet, dass die Menge des Geldes, die Sie aufgegeben haben auf mehrere Zielkonten, Budgets oder Kategorien aufgeteilt werden kann.',
'split_intro_three_withdrawal' => 'For example: you could split your :total groceries so you pay :split_one from your "daily groceries" budget and :split_two from your "cigarettes" budget.',
'split_table_intro_withdrawal' => 'Split your withdrawal in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.',
- 'store_splitted_withdrawal' => 'Store splitted withdrawal',
- 'update_splitted_withdrawal' => 'Update splitted withdrawal',
+ 'store_splitted_withdrawal' => 'Gesplittete Ausgabe speichern',
+ 'update_splitted_withdrawal' => 'Gesplittete Ausgabe aktualisieren',
'split_title_deposit' => 'Neue Einnahme aufteilen',
'split_intro_one_deposit' => 'Firefly untestützt das "Aufteilen" von Einnahmen.',
'split_intro_two_deposit' => 'It means that the amount of money you\'ve earned is divided between several source revenue accounts or categories.',
@@ -891,13 +905,13 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?',
'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.',
'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.',
'store_splitted_transfer' => 'Store splitted transfer',
- 'add_another_split' => 'Add another split',
- 'split-transactions' => 'Split transactions',
- 'split-new-transaction' => 'Split a new transaction',
- 'do_split' => 'Do a split',
- 'split_this_withdrawal' => 'Split this withdrawal',
- 'split_this_deposit' => 'Split this deposit',
- 'split_this_transfer' => 'Split this transfer',
+ 'add_another_split' => 'Eine weitere Aufteilung hinzufügen',
+ 'split-transactions' => 'Transaktionen aufteilen',
+ 'split-new-transaction' => 'Eine neue Transaktion aufteilen',
+ 'do_split' => 'Aufteilen',
+ 'split_this_withdrawal' => 'Diese Ausgabe aufteilen',
+ 'split_this_deposit' => 'Diese Einnahme aufteilen',
+ 'split_this_transfer' => 'Diese Überweisung aufteilen',
'cannot_edit_multiple_source' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple source accounts.',
'cannot_edit_multiple_dest' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple destination accounts.',
'no_edit_multiple_left' => 'You have selected no valid transactions to edit.',
diff --git a/resources/lang/de_DE/list.php b/resources/lang/de_DE/list.php
index b7aeba4eb0..801ae0be8b 100644
--- a/resources/lang/de_DE/list.php
+++ b/resources/lang/de_DE/list.php
@@ -12,7 +12,7 @@
return [
'buttons' => 'Schaltfläche',
'icon' => 'Icon',
- 'id' => 'ID',
+ 'id' => 'Id',
'create_date' => 'Erstellt am',
'update_date' => 'Aktualisiert am',
'balance_before' => 'Bilanz vor',
diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php
index 61367d9b2c..d54d34d4a6 100644
--- a/resources/lang/en_US/firefly.php
+++ b/resources/lang/en_US/firefly.php
@@ -106,6 +106,14 @@ return [
'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.',
'budget_in_period' => '":name" between :start and :end',
'budget_in_period_breadcrumb' => 'Between :start and :end',
+ 'clone_withdrawal' => 'Clone this withdrawal',
+ 'clone_deposit' => 'Clone this deposit',
+ 'clone_transfer' => 'Clone this transfer',
+ 'transaction_journal_other_options' => 'Other options',
+ 'multi_select_no_selection' => 'None selected',
+ 'multi_select_all_selected' => 'All selected',
+ 'multi_select_filter_placeholder' => 'Find..',
+
// repeat frequencies:
'repeat_freq_yearly' => 'yearly',
@@ -252,6 +260,9 @@ return [
'rule_trigger_description_ends_choice' => 'Description ends with..',
'rule_trigger_description_contains_choice' => 'Description contains..',
'rule_trigger_description_is_choice' => 'Description is..',
+ 'rule_trigger_category_is_choice' => 'Category is..',
+ 'rule_trigger_budget_is_choice' => 'Budget is..',
+ 'rule_trigger_tag_is_choice' => '(A) tag is..',
'rule_trigger_store_journal' => 'When a transaction is created',
'rule_trigger_update_journal' => 'When a transaction is updated',
'rule_action_set_category' => 'Set category to ":action_value"',
@@ -741,7 +752,10 @@ return [
'description' => 'Description',
'sum_of_period' => 'Sum of period',
'average_in_period' => 'Average in period',
-
+ 'account_role_defaultAsset' => 'Default asset account',
+ 'account_role_sharedAsset' => 'Shared asset account',
+ 'account_role_savingAsset' => 'Savings account',
+ 'account_role_ccAsset' => 'Credit card',
// charts:
'chart' => 'Chart',
diff --git a/resources/lang/es_ES/firefly.php b/resources/lang/es_ES/firefly.php
index 6653989559..a91170cd53 100644
--- a/resources/lang/es_ES/firefly.php
+++ b/resources/lang/es_ES/firefly.php
@@ -106,6 +106,14 @@ return [
'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.',
'budget_in_period' => '":name" between :start and :end',
'budget_in_period_breadcrumb' => 'Between :start and :end',
+ 'clone_withdrawal' => 'Clone this withdrawal',
+ 'clone_deposit' => 'Clone this deposit',
+ 'clone_transfer' => 'Clone this transfer',
+ 'transaction_journal_other_options' => 'Other options',
+ 'multi_select_no_selection' => 'None selected',
+ 'multi_select_all_selected' => 'All selected',
+ 'multi_select_filter_placeholder' => 'Find..',
+
// repeat frequencies:
'repeat_freq_yearly' => 'yearly',
@@ -252,6 +260,9 @@ return [
'rule_trigger_description_ends_choice' => 'Description ends with..',
'rule_trigger_description_contains_choice' => 'Description contains..',
'rule_trigger_description_is_choice' => 'Description is..',
+ 'rule_trigger_category_is_choice' => 'Category is..',
+ 'rule_trigger_budget_is_choice' => 'Budget is..',
+ 'rule_trigger_tag_is_choice' => '(A) tag is..',
'rule_trigger_store_journal' => 'When a transaction is created',
'rule_trigger_update_journal' => 'When a transaction is updated',
'rule_action_set_category' => 'Set category to ":action_value"',
@@ -741,7 +752,10 @@ return [
'description' => 'Description',
'sum_of_period' => 'Sum of period',
'average_in_period' => 'Average in period',
-
+ 'account_role_defaultAsset' => 'Default asset account',
+ 'account_role_sharedAsset' => 'Shared asset account',
+ 'account_role_savingAsset' => 'Savings account',
+ 'account_role_ccAsset' => 'Credit card',
// charts:
'chart' => 'Chart',
diff --git a/resources/lang/fr_FR/firefly.php b/resources/lang/fr_FR/firefly.php
index 7a8cca9f05..cfd9123263 100644
--- a/resources/lang/fr_FR/firefly.php
+++ b/resources/lang/fr_FR/firefly.php
@@ -106,6 +106,14 @@ return [
'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.',
'budget_in_period' => '":name" between :start and :end',
'budget_in_period_breadcrumb' => 'Between :start and :end',
+ 'clone_withdrawal' => 'Clone this withdrawal',
+ 'clone_deposit' => 'Clone this deposit',
+ 'clone_transfer' => 'Clone this transfer',
+ 'transaction_journal_other_options' => 'Other options',
+ 'multi_select_no_selection' => 'None selected',
+ 'multi_select_all_selected' => 'All selected',
+ 'multi_select_filter_placeholder' => 'Find..',
+
// repeat frequencies:
'repeat_freq_yearly' => 'yearly',
@@ -252,6 +260,9 @@ return [
'rule_trigger_description_ends_choice' => 'La description se termine par..',
'rule_trigger_description_contains_choice' => 'La description contient..',
'rule_trigger_description_is_choice' => 'La description est..',
+ 'rule_trigger_category_is_choice' => 'Category is..',
+ 'rule_trigger_budget_is_choice' => 'Budget is..',
+ 'rule_trigger_tag_is_choice' => '(A) tag is..',
'rule_trigger_store_journal' => 'When a transaction is created',
'rule_trigger_update_journal' => 'When a transaction is updated',
'rule_action_set_category' => 'Définir la catégorie à ":action_value"',
@@ -741,7 +752,10 @@ return [
'description' => 'Description',
'sum_of_period' => 'Sum of period',
'average_in_period' => 'Average in period',
-
+ 'account_role_defaultAsset' => 'Default asset account',
+ 'account_role_sharedAsset' => 'Shared asset account',
+ 'account_role_savingAsset' => 'Savings account',
+ 'account_role_ccAsset' => 'Credit card',
// charts:
'chart' => 'Chart',
diff --git a/resources/lang/hr_HR/firefly.php b/resources/lang/hr_HR/firefly.php
index 6653989559..a91170cd53 100644
--- a/resources/lang/hr_HR/firefly.php
+++ b/resources/lang/hr_HR/firefly.php
@@ -106,6 +106,14 @@ return [
'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.',
'budget_in_period' => '":name" between :start and :end',
'budget_in_period_breadcrumb' => 'Between :start and :end',
+ 'clone_withdrawal' => 'Clone this withdrawal',
+ 'clone_deposit' => 'Clone this deposit',
+ 'clone_transfer' => 'Clone this transfer',
+ 'transaction_journal_other_options' => 'Other options',
+ 'multi_select_no_selection' => 'None selected',
+ 'multi_select_all_selected' => 'All selected',
+ 'multi_select_filter_placeholder' => 'Find..',
+
// repeat frequencies:
'repeat_freq_yearly' => 'yearly',
@@ -252,6 +260,9 @@ return [
'rule_trigger_description_ends_choice' => 'Description ends with..',
'rule_trigger_description_contains_choice' => 'Description contains..',
'rule_trigger_description_is_choice' => 'Description is..',
+ 'rule_trigger_category_is_choice' => 'Category is..',
+ 'rule_trigger_budget_is_choice' => 'Budget is..',
+ 'rule_trigger_tag_is_choice' => '(A) tag is..',
'rule_trigger_store_journal' => 'When a transaction is created',
'rule_trigger_update_journal' => 'When a transaction is updated',
'rule_action_set_category' => 'Set category to ":action_value"',
@@ -741,7 +752,10 @@ return [
'description' => 'Description',
'sum_of_period' => 'Sum of period',
'average_in_period' => 'Average in period',
-
+ 'account_role_defaultAsset' => 'Default asset account',
+ 'account_role_sharedAsset' => 'Shared asset account',
+ 'account_role_savingAsset' => 'Savings account',
+ 'account_role_ccAsset' => 'Credit card',
// charts:
'chart' => 'Chart',
diff --git a/resources/lang/nl_NL/firefly.php b/resources/lang/nl_NL/firefly.php
index d4bb929439..65b5810fb7 100644
--- a/resources/lang/nl_NL/firefly.php
+++ b/resources/lang/nl_NL/firefly.php
@@ -106,6 +106,14 @@ return [
'pref_languages_locale' => 'Als je hier een andere taal dan Engels hebt geselecteerd, zorg er dan voor dat je besturingssysteem ook in staat is om valuta, data en bedragen in die taal weer te geven.',
'budget_in_period' => '":name" tussen :start en :end',
'budget_in_period_breadcrumb' => 'Tussen :start en :end',
+ 'clone_withdrawal' => 'Kopieer deze uitgave',
+ 'clone_deposit' => 'Kopieer deze inkomsten',
+ 'clone_transfer' => 'Kopieer deze overschrijving',
+ 'transaction_journal_other_options' => 'Andere opties',
+ 'multi_select_no_selection' => 'Niets geselecteerd',
+ 'multi_select_all_selected' => 'Alles geselecteerd',
+ 'multi_select_filter_placeholder' => 'Vinden..',
+
// repeat frequencies:
'repeat_freq_yearly' => 'jaarlijks',
@@ -139,10 +147,10 @@ return [
'do_export' => 'Exporteren',
'export_status_never_started' => 'Het exporteren is nog niet begonnen',
'export_status_make_exporter' => 'Exporteerding maken...',
- 'export_status_collecting_journals' => 'Overboekingen verzamelen...',
- 'export_status_collected_journals' => 'Overboekingen verzameld!',
- 'export_status_converting_to_export_format' => 'Overboekingen overzetten...',
- 'export_status_converted_to_export_format' => 'Overboekingen overgezet!',
+ 'export_status_collecting_journals' => 'Transacties verzamelen...',
+ 'export_status_collected_journals' => 'Transacties verzameld!',
+ 'export_status_converting_to_export_format' => 'Transacties overzetten...',
+ 'export_status_converted_to_export_format' => 'Transacties overgezet!',
'export_status_creating_journal_file' => 'Exportbestand maken...',
'export_status_created_journal_file' => 'Exportbestand gemaakt!',
'export_status_collecting_attachments' => 'Bijlagen verzamelen...',
@@ -159,7 +167,7 @@ return [
// rules
'rules' => 'Regels',
- 'rules_explanation' => 'Hier kan je regels instellen. Regels worden in werking gesteld als je een bij-, afschrijving of overboeking maakt (of verandert). Als die transactie bepaalde eigenschappen heeft (zogenaamde "triggers") zal Firefly de bijbehorende "acties" uitvoeren. Gecombineerd kan je Firefly op een bepaalde manier laten reageren op nieuwe transacties.',
+ 'rules_explanation' => 'Hier kan je regels instellen. Regels worden in werking gesteld als je een bij-, afschrijving of overschrijving maakt (of verandert). Als die transactie bepaalde eigenschappen heeft (zogenaamde "triggers") zal Firefly de bijbehorende "acties" uitvoeren. Gecombineerd kan je Firefly op een bepaalde manier laten reageren op nieuwe transacties.',
'rule_name' => 'Regelnaam',
'rule_triggers' => 'Regel reageert op',
'rule_actions' => 'Regel zal dan',
@@ -252,6 +260,9 @@ return [
'rule_trigger_description_ends_choice' => 'Omschrijving eindigt op..',
'rule_trigger_description_contains_choice' => 'Omschrijving bevat..',
'rule_trigger_description_is_choice' => 'Omschrijving is..',
+ 'rule_trigger_category_is_choice' => 'Categorie is..',
+ 'rule_trigger_budget_is_choice' => 'Budget is..',
+ 'rule_trigger_tag_is_choice' => '(Een) tag is..',
'rule_trigger_store_journal' => 'Als een transactie wordt gemaakt',
'rule_trigger_update_journal' => 'Als een transactie wordt bijgewerkt',
'rule_action_set_category' => 'Verander categorie naar ":action_value"',
@@ -386,8 +397,8 @@ return [
'title_withdrawal' => 'Uitgaven',
'title_revenue' => 'Inkomsten',
'title_deposit' => 'Inkomsten',
- 'title_transfer' => 'Overboekingen',
- 'title_transfers' => 'Overboekingen',
+ 'title_transfer' => 'Overschrijvingen',
+ 'title_transfers' => 'Overschrijvingen',
// convert stuff:
'convert_is_already_type_Withdrawal' => 'Deze transactie is al een uitgave',
@@ -741,7 +752,10 @@ return [
'description' => 'Omschrijving',
'sum_of_period' => 'Som van periode',
'average_in_period' => 'Gemiddelde in periode',
-
+ 'account_role_defaultAsset' => 'Standaard betaalrekening',
+ 'account_role_sharedAsset' => 'Gedeelde betaalrekening',
+ 'account_role_savingAsset' => 'Spaarrekening',
+ 'account_role_ccAsset' => 'Credit card',
// charts:
'chart' => 'Diagram',
@@ -896,7 +910,7 @@ return [
'do_split' => 'Splits',
'split_this_withdrawal' => 'Splits deze uitgave',
'split_this_deposit' => 'Splits deze inkomsten',
- 'split_this_transfer' => 'Splits deze overboeking',
+ 'split_this_transfer' => 'Splits deze overschrijving',
'cannot_edit_multiple_source' => 'Je kan transactie #:id met omschrijving ":description" niet splitsen, want deze bevat meerdere bronrekeningen.',
'cannot_edit_multiple_dest' => 'Je kan transactie #:id met omschrijving ":description" niet wijzigen, want deze bevat meerdere doelrekeningen.',
'no_edit_multiple_left' => 'Je hebt geen geldige transacties geselecteerd.',
diff --git a/resources/lang/nl_NL/help.php b/resources/lang/nl_NL/help.php
index c8c95d674a..9ca29221ad 100644
--- a/resources/lang/nl_NL/help.php
+++ b/resources/lang/nl_NL/help.php
@@ -23,7 +23,7 @@ return [
'report-menu-title' => 'Overzichten',
'report-menu-text' => 'Bekijk dit als je een goed overzicht van je financiën wil.',
'transaction-menu-title' => 'Transacties',
- 'transaction-menu-text' => 'Hier vind je al je bijschrijvingen, afschrijvingen en overboekingen.',
+ 'transaction-menu-text' => 'Hier vind je al je bijschrijvingen, afschrijvingen en overschrijvingen.',
'option-menu-title' => 'Opties',
'option-menu-text' => 'Hier vind je alle opties.',
'main-content-end-title' => 'Einde!',
diff --git a/resources/lang/pl_PL/csv.php b/resources/lang/pl_PL/csv.php
index 9564e7c73b..d9b1b88c79 100644
--- a/resources/lang/pl_PL/csv.php
+++ b/resources/lang/pl_PL/csv.php
@@ -28,16 +28,16 @@ return [
'column_name' => 'Nazwa kolumny',
'column_example' => 'Przykładowe dane w kolumnie',
'column_role' => 'Znaczenie danych w kolumnie',
- 'do_map_value' => 'Map these values',
+ 'do_map_value' => 'Zmapuj te wartości',
'column' => 'Kolumna',
'no_example_data' => 'Brak dostępnych danych przykładowych',
'store_column_roles' => 'Kontynuuj import',
- 'do_not_map' => '(do not map)',
- 'map_title' => 'Connect import data to Firefly III data',
+ 'do_not_map' => '(nie mapuj)',
+ 'map_title' => 'Połącz dane z importu z danymi z Firefly III',
'map_text' => 'In the following tables, the left value shows you information found in your uploaded CSV file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.',
'field_value' => 'Wartość pola',
- 'field_mapped_to' => 'Mapped to',
+ 'field_mapped_to' => 'Zmapowane do',
'store_column_mapping' => 'Zapisz mapowanie',
// map things.
@@ -45,22 +45,22 @@ return [
'column__ignore' => '(ignoruj tę kolumnę)',
'column_account-iban' => 'Konto aktywów (IBAN)',
- 'column_account-id' => 'Asset account ID (matching Firefly)',
+ 'column_account-id' => 'ID konta aktywów (taki sam jak w Firefly)',
'column_account-name' => 'Konto aktywów (nazwa)',
'column_amount' => 'Kwota',
'column_amount-comma-separated' => 'Kwota (przecinek jako separator dziesiętny)',
- 'column_bill-id' => 'Bill ID (matching Firefly)',
+ 'column_bill-id' => 'ID rachunku (taki sam jak w Firefly)',
'column_bill-name' => 'Nazwa rachunku',
- 'column_budget-id' => 'Budget ID (matching Firefly)',
+ 'column_budget-id' => 'ID budżetu (taki sam jak w Firefly)',
'column_budget-name' => 'Nazwa budżetu',
- 'column_category-id' => 'Category ID (matching Firefly)',
+ 'column_category-id' => 'ID kategorii (taki sam jak w Firefly)',
'column_category-name' => 'Nazwa kategorii',
'column_currency-code' => 'Kod waluty (ISO 4217)',
- 'column_currency-id' => 'Currency ID (matching Firefly)',
- 'column_currency-name' => 'Currency name (matching Firefly)',
- 'column_currency-symbol' => 'Currency symbol (matching Firefly)',
+ 'column_currency-id' => 'ID waluty (taki sam jak w Firefly)',
+ 'column_currency-name' => 'Nazwa waluty (taka sama jak w Firefly)',
+ 'column_currency-symbol' => 'Symbol waluty (taki sam jak w Firefly)',
'column_date-interest' => 'Interest calculation date',
- 'column_date-book' => 'Transaction booking date',
+ 'column_date-book' => 'Data księgowania transakcji',
'column_date-process' => 'Transaction process date',
'column_date-transaction' => 'Data',
'column_description' => 'Opis',
@@ -75,6 +75,6 @@ return [
'column_sepa-db' => 'SEPA Direct Debet',
'column_tags-comma' => 'Tagi (oddzielone przecinkami)',
'column_tags-space' => 'Tagi (oddzielone spacjami)',
- 'column_account-number' => 'Asset account (account number)',
+ 'column_account-number' => 'Konto aktywów (numer konta)',
'column_opposing-number' => 'Opposing account (account number)',
];
\ No newline at end of file
diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php
index d79ddc8929..d101e6129f 100644
--- a/resources/lang/pl_PL/firefly.php
+++ b/resources/lang/pl_PL/firefly.php
@@ -97,7 +97,7 @@ return [
'sum_of_expenses_in_budget' => 'Wydano łącznie w budżecie ":budget"',
'left_in_budget_limit' => 'Left to spend according to budgeting',
'cannot_change_demo' => 'Nie można zmienić hasła do konta demonstracyjnego.',
- 'cannot_delete_demo' => 'You cannot remove the demonstration account.',
+ 'cannot_delete_demo' => 'Nie możesz usunąć konta demonstracyjnego.',
'cannot_reset_demo_user' => 'Nie można zresetować hasła do konta demonstracyjnego',
'per_period' => 'Za okres',
'all_periods' => 'Wszystkie okresy',
@@ -106,6 +106,14 @@ return [
'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.',
'budget_in_period' => '":name" między :start oraz :end',
'budget_in_period_breadcrumb' => 'Między :start i :end',
+ 'clone_withdrawal' => 'Zduplikuj tę wypłatę',
+ 'clone_deposit' => 'Zduplikuj tą wpłatę',
+ 'clone_transfer' => 'Zduplikuj ten transfer',
+ 'transaction_journal_other_options' => 'Inne opcje',
+ 'multi_select_no_selection' => 'Nie wybrano',
+ 'multi_select_all_selected' => 'Wybrano wszystko',
+ 'multi_select_filter_placeholder' => 'Find..',
+
// repeat frequencies:
'repeat_freq_yearly' => 'rocznie',
@@ -215,7 +223,7 @@ return [
'execute_on_existing_transactions_short' => 'Istniejące transakcje',
'executed_group_on_existing_transactions' => 'Wykonano grupę ":title" dla istniejących transakcji',
'execute_group_on_existing_transactions' => 'Wykonaj grupę ":title" dla istniejących transakcji',
- 'include_transactions_from_accounts' => 'Include transactions from these accounts',
+ 'include_transactions_from_accounts' => 'Uwzględnij transakcje z tych kont',
'execute' => 'Wykonaj',
// actions and triggers
@@ -252,6 +260,9 @@ return [
'rule_trigger_description_ends_choice' => 'Opis kończy się na..',
'rule_trigger_description_contains_choice' => 'Opis zawiera..',
'rule_trigger_description_is_choice' => 'Opis jest..',
+ 'rule_trigger_category_is_choice' => 'Category is..',
+ 'rule_trigger_budget_is_choice' => 'Budget is..',
+ 'rule_trigger_tag_is_choice' => '(A) tag is..',
'rule_trigger_store_journal' => 'Po utworzeniu transakcji',
'rule_trigger_update_journal' => 'Po zmodyfikowaniu transakcji',
'rule_action_set_category' => 'Ustaw kategorię na ":action_value"',
@@ -289,7 +300,7 @@ return [
// preferences
'pref_home_screen_accounts' => 'Konta na stronie domowej',
'pref_home_screen_accounts_help' => 'Które konta powinny być wyświetlane na stronie głównej?',
- 'pref_view_range' => 'Pokaż zakres',
+ 'pref_view_range' => 'Zakres widzenia',
'pref_view_range_help' => 'Niektóre wykresy są automatycznie grupowane w okresach. Jaki okres wolisz?',
'pref_1D' => 'Dzień',
'pref_1W' => 'Tydzień',
@@ -324,12 +335,12 @@ return [
'pref_home_do_show_deposits' => 'Tak, pokaż je',
'successful_count' => 'of which :count successful',
'transaction_page_size_title' => 'Rozmiar strony',
- 'transaction_page_size_help' => 'Any list of transactions shows at most this many transactions',
+ 'transaction_page_size_help' => 'Dowolna lista transakcji będzie pokazywać maksymalnie tyle transakcji',
'transaction_page_size_label' => 'Rozmiar strony',
'between_dates' => '(:start i :end)',
'pref_optional_fields_transaction' => 'Opcjonalne pola dla transakcji',
'pref_optional_fields_transaction_help' => 'By default not all fields are enabled when creating a new transaction (because of the clutter). Below, you can enable these fields if you think they could be useful for you. Of course, any field that is disabled, but already filled in, will be visible regardless of the setting.',
- 'optional_tj_date_fields' => 'Pola daty',
+ 'optional_tj_date_fields' => 'Pola dat',
'optional_tj_business_fields' => 'Pola biznesowe',
'optional_tj_attachment_fields' => 'Pola załączników',
'pref_optional_tj_interest_date' => 'Interest date',
@@ -393,35 +404,35 @@ return [
'convert_is_already_type_Withdrawal' => 'Ta transakcja jest już wypłatą',
'convert_is_already_type_Deposit' => 'Ta transakcja jest już wpłatą',
'convert_is_already_type_Transfer' => 'Ta transakcja jest już transferem',
- 'convert_to_Withdrawal' => 'Convert ":description" to a withdrawal',
- 'convert_to_Deposit' => 'Convert ":description" to a deposit',
- 'convert_to_Transfer' => 'Convert ":description" to a transfer',
+ 'convert_to_Withdrawal' => 'Konwertuj ":description" na wypłatę',
+ 'convert_to_Deposit' => 'Konwertuj ":description" na wpłatę',
+ 'convert_to_Transfer' => 'Konwertuj ":description" na transfer',
'convert_options_WithdrawalDeposit' => 'Konwertuj wypłatę na wpłatę',
'convert_options_WithdrawalTransfer' => 'Konwertuj wypłatę na transfer',
'convert_options_DepositTransfer' => 'Konwertuj wpłatę na transfer',
'convert_options_DepositWithdrawal' => 'Konwertuj wpłatę na wypłatę',
'convert_options_TransferWithdrawal' => 'Konwertuj transfer na wypłatę',
- 'convert_options_TransferDeposit' => 'Convert a transfer into a deposit',
+ 'convert_options_TransferDeposit' => 'Konwertuj transfer na wpłatę',
'transaction_journal_convert_options' => 'Konwertuj tę transakcję',
- 'convert_Withdrawal_to_deposit' => 'Convert this withdrawal to a deposit',
- 'convert_Withdrawal_to_transfer' => 'Convert this withdrawal to a transfer',
- 'convert_Deposit_to_withdrawal' => 'Convert this deposit to a withdrawal',
- 'convert_Deposit_to_transfer' => 'Convert this deposit to a transfer',
- 'convert_Transfer_to_deposit' => 'Convert this transfer to a deposit',
- 'convert_Transfer_to_withdrawal' => 'Convert this transfer to a withdrawal',
- 'convert_please_set_revenue_source' => 'Please pick the revenue account where the money will come from.',
- 'convert_please_set_asset_destination' => 'Please pick the asset account where the money will go to.',
- 'convert_please_set_expense_destination' => 'Please pick the expense account where the money will go to.',
- 'convert_please_set_asset_source' => 'Please pick the asset account where the money will come from.',
+ 'convert_Withdrawal_to_deposit' => 'Konwertuj tę wypłatę na wpłatę',
+ 'convert_Withdrawal_to_transfer' => 'Konwertuj tę wypłatę na transfer',
+ 'convert_Deposit_to_withdrawal' => 'Konwertuj tę wpłatę na wypłatę',
+ 'convert_Deposit_to_transfer' => 'Konwertuj tę wpłatę na transfer',
+ 'convert_Transfer_to_deposit' => 'Konwertuj ten transfer na wpłatę',
+ 'convert_Transfer_to_withdrawal' => 'Konwertuj ten transfer na wypłatę',
+ 'convert_please_set_revenue_source' => 'Proszę wybierz konto przychodów, z którego będą przychodzić pieniądze.',
+ 'convert_please_set_asset_destination' => 'Proszę wybierz konto aktywów, do którego będą wychodzić pieniądze.',
+ 'convert_please_set_expense_destination' => 'Proszę wybierz konto wydatków, do którego będą wychodzić pieniądze.',
+ 'convert_please_set_asset_source' => 'Proszę wybierz konto aktywów, z którego będą przychodzić pieniądze.',
'convert_explanation_withdrawal_deposit' => 'If you convert this withdrawal into a deposit, :amount will be deposited into :sourceName instead of taken from it.',
'convert_explanation_withdrawal_transfer' => 'If you convert this withdrawal into a transfer, :amount will be transferred from :sourceName to a new asset account, instead of being paid to :destinationName.',
'convert_explanation_deposit_withdrawal' => 'If you convert this deposit into a withdrawal, :amount will be removed from :destinationName instead of added to it.',
'convert_explanation_deposit_transfer' => 'If you convert this deposit into a transfer, :amount will be transferred from an asset account of your choice into :destinationName.',
'convert_explanation_transfer_withdrawal' => 'If you convert this transfer into a withdrawal, :amount will go from :sourceName to a new destination as an expense, instead of to :destinationName as a transfer.',
'convert_explanation_transfer_deposit' => 'If you convert this transfer into a deposit, :amount will be deposited into account :destinationName instead of being transferred there.',
- 'converted_to_Withdrawal' => 'The transaction has been converted to a withdrawal',
- 'converted_to_Deposit' => 'The transaction has been converted to a deposit',
- 'converted_to_Transfer' => 'The transaction has been converted to a transfer',
+ 'converted_to_Withdrawal' => 'Transakcja została przekonwertowana do wypłaty',
+ 'converted_to_Deposit' => 'Transakcja została przekonwertowana do wpłaty',
+ 'converted_to_Transfer' => 'Transakcja została przekonwertowana do transferu',
// create new stuff:
@@ -439,7 +450,7 @@ return [
'store_currency' => 'Zapisz nową walutę',
'update_currency' => 'Modyfikuj walutę',
'new_default_currency' => ':name jest teraz domyślną walutą.',
- 'cannot_delete_currency' => 'Cannot delete :name because it is still in use.',
+ 'cannot_delete_currency' => 'Nie można usunąć :name, ponieważ jest on nadal używany.',
'deleted_currency' => 'Waluta :name została usunięta',
'created_currency' => 'Waluta :name została utworzona',
'updated_currency' => 'Waluta :name została zmodyfikowana',
@@ -599,8 +610,8 @@ return [
'newWithdrawal' => 'Nowy wydatek',
'newDeposit' => 'Nowa wpłata',
'newTransfer' => 'Nowy transfer',
- 'moneyIn' => 'Money in',
- 'moneyOut' => 'Money out',
+ 'moneyIn' => 'Uznania',
+ 'moneyOut' => 'Obciążenia',
'billsToPay' => 'Rachunki do zapłacenia',
'billsPaid' => 'Zapłacone rachunki',
'divided' => 'podzielone',
@@ -618,13 +629,13 @@ return [
'Default account' => 'Konto aktywów',
'Expense account' => 'Konto wydatków',
'Revenue account' => 'Konto przychodów',
- 'Initial balance account' => 'Initial balance account',
+ 'Initial balance account' => 'Początkowe saldo konta',
'budgets' => 'Budżety',
'tags' => 'Tagi',
'reports' => 'Raporty',
'transactions' => 'Transakcje',
'expenses' => 'Wydatki',
- 'income' => 'Przychód / dochód',
+ 'income' => 'Przychody / dochody',
'transfers' => 'Transfery',
'moneyManagement' => 'Zarządzanie pieniędzmi',
'piggyBanks' => 'Skarbonki',
@@ -649,16 +660,16 @@ return [
'errors' => 'Błędy',
// reports:
- 'report_default' => 'Default financial report between :start and :end',
- 'report_audit' => 'Transaction history overview between :start and :end',
- 'report_category' => 'Category report between :start and :end',
- 'report_budget' => 'Budget report between :start and :end',
+ 'report_default' => 'Domyślny raport finansowy między :start i :end',
+ 'report_audit' => 'Przegląd historii transakcji między :start i :end',
+ 'report_category' => 'Raport kategorii między :start i :end',
+ 'report_budget' => 'Raport budżetów między :start i :end',
'quick_link_reports' => 'Szybkie linki',
- 'quick_link_default_report' => 'Default financial report',
- 'quick_link_audit_report' => 'Transaction history overview',
- 'report_this_month_quick' => 'Current month, all accounts',
- 'report_this_year_quick' => 'Current year, all accounts',
- 'report_this_fiscal_year_quick' => 'Current fiscal year, all accounts',
+ 'quick_link_default_report' => 'Domyślny raport finansowy',
+ 'quick_link_audit_report' => 'Przegląd historii transakcji',
+ 'report_this_month_quick' => 'Bieżący miesiąc, wszystkie konta',
+ 'report_this_year_quick' => 'Bieżący rok, wszystkie konta',
+ 'report_this_fiscal_year_quick' => 'Bieżący rok podatkowy, wszystkie konta',
'report_all_time_quick' => 'All-time, all accounts',
'reports_can_bookmark' => 'Remember that reports can be bookmarked.',
'incomeVsExpenses' => 'Dochody a wydatki',
@@ -693,7 +704,7 @@ return [
'sum_of_years' => 'Sum of years',
'average_of_year' => 'Average of year',
'average_of_years' => 'Average of years',
- 'categories_earned_in_year' => 'Categories (by earnings)',
+ 'categories_earned_in_year' => 'Kategorie (wg przychodów)',
'categories_spent_in_year' => 'Kategorie (wg wydatków)',
'report_type' => 'Typ raportu',
'report_type_default' => 'Domyślny raport finansowy',
@@ -702,14 +713,14 @@ return [
'report_type_budget' => 'Raport budżetów',
'report_type_meta-history' => 'Przegląd kategorii, budżetów i rachunków',
'more_info_help' => 'More information about these types of reports can be found in the help pages. Press the (?) icon in the top right corner.',
- 'report_included_accounts' => 'Included accounts',
+ 'report_included_accounts' => 'Uwzględnione konta',
'report_date_range' => 'Zakres dat',
'report_preset_ranges' => 'Pre-set ranges',
'shared' => 'Udostępnione',
- 'fiscal_year' => 'Fiscal year',
+ 'fiscal_year' => 'Rok podatkowy',
'income_entry' => 'Income from account ":name" between :start and :end',
'expense_entry' => 'Expenses to account ":name" between :start and :end',
- 'category_entry' => 'Expenses in category ":name" between :start and :end',
+ 'category_entry' => 'Wydatki w kategorii ":name" między :start i :end',
'budget_spent_amount' => 'Wydatki w budżecie ":budget" między :start i :end',
'balance_amount' => 'Expenses in budget ":budget" paid from account ":account" between :start and :end',
'no_audit_activity' => 'No activity was recorded on account :account_name between :start and :end.',
@@ -731,7 +742,7 @@ return [
'include_income_not_in_category' => 'Included income not in the selected category(ies)',
'include_income_not_in_account' => 'Included income not in the selected account(s)',
'everything_else' => 'Wszystko inne',
- 'income_and_expenses' => 'Income and expenses',
+ 'income_and_expenses' => 'Dochody i wydatki',
'spent_average' => 'Wydano (średnia)',
'income_average' => 'Dochód (średnia)',
'transaction_count' => 'Liczba transakcji',
@@ -739,9 +750,12 @@ return [
'average_income_per_account' => 'Średni dochód per konto',
'total' => 'Łącznie',
'description' => 'Opis',
- 'sum_of_period' => 'Sum of period',
- 'average_in_period' => 'Average in period',
-
+ 'sum_of_period' => 'Suma dla tego okresu',
+ 'average_in_period' => 'Średnia dla tego okresu',
+ 'account_role_defaultAsset' => 'Domyślne konto aktywów',
+ 'account_role_sharedAsset' => 'Współdzielone konto aktywów',
+ 'account_role_savingAsset' => 'Konto oszczędnościowe',
+ 'account_role_ccAsset' => 'Karta kredytowa',
// charts:
'chart' => 'Wykres',
@@ -772,7 +786,7 @@ return [
'balanceFor' => 'Saldo dla :name',
// piggy banks:
- 'add_money_to_piggy' => 'Add money to piggy bank ":name"',
+ 'add_money_to_piggy' => 'Dodaj pieniądze do skarbonki ":name"',
'piggy_bank' => 'Skarbonka',
'new_piggy_bank' => 'Utwórz nową skarbonkę',
'store_piggy_bank' => 'Zapisz nową skarbonkę',
@@ -787,40 +801,40 @@ return [
'add' => 'Dodaj',
'remove' => 'Usuń',
- 'max_amount_add' => 'The maximum amount you can add is',
- 'max_amount_remove' => 'The maximum amount you can remove is',
- 'update_piggy_button' => 'Update piggy bank',
- 'update_piggy_title' => 'Update piggy bank ":name"',
- 'updated_piggy_bank' => 'Updated piggy bank ":name"',
+ 'max_amount_add' => 'Maksymalną kwotą, którą możesz dodać jest',
+ 'max_amount_remove' => 'Maksymalną kwotą, którą możesz usunąć jest',
+ 'update_piggy_button' => 'Aktualizuj skarbonkę',
+ 'update_piggy_title' => 'Aktualizuj skarbonkę ":name"',
+ 'updated_piggy_bank' => 'Zaktualizowano skarbonkę ":name"',
'details' => 'Szczegóły',
'events' => 'Zdarzenia',
- 'target_amount' => 'Target amount',
- 'start_date' => 'Start date',
- 'target_date' => 'Target date',
+ 'target_amount' => 'Kwota docelowa',
+ 'start_date' => 'Data rozpoczęcia',
+ 'target_date' => 'Data docelowa',
'no_target_date' => 'No target date',
- 'todo' => 'to do',
- 'table' => 'Table',
- 'piggy_bank_not_exists' => 'Piggy bank no longer exists.',
- 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.',
+ 'todo' => 'do wykonania',
+ 'table' => 'Tabela',
+ 'piggy_bank_not_exists' => 'Skarbonka już nie istnieje.',
+ 'add_any_amount_to_piggy' => 'Dodaj pieniądze do skarbonki aby osiągnąć twój cel w kwocie :amount.',
'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date',
- 'delete_piggy_bank' => 'Delete piggy bank ":name"',
- 'cannot_add_amount_piggy' => 'Could not add :amount to ":name".',
+ 'delete_piggy_bank' => 'Usuń skarbonkę ":name"',
+ 'cannot_add_amount_piggy' => 'Nie można dodać :amount do ":name".',
'cannot_remove_from_piggy' => 'Could not remove :amount from ":name".',
- 'deleted_piggy_bank' => 'Deleted piggy bank ":name"',
+ 'deleted_piggy_bank' => 'Usunięto skarbonkę ":name"',
'added_amount_to_piggy' => 'Added :amount to ":name"',
'removed_amount_from_piggy' => 'Removed :amount from ":name"',
'cannot_remove_amount_piggy' => 'Could not remove :amount from ":name".',
// tags
- 'regular_tag' => 'Just a regular tag.',
+ 'regular_tag' => 'Po prostu zwykły tag.',
'balancing_act' => 'The tag takes at most two transactions; an expense and a transfer. They\'ll balance each other out.',
'advance_payment' => 'The tag accepts one expense and any number of deposits aimed to repay the original expense.',
- 'delete_tag' => 'Delete tag ":tag"',
- 'deleted_tag' => 'Deleted tag ":tag"',
+ 'delete_tag' => 'Usuń tag ":tag"',
+ 'deleted_tag' => 'Usunięto tag ":tag"',
'new_tag' => 'Make new tag',
- 'edit_tag' => 'Edit tag ":tag"',
- 'updated_tag' => 'Updated tag ":tag"',
- 'created_tag' => 'Tag ":tag" has been created!',
+ 'edit_tag' => 'Modyfikuj tag ":tag"',
+ 'updated_tag' => 'Zaktualizowano tag ":tag"',
+ 'created_tag' => 'Tag ":tag" został utworzony!',
'no_year' => 'Nie ustawiono roku',
'no_month' => 'Nie ustawiono miesiąca',
'tag_title_nothing' => 'Domyślne tagi',
@@ -830,7 +844,7 @@ return [
'tags_group' => 'Tags group transactions together, which makes it possible to store reimbursements (in case you front money for others) and other "balancing acts" where expenses are summed up (the payments on your new TV) or where expenses and deposits are cancelling each other out (buying something with saved money). It\'s all up to you. Using tags the old-fashioned way is of course always possible.',
'tags_start' => 'Create a tag to get started or enter tags when creating new transactions.',
- 'transaction_journal_information' => 'Transaction information',
+ 'transaction_journal_information' => 'Informacje o transakcji',
'transaction_journal_meta' => 'Meta information',
'total_amount' => 'Łączna kwota',
'number_of_decimals' => 'Ilość miejsc dziesiętnych',
@@ -848,17 +862,17 @@ return [
'single_user_administration' => 'User administration for :email',
'edit_user' => 'Modyfikuj użytkownika :email',
'hidden_fields_preferences' => 'Not all fields are visible right now. You must enable them in your settings.',
- 'user_data_information' => 'User data',
- 'user_information' => 'User information',
- 'total_size' => 'total size',
+ 'user_data_information' => 'Dane użytkownika',
+ 'user_information' => 'Informacja o użytkowniku',
+ 'total_size' => 'łączny rozmiar',
'budget_or_budgets' => 'budżet(y)',
'budgets_with_limits' => 'budget(s) with configured amount',
'rule_or_rules' => 'reguła(y)',
'rulegroup_or_groups' => 'grupa(y) reguł',
'setting_must_confirm_account' => 'Potwierdzenie konta',
'setting_must_confirm_account_explain' => 'When this setting is enabled, users must activate their account before it can be used.',
- 'configuration_updated' => 'The configuration has been updated',
- 'setting_is_demo_site' => 'Demo site',
+ 'configuration_updated' => 'Konfiguracja została zaktualizowana',
+ 'setting_is_demo_site' => 'Strona demonstracyjna',
'setting_is_demo_site_explain' => 'If you check this box, this installation will behave as if it is the demo site, which can have weird side effects.',
'setting_send_email_notifications' => 'Wyślij powiadomienia emailem',
'setting_send_email_explain' => 'Firefly III can send you email notifications about certain events. They will be sent to :site_owner
. This email address can be set in the .env
file.',
@@ -903,45 +917,45 @@ return [
// import
'configuration_file_help' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file.',
- 'import_data_index' => 'Index',
- 'import_file_type_csv' => 'CSV (comma separated values)',
+ 'import_data_index' => 'Indeks',
+ 'import_file_type_csv' => 'CSV (wartości oddzielone przecinkami)',
'import_file_type_help' => 'Wybierz typ pliku, który będziesz przesyłać',
- 'import_start' => 'Start the import',
+ 'import_start' => 'Rozpocznij Importowanie',
'configure_import' => 'Further configure your import',
- 'import_finish_configuration' => 'Finish configuration',
- 'settings_for_import' => 'Settings',
- 'import_status' => 'Import status',
- 'import_status_text' => 'The import is currently running, or will start momentarily.',
- 'import_complete' => 'Import configuration complete!',
+ 'import_finish_configuration' => 'Zakończ konfigurację',
+ 'settings_for_import' => 'Ustawienia',
+ 'import_status' => 'Status importu',
+ 'import_status_text' => 'Import jest aktualnie uruchomiony, lub rozpocznie się chwilę.',
+ 'import_complete' => 'Zakończono import konfiguracji!',
'import_complete_text' => 'The import is ready to start. All the configuration you needed to do has been done. Please download the configuration file. It will help you with the import should it not go as planned. To actually run the import, you can either execute the following command in your console, or run the web-based import. Depending on your configuration, the console import will give you more feedback.',
- 'import_download_config' => 'Download configuration',
- 'import_start_import' => 'Start import',
- 'import_data' => 'Import data',
- 'import_data_full' => 'Import data into Firefly III',
- 'import' => 'Import',
+ 'import_download_config' => 'Pobierz konfigurację',
+ 'import_start_import' => 'Rozpocznij import',
+ 'import_data' => 'Importuj dane',
+ 'import_data_full' => 'Importuj dane do Firefly III',
+ 'import' => 'Importuj',
'import_file_help' => 'Wybierz swój plik',
- 'import_status_settings_complete' => 'The import is ready to start.',
- 'import_status_import_complete' => 'The import has completed.',
- 'import_status_import_running' => 'The import is currently running. Please be patient.',
- 'import_status_header' => 'Import status and progress',
- 'import_status_errors' => 'Import errors',
- 'import_status_report' => 'Import report',
- 'import_finished' => 'Import has finished',
- 'import_error_single' => 'An error has occured during the import.',
- 'import_error_multi' => 'Some errors occured during the import.',
- 'import_error_fatal' => 'There was an error during the import routine. Please check the log files. The error seems to be:',
- 'import_error_timeout' => 'The import seems to have timed out. If this error persists, please import your data using the console command.',
+ 'import_status_settings_complete' => 'Import jest gotowy do uruchomienia.',
+ 'import_status_import_complete' => 'Import został zakończony.',
+ 'import_status_import_running' => 'Import jest aktualnie uruchomiony. Proszę o cierpliwość.',
+ 'import_status_header' => 'Status oraz postęp importu',
+ 'import_status_errors' => 'Błędy importu',
+ 'import_status_report' => 'Raport z importu',
+ 'import_finished' => 'Import został zakończony',
+ 'import_error_single' => 'Wystąpił błąd podczas importu.',
+ 'import_error_multi' => 'Wystąpiły błędy podczas importu.',
+ 'import_error_fatal' => 'Wystąpił błąd podczas procedury importu. Proszę sprawdzić pliki dziennika błędów. Błąd wydaje się być:',
+ 'import_error_timeout' => 'Wygląda na to że został przekroczony limit czasu dla importu. Jeżeli bład będzie się powtarzał, należy zaimportować dane przy użyciu polecenia z konsoli.',
'import_double' => 'Row #:row: This row has been imported before, and is stored in :description.',
'import_finished_all' => 'The import has finished. Please check out the results below.',
- 'import_with_key' => 'Import with key \':key\'',
+ 'import_with_key' => 'Import z kluczem \':key\'',
'import_share_configuration' => 'Please consider downloading your configuration and sharing it at the import configuration center. This will allow other users of Firefly III to import their files more easily.',
'import_finished_report' => 'The import has finished. Please note any errors in the block above this line. All transactions imported during this particular session have been tagged, and you can check them out below. ',
'import_finished_link' => 'The transactions imported can be found in tag :tag.',
- 'need_at_least_one_account' => 'You need at least one asset account to be able to create piggy banks',
+ 'need_at_least_one_account' => 'Potrzebujesz przynajmniej jednego konta aktywów, aby móc tworzyć skarbonki',
'see_help_top_right' => 'For more information, please check out the help pages using the icon in the top right corner of the page.',
'bread_crumb_import_complete' => 'Import ":key" complete',
'bread_crumb_configure_import' => 'Configure import ":key"',
- 'bread_crumb_import_finished' => 'Import ":key" finished',
+ 'bread_crumb_import_finished' => 'Import ":key" został zakończony',
'import_finished_intro' => 'The import has finished! You can now see the new transactions in Firefly.',
'import_finished_text_without_link' => 'It seems there is no tag that points to all your imported transactions. Please look for your imported data in the menu on the left, under "Transactions".',
'import_finished_text_with_link' => 'You can find a list of your imported transactions on the page of the tag that was created for this import.',
diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php
index 8ff761a138..e5466680b7 100644
--- a/resources/lang/pl_PL/form.php
+++ b/resources/lang/pl_PL/form.php
@@ -22,7 +22,7 @@ return [
'active' => 'Aktywny',
'amount_min' => 'Minimalna kwota',
'amount_max' => 'Maksymalna kwota',
- 'match' => 'Matches on',
+ 'match' => 'Dopasowanie',
'repeat_freq' => 'Powtarza się',
'journal_currency_id' => 'Waluta',
'currency_id' => 'Waluta',
@@ -51,7 +51,7 @@ return [
'tagPosition' => 'Lokalizacja taga',
'virtualBalance' => 'Wirtualne saldo',
'longitude_latitude' => 'Lokalizacja',
- 'targetamount' => 'Docelowa kwota',
+ 'targetamount' => 'Kwota docelowa',
'accountRole' => 'Rola konta',
'openingBalanceDate' => 'Data salda otwarcia',
'ccType' => 'Plan płatności kartą kredytową',
@@ -66,10 +66,10 @@ return [
'decimal_places' => 'Miejsca dziesiętne',
'revenue_account_source' => 'Konto przychodów (źródło)',
- 'source_account_asset' => 'Source account (asset account)',
- 'destination_account_expense' => 'Destination account (expense account)',
- 'destination_account_asset' => 'Destination account (asset account)',
- 'source_account_revenue' => 'Source account (revenue account)',
+ 'source_account_asset' => 'Konto źródłowe (konto aktywów)',
+ 'destination_account_expense' => 'Konto docelowe (konto wydatków)',
+ 'destination_account_asset' => 'Konto docelowe (konto aktywów)',
+ 'source_account_revenue' => 'Konto źródłowe (konto przychodów)',
'type' => 'Typ',
'convert_Withdrawal' => 'Konwertuj wypłatę',
'convert_Deposit' => 'Konwertuj wpłatę',
@@ -174,7 +174,7 @@ return [
'csv_tab' => 'Tabulator (niewidoczny)',
'csv_delimiter' => 'CSV field delimiter',
'csv_import_account' => 'Domyślne konto importu',
- 'csv_config' => 'CSV import configuration',
+ 'csv_config' => 'Konfiguracja importu CSV',
'due_date' => 'Termin realizacji',
diff --git a/resources/lang/pl_PL/list.php b/resources/lang/pl_PL/list.php
index 1dd99e4872..0ce37d9346 100644
--- a/resources/lang/pl_PL/list.php
+++ b/resources/lang/pl_PL/list.php
@@ -23,15 +23,15 @@ return [
'active' => 'Jest aktywny?',
'lastActivity' => 'Ostatnia aktywność',
'balanceDiff' => 'Różnica salda między :start oraz :end',
- 'matchedOn' => 'Matched on',
- 'matchesOn' => 'Matched on',
+ 'matchedOn' => 'Dopasowanie',
+ 'matchesOn' => 'Dopasowanie',
'account_type' => 'Typ konta',
'created_at' => 'Utworzono',
'new_balance' => 'Nowe saldo',
'account' => 'Konto',
'matchingAmount' => 'Kwota',
'lastMatch' => 'Ostatnie dopasowanie',
- 'split_number' => 'Split #',
+ 'split_number' => '# podziału',
'destination' => 'Cel',
'source' => 'Źródło',
'next_expected_match' => 'Następne oczekiwane dopasowanie',
diff --git a/resources/lang/pt_BR/csv.php b/resources/lang/pt_BR/csv.php
index 18bc2a2c68..d23fdd3663 100644
--- a/resources/lang/pt_BR/csv.php
+++ b/resources/lang/pt_BR/csv.php
@@ -28,7 +28,7 @@ return [
'column_name' => 'Nome da coluna',
'column_example' => 'Dados de exemplo da coluna',
'column_role' => 'Significado de dados de coluna',
- 'do_map_value' => 'Mapear esses valores',
+ 'do_map_value' => 'Mapeie esses valores',
'column' => 'Coluna',
'no_example_data' => 'Não há dados de exemplo disponíveis',
'store_column_roles' => 'Continuar a importação',
diff --git a/resources/lang/pt_BR/demo.php b/resources/lang/pt_BR/demo.php
index e7f8ea934d..559620fedf 100644
--- a/resources/lang/pt_BR/demo.php
+++ b/resources/lang/pt_BR/demo.php
@@ -8,17 +8,17 @@
*/
return [
- 'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.',
- 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.',
- 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.',
- 'accounts-index' => 'Asset accounts are your personal bank accounts. Expense accounts are the accounts you spend money at, such as stores and friends. Revenue accounts are accounts you receive money from, such as your job, the government or other sources of income. On this page you can edit or remove them.',
- 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.',
- 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.',
- 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.',
- 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.',
- 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.',
- 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.',
- 'import-index' => 'Of course, any CSV file can be imported into Firefly III ',
- 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.',
- 'import-configure-configuration' => 'The configuration you see below is correct for the local file.',
+ 'no_demo_text' => 'Desculpe, não há nenhum texto extra de explicação para esta página.',
+ 'see_help_icon' => 'No entanto, o -ícone no canto superior direito pode lhe dizer mais.',
+ 'index' => 'Bem-vindo ao Firefly III! Nesta página você pode obter uma rápida visão geral de suas finanças. Para mais informações, confira Contas de Ativos → Contas de Ativos e, claro, as páginas de Orçamentos e Relatório.Ou então, dê uma olhada ao redor e veja onde você vai parar.',
+ 'accounts-index' => 'Contas de ativos são suas contas bancárias pessoais. Contas de despesas são as contas em que você gasta dinheiro, como por exemplo, com lojas, amigos. Contas de receita são as contas em que você recebe dinheiro, como seu emprego, auxílio do governo ou outras formas de receita. Nesta página, você pode editá-los ou removê-los.',
+ 'budgets-index' => 'Esta página mostra a você uma visão geral dos seus orçamentos. A barra superior mostra a quantidade disponível a ser orçamentada. Isto pode ser personalizado para qualquer valor clicando o montante à direita. A quantidade que você gastou de fato é mostrada na barra abaixo. Abaixo, estão as despesas para cada orçamento e o que você orçou neles.',
+ 'reports-index-start' => 'Firefly III suporta quatro tipos de relatórios. Leia sobre eles, clicando sobre o -ícone no canto superior direito.',
+ 'reports-index-examples' => 'Certifique-se de verificar estes exemplos: um quadro financeiro mensal, um quadro financeiro anual e uma visão geral orçamentária.',
+ 'currencies-index' => 'Firefly III oferece suporte a várias moedas. Embora o padrão seja o Euro, ela pode ser definida para o dólar americano e muitas outras moedas. Como você pode ver uma pequena seleção de moedas foi incluída, mas você pode adicionar suas próprias se desejar. No entanto, alterar a moeda padrão não vai mudar a moeda de transações existentes: Firefly III suporta o uso de várias moedas ao mesmo tempo.',
+ 'transactions-index' => 'Estas despesas, depósitos e transferências não são fantasiosas. Elas foram geradas automaticamente.',
+ 'piggy-banks-index' => 'Como você pode ver, existem três cofrinhos. Use o sinal de mais e menos botões para influenciar a quantidade de dinheiro em cada cofrinho. Clique no nome do cofrinho para ver a administração de cada cofrinho.',
+ 'import-index' => 'Claro, qualquer arquivo .CSV pode ser importado em Firefly III ',
+ 'import-configure-security' => 'Por questões de segurança, seu upload foi substituído por um arquivo local.',
+ 'import-configure-configuration' => 'A configuração que você vê abaixo é a correta para o arquivo local.',
];
\ No newline at end of file
diff --git a/resources/lang/pt_BR/firefly.php b/resources/lang/pt_BR/firefly.php
index 51ac5c791a..6d270fdea5 100644
--- a/resources/lang/pt_BR/firefly.php
+++ b/resources/lang/pt_BR/firefly.php
@@ -106,6 +106,14 @@ return [
'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.',
'budget_in_period' => '":name" between :start and :end',
'budget_in_period_breadcrumb' => 'Between :start and :end',
+ 'clone_withdrawal' => 'Clone this withdrawal',
+ 'clone_deposit' => 'Clone this deposit',
+ 'clone_transfer' => 'Clone this transfer',
+ 'transaction_journal_other_options' => 'Other options',
+ 'multi_select_no_selection' => 'None selected',
+ 'multi_select_all_selected' => 'All selected',
+ 'multi_select_filter_placeholder' => 'Find..',
+
// repeat frequencies:
'repeat_freq_yearly' => 'anual',
@@ -252,6 +260,9 @@ return [
'rule_trigger_description_ends_choice' => 'Descrição termina com..',
'rule_trigger_description_contains_choice' => 'Descrição contém..',
'rule_trigger_description_is_choice' => 'Descrição é..',
+ 'rule_trigger_category_is_choice' => 'Category is..',
+ 'rule_trigger_budget_is_choice' => 'Budget is..',
+ 'rule_trigger_tag_is_choice' => '(A) tag is..',
'rule_trigger_store_journal' => 'When a transaction is created',
'rule_trigger_update_journal' => 'When a transaction is updated',
'rule_action_set_category' => 'Definir categoria para ":action_value"',
@@ -741,7 +752,10 @@ return [
'description' => 'Descrição',
'sum_of_period' => 'Sum of period',
'average_in_period' => 'Average in period',
-
+ 'account_role_defaultAsset' => 'Default asset account',
+ 'account_role_sharedAsset' => 'Shared asset account',
+ 'account_role_savingAsset' => 'Savings account',
+ 'account_role_ccAsset' => 'Credit card',
// charts:
'chart' => 'Gráfico',
diff --git a/resources/lang/pt_BR/validation.php b/resources/lang/pt_BR/validation.php
index ca5dace44c..3e4891f349 100644
--- a/resources/lang/pt_BR/validation.php
+++ b/resources/lang/pt_BR/validation.php
@@ -12,7 +12,7 @@
return [
'iban' => 'Este não é um válido IBAN.',
'unique_account_number_for_user' => 'Parece que este número de conta já está em uso.',
- 'deleted_user' => 'Due to security constraints, you cannot register using this email address.',
+ 'deleted_user' => 'Devido a restrições de segurança, você não pode registrar usando este endereço de e-mail.',
'rule_trigger_value' => 'Este valor é inválido para o disparo selecionado.',
'rule_action_value' => 'Este valor é inválido para a ação selecionada.',
'invalid_domain' => 'Devido a restrições de segurança, você não pode registrar deste domínio.',
@@ -87,5 +87,5 @@ return [
'file' => 'O :attribute deve ser um arquivo.',
'in_array' => 'O campo :attribute não existe em :other.',
'present' => 'O campo :attribute deve estar presente.',
- 'amount_zero' => 'The total amount cannot be zero',
+ 'amount_zero' => 'A quantidade total não pode ser zero',
];
\ No newline at end of file
diff --git a/resources/lang/ru_RU/firefly.php b/resources/lang/ru_RU/firefly.php
index 6653989559..a91170cd53 100644
--- a/resources/lang/ru_RU/firefly.php
+++ b/resources/lang/ru_RU/firefly.php
@@ -106,6 +106,14 @@ return [
'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.',
'budget_in_period' => '":name" between :start and :end',
'budget_in_period_breadcrumb' => 'Between :start and :end',
+ 'clone_withdrawal' => 'Clone this withdrawal',
+ 'clone_deposit' => 'Clone this deposit',
+ 'clone_transfer' => 'Clone this transfer',
+ 'transaction_journal_other_options' => 'Other options',
+ 'multi_select_no_selection' => 'None selected',
+ 'multi_select_all_selected' => 'All selected',
+ 'multi_select_filter_placeholder' => 'Find..',
+
// repeat frequencies:
'repeat_freq_yearly' => 'yearly',
@@ -252,6 +260,9 @@ return [
'rule_trigger_description_ends_choice' => 'Description ends with..',
'rule_trigger_description_contains_choice' => 'Description contains..',
'rule_trigger_description_is_choice' => 'Description is..',
+ 'rule_trigger_category_is_choice' => 'Category is..',
+ 'rule_trigger_budget_is_choice' => 'Budget is..',
+ 'rule_trigger_tag_is_choice' => '(A) tag is..',
'rule_trigger_store_journal' => 'When a transaction is created',
'rule_trigger_update_journal' => 'When a transaction is updated',
'rule_action_set_category' => 'Set category to ":action_value"',
@@ -741,7 +752,10 @@ return [
'description' => 'Description',
'sum_of_period' => 'Sum of period',
'average_in_period' => 'Average in period',
-
+ 'account_role_defaultAsset' => 'Default asset account',
+ 'account_role_sharedAsset' => 'Shared asset account',
+ 'account_role_savingAsset' => 'Savings account',
+ 'account_role_ccAsset' => 'Credit card',
// charts:
'chart' => 'Chart',
diff --git a/resources/lang/zh_HK/firefly.php b/resources/lang/zh_HK/firefly.php
index 6653989559..a91170cd53 100644
--- a/resources/lang/zh_HK/firefly.php
+++ b/resources/lang/zh_HK/firefly.php
@@ -106,6 +106,14 @@ return [
'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.',
'budget_in_period' => '":name" between :start and :end',
'budget_in_period_breadcrumb' => 'Between :start and :end',
+ 'clone_withdrawal' => 'Clone this withdrawal',
+ 'clone_deposit' => 'Clone this deposit',
+ 'clone_transfer' => 'Clone this transfer',
+ 'transaction_journal_other_options' => 'Other options',
+ 'multi_select_no_selection' => 'None selected',
+ 'multi_select_all_selected' => 'All selected',
+ 'multi_select_filter_placeholder' => 'Find..',
+
// repeat frequencies:
'repeat_freq_yearly' => 'yearly',
@@ -252,6 +260,9 @@ return [
'rule_trigger_description_ends_choice' => 'Description ends with..',
'rule_trigger_description_contains_choice' => 'Description contains..',
'rule_trigger_description_is_choice' => 'Description is..',
+ 'rule_trigger_category_is_choice' => 'Category is..',
+ 'rule_trigger_budget_is_choice' => 'Budget is..',
+ 'rule_trigger_tag_is_choice' => '(A) tag is..',
'rule_trigger_store_journal' => 'When a transaction is created',
'rule_trigger_update_journal' => 'When a transaction is updated',
'rule_action_set_category' => 'Set category to ":action_value"',
@@ -741,7 +752,10 @@ return [
'description' => 'Description',
'sum_of_period' => 'Sum of period',
'average_in_period' => 'Average in period',
-
+ 'account_role_defaultAsset' => 'Default asset account',
+ 'account_role_sharedAsset' => 'Shared asset account',
+ 'account_role_savingAsset' => 'Savings account',
+ 'account_role_ccAsset' => 'Credit card',
// charts:
'chart' => 'Chart',
diff --git a/resources/lang/zh_TW/firefly.php b/resources/lang/zh_TW/firefly.php
index 0de95e0eea..9fddfcf9d8 100644
--- a/resources/lang/zh_TW/firefly.php
+++ b/resources/lang/zh_TW/firefly.php
@@ -106,6 +106,14 @@ return [
'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.',
'budget_in_period' => '":name" between :start and :end',
'budget_in_period_breadcrumb' => 'Between :start and :end',
+ 'clone_withdrawal' => 'Clone this withdrawal',
+ 'clone_deposit' => 'Clone this deposit',
+ 'clone_transfer' => 'Clone this transfer',
+ 'transaction_journal_other_options' => 'Other options',
+ 'multi_select_no_selection' => 'None selected',
+ 'multi_select_all_selected' => 'All selected',
+ 'multi_select_filter_placeholder' => 'Find..',
+
// repeat frequencies:
'repeat_freq_yearly' => 'yearly',
@@ -252,6 +260,9 @@ return [
'rule_trigger_description_ends_choice' => '描述以…結尾',
'rule_trigger_description_contains_choice' => '描述包含…',
'rule_trigger_description_is_choice' => '描述是…',
+ 'rule_trigger_category_is_choice' => 'Category is..',
+ 'rule_trigger_budget_is_choice' => 'Budget is..',
+ 'rule_trigger_tag_is_choice' => '(A) tag is..',
'rule_trigger_store_journal' => 'When a transaction is created',
'rule_trigger_update_journal' => 'When a transaction is updated',
'rule_action_set_category' => 'Set category to ":action_value"',
@@ -741,7 +752,10 @@ return [
'description' => 'Description',
'sum_of_period' => 'Sum of period',
'average_in_period' => 'Average in period',
-
+ 'account_role_defaultAsset' => 'Default asset account',
+ 'account_role_sharedAsset' => 'Shared asset account',
+ 'account_role_savingAsset' => 'Savings account',
+ 'account_role_ccAsset' => 'Credit card',
// charts:
'chart' => 'Chart',
diff --git a/resources/tests/blns.base64.json b/resources/tests/blns.base64.json
new file mode 100644
index 0000000000..19c54f1325
--- /dev/null
+++ b/resources/tests/blns.base64.json
@@ -0,0 +1,468 @@
+[
+ "",
+ "dW5kZWZpbmVkCg==",
+ "dW5kZWYK",
+ "bnVsbAo=",
+ "TlVMTAo=",
+ "KG51bGwpCg==",
+ "bmlsCg==",
+ "TklMCg==",
+ "dHJ1ZQo=",
+ "ZmFsc2UK",
+ "VHJ1ZQo=",
+ "RmFsc2UK",
+ "Tm9uZQo=",
+ "aGFzT3duUHJvcGVydHkK",
+ "XFw=",
+ "MAo=",
+ "XFxcXAo=",
+ "MQo=",
+ "MS4wMAo=",
+ "JDEuMDAK",
+ "MS8yCg==",
+ "MUUyCg==",
+ "MUUwMgo=",
+ "MUUrMDIK",
+ "LTEK",
+ "LTEuMDAK",
+ "LSQxLjAwCg==",
+ "LTEvMgo=",
+ "LTFFMgo=",
+ "LTFFMDIK",
+ "LTFFKzAyCg==",
+ "MS8wCg==",
+ "MC8wCg==",
+ "LTIxNDc0ODM2NDgvLTEK",
+ "LTkyMjMzNzIwMzY4NTQ3NzU4MDgvLTEK",
+ "MC4wMAo=",
+ "MC4uMAo=",
+ "Lgo=",
+ "MC4wLjAK",
+ "MCwwMAo=",
+ "MCwsMAo=",
+ "LAo=",
+ "MCwwLDAK",
+ "MC4wLzAK",
+ "MS4wLzAuMAo=",
+ "MC4wLzAuMAo=",
+ "MSwwLzAsMAo=",
+ "MCwwLzAsMAo=",
+ "LS0xCg==",
+ "LQo=",
+ "LS4K",
+ "LSwK",
+ "OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5Cg==",
+ "TmFOCg==",
+ "SW5maW5pdHkK",
+ "LUluZmluaXR5Cg==",
+ "MHgwCg==",
+ "MHhmZmZmZmZmZgo=",
+ "MHhmZmZmZmZmZmZmZmZmZmZmCg==",
+ "MHhhYmFkMWRlYQo=",
+ "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5Cg==",
+ "MSwwMDAuMDAK",
+ "MSAwMDAuMDAK",
+ "MScwMDAuMDAK",
+ "MSwwMDAsMDAwLjAwCg==",
+ "MSAwMDAgMDAwLjAwCg==",
+ "MScwMDAnMDAwLjAwCg==",
+ "MS4wMDAsMDAK",
+ "MSAwMDAsMDAK",
+ "MScwMDAsMDAK",
+ "MS4wMDAuMDAwLDAwCg==",
+ "MSAwMDAgMDAwLDAwCg==",
+ "MScwMDAnMDAwLDAwCg==",
+ "MDEwMDAK",
+ "MDgK",
+ "MDkK",
+ "Mi4yMjUwNzM4NTg1MDcyMDExZS0zMDgK",
+ "LC4vOydbXS09Cg==",
+ "PD4/OiJ7fXxfKwo=",
+ "IUAjJCVeJiooKWB+Cg==",
+ "zqniiYjDp+KImuKIq8ucwrXiiaTiiaXDtwo=",
+ "w6XDn+KIgsaSwqnLmeKIhsuawqzigKbDpgo=",
+ "xZPiiJHCtMKu4oCgwqXCqMuGw7jPgOKAnOKAmAo=",
+ "wqHihKLCo8Ki4oiewqfCtuKAosKqwrrigJPiiaAK",
+ "wrjLm8OH4peKxLHLnMOCwq/LmMK/Cg==",
+ "w4XDjcOOw4/LncOTw5Tvo7/DksOaw4bimIMK",
+ "xZLigJ7CtOKAsMuHw4HCqMuGw5jiiI/igJ3igJkK",
+ "YOKBhOKCrOKAueKAuu+sge+sguKAocKwwrfigJrigJTCsQo=",
+ "4oWb4oWc4oWd4oWeCg==",
+ "0IHQgtCD0ITQhdCG0IfQiNCJ0IrQi9CM0I3QjtCP0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y8K",
+ "2aDZodmi2aPZpNml2abZp9mo2akK",
+ "4oGw4oG04oG1Cg==",
+ "4oKA4oKB4oKCCg==",
+ "4oGw4oG04oG14oKA4oKB4oKCCg==",
+ "Jwo=",
+ "Igo=",
+ "JycK",
+ "IiIK",
+ "JyInCg==",
+ "IicnJyciJyIK",
+ "IiciJyInJycnIgo=",
+ "55Sw5Lit44GV44KT44Gr44GC44GS44Gm5LiL44GV44GECg==",
+ "44OR44O844OG44Kj44O844G46KGM44GL44Gq44GE44GLCg==",
+ "5ZKM6KO95ryi6KqeCg==",
+ "6YOo6JC95qC8Cg==",
+ "7IKs7ZqM6rO87ZWZ7JuQIOyWtO2VmeyXsOq1rOyGjAo=",
+ "7LCm7LCo66W8IO2DgOqzoCDsmKgg7Y6y7Iuc66eo6rO8IOyRm+uLpOumrCDrmKDrsKnqsIHtlZgK",
+ "56S+5pyD56eR5a246Zmi6Kqe5a2456CU56m25omACg==",
+ "7Jq4656A67CU7Yag66W0Cg==",
+ "8KCcjvCgnLHwoJ258KCxk/CgsbjwoLKW8KCzjwo=",
+ "44O94Ly84LqI2YTNnOC6iOC8ve++iSDjg73gvLzguojZhM2c4LqI4Ly9776JCg==",
+ "KO+9oeKXlSDiiIAg4peV772hKQo=",
+ "772A772oKMK04oiA772A4oipCg==",
+ "X1/vvpsoLF8sKikK",
+ "44O7KO+/o+KIgO+/oynjg7s6KjoK",
+ "776f772l4py/44O+4pWyKO+9oeKXleKAv+KXle+9oSnilbHinL/vvaXvvp8K",
+ "LOOAguODuzoqOuODu+OCnOKAmSgg4pi7IM+JIOKYuyAp44CC44O7Oio644O744Kc4oCZCg==",
+ "KOKVr8Kw4pahwrDvvInila/vuLUg4pS74pSB4pS7KQo=",
+ "KO++ieCypeebiuCype+8ie++ie+7vyDilLvilIHilLsK",
+ "KCDNocKwIM2cypYgzaHCsCkK",
+ "8J+YjQo=",
+ "8J+RqfCfj70K",
+ "8J+RviDwn5mHIPCfkoEg8J+ZhSDwn5mGIPCfmYsg8J+ZjiDwn5mNCg==",
+ "8J+QtSDwn5mIIPCfmYkg8J+Zigo=",
+ "4p2k77iPIPCfkpQg8J+SjCDwn5KVIPCfkp4g8J+SkyDwn5KXIPCfkpYg8J+SmCDwn5KdIPCfkp8g8J+SnCDwn5KbIPCfkpog8J+SmQo=",
+ "4pyL8J+PvyDwn5Kq8J+PvyDwn5GQ8J+PvyDwn5mM8J+PvyDwn5GP8J+PvyDwn5mP8J+Pvwo=",
+ "8J+aviDwn4aSIPCfhpMg8J+GlSDwn4aWIPCfhpcg8J+GmSDwn4+nCg==",
+ "MO+4j+KDoyAx77iP4oOjIDLvuI/ig6MgM++4j+KDoyA077iP4oOjIDXvuI/ig6MgNu+4j+KDoyA377iP4oOjIDjvuI/ig6MgOe+4j+KDoyDwn5SfCg==",
+ "77yR77yS77yTCg==",
+ "2aHZotmjCg==",
+ "2KvZhSDZhtmB2LMg2LPZgti32Kog2YjYqNin2YTYqtit2K/Zitiv2IwsINis2LLZitix2KrZiiDYqNin2LPYqtiu2K/Yp9mFINij2YYg2K/ZhtmILiDYpdiwINmH2YbYp9ifINin2YTYs9iq2KfYsSDZiNiq2YbYtdmK2Kgg2YPYp9mGLiDYo9mH2ZHZhCDYp9mK2LfYp9mE2YrYp9iMINio2LHZiti32KfZhtmK2Kct2YHYsdmG2LPYpyDZgtivINij2K7YsC4g2LPZhNmK2YXYp9mG2Iwg2KXYqtmB2KfZgtmK2Kkg2KjZitmGINmF2KcsINmK2LDZg9ixINin2YTYrdiv2YjYryDYo9mKINio2LnYrywg2YXYudin2YXZhNipINio2YjZhNmG2K/Yp9iMINin2YTYpdi32YTYp9mCINi52YQg2KXZitmILgo=",
+ "15HWsNa816jWtdeQ16nWtNeB15nXqiwg15HWuNa816jWuNeQINeQ1rHXnNa515TWtNeZ150sINeQ1rXXqiDXlNa316nWuNa814HXnta315nWtNedLCDXldaw15DWtdeqINeU1rjXkNa416jWttelCg==",
+ "15TWuNeZ1rDXqta415R0ZXN02KfZhNi12YHYrdin2Kog2KfZhNiq2ZHYrdmI2YQK",
+ "77e9Cg==",
+ "77e6Cg==",
+ "4oCLCg==",
+ "4ZqACg==",
+ "4aCOCg==",
+ "44CACg==",
+ "77u/Cg==",
+ "4pCjCg==",
+ "4pCiCg==",
+ "4pChCg==",
+ "4oCq4oCqdGVzdOKAqgo=",
+ "4oCrdGVzdOKAqwo=",
+ "4oCpdGVzdOKAqQo=",
+ "dGVzdOKBoHRlc3TigKsK",
+ "4oGmdGVzdOKBpwo=",
+ "4bmwzLrMusyVb82eIMy3acyyzKzNh8yqzZluzJ3Ml82VdsyfzJzMmMymzZ9vzLbMmcywzKBrw6jNmsyuzLrMqsy5zLHMpCDMlnTMnc2VzLPMo8y7zKrNnmjMvM2TzLLMpsyzzJjMsmXNh8yjzLDMpsyszY4gzKLMvMy7zLHMmGjNms2OzZnMnMyjzLLNhWnMpsyyzKPMsMykdsy7zY1lzLrMrcyzzKrMsC1tzKJpzYVuzJbMusyezLLMr8ywZMy1zLzMn82ZzKnMvMyYzLMgzJ7MpcyxzLPMrXLMm8yXzJhlzZlwzaByzLzMnsy7zK3Ml2XMusygzKPNn3PMmM2HzLPNjcydzYllzYnMpcyvzJ7Mss2azKzNnMe5zKzNjs2OzJ/Mls2HzKR0zY3MrMykzZPMvMytzZjNhWnMqsyxbs2gZ8y0zYkgzY/Nic2FY8yszJ9ozaFhzKvMu8yvzZhvzKvMn8yWzY3MmcydzYlzzJfMpsyyLsyozLnNiMyjCg==",
+ "zKHNk8yezYVJzJfMmMymzZ1uzYfNh82ZdsyuzKtva8yyzKvMmc2IacyWzZnMrcy5zKDMnm7Mocy7zK7Mo8y6Z8yyzYjNmcytzZnMrM2OIMywdM2UzKZozJ7MsmXMosykIM2NzKzMss2WZsy0zJjNlcyjw6jNluG6ucylzKlszZbNlM2aac2TzZrMps2gbs2WzY3Ml82TzLPMrmfNjSDMqG/NmsyqzaFmzJjMo8ysIMyWzJjNlsyfzZnMrmPSic2UzKvNls2TzYfNls2FaMy1zKTMo82azZTDocyXzLzNlc2Fb8y8zKPMpXPMsc2IzLrMlsymzLvNoi7Mm8yWzJ7MoMyrzLAK",
+ "zJfMus2WzLnMr82T4bmuzKTNjcylzYfNiGjMssyBZc2PzZPMvMyXzJnMvMyjzZQgzYfMnMyxzKDNk82NzYVOzZXNoGXMl8yxesyYzJ3MnMy6zZlwzKTMusy5zY3Mr82aZcygzLvMoM2ccsyozKTNjcy6zJbNlMyWzJZkzKDMn8ytzKzMnc2facymzZbMqc2TzZTMpGHMoMyXzKzNicyZbs2azZwgzLvMnsywzZrNhWjMtc2JacyzzJ52zKLNh+G4mc2OzZ8t0onMrcypzLzNlG3MpMytzKtpzZXNh8ydzKZuzJfNmeG4jcyfIMyvzLLNlc2ex6vMn8yvzLDMss2ZzLvMnWYgzKrMsMywzJfMlsytzJjNmGPMps2NzLLMns2NzKnMmeG4pc2aYcyuzY7Mn8yZzZzGocypzLnNjnPMpC7MncydINKJWsyhzJbMnM2WzLDMo82JzJxhzZbMsM2ZzKzNoWzMssyrzLPNjcypZ8yhzJ/MvMyxzZrMnsyszYVvzJfNnC7Mnwo=",
+ "zKZIzKzMpMyXzKTNnWXNnCDMnMylzJ3Mu82NzJ/MgXfMlWjMlsyvzZNvzJ3NmcyWzY7MscyuINKJzLrMmcyezJ/NiFfMt8y8zK1hzLrMqs2NxK/NiM2VzK3NmcyvzJx0zLbMvMyuc8yYzZnNlsyVIMygzKvMoELMu82NzZnNicyzzYVlzLVozLXMrM2HzKvNmWnMuc2TzLPMs8yuzY7Mq8yVbs2fZMy0zKrMnMyWIMywzYnMqc2HzZnMss2ezYVUzZbMvM2TzKrNomjNj82TzK7Mu2XMrMydzJ/NhSDMpMy5zJ1XzZnMnsydzZTNh82dzYVhzY/Nk82UzLnMvMyjbMy0zZTMsMykzJ/NlOG4vcyrLs2VCg==",
+ "WsyuzJ7MoM2ZzZTNheG4gMyXzJ7NiMy7zJfhuLbNmc2OzK/MucyezZNHzLtPzK3Ml8yuCg==",
+ "y5nJkG5i4bSJbMmQIMmQdcaDyZDJryDHncm5b2xvcCDKh8edIMedyblvccmQbCDKh24gyod1bnDhtIlw4bSJyZR14bSJIMm5b2TJr8edyocgcG/Jr3Nu4bSJx50gb3AgcMedcyAnyofhtIlsx50gxoN14bSJyZRz4bSJZOG0iXDJkCDJuW7Kh8edyofJlMedc3VvyZQgJ8qHx53Jr8mQIMqH4bSJcyDJuW9sb3Agya9uc2ThtIkgya/Hncm5b8ulCg==",
+ "MDDLmcaWJC0K",
+ "77y0772I772FIO+9ke+9le+9ie+9g++9iyDvvYLvvZLvvY/vvZfvvY4g772G772P772YIO+9iu+9le+9je+9kO+9kyDvvY/vvZbvvYXvvZIg772U772I772FIO+9jO+9ge+9mu+9mSDvvYTvvY/vvYcK",
+ "8J2Qk/CdkKHwnZCeIPCdkKrwnZCu8J2QovCdkJzwnZCkIPCdkJvwnZCr8J2QqPCdkLDwnZCnIPCdkJ/wnZCo8J2QsSDwnZCj8J2QrvCdkKbwnZCp8J2QrCDwnZCo8J2Qr/CdkJ7wnZCrIPCdkK3wnZCh8J2QniDwnZCl8J2QmvCdkLPwnZCyIPCdkJ3wnZCo8J2QoAo=",
+ "8J2Vv/Cdlo3wnZaKIPCdlpbwnZaa8J2WjvCdlojwnZaQIPCdlofwnZaX8J2WlPCdlpzwnZaTIPCdlovwnZaU8J2WnSDwnZaP8J2WmvCdlpLwnZaV8J2WmCDwnZaU8J2Wm/CdlorwnZaXIPCdlpnwnZaN8J2WiiDwnZaR8J2WhvCdlp/wnZaeIPCdlonwnZaU8J2WjAo=",
+ "8J2Ru/CdkonwnZKGIPCdkpLwnZKW8J2SivCdkoTwnZKMIPCdkoPwnZKT8J2SkPCdkpjwnZKPIPCdkofwnZKQ8J2SmSDwnZKL8J2SlvCdko7wnZKR8J2SlCDwnZKQ8J2Sl/CdkobwnZKTIPCdkpXwnZKJ8J2ShiDwnZKN8J2SgvCdkpvwnZKaIPCdkoXwnZKQ8J2SiAo=",
+ "8J2To/Cdk7HwnZOuIPCdk7rwnZO+8J2TsvCdk6zwnZO0IPCdk6vwnZO78J2TuPCdlIDwnZO3IPCdk6/wnZO48J2UgSDwnZOz8J2TvvCdk7bwnZO58J2TvCDwnZO48J2Tv/Cdk67wnZO7IPCdk73wnZOx8J2TriDwnZO18J2TqvCdlIPwnZSCIPCdk63wnZO48J2TsAo=",
+ "8J2Vi/CdlZnwnZWWIPCdlaLwnZWm8J2VmvCdlZTwnZWcIPCdlZPwnZWj8J2VoPCdlajwnZWfIPCdlZfwnZWg8J2VqSDwnZWb8J2VpvCdlZ7wnZWh8J2VpCDwnZWg8J2Vp/CdlZbwnZWjIPCdlaXwnZWZ8J2VliDwnZWd8J2VkvCdlavwnZWqIPCdlZXwnZWg8J2VmAo=",
+ "8J2ag/CdmpHwnZqOIPCdmprwnZqe8J2akvCdmozwnZqUIPCdmovwnZqb8J2amPCdmqDwnZqXIPCdmo/wnZqY8J2aoSDwnZqT8J2anvCdmpbwnZqZ8J2anCDwnZqY8J2an/Cdmo7wnZqbIPCdmp3wnZqR8J2ajiDwnZqV8J2aivCdmqPwnZqiIPCdmo3wnZqY8J2akAo=",
+ "4pKv4pKj4pKgIOKSrOKSsOKSpOKSnuKSpiDikp3ikq3ikqrikrLikqkg4pKh4pKq4pKzIOKSpeKSsOKSqOKSq+KSriDikqrikrHikqDikq0g4pKv4pKj4pKgIOKSp+KSnOKSteKStCDikp/ikqrikqIK",
+ "PHNjcmlwdD5hbGVydCgxMjMpPC9zY3JpcHQ+Cg==",
+ "Jmx0O3NjcmlwdCZndDthbGVydCgmIzM5OzEyMyYjMzk7KTsmbHQ7L3NjcmlwdCZndDsK",
+ "PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEyMykgLz4K",
+ "PHN2Zz48c2NyaXB0PjEyMzwxPmFsZXJ0KDEyMyk8L3NjcmlwdD4K",
+ "Ij48c2NyaXB0PmFsZXJ0KDEyMyk8L3NjcmlwdD4K",
+ "Jz48c2NyaXB0PmFsZXJ0KDEyMyk8L3NjcmlwdD4K",
+ "PjxzY3JpcHQ+YWxlcnQoMTIzKTwvc2NyaXB0Pgo=",
+ "PC9zY3JpcHQ+PHNjcmlwdD5hbGVydCgxMjMpPC9zY3JpcHQ+Cg==",
+ "PCAvIHNjcmlwdCA+PCBzY3JpcHQgPmFsZXJ0KDEyMyk8IC8gc2NyaXB0ID4K",
+ "b25mb2N1cz1KYVZhU0NyaXB0OmFsZXJ0KDEyMykgYXV0b2ZvY3VzCg==",
+ "IiBvbmZvY3VzPUphVmFTQ3JpcHQ6YWxlcnQoMTIzKSBhdXRvZm9jdXMK",
+ "JyBvbmZvY3VzPUphVmFTQ3JpcHQ6YWxlcnQoMTIzKSBhdXRvZm9jdXMK",
+ "77ycc2NyaXB077yeYWxlcnQoMTIzKe+8nC9zY3JpcHTvvJ4K",
+ "PHNjPHNjcmlwdD5yaXB0PmFsZXJ0KDEyMyk8L3NjPC9zY3JpcHQ+cmlwdD4K",
+ "LS0+PHNjcmlwdD5hbGVydCgxMjMpPC9zY3JpcHQ+Cg==",
+ "IjthbGVydCgxMjMpO3Q9Igo=",
+ "JzthbGVydCgxMjMpO3Q9Jwo=",
+ "SmF2YVNDcmlwdDphbGVydCgxMjMpCg==",
+ "O2FsZXJ0KDEyMyk7Cg==",
+ "c3JjPUphVmFTQ3JpcHQ6cHJvbXB0KDEzMikK",
+ "Ij48c2NyaXB0PmFsZXJ0KDEyMyk7PC9zY3JpcHQgeD0iCg==",
+ "Jz48c2NyaXB0PmFsZXJ0KDEyMyk7PC9zY3JpcHQgeD0nCg==",
+ "PjxzY3JpcHQ+YWxlcnQoMTIzKTs8L3NjcmlwdCB4PQo=",
+ "IiBhdXRvZm9jdXMgb25rZXl1cD0iamF2YXNjcmlwdDphbGVydCgxMjMpCg==",
+ "JyBhdXRvZm9jdXMgb25rZXl1cD0namF2YXNjcmlwdDphbGVydCgxMjMpCg==",
+ "PHNjcmlwdHgyMHR5cGU9InRleHQvamF2YXNjcmlwdCI+amF2YXNjcmlwdDphbGVydCgxKTs8L3NjcmlwdD4K",
+ "PHNjcmlwdHgzRXR5cGU9InRleHQvamF2YXNjcmlwdCI+amF2YXNjcmlwdDphbGVydCgxKTs8L3NjcmlwdD4K",
+ "PHNjcmlwdHgwRHR5cGU9InRleHQvamF2YXNjcmlwdCI+amF2YXNjcmlwdDphbGVydCgxKTs8L3NjcmlwdD4K",
+ "PHNjcmlwdHgwOXR5cGU9InRleHQvamF2YXNjcmlwdCI+amF2YXNjcmlwdDphbGVydCgxKTs8L3NjcmlwdD4K",
+ "PHNjcmlwdHgwQ3R5cGU9InRleHQvamF2YXNjcmlwdCI+amF2YXNjcmlwdDphbGVydCgxKTs8L3NjcmlwdD4K",
+ "PHNjcmlwdHgyRnR5cGU9InRleHQvamF2YXNjcmlwdCI+amF2YXNjcmlwdDphbGVydCgxKTs8L3NjcmlwdD4K",
+ "PHNjcmlwdHgwQXR5cGU9InRleHQvamF2YXNjcmlwdCI+amF2YXNjcmlwdDphbGVydCgxKTs8L3NjcmlwdD4K",
+ "J2AiPjx4M0NzY3JpcHQ+amF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "J2AiPjx4MDBzY3JpcHQ+amF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "QUJDPGRpdiBzdHlsZT0ieHgzQWV4cHJlc3Npb24oamF2YXNjcmlwdDphbGVydCgxKSI+REVGCg==",
+ "QUJDPGRpdiBzdHlsZT0ieDpleHByZXNzaW9ueDVDKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDpleHByZXNzaW9ueDAwKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDpleHB4MDByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDpleHB4NUNyZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4MEFleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4MDlleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTN4ODB4ODBleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTJ4ODB4ODRleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4QzJ4QTBleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTJ4ODB4ODBleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTJ4ODB4OEFleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4MERleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4MENleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTJ4ODB4ODdleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RUZ4QkJ4QkZleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4MjBleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTJ4ODB4ODhleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4MDBleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTJ4ODB4OEJleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTJ4ODB4ODZleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTJ4ODB4ODVleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTJ4ODB4ODJleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4MEJleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTJ4ODB4ODFleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTJ4ODB4ODNleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "QUJDPGRpdiBzdHlsZT0ieDp4RTJ4ODB4ODlleHByZXNzaW9uKGphdmFzY3JpcHQ6YWxlcnQoMSkiPkRFRgo=",
+ "PGEgaHJlZj0ieDBCamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDBGamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEMyeEEwamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDA1amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUxeEEweDhFamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDE4amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDExamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweDg4amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweDg5amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweDgwamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDE3amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDAzamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDBFamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDFBamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDAwamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDEwamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweDgyamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDIwamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDEzamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDA5amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweDhBamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDE0amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDE5amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweEFGamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDFGamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweDgxamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDFEamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweDg3amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDA3amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUxeDlBeDgwamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweDgzamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDA0amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDAxamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDA4amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweDg0amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweDg2amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUzeDgweDgwamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDEyamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDBEamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDBBamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDBDamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDE1amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweEE4amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDE2amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDAyamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDFCamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDA2amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweEE5amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgweDg1amF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDFFamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieEUyeDgxeDlGamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0ieDFDamF2YXNjcmlwdDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0iamF2YXNjcmlwdHgwMDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0iamF2YXNjcmlwdHgzQTpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0iamF2YXNjcmlwdHgwOTpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0iamF2YXNjcmlwdHgwRDpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "PGEgaHJlZj0iamF2YXNjcmlwdHgwQTpqYXZhc2NyaXB0OmFsZXJ0KDEpIiBpZD0iZnV6emVsZW1lbnQxIj50ZXN0PC9hPgo=",
+ "YCInPjxpbWcgc3JjPXh4eDp4IHgwQW9uZXJyb3I9amF2YXNjcmlwdDphbGVydCgxKT4K",
+ "YCInPjxpbWcgc3JjPXh4eDp4IHgyMm9uZXJyb3I9amF2YXNjcmlwdDphbGVydCgxKT4K",
+ "YCInPjxpbWcgc3JjPXh4eDp4IHgwQm9uZXJyb3I9amF2YXNjcmlwdDphbGVydCgxKT4K",
+ "YCInPjxpbWcgc3JjPXh4eDp4IHgwRG9uZXJyb3I9amF2YXNjcmlwdDphbGVydCgxKT4K",
+ "YCInPjxpbWcgc3JjPXh4eDp4IHgyRm9uZXJyb3I9amF2YXNjcmlwdDphbGVydCgxKT4K",
+ "YCInPjxpbWcgc3JjPXh4eDp4IHgwOW9uZXJyb3I9amF2YXNjcmlwdDphbGVydCgxKT4K",
+ "YCInPjxpbWcgc3JjPXh4eDp4IHgwQ29uZXJyb3I9amF2YXNjcmlwdDphbGVydCgxKT4K",
+ "YCInPjxpbWcgc3JjPXh4eDp4IHgwMG9uZXJyb3I9amF2YXNjcmlwdDphbGVydCgxKT4K",
+ "YCInPjxpbWcgc3JjPXh4eDp4IHgyN29uZXJyb3I9amF2YXNjcmlwdDphbGVydCgxKT4K",
+ "YCInPjxpbWcgc3JjPXh4eDp4IHgyMG9uZXJyb3I9amF2YXNjcmlwdDphbGVydCgxKT4K",
+ "ImAnPjxzY3JpcHQ+eDNCamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eDBEamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEVGeEJCeEJGamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweDgxamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweDg0amF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUzeDgweDgwamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eDA5amF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweDg5amF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweDg1amF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweDg4amF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eDAwamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweEE4amF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweDhBamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUxeDlBeDgwamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eDBDamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eDJCamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEYweDkweDk2eDlBamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+LWphdmFzY3JpcHQ6YWxlcnQoMSk8L3NjcmlwdD4K",
+ "ImAnPjxzY3JpcHQ+eDBBamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweEFGamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eDdFamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweDg3amF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgxeDlGamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweEE5amF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEMyeDg1amF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEVGeEJGeEFFamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweDgzamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweDhCamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEVGeEJGeEJFamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweDgwamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eDIxamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweDgyamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUyeDgweDg2amF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEUxeEEweDhFamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eDBCamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eDIwamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "ImAnPjxzY3JpcHQ+eEMyeEEwamF2YXNjcmlwdDphbGVydCgxKTwvc2NyaXB0Pgo=",
+ "PGltZyB4MDBzcmM9eCBvbmVycm9yPSJhbGVydCgxKSI+Cg==",
+ "PGltZyB4NDdzcmM9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyB4MTFzcmM9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyB4MTJzcmM9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZ3g0N3NyYz14IG9uZXJyb3I9ImphdmFzY3JpcHQ6YWxlcnQoMSkiPgo=",
+ "PGltZ3gxMHNyYz14IG9uZXJyb3I9ImphdmFzY3JpcHQ6YWxlcnQoMSkiPgo=",
+ "PGltZ3gxM3NyYz14IG9uZXJyb3I9ImphdmFzY3JpcHQ6YWxlcnQoMSkiPgo=",
+ "PGltZ3gzMnNyYz14IG9uZXJyb3I9ImphdmFzY3JpcHQ6YWxlcnQoMSkiPgo=",
+ "PGltZ3g0N3NyYz14IG9uZXJyb3I9ImphdmFzY3JpcHQ6YWxlcnQoMSkiPgo=",
+ "PGltZ3gxMXNyYz14IG9uZXJyb3I9ImphdmFzY3JpcHQ6YWxlcnQoMSkiPgo=",
+ "PGltZyB4NDdzcmM9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyB4MzRzcmM9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyB4MzlzcmM9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyB4MDBzcmM9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmN4MDk9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmN4MTA9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmN4MTM9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmN4MzI9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmN4MTI9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmN4MTE9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmN4MDA9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmN4NDc9eCBvbmVycm9yPSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmM9eHgwOW9uZXJyb3I9ImphdmFzY3JpcHQ6YWxlcnQoMSkiPgo=",
+ "PGltZyBzcmM9eHgxMG9uZXJyb3I9ImphdmFzY3JpcHQ6YWxlcnQoMSkiPgo=",
+ "PGltZyBzcmM9eHgxMW9uZXJyb3I9ImphdmFzY3JpcHQ6YWxlcnQoMSkiPgo=",
+ "PGltZyBzcmM9eHgxMm9uZXJyb3I9ImphdmFzY3JpcHQ6YWxlcnQoMSkiPgo=",
+ "PGltZyBzcmM9eHgxM29uZXJyb3I9ImphdmFzY3JpcHQ6YWxlcnQoMSkiPgo=",
+ "PGltZ1thXVtiXVtjXXNyY1tkXT14W2Vdb25lcnJvcj1bZl0iYWxlcnQoMSkiPgo=",
+ "PGltZyBzcmM9eCBvbmVycm9yPXgwOSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmM9eCBvbmVycm9yPXgxMCJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmM9eCBvbmVycm9yPXgxMSJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmM9eCBvbmVycm9yPXgxMiJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmM9eCBvbmVycm9yPXgzMiJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGltZyBzcmM9eCBvbmVycm9yPXgwMCJqYXZhc2NyaXB0OmFsZXJ0KDEpIj4K",
+ "PGEgaHJlZj1qYXZhJiMxJiMyJiMzJiM0JiM1JiM2JiM3JiM4JiMxMSYjMTJzY3JpcHQ6amF2YXNjcmlwdDphbGVydCgxKT5YWFg8L2E+Cg==",
+ "PGltZyBzcmM9InhgIGA8c2NyaXB0PmphdmFzY3JpcHQ6YWxlcnQoMSk8L3NjcmlwdD4iYCBgPgo=",
+ "PGltZyBzcmMgb25lcnJvciAvIiAnIj0gYWx0PWphdmFzY3JpcHQ6YWxlcnQoMSkvLyI+Cg==",
+ "PHRpdGxlIG9ucHJvcGVydHljaGFuZ2U9amF2YXNjcmlwdDphbGVydCgxKT48L3RpdGxlPjx0aXRsZSB0aXRsZT0+Cg==",
+ "PGEgaHJlZj1odHRwOi8vZm9vLmJhci8jeD1geT48L2E+PGltZyBhbHQ9ImA+PGltZyBzcmM9eDp4IG9uZXJyb3I9amF2YXNjcmlwdDphbGVydCgxKT48L2E+Ij4K",
+ "PCEtLVtpZl0+PHNjcmlwdD5qYXZhc2NyaXB0OmFsZXJ0KDEpPC9zY3JpcHQgLS0+Cg==",
+ "PCEtLVtpZjxpbWcgc3JjPXggb25lcnJvcj1qYXZhc2NyaXB0OmFsZXJ0KDEpLy9dPiAtLT4K",
+ "PHNjcmlwdCBzcmM9Ii8lKGpzY3JpcHQpcyI+PC9zY3JpcHQ+Cg==",
+ "PHNjcmlwdCBzcmM9IlwlKGpzY3JpcHQpcyI+PC9zY3JpcHQ+Cg==",
+ "PElNRyAiIiI+PFNDUklQVD5hbGVydCgiWFNTIik8L1NDUklQVD4iPgo=",
+ "PElNRyBTUkM9amF2YXNjcmlwdDphbGVydChTdHJpbmcuZnJvbUNoYXJDb2RlKDg4LDgzLDgzKSk+Cg==",
+ "PElNRyBTUkM9IyBvbm1vdXNlb3Zlcj0iYWxlcnQoJ3h4cycpIj4K",
+ "PElNRyBTUkM9IG9ubW91c2VvdmVyPSJhbGVydCgneHhzJykiPgo=",
+ "PElNRyBvbm1vdXNlb3Zlcj0iYWxlcnQoJ3h4cycpIj4K",
+ "PElNRyBTUkM9JiMxMDY7JiM5NzsmIzExODsmIzk3OyYjMTE1OyYjOTk7JiMxMTQ7JiMxMDU7JiMxMTI7JiMxMTY7JiM1ODsmIzk3OyYjMTA4OyYjMTAxOyYjMTE0OyYjMTE2OyYjNDA7JiMzOTsmIzg4OyYjODM7JiM4MzsmIzM5OyYjNDE7Pgo=",
+ "PElNRyBTUkM9JiMwMDAwMTA2JiMwMDAwMDk3JiMwMDAwMTE4JiMwMDAwMDk3JiMwMDAwMTE1JiMwMDAwMDk5JiMwMDAwMTE0JiMwMDAwMTA1JiMwMDAwMTEyJiMwMDAwMTE2JiMwMDAwMDU4JiMwMDAwMDk3JiMwMDAwMTA4JiMwMDAwMTAxJiMwMDAwMTE0JiMwMDAwMTE2JiMwMDAwMDQwJiMwMDAwMDM5JiMwMDAwMDg4JiMwMDAwMDgzJiMwMDAwMDgzJiMwMDAwMDM5JiMwMDAwMDQxPgo=",
+ "PElNRyBTUkM9JiN4NkEmI3g2MSYjeDc2JiN4NjEmI3g3MyYjeDYzJiN4NzImI3g2OSYjeDcwJiN4NzQmI3gzQSYjeDYxJiN4NkMmI3g2NSYjeDcyJiN4NzQmI3gyOCYjeDI3JiN4NTgmI3g1MyYjeDUzJiN4MjcmI3gyOT4K",
+ "PElNRyBTUkM9ImphdiBhc2NyaXB0OmFsZXJ0KCdYU1MnKTsiPgo=",
+ "PElNRyBTUkM9ImphdiYjeDA5O2FzY3JpcHQ6YWxlcnQoJ1hTUycpOyI+Cg==",
+ "PElNRyBTUkM9ImphdiYjeDBBO2FzY3JpcHQ6YWxlcnQoJ1hTUycpOyI+Cg==",
+ "PElNRyBTUkM9ImphdiYjeDBEO2FzY3JpcHQ6YWxlcnQoJ1hTUycpOyI+Cg==",
+ "cGVybCAtZSAncHJpbnQgIjxJTUcgU1JDPWphdmEwc2NyaXB0OmFsZXJ0KCJYU1MiKT4iOycgPiBvdXQK",
+ "PElNRyBTUkM9IiAmIzE0OyBqYXZhc2NyaXB0OmFsZXJ0KCdYU1MnKTsiPgo=",
+ "PFNDUklQVC9YU1MgU1JDPSJodHRwOi8vaGEuY2tlcnMub3JnL3hzcy5qcyI+PC9TQ1JJUFQ+Cg==",
+ "PEJPRFkgb25sb2FkISMkJSYoKSp+Ky1fLiw6Oz9AWy98XV5gPWFsZXJ0KCJYU1MiKT4K",
+ "PFNDUklQVC9TUkM9Imh0dHA6Ly9oYS5ja2Vycy5vcmcveHNzLmpzIj48L1NDUklQVD4K",
+ "PDxTQ1JJUFQ+YWxlcnQoIlhTUyIpOy8vPDwvU0NSSVBUPgo=",
+ "PFNDUklQVCBTUkM9aHR0cDovL2hhLmNrZXJzLm9yZy94c3MuanM/PCBCID4K",
+ "PFNDUklQVCBTUkM9Ly9oYS5ja2Vycy5vcmcvLmo+Cg==",
+ "PElNRyBTUkM9ImphdmFzY3JpcHQ6YWxlcnQoJ1hTUycpIgo=",
+ "PGlmcmFtZSBzcmM9aHR0cDovL2hhLmNrZXJzLm9yZy9zY3JpcHRsZXQuaHRtbCA8Cg==",
+ "IjthbGVydCgnWFNTJyk7Ly8K",
+ "PHBsYWludGV4dD4K",
+ "PC90ZXh0YXJlYT48c2NyaXB0PmFsZXJ0KDEyMyk8L3NjcmlwdD4=",
+ "MTtEUk9QIFRBQkxFIHVzZXJzCg==",
+ "MSc7IERST1AgVEFCTEUgdXNlcnMtLSAxCg==",
+ "JyBPUiAxPTEgLS0gMQo=",
+ "JyBPUiAnMSc9JzEK",
+ "LQo=",
+ "LS0K",
+ "LS12ZXJzaW9uCg==",
+ "LS1oZWxwCg==",
+ "JFVTRVIK",
+ "L2Rldi9udWxsOyB0b3VjaCAvdG1wL2JsbnMuZmFpbCA7IGVjaG8K",
+ "YHRvdWNoIC90bXAvYmxucy5mYWlsYAo=",
+ "JCh0b3VjaCAvdG1wL2JsbnMuZmFpbCkK",
+ "QHtbc3lzdGVtICJ0b3VjaCAvdG1wL2JsbnMuZmFpbCJdfQo=",
+ "ZXZhbCgicHV0cyAnaGVsbG8gd29ybGQnIikK",
+ "U3lzdGVtKCJscyAtYWwgLyIpCg==",
+ "YGxzIC1hbCAvYAo=",
+ "S2VybmVsLmV4ZWMoImxzIC1hbCAvIikK",
+ "S2VybmVsLmV4aXQoMSkK",
+ "JXgoJ2xzIC1hbCAvJykK",
+ "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PjwhRE9DVFlQRSBmb28gWyA8IUVMRU1FTlQgZm9vIEFOWSA+PCFFTlRJVFkgeHhlIFNZU1RFTSAiZmlsZTovLy9ldGMvcGFzc3dkIiA+XT48Zm9vPiZ4eGU7PC9mb28+Cg==",
+ "JEhPTUUK",
+ "JEVOVnsnSE9NRSd9Cg==",
+ "JWQK",
+ "JXMK",
+ "ezB9",
+ "JSouKnMK",
+ "Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3Bhc3N3ZCUwMAo=",
+ "Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL2hvc3RzCg==",
+ "KCkgeyAwOyB9OyB0b3VjaCAvdG1wL2JsbnMuc2hlbGxzaG9jazEuZmFpbDsK",
+ "KCkgeyBfOyB9ID5fWyQoJCgpKV0geyB0b3VjaCAvdG1wL2JsbnMuc2hlbGxzaG9jazIuZmFpbDsgfQo=",
+ "KysrQVRIMA==",
+ "Q09OCg==",
+ "UFJOCg==",
+ "QVVYCg==",
+ "Q0xPQ0skCg==",
+ "TlVMCg==",
+ "QToK",
+ "Wlo6Cg==",
+ "Q09NMQo=",
+ "TFBUMQo=",
+ "TFBUMgo=",
+ "TFBUMwo=",
+ "Q09NMgo=",
+ "Q09NMwo=",
+ "Q09NNAo=",
+ "U2N1bnRob3JwZSBHZW5lcmFsIEhvc3BpdGFsCg==",
+ "UGVuaXN0b25lIENvbW11bml0eSBDaHVyY2gK",
+ "TGlnaHR3YXRlciBDb3VudHJ5IFBhcmsK",
+ "SmltbXkgQ2xpdGhlcm9lCg==",
+ "SG9ybmltYW4gTXVzZXVtCg==",
+ "c2hpdGFrZSBtdXNocm9vbXMK",
+ "Um9tYW5zSW5TdXNzZXguY28udWsK",
+ "aHR0cDovL3d3dy5jdW0ucWMuY2EvCg==",
+ "Q3JhaWcgQ29ja2J1cm4sIFNvZnR3YXJlIFNwZWNpYWxpc3QK",
+ "TGluZGEgQ2FsbGFoYW4K",
+ "RHIuIEhlcm1hbiBJLiBMaWJzaGl0ego=",
+ "bWFnbmEgY3VtIGxhdWRlCg==",
+ "U3VwZXIgQm93bCBYWFgK",
+ "bWVkaWV2YWwgZXJlY3Rpb24gb2YgcGFyYXBldHMK",
+ "ZXZhbHVhdGUK",
+ "bW9jaGEK",
+ "ZXhwcmVzc2lvbgo=",
+ "QXJzZW5hbCBjYW5hbAo=",
+ "Y2xhc3NpYwo=",
+ "VHlzb24gR2F5Cg==",
+ "SWYgeW91J3JlIHJlYWRpbmcgdGhpcywgeW91J3ZlIGJlZW4gaW4gYSBjb21hIGZvciBhbG1vc3QgMjAgeWVhcnMgbm93LiBXZSdyZSB0cnlpbmcgYSBuZXcgdGVjaG5pcXVlLiBXZSBkb24ndCBrbm93IHdoZXJlIHRoaXMgbWVzc2FnZSB3aWxsIGVuZCB1cCBpbiB5b3VyIGRyZWFtLCBidXQgd2UgaG9wZSBpdCB3b3Jrcy4gUGxlYXNlIHdha2UgdXAsIHdlIG1pc3MgeW91Lgo=",
+ "Um9zZXMgYXJlIBtbMDszMW1yZWQbWzBtLCB2aW9sZXRzIGFyZSAbWzA7MzRtYmx1ZS4gSG9wZSB5b3UgZW5qb3kgdGVybWluYWwgaHVlCg==",
+ "QnV0IG5vdy4uLhtbMjBDZm9yIG15IGdyZWF0ZXN0IHRyaWNrLi4uG1s4bQo=",
+ "VGhlIHF1aWMICAgICAhrIGJyb3duIGZvBwcHBwcHBwcHBwd4Li4uIFtCZWVlZXBdCg==",
+ "UG93ZXLZhNmP2YTZj9i12ZHYqNmP2YTZj9mE2LXZkdio2Y/Ysdix2Ysg4KWjIOClo2gg4KWjIOClo+WGlwo="
+ ]
diff --git a/resources/views/accounts/create.twig b/resources/views/accounts/create.twig
index e1ccc79fd7..07e55d4f55 100644
--- a/resources/views/accounts/create.twig
+++ b/resources/views/accounts/create.twig
@@ -41,7 +41,7 @@
{{ ExpandedForm.balance('openingBalance') }}
{{ ExpandedForm.date('openingBalanceDate', phpdate('Y-m-d')) }}
- {{ ExpandedForm.select('accountRole', Config.get('firefly.accountRoles'),null,{'helpText' : 'asset_account_role_help'|_}) }}
+ {{ ExpandedForm.select('accountRole', roles,null,{'helpText' : 'asset_account_role_help'|_}) }}
{{ ExpandedForm.balance('virtualBalance') }}
{% endif %}
@@ -67,3 +67,13 @@
{% endblock %}
+{% block scripts %}
+
+
+
+{% endblock %}
+
+{% block styles %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/resources/views/accounts/edit.twig b/resources/views/accounts/edit.twig
index d849fa50d4..29cd807ac2 100644
--- a/resources/views/accounts/edit.twig
+++ b/resources/views/accounts/edit.twig
@@ -38,7 +38,7 @@
{% if account.accounttype.type == 'Default account' or account.accounttype.type == 'Asset account' %}
{{ ExpandedForm.balance('openingBalance',null, {'currency' : openingBalance ? openingBalance.transactionCurrency : null}) }}
{{ ExpandedForm.date('openingBalanceDate') }}
- {{ ExpandedForm.select('accountRole',Config.get('firefly.accountRoles')) }}
+ {{ ExpandedForm.select('accountRole', roles) }}
{{ ExpandedForm.balance('virtualBalance',null) }}
{% endif %}
@@ -77,3 +77,13 @@
{{ Form.close|raw }}
{% endblock %}
+{% block scripts %}
+
+
+
+{% endblock %}
+
+{% block styles %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/resources/views/admin/users/index.twig b/resources/views/admin/users/index.twig
index dacf2a65bf..a70b7cba77 100644
--- a/resources/views/admin/users/index.twig
+++ b/resources/views/admin/users/index.twig
@@ -17,6 +17,7 @@
- {{ 'add_rule_trigger'|_ }}
+
{{ 'test_rule_triggers'|_ }}
+ + + {{ ('clone_'~journal.transactionType.type|lower)|_ }} + +
+ {% endif %}