Code cleanup that (hopefully) matches style CI

This commit is contained in:
James Cole 2020-03-17 15:01:00 +01:00
parent bd2f064eeb
commit 2b6c3fd743
No known key found for this signature in database
GPG Key ID: C16961E655E74B5E
110 changed files with 2060 additions and 1660 deletions

View File

@ -49,7 +49,7 @@ class APIEventHandler
{ {
/** @var UserRepositoryInterface $repository */ /** @var UserRepositoryInterface $repository */
$repository = app(UserRepositoryInterface::class); $repository = app(UserRepositoryInterface::class);
$user = $repository->findNull((int)$event->userId); $user = $repository->findNull((int) $event->userId);
if (null !== $user) { if (null !== $user) {
$email = $user->email; $email = $user->email;
$ipAddress = Request::ip(); $ipAddress = Request::ip();

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Handlers\Events; namespace FireflyIII\Handlers\Events;
use FireflyIII\Events\UpdatedTransactionGroup; use FireflyIII\Events\UpdatedTransactionGroup;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournal;
use FireflyIII\TransactionRules\Engine\RuleEngine; use FireflyIII\TransactionRules\Engine\RuleEngine;

View File

@ -25,9 +25,7 @@ declare(strict_types=1);
namespace FireflyIII\Handlers\Events; namespace FireflyIII\Handlers\Events;
use Carbon\Carbon;
use FireflyIII\Events\RequestedVersionCheckStatus; use FireflyIII\Events\RequestedVersionCheckStatus;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Update\UpdateTrait; use FireflyIII\Helpers\Update\UpdateTrait;
use FireflyIII\Models\Configuration; use FireflyIII\Models\Configuration;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
@ -53,9 +51,10 @@ class VersionCheckEventHandler
// should not check for updates: // should not check for updates:
$permission = app('fireflyconfig')->get('permission_update_check', -1); $permission = app('fireflyconfig')->get('permission_update_check', -1);
$value = (int)$permission->data; $value = (int) $permission->data;
if (1 !== $value) { if (1 !== $value) {
Log::info('Update check is not enabled.'); Log::info('Update check is not enabled.');
return; return;
} }
@ -65,6 +64,7 @@ class VersionCheckEventHandler
$user = $event->user; $user = $event->user;
if (!$repository->hasRole($user, 'owner')) { if (!$repository->hasRole($user, 'owner')) {
Log::debug('User is not admin, done.'); Log::debug('User is not admin, done.');
return; return;
} }
@ -75,11 +75,12 @@ class VersionCheckEventHandler
Log::debug(sprintf('Last check time is %d, current time is %d, difference is %d', $lastCheckTime->data, $now, $diff)); Log::debug(sprintf('Last check time is %d, current time is %d, difference is %d', $lastCheckTime->data, $now, $diff));
if ($diff < 604800) { if ($diff < 604800) {
Log::debug(sprintf('Checked for updates less than a week ago (on %s).', date('Y-m-d H:i:s', $lastCheckTime->data))); Log::debug(sprintf('Checked for updates less than a week ago (on %s).', date('Y-m-d H:i:s', $lastCheckTime->data)));
return; return;
} }
// last check time was more than a week ago. // last check time was more than a week ago.
Log::debug('Have not checked for a new version in a week!'); Log::debug('Have not checked for a new version in a week!');
$release = $this->getLatestRelease(); $release = $this->getLatestRelease();
session()->flash($release['level'], $release['message']); session()->flash($release['level'], $release['message']);
app('fireflyconfig')->set('last_update_check', time()); app('fireflyconfig')->set('last_update_check', time());

View File

@ -26,7 +26,9 @@ use Crypt;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Attachment; use FireflyIII\Models\Attachment;
use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Contracts\Encryption\EncryptException;
use Illuminate\Contracts\Filesystem\FileNotFoundException; use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Contracts\Filesystem\Filesystem;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
@ -50,18 +52,19 @@ class AttachmentHelper implements AttachmentHelperInterface
/** @var int Max upload size. */ /** @var int Max upload size. */
protected $maxUploadSize = 0; protected $maxUploadSize = 0;
/** @var \Illuminate\Contracts\Filesystem\Filesystem The disk where attachments are stored. */ /** @var Filesystem The disk where attachments are stored. */
protected $uploadDisk; protected $uploadDisk;
/** /**
* AttachmentHelper constructor. * AttachmentHelper constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
{ {
$this->maxUploadSize = (int)config('firefly.maxUploadSize'); $this->maxUploadSize = (int) config('firefly.maxUploadSize');
$this->allowedMimes = (array)config('firefly.allowedMimes'); $this->allowedMimes = (array) config('firefly.allowedMimes');
$this->errors = new MessageBag; $this->errors = new MessageBag;
$this->messages = new MessageBag; $this->messages = new MessageBag;
$this->attachments = new Collection; $this->attachments = new Collection;
@ -104,16 +107,18 @@ class AttachmentHelper implements AttachmentHelperInterface
* Returns the file path relative to upload disk for an attachment, * Returns the file path relative to upload disk for an attachment,
* *
* @param Attachment $attachment * @param Attachment $attachment
*
* @codeCoverageIgnore * @codeCoverageIgnore
* @return string * @return string
*/ */
public function getAttachmentLocation(Attachment $attachment): string public function getAttachmentLocation(Attachment $attachment): string
{ {
return sprintf('%sat-%d.data', DIRECTORY_SEPARATOR, (int)$attachment->id); return sprintf('%sat-%d.data', DIRECTORY_SEPARATOR, (int) $attachment->id);
} }
/** /**
* Get all attachments. * Get all attachments.
*
* @codeCoverageIgnore * @codeCoverageIgnore
* @return Collection * @return Collection
*/ */
@ -198,8 +203,8 @@ class AttachmentHelper implements AttachmentHelperInterface
* @param object $model * @param object $model
* @param array|null $files * @param array|null $files
* *
* @return bool
* @throws FireflyException * @throws FireflyException
* @return bool
*/ */
public function saveAttachmentsForModel(object $model, ?array $files): bool public function saveAttachmentsForModel(object $model, ?array $files): bool
{ {
@ -242,7 +247,7 @@ class AttachmentHelper implements AttachmentHelperInterface
$count = $model->user->attachments()->where('md5', $md5)->where('attachable_id', $model->id)->where('attachable_type', $class)->count(); $count = $model->user->attachments()->where('md5', $md5)->where('attachable_id', $model->id)->where('attachable_type', $class)->count();
$result = false; $result = false;
if ($count > 0) { if ($count > 0) {
$msg = (string)trans('validation.file_already_attached', ['name' => $name]); $msg = (string) trans('validation.file_already_attached', ['name' => $name]);
$this->errors->add('attachments', $msg); $this->errors->add('attachments', $msg);
Log::error($msg); Log::error($msg);
$result = true; $result = true;
@ -257,9 +262,9 @@ class AttachmentHelper implements AttachmentHelperInterface
* @param UploadedFile $file * @param UploadedFile $file
* @param Model $model * @param Model $model
* *
* @return Attachment|null * @throws EncryptException
* @throws \Illuminate\Contracts\Encryption\EncryptException
* @throws FireflyException * @throws FireflyException
* @return Attachment|null
*/ */
protected function processFile(UploadedFile $file, Model $model): ?Attachment protected function processFile(UploadedFile $file, Model $model): ?Attachment
{ {
@ -286,7 +291,7 @@ class AttachmentHelper implements AttachmentHelperInterface
throw new FireflyException('Cannot upload empty or non-existent file.'); // @codeCoverageIgnore throw new FireflyException('Cannot upload empty or non-existent file.'); // @codeCoverageIgnore
} }
$content = $fileObject->fread($file->getSize()); $content = $fileObject->fread($file->getSize());
Log::debug(sprintf('Full file length is %d and upload size is %d.', strlen($content), $file->getSize())); Log::debug(sprintf('Full file length is %d and upload size is %d.', strlen($content), $file->getSize()));
// store it: // store it:
@ -296,7 +301,7 @@ class AttachmentHelper implements AttachmentHelperInterface
$this->attachments->push($attachment); $this->attachments->push($attachment);
$name = e($file->getClientOriginalName()); // add message: $name = e($file->getClientOriginalName()); // add message:
$msg = (string)trans('validation.file_attached', ['name' => $name]); $msg = (string) trans('validation.file_attached', ['name' => $name]);
$this->messages->add('attachments', $msg); $this->messages->add('attachments', $msg);
} }
@ -320,7 +325,7 @@ class AttachmentHelper implements AttachmentHelperInterface
$result = true; $result = true;
if (!in_array($mime, $this->allowedMimes, true)) { if (!in_array($mime, $this->allowedMimes, true)) {
$msg = (string)trans('validation.file_invalid_mime', ['name' => $name, 'mime' => $mime]); $msg = (string) trans('validation.file_invalid_mime', ['name' => $name, 'mime' => $mime]);
$this->errors->add('attachments', $msg); $this->errors->add('attachments', $msg);
Log::error($msg); Log::error($msg);
@ -345,7 +350,7 @@ class AttachmentHelper implements AttachmentHelperInterface
$name = e($file->getClientOriginalName()); $name = e($file->getClientOriginalName());
$result = true; $result = true;
if ($size > $this->maxUploadSize) { if ($size > $this->maxUploadSize) {
$msg = (string)trans('validation.file_too_large', ['name' => $name]); $msg = (string) trans('validation.file_too_large', ['name' => $name]);
$this->errors->add('attachments', $msg); $this->errors->add('attachments', $msg);
Log::error($msg); Log::error($msg);

View File

@ -57,13 +57,6 @@ interface GroupCollectorInterface
*/ */
public function amountLess(string $amount): GroupCollectorInterface; public function amountLess(string $amount): GroupCollectorInterface;
/**
* Add basic info on attachments of transactions.
*
* @return GroupCollectorInterface
*/
public function withAttachmentInformation(): GroupCollectorInterface;
/** /**
* Get transactions where the amount is more than. * Get transactions where the amount is more than.
* *
@ -128,15 +121,6 @@ interface GroupCollectorInterface
*/ */
public function setAccounts(Collection $accounts): GroupCollectorInterface; public function setAccounts(Collection $accounts): GroupCollectorInterface;
/**
* Either account can be set, but NOT both. This effectively excludes internal transfers.
*
* @param Collection $accounts
*
* @return GroupCollectorInterface
*/
public function setXorAccounts(Collection $accounts): GroupCollectorInterface;
/** /**
* Collect transactions after a specific date. * Collect transactions after a specific date.
* *
@ -146,24 +130,6 @@ interface GroupCollectorInterface
*/ */
public function setAfter(Carbon $date): GroupCollectorInterface; public function setAfter(Carbon $date): GroupCollectorInterface;
/**
* Collect transactions created on a specific date.
*
* @param Carbon $date
*
* @return GroupCollectorInterface
*/
public function setCreatedAt(Carbon $date): GroupCollectorInterface;
/**
* Collect transactions updated on a specific date.
*
* @param Carbon $date
*
* @return GroupCollectorInterface
*/
public function setUpdatedAt(Carbon $date): GroupCollectorInterface;
/** /**
* Collect transactions before a specific date. * Collect transactions before a specific date.
* *
@ -236,6 +202,14 @@ interface GroupCollectorInterface
*/ */
public function setCategory(Category $category): GroupCollectorInterface; public function setCategory(Category $category): GroupCollectorInterface;
/**
* Collect transactions created on a specific date.
*
* @param Carbon $date
*
* @return GroupCollectorInterface
*/
public function setCreatedAt(Carbon $date): GroupCollectorInterface;
/** /**
* Limit results to a specific currency, either foreign or normal one. * Limit results to a specific currency, either foreign or normal one.
@ -355,6 +329,15 @@ interface GroupCollectorInterface
*/ */
public function setTypes(array $types): GroupCollectorInterface; public function setTypes(array $types): GroupCollectorInterface;
/**
* Collect transactions updated on a specific date.
*
* @param Carbon $date
*
* @return GroupCollectorInterface
*/
public function setUpdatedAt(Carbon $date): GroupCollectorInterface;
/** /**
* Set the user object and start the query. * Set the user object and start the query.
* *
@ -364,6 +347,15 @@ interface GroupCollectorInterface
*/ */
public function setUser(User $user): GroupCollectorInterface; public function setUser(User $user): GroupCollectorInterface;
/**
* Either account can be set, but NOT both. This effectively excludes internal transfers.
*
* @param Collection $accounts
*
* @return GroupCollectorInterface
*/
public function setXorAccounts(Collection $accounts): GroupCollectorInterface;
/** /**
* Automatically include all stuff required to make API calls work. * Automatically include all stuff required to make API calls work.
* *
@ -378,6 +370,13 @@ interface GroupCollectorInterface
*/ */
public function withAccountInformation(): GroupCollectorInterface; public function withAccountInformation(): GroupCollectorInterface;
/**
* Add basic info on attachments of transactions.
*
* @return GroupCollectorInterface
*/
public function withAttachmentInformation(): GroupCollectorInterface;
/** /**
* Include bill name + ID. * Include bill name + ID.
* *

View File

@ -79,7 +79,7 @@ class FiscalHelper implements FiscalHelperInterface
if (true === $this->useCustomFiscalYear) { if (true === $this->useCustomFiscalYear) {
$prefStartStr = app('preferences')->get('fiscalYearStart', '01-01')->data; $prefStartStr = app('preferences')->get('fiscalYearStart', '01-01')->data;
[$mth, $day] = explode('-', $prefStartStr); [$mth, $day] = explode('-', $prefStartStr);
$startDate->day((int)$day)->month((int)$mth); $startDate->day((int) $day)->month((int) $mth);
// if start date is after passed date, sub 1 year. // if start date is after passed date, sub 1 year.
if ($startDate > $date) { if ($startDate > $date) {

View File

@ -99,7 +99,7 @@ class NetWorth implements NetWorthInterface
/** @var Account $account */ /** @var Account $account */
foreach ($accounts as $account) { foreach ($accounts as $account) {
Log::debug(sprintf('Now at account #%d: "%s"', $account->id, $account->name)); Log::debug(sprintf('Now at account #%d: "%s"', $account->id, $account->name));
$currencyId = (int)$this->accountRepository->getMetaValue($account, 'currency_id'); $currencyId = (int) $this->accountRepository->getMetaValue($account, 'currency_id');
$currencyId = 0 === $currencyId ? $default->id : $currencyId; $currencyId = 0 === $currencyId ? $default->id : $currencyId;
Log::debug(sprintf('Currency ID is #%d', $currencyId)); Log::debug(sprintf('Currency ID is #%d', $currencyId));
@ -111,9 +111,9 @@ class NetWorth implements NetWorthInterface
// if the account is a credit card, subtract the virtual balance from the balance, // if the account is a credit card, subtract the virtual balance from the balance,
// to better reflect that this is not money that is actually "yours". // to better reflect that this is not money that is actually "yours".
$role = (string)$this->accountRepository->getMetaValue($account, 'account_role'); $role = (string) $this->accountRepository->getMetaValue($account, 'account_role');
$virtualBalance = (string)$account->virtual_balance; $virtualBalance = (string) $account->virtual_balance;
if ('ccAsset' === $role && '' !== $virtualBalance && (float)$virtualBalance > 0) { if ('ccAsset' === $role && '' !== $virtualBalance && (float) $virtualBalance > 0) {
$balance = bcsub($balance, $virtualBalance); $balance = bcsub($balance, $virtualBalance);
} }

View File

@ -87,7 +87,7 @@ class PopupReport implements PopupReportInterface
if (null !== $currencyId) { if (null !== $currencyId) {
/** @var CurrencyRepositoryInterface $repos */ /** @var CurrencyRepositoryInterface $repos */
$repos = app(CurrencyRepositoryInterface::class); $repos = app(CurrencyRepositoryInterface::class);
$currency = $repos->find((int)$currencyId); $currency = $repos->find((int) $currencyId);
} }
@ -124,7 +124,7 @@ class PopupReport implements PopupReportInterface
if (null !== $currencyId) { if (null !== $currencyId) {
/** @var CurrencyRepositoryInterface $repos */ /** @var CurrencyRepositoryInterface $repos */
$repos = app(CurrencyRepositoryInterface::class); $repos = app(CurrencyRepositoryInterface::class);
$currency = $repos->find((int)$currencyId); $currency = $repos->find((int) $currencyId);
} }
@ -154,7 +154,7 @@ class PopupReport implements PopupReportInterface
* Collect journals by a category. * Collect journals by a category.
* *
* @param Category|null $category * @param Category|null $category
* @param array $attributes * @param array $attributes
* *
* @return array * @return array
*/ */
@ -166,7 +166,7 @@ class PopupReport implements PopupReportInterface
if (null !== $currencyId) { if (null !== $currencyId) {
/** @var CurrencyRepositoryInterface $repos */ /** @var CurrencyRepositoryInterface $repos */
$repos = app(CurrencyRepositoryInterface::class); $repos = app(CurrencyRepositoryInterface::class);
$currency = $repos->find((int)$currencyId); $currency = $repos->find((int) $currencyId);
} }
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
@ -179,10 +179,10 @@ class PopupReport implements PopupReportInterface
->withCategoryInformation() ->withCategoryInformation()
->setRange($attributes['startDate'], $attributes['endDate'])->withAccountInformation(); ->setRange($attributes['startDate'], $attributes['endDate'])->withAccountInformation();
if(null!== $category) { if (null !== $category) {
$collector->setCategory($category); $collector->setCategory($category);
} }
if(null === $category) { if (null === $category) {
$collector->withoutCategory(); $collector->withoutCategory();
} }
@ -209,7 +209,7 @@ class PopupReport implements PopupReportInterface
if (null !== $currencyId) { if (null !== $currencyId) {
/** @var CurrencyRepositoryInterface $repos */ /** @var CurrencyRepositoryInterface $repos */
$repos = app(CurrencyRepositoryInterface::class); $repos = app(CurrencyRepositoryInterface::class);
$currency = $repos->find((int)$currencyId); $currency = $repos->find((int) $currencyId);
} }
/** @var JournalRepositoryInterface $repository */ /** @var JournalRepositoryInterface $repository */

View File

@ -25,7 +25,6 @@ namespace FireflyIII\Helpers\Report;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use Illuminate\Support\Collection;
/** /**
* Interface PopupReportInterface. * Interface PopupReportInterface.
@ -68,7 +67,7 @@ interface PopupReportInterface
* Group by category. * Group by category.
* *
* @param Category|null $category * @param Category|null $category
* @param array $attributes * @param array $attributes
* *
* @return array * @return array
*/ */

View File

@ -43,6 +43,7 @@ class ReportHelper implements ReportHelperInterface
/** /**
* ReportHelper constructor. * ReportHelper constructor.
*
* @param BudgetRepositoryInterface $budgetRepository * @param BudgetRepositoryInterface $budgetRepository
*/ */
public function __construct(BudgetRepositoryInterface $budgetRepository) public function __construct(BudgetRepositoryInterface $budgetRepository)
@ -62,8 +63,8 @@ class ReportHelper implements ReportHelperInterface
* *
* Excludes bills which have not had a payment on the mentioned accounts. * Excludes bills which have not had a payment on the mentioned accounts.
* *
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* @param Collection $accounts * @param Collection $accounts
* *
* @return array * @return array

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Helpers\Report; namespace FireflyIII\Helpers\Report;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Helpers\Collection\Bill as BillCollection;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/** /**

View File

@ -23,13 +23,16 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Account; namespace FireflyIII\Http\Controllers\Account;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\AccountFormRequest; use FireflyIII\Http\Requests\AccountFormRequest;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Http\Controllers\ModelInformation; use FireflyIII\Support\Http\Controllers\ModelInformation;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -44,6 +47,7 @@ class CreateController extends Controller
/** /**
* CreateController constructor. * CreateController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -54,7 +58,7 @@ class CreateController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-credit-card'); app('view')->share('mainTitleIcon', 'fa-credit-card');
app('view')->share('title', (string)trans('firefly.accounts')); app('view')->share('title', (string) trans('firefly.accounts'));
$this->repository = app(AccountRepositoryInterface::class); $this->repository = app(AccountRepositoryInterface::class);
@ -66,17 +70,17 @@ class CreateController extends Controller
/** /**
* Create a new account. * Create a new account.
* *
* @param Request $request * @param Request $request
* @param string|null $objectType * @param string|null $objectType
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function create(Request $request, string $objectType = null) public function create(Request $request, string $objectType = null)
{ {
$objectType = $objectType ?? 'asset'; $objectType = $objectType ?? 'asset';
$defaultCurrency = app('amount')->getDefaultCurrency(); $defaultCurrency = app('amount')->getDefaultCurrency();
$subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $objectType)); $subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $objectType));
$subTitle = (string)trans(sprintf('firefly.make_new_%s_account', $objectType)); $subTitle = (string) trans(sprintf('firefly.make_new_%s_account', $objectType));
$roles = $this->getRoles(); $roles = $this->getRoles();
$liabilityTypes = $this->getLiabilityTypes(); $liabilityTypes = $this->getLiabilityTypes();
$hasOldInput = null !== $request->old('_token'); $hasOldInput = null !== $request->old('_token');
@ -91,17 +95,18 @@ class CreateController extends Controller
// interest calculation periods: // interest calculation periods:
$interestPeriods = [ $interestPeriods = [
'daily' => (string)trans('firefly.interest_calc_daily'), 'daily' => (string) trans('firefly.interest_calc_daily'),
'monthly' => (string)trans('firefly.interest_calc_monthly'), 'monthly' => (string) trans('firefly.interest_calc_monthly'),
'yearly' => (string)trans('firefly.interest_calc_yearly'), 'yearly' => (string) trans('firefly.interest_calc_yearly'),
]; ];
// pre fill some data // pre fill some data
$request->session()->flash( $request->session()->flash(
'preFilled', [ 'preFilled',
'currency_id' => $defaultCurrency->id, [
'include_net_worth' => $hasOldInput ? (bool)$request->old('include_net_worth') : true, 'currency_id' => $defaultCurrency->id,
] 'include_net_worth' => $hasOldInput ? (bool) $request->old('include_net_worth') : true,
]
); );
// put previous url in session if not redirect from store (not "create another"). // put previous url in session if not redirect from store (not "create another").
@ -119,13 +124,13 @@ class CreateController extends Controller
* *
* @param AccountFormRequest $request * @param AccountFormRequest $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function store(AccountFormRequest $request) public function store(AccountFormRequest $request)
{ {
$data = $request->getAccountData(); $data = $request->getAccountData();
$account = $this->repository->store($data); $account = $this->repository->store($data);
$request->session()->flash('success', (string)trans('firefly.stored_new_account', ['name' => $account->name])); $request->session()->flash('success', (string) trans('firefly.stored_new_account', ['name' => $account->name]));
app('preferences')->mark(); app('preferences')->mark();
Log::channel('audit')->info('Stored new account.', $data); Log::channel('audit')->info('Stored new account.', $data);
@ -138,7 +143,7 @@ class CreateController extends Controller
} }
// redirect to previous URL. // redirect to previous URL.
$redirect = redirect($this->getPreviousUri('accounts.create.uri')); $redirect = redirect($this->getPreviousUri('accounts.create.uri'));
if (1 === (int)$request->get('create_another')) { if (1 === (int) $request->get('create_another')) {
// set value so create routine will not overwrite URL: // set value so create routine will not overwrite URL:
$request->session()->put('accounts.create.fromStore', true); $request->session()->put('accounts.create.fromStore', true);
@ -147,7 +152,4 @@ class CreateController extends Controller
return $redirect; return $redirect;
} }
} }

View File

@ -28,7 +28,11 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Http\Controllers\UserNavigation; use FireflyIII\Support\Http\Controllers\UserNavigation;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* Class DeleteController * Class DeleteController
@ -42,6 +46,7 @@ class DeleteController extends Controller
/** /**
* DeleteController constructor. * DeleteController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -52,7 +57,7 @@ class DeleteController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-credit-card'); app('view')->share('mainTitleIcon', 'fa-credit-card');
app('view')->share('title', (string)trans('firefly.accounts')); app('view')->share('title', (string) trans('firefly.accounts'));
$this->repository = app(AccountRepositoryInterface::class); $this->repository = app(AccountRepositoryInterface::class);
@ -66,7 +71,7 @@ class DeleteController extends Controller
* *
* @param Account $account * @param Account $account
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function delete(Account $account) public function delete(Account $account)
{ {
@ -75,7 +80,7 @@ class DeleteController extends Controller
} }
$typeName = config(sprintf('firefly.shortNamesByFullName.%s', $account->accountType->type)); $typeName = config(sprintf('firefly.shortNamesByFullName.%s', $account->accountType->type));
$subTitle = (string)trans(sprintf('firefly.delete_%s_account', $typeName), ['name' => $account->name]); $subTitle = (string) trans(sprintf('firefly.delete_%s_account', $typeName), ['name' => $account->name]);
$accountList = app('expandedform')->makeSelectListWithEmpty($this->repository->getAccountsByType([$account->accountType->type])); $accountList = app('expandedform')->makeSelectListWithEmpty($this->repository->getAccountsByType([$account->accountType->type]));
$objectType = $typeName; $objectType = $typeName;
unset($accountList[$account->id]); unset($accountList[$account->id]);
@ -92,7 +97,7 @@ class DeleteController extends Controller
* @param Request $request * @param Request $request
* @param Account $account * @param Account $account
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function destroy(Request $request, Account $account) public function destroy(Request $request, Account $account)
{ {
@ -103,11 +108,11 @@ class DeleteController extends Controller
$type = $account->accountType->type; $type = $account->accountType->type;
$typeName = config(sprintf('firefly.shortNamesByFullName.%s', $type)); $typeName = config(sprintf('firefly.shortNamesByFullName.%s', $type));
$name = $account->name; $name = $account->name;
$moveTo = $this->repository->findNull((int)$request->get('move_account_before_delete')); $moveTo = $this->repository->findNull((int) $request->get('move_account_before_delete'));
$this->repository->destroy($account, $moveTo); $this->repository->destroy($account, $moveTo);
$request->session()->flash('success', (string)trans(sprintf('firefly.%s_deleted', $typeName), ['name' => $name])); $request->session()->flash('success', (string) trans(sprintf('firefly.%s_deleted', $typeName), ['name' => $name]));
app('preferences')->mark(); app('preferences')->mark();
return redirect($this->getPreviousUri('accounts.delete.uri')); return redirect($this->getPreviousUri('accounts.delete.uri'));

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Account; namespace FireflyIII\Http\Controllers\Account;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\AccountFormRequest; use FireflyIII\Http\Requests\AccountFormRequest;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
@ -31,7 +30,11 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Http\Controllers\ModelInformation; use FireflyIII\Support\Http\Controllers\ModelInformation;
use FireflyIII\Support\Http\Controllers\UserNavigation; use FireflyIII\Support\Http\Controllers\UserNavigation;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* *
@ -56,7 +59,7 @@ class EditController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-credit-card'); app('view')->share('mainTitleIcon', 'fa-credit-card');
app('view')->share('title', (string)trans('firefly.accounts')); app('view')->share('title', (string) trans('firefly.accounts'));
$this->repository = app(AccountRepositoryInterface::class); $this->repository = app(AccountRepositoryInterface::class);
$this->currencyRepos = app(CurrencyRepositoryInterface::class); $this->currencyRepos = app(CurrencyRepositoryInterface::class);
@ -69,11 +72,11 @@ class EditController extends Controller
/** /**
* Edit account overview. * Edit account overview.
* *
* @param Request $request * @param Request $request
* @param Account $account * @param Account $account
* @param AccountRepositoryInterface $repository * @param AccountRepositoryInterface $repository
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
* *
*/ */
public function edit(Request $request, Account $account, AccountRepositoryInterface $repository) public function edit(Request $request, Account $account, AccountRepositoryInterface $repository)
@ -83,7 +86,7 @@ class EditController extends Controller
} }
$objectType = config('firefly.shortNamesByFullName')[$account->accountType->type]; $objectType = config('firefly.shortNamesByFullName')[$account->accountType->type];
$subTitle = (string)trans(sprintf('firefly.edit_%s_account', $objectType), ['name' => $account->name]); $subTitle = (string) trans(sprintf('firefly.edit_%s_account', $objectType), ['name' => $account->name]);
$subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $objectType)); $subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $objectType));
$roles = $this->getRoles(); $roles = $this->getRoles();
$liabilityTypes = $this->getLiabilityTypes(); $liabilityTypes = $this->getLiabilityTypes();
@ -103,9 +106,9 @@ class EditController extends Controller
// interest calculation periods: // interest calculation periods:
$interestPeriods = [ $interestPeriods = [
'daily' => (string)trans('firefly.interest_calc_daily'), 'daily' => (string) trans('firefly.interest_calc_daily'),
'monthly' => (string)trans('firefly.interest_calc_monthly'), 'monthly' => (string) trans('firefly.interest_calc_monthly'),
'yearly' => (string)trans('firefly.interest_calc_yearly'), 'yearly' => (string) trans('firefly.interest_calc_yearly'),
]; ];
// put previous url in session if not redirect from store (not "return_to_edit"). // put previous url in session if not redirect from store (not "return_to_edit").
@ -114,7 +117,7 @@ class EditController extends Controller
} }
$request->session()->forget('accounts.edit.fromUpdate'); $request->session()->forget('accounts.edit.fromUpdate');
$openingBalanceAmount = (string)$repository->getOpeningBalanceAmount($account); $openingBalanceAmount = (string) $repository->getOpeningBalanceAmount($account);
$openingBalanceDate = $repository->getOpeningBalanceDate($account); $openingBalanceDate = $repository->getOpeningBalanceDate($account);
$currency = $this->repository->getAccountCurrency($account) ?? app('amount')->getDefaultCurrency(); $currency = $this->repository->getAccountCurrency($account) ?? app('amount')->getDefaultCurrency();
@ -139,15 +142,25 @@ class EditController extends Controller
'interest' => $repository->getMetaValue($account, 'interest'), 'interest' => $repository->getMetaValue($account, 'interest'),
'interest_period' => $repository->getMetaValue($account, 'interest_period'), 'interest_period' => $repository->getMetaValue($account, 'interest_period'),
'notes' => $this->repository->getNoteText($account), 'notes' => $this->repository->getNoteText($account),
'active' => $hasOldInput ? (bool)$request->old('active') : $account->active, 'active' => $hasOldInput ? (bool) $request->old('active') : $account->active,
]; ];
$request->session()->flash('preFilled', $preFilled); $request->session()->flash('preFilled', $preFilled);
return view( return view(
'accounts.edit', compact( 'accounts.edit',
'account', 'currency', 'subTitle', 'subTitleIcon', 'locations', 'objectType', 'roles', 'preFilled', 'liabilityTypes', 'interestPeriods' compact(
) 'account',
'currency',
'subTitle',
'subTitleIcon',
'locations',
'objectType',
'roles',
'preFilled',
'liabilityTypes',
'interestPeriods'
)
); );
} }
@ -156,9 +169,9 @@ class EditController extends Controller
* Update the account. * Update the account.
* *
* @param AccountFormRequest $request * @param AccountFormRequest $request
* @param Account $account * @param Account $account
* *
* @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return $this|RedirectResponse|Redirector
*/ */
public function update(AccountFormRequest $request, Account $account) public function update(AccountFormRequest $request, Account $account)
{ {
@ -169,11 +182,11 @@ class EditController extends Controller
$data = $request->getAccountData(); $data = $request->getAccountData();
$this->repository->update($account, $data); $this->repository->update($account, $data);
$request->session()->flash('success', (string)trans('firefly.updated_account', ['name' => $account->name])); $request->session()->flash('success', (string) trans('firefly.updated_account', ['name' => $account->name]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('accounts.edit.uri')); $redirect = redirect($this->getPreviousUri('accounts.edit.uri'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// set value so edit routine will not overwrite URL: // set value so edit routine will not overwrite URL:
$request->session()->put('accounts.edit.fromUpdate', true); $request->session()->put('accounts.edit.fromUpdate', true);
@ -182,5 +195,4 @@ class EditController extends Controller
return $redirect; return $redirect;
} }
} }

View File

@ -28,8 +28,10 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Http\Controllers\BasicDataSupport; use FireflyIII\Support\Http\Controllers\BasicDataSupport;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\View\View;
/** /**
* *
@ -43,6 +45,7 @@ class IndexController extends Controller
/** /**
* IndexController constructor. * IndexController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -53,7 +56,7 @@ class IndexController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-credit-card'); app('view')->share('mainTitleIcon', 'fa-credit-card');
app('view')->share('title', (string)trans('firefly.accounts')); app('view')->share('title', (string) trans('firefly.accounts'));
$this->repository = app(AccountRepositoryInterface::class); $this->repository = app(AccountRepositoryInterface::class);
@ -66,19 +69,19 @@ class IndexController extends Controller
* @param Request $request * @param Request $request
* @param string $objectType * @param string $objectType
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function inactive(Request $request, string $objectType) public function inactive(Request $request, string $objectType)
{ {
$objectType = $objectType ?? 'asset'; $objectType = $objectType ?? 'asset';
$inactivePage = true; $inactivePage = true;
$subTitle = (string)trans(sprintf('firefly.%s_accounts_inactive', $objectType)); $subTitle = (string) trans(sprintf('firefly.%s_accounts_inactive', $objectType));
$subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $objectType)); $subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $objectType));
$types = config(sprintf('firefly.accountTypesByIdentifier.%s', $objectType)); $types = config(sprintf('firefly.accountTypesByIdentifier.%s', $objectType));
$collection = $this->repository->getInactiveAccountsByType($types); $collection = $this->repository->getInactiveAccountsByType($types);
$total = $collection->count(); $total = $collection->count();
$page = 0 === (int)$request->get('page') ? 1 : (int)$request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$accounts = $collection->slice(($page - 1) * $pageSize, $pageSize); $accounts = $collection->slice(($page - 1) * $pageSize, $pageSize);
unset($collection); unset($collection);
/** @var Carbon $start */ /** @var Carbon $start */
@ -99,8 +102,8 @@ class IndexController extends Controller
$account->endBalance = $this->isInArray($endBalances, $account->id); $account->endBalance = $this->isInArray($endBalances, $account->id);
$account->difference = bcsub($account->endBalance, $account->startBalance); $account->difference = bcsub($account->endBalance, $account->startBalance);
$account->interest = round($this->repository->getMetaValue($account, 'interest'), 6); $account->interest = round($this->repository->getMetaValue($account, 'interest'), 6);
$account->interestPeriod = (string)trans(sprintf('firefly.interest_calc_%s', $this->repository->getMetaValue($account, 'interest_period'))); $account->interestPeriod = (string) trans(sprintf('firefly.interest_calc_%s', $this->repository->getMetaValue($account, 'interest_period')));
$account->accountTypeString = (string)trans(sprintf('firefly.account_type_%s', $account->accountType->type)); $account->accountTypeString = (string) trans(sprintf('firefly.account_type_%s', $account->accountType->type));
} }
); );
@ -108,7 +111,7 @@ class IndexController extends Controller
$accounts = new LengthAwarePaginator($accounts, $total, $pageSize, $page); $accounts = new LengthAwarePaginator($accounts, $total, $pageSize, $page);
$accounts->setPath(route('accounts.inactive.index', [$objectType])); $accounts->setPath(route('accounts.inactive.index', [$objectType]));
return view('accounts.index', compact('objectType','inactivePage', 'subTitleIcon', 'subTitle', 'page', 'accounts')); return view('accounts.index', compact('objectType', 'inactivePage', 'subTitleIcon', 'subTitle', 'page', 'accounts'));
} }
@ -116,20 +119,20 @@ class IndexController extends Controller
* Show list of accounts. * Show list of accounts.
* *
* @param Request $request * @param Request $request
* @param string $objectType * @param string $objectType
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index(Request $request, string $objectType) public function index(Request $request, string $objectType)
{ {
$objectType = $objectType ?? 'asset'; $objectType = $objectType ?? 'asset';
$subTitle = (string)trans(sprintf('firefly.%s_accounts', $objectType)); $subTitle = (string) trans(sprintf('firefly.%s_accounts', $objectType));
$subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $objectType)); $subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $objectType));
$types = config(sprintf('firefly.accountTypesByIdentifier.%s', $objectType)); $types = config(sprintf('firefly.accountTypesByIdentifier.%s', $objectType));
$collection = $this->repository->getActiveAccountsByType($types); $collection = $this->repository->getActiveAccountsByType($types);
$total = $collection->count(); $total = $collection->count();
$page = 0 === (int)$request->get('page') ? 1 : (int)$request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$accounts = $collection->slice(($page - 1) * $pageSize, $pageSize); $accounts = $collection->slice(($page - 1) * $pageSize, $pageSize);
$inactiveCount = $this->repository->getInactiveAccountsByType($types)->count(); $inactiveCount = $this->repository->getInactiveAccountsByType($types)->count();
@ -153,9 +156,9 @@ class IndexController extends Controller
$account->endBalance = $this->isInArray($endBalances, $account->id); $account->endBalance = $this->isInArray($endBalances, $account->id);
$account->difference = bcsub($account->endBalance, $account->startBalance); $account->difference = bcsub($account->endBalance, $account->startBalance);
$account->interest = round($this->repository->getMetaValue($account, 'interest'), 6); $account->interest = round($this->repository->getMetaValue($account, 'interest'), 6);
$account->interestPeriod = (string)trans(sprintf('firefly.interest_calc_%s', $this->repository->getMetaValue($account, 'interest_period'))); $account->interestPeriod = (string) trans(sprintf('firefly.interest_calc_%s', $this->repository->getMetaValue($account, 'interest_period')));
$account->accountTypeString = (string)trans(sprintf('firefly.account_type_%s', $account->accountType->type)); $account->accountTypeString = (string) trans(sprintf('firefly.account_type_%s', $account->accountType->type));
$account->location = $this->repository->getLocation($account); $account->location = $this->repository->getLocation($account);
} }
); );

View File

@ -25,6 +25,7 @@ namespace FireflyIII\Http\Controllers\Account;
use Carbon\Carbon; use Carbon\Carbon;
use Exception; use Exception;
use FireflyIII\Exceptions\DuplicateTransactionException;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Factory\TransactionGroupFactory; use FireflyIII\Factory\TransactionGroupFactory;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@ -37,6 +38,10 @@ use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Support\Http\Controllers\UserNavigation; use FireflyIII\Support\Http\Controllers\UserNavigation;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -54,6 +59,7 @@ class ReconcileController extends Controller
/** /**
* ReconcileController constructor. * ReconcileController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -64,7 +70,7 @@ class ReconcileController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-credit-card'); app('view')->share('mainTitleIcon', 'fa-credit-card');
app('view')->share('title', (string)trans('firefly.accounts')); app('view')->share('title', (string) trans('firefly.accounts'));
$this->repository = app(JournalRepositoryInterface::class); $this->repository = app(JournalRepositoryInterface::class);
$this->accountRepos = app(AccountRepositoryInterface::class); $this->accountRepos = app(AccountRepositoryInterface::class);
$this->currencyRepos = app(CurrencyRepositoryInterface::class); $this->currencyRepos = app(CurrencyRepositoryInterface::class);
@ -77,12 +83,12 @@ class ReconcileController extends Controller
/** /**
* Reconciliation overview. * Reconciliation overview.
* *
* @param Account $account * @param Account $account
* @param Carbon|null $start * @param Carbon|null $start
* @param Carbon|null $end * @param Carbon|null $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View
* @throws Exception * @throws Exception
* @return Factory|RedirectResponse|Redirector|View
*/ */
public function reconcile(Account $account, Carbon $start = null, Carbon $end = null) public function reconcile(Account $account, Carbon $start = null, Carbon $end = null)
{ {
@ -93,7 +99,7 @@ class ReconcileController extends Controller
if (AccountType::ASSET !== $account->accountType->type) { if (AccountType::ASSET !== $account->accountType->type) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
session()->flash('error', (string)trans('firefly.must_be_asset_account')); session()->flash('error', (string) trans('firefly.must_be_asset_account'));
return redirect(route('accounts.index', [config(sprintf('firefly.shortNamesByFullName.%s', $account->accountType->type))])); return redirect(route('accounts.index', [config(sprintf('firefly.shortNamesByFullName.%s', $account->accountType->type))]));
// @codeCoverageIgnoreEnd // @codeCoverageIgnoreEnd
@ -111,7 +117,6 @@ class ReconcileController extends Controller
$start = clone session('start', app('navigation')->startOfPeriod(new Carbon, $range)); $start = clone session('start', app('navigation')->startOfPeriod(new Carbon, $range));
/** @var Carbon $end */ /** @var Carbon $end */
$end = clone session('end', app('navigation')->endOfPeriod(new Carbon, $range)); $end = clone session('end', app('navigation')->endOfPeriod(new Carbon, $range));
} }
if (null === $end) { if (null === $end) {
/** @var Carbon $end */ /** @var Carbon $end */
@ -128,7 +133,7 @@ class ReconcileController extends Controller
$endBalance = round(app('steam')->balance($account, $end), $currency->decimal_places); $endBalance = round(app('steam')->balance($account, $end), $currency->decimal_places);
$subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $account->accountType->type)); $subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $account->accountType->type));
$subTitle = (string)trans('firefly.reconcile_account', ['account' => $account->name]); $subTitle = (string) trans('firefly.reconcile_account', ['account' => $account->name]);
// various links // various links
$transactionsUri = route('accounts.reconcile.transactions', [$account->id, '%start%', '%end%']); $transactionsUri = route('accounts.reconcile.transactions', [$account->id, '%start%', '%end%']);
@ -136,21 +141,34 @@ class ReconcileController extends Controller
$indexUri = route('accounts.reconcile', [$account->id, '%start%', '%end%']); $indexUri = route('accounts.reconcile', [$account->id, '%start%', '%end%']);
$objectType = 'asset'; $objectType = 'asset';
return view('accounts.reconcile.index', return view(
compact('account', 'currency', 'objectType', 'accounts.reconcile.index',
'subTitleIcon', 'start', 'end', 'subTitle', 'startBalance', 'endBalance', compact(
'transactionsUri', 'overviewUri', 'indexUri')); 'account',
'currency',
'objectType',
'subTitleIcon',
'start',
'end',
'subTitle',
'startBalance',
'endBalance',
'transactionsUri',
'overviewUri',
'indexUri'
)
);
} }
/** /**
* Submit a new reconciliation. * Submit a new reconciliation.
* *
* @param ReconciliationStoreRequest $request * @param ReconciliationStoreRequest $request
* @param Account $account * @param Account $account
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function submit(ReconciliationStoreRequest $request, Account $account, Carbon $start, Carbon $end) public function submit(ReconciliationStoreRequest $request, Account $account, Carbon $start, Carbon $end)
{ {
@ -163,7 +181,7 @@ class ReconcileController extends Controller
/** @var string $journalId */ /** @var string $journalId */
foreach ($data['journals'] as $journalId) { foreach ($data['journals'] as $journalId) {
$this->repository->reconcileById((int)$journalId); $this->repository->reconcileById((int) $journalId);
} }
Log::debug('Reconciled all transactions.'); Log::debug('Reconciled all transactions.');
@ -180,10 +198,10 @@ class ReconcileController extends Controller
Log::debug('End of routine.'); Log::debug('End of routine.');
app('preferences')->mark(); app('preferences')->mark();
if ('' === $result) { if ('' === $result) {
session()->flash('success', (string)trans('firefly.reconciliation_stored')); session()->flash('success', (string) trans('firefly.reconciliation_stored'));
} }
if ('' !== $result) { if ('' !== $result) {
session()->flash('error', (string)trans('firefly.reconciliation_error', ['error' => $result])); session()->flash('error', (string) trans('firefly.reconciliation_error', ['error' => $result]));
} }
return redirect(route('accounts.show', [$account->id])); return redirect(route('accounts.show', [$account->id]));
@ -197,8 +215,8 @@ class ReconcileController extends Controller
* @param Carbon $end * @param Carbon $end
* @param string $difference * @param string $difference
* *
* @throws DuplicateTransactionException
* @return string * @return string
* @throws \FireflyIII\Exceptions\DuplicateTransactionException
*/ */
private function createReconciliation(Account $account, Carbon $start, Carbon $end, string $difference) private function createReconciliation(Account $account, Carbon $start, Carbon $end, string $difference)
{ {
@ -220,9 +238,11 @@ class ReconcileController extends Controller
} }
// title: // title:
$description = trans('firefly.reconciliation_transaction_title', $description = trans(
['from' => $start->formatLocalized($this->monthAndDayFormat), 'to' => $end->formatLocalized($this->monthAndDayFormat)]); 'firefly.reconciliation_transaction_title',
$submission = [ ['from' => $start->formatLocalized($this->monthAndDayFormat), 'to' => $end->formatLocalized($this->monthAndDayFormat)]
);
$submission = [
'user' => auth()->user()->id, 'user' => auth()->user()->id,
'group_title' => null, 'group_title' => null,
'transactions' => [ 'transactions' => [

View File

@ -32,7 +32,9 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Http\Controllers\PeriodOverview; use FireflyIII\Support\Http\Controllers\PeriodOverview;
use FireflyIII\Support\Http\Controllers\UserNavigation; use FireflyIII\Support\Http\Controllers\UserNavigation;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use View; use View;
@ -51,6 +53,7 @@ class ShowController extends Controller
/** /**
* ShowController constructor. * ShowController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -63,7 +66,7 @@ class ShowController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-credit-card'); app('view')->share('mainTitleIcon', 'fa-credit-card');
app('view')->share('title', (string)trans('firefly.accounts')); app('view')->share('title', (string) trans('firefly.accounts'));
$this->repository = app(AccountRepositoryInterface::class); $this->repository = app(AccountRepositoryInterface::class);
$this->currencyRepos = app(CurrencyRepositoryInterface::class); $this->currencyRepos = app(CurrencyRepositoryInterface::class);
@ -77,13 +80,13 @@ class ShowController extends Controller
/** /**
* Show an account. * Show an account.
* *
* @param Request $request * @param Request $request
* @param Account $account * @param Account $account
* @param Carbon|null $start * @param Carbon|null $start
* @param Carbon|null $end * @param Carbon|null $end
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View
* @throws Exception * @throws Exception
* @return RedirectResponse|Redirector|View
*/ */
public function show(Request $request, Account $account, Carbon $start = null, Carbon $end = null) public function show(Request $request, Account $account, Carbon $start = null, Carbon $end = null)
{ {
@ -103,12 +106,12 @@ class ShowController extends Controller
$objectType = config(sprintf('firefly.shortNamesByFullName.%s', $account->accountType->type)); $objectType = config(sprintf('firefly.shortNamesByFullName.%s', $account->accountType->type));
$today = new Carbon; $today = new Carbon;
$subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $account->accountType->type)); $subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $account->accountType->type));
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$currency = $this->repository->getAccountCurrency($account) ?? app('amount')->getDefaultCurrency(); $currency = $this->repository->getAccountCurrency($account) ?? app('amount')->getDefaultCurrency();
$fStart = $start->formatLocalized($this->monthAndDayFormat); $fStart = $start->formatLocalized($this->monthAndDayFormat);
$fEnd = $end->formatLocalized($this->monthAndDayFormat); $fEnd = $end->formatLocalized($this->monthAndDayFormat);
$subTitle = (string)trans('firefly.journals_in_period_for_account', ['name' => $account->name, 'start' => $fStart, 'end' => $fEnd]); $subTitle = (string) trans('firefly.journals_in_period_for_account', ['name' => $account->name, 'start' => $fStart, 'end' => $fEnd]);
$chartUri = route('chart.account.period', [$account->id, $start->format('Y-m-d'), $end->format('Y-m-d')]); $chartUri = route('chart.account.period', [$account->id, $start->format('Y-m-d'), $end->format('Y-m-d')]);
$firstTransaction = $this->repository->oldestJournalDate($account) ?? $start; $firstTransaction = $this->repository->oldestJournalDate($account) ?? $start;
$periods = $this->getAccountPeriodOverview($account, $firstTransaction, $end); $periods = $this->getAccountPeriodOverview($account, $firstTransaction, $end);
@ -123,13 +126,25 @@ class ShowController extends Controller
$groups = $collector->getPaginatedGroups(); $groups = $collector->getPaginatedGroups();
$groups->setPath(route('accounts.show', [$account->id, $start->format('Y-m-d'), $end->format('Y-m-d')])); $groups->setPath(route('accounts.show', [$account->id, $start->format('Y-m-d'), $end->format('Y-m-d')]));
$showAll = false; $showAll = false;
$balance = app('steam')->balance($account, $end); $balance = app('steam')->balance($account, $end);
return view( return view(
'accounts.show', 'accounts.show',
compact( compact(
'account', 'showAll', 'objectType', 'currency', 'today', 'periods', 'subTitleIcon', 'groups', 'subTitle', 'start', 'end', 'account',
'chartUri', 'location','balance' 'showAll',
'objectType',
'currency',
'today',
'periods',
'subTitleIcon',
'groups',
'subTitle',
'start',
'end',
'chartUri',
'location',
'balance'
) )
); );
} }
@ -139,8 +154,9 @@ class ShowController extends Controller
* *
* @param Request $request * @param Request $request
* @param Account $account * @param Account $account
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View *
* @throws Exception * @throws Exception
* @return RedirectResponse|Redirector|View
*/ */
public function showAll(Request $request, Account $account) public function showAll(Request $request, Account $account)
{ {
@ -156,10 +172,10 @@ class ShowController extends Controller
$today = new Carbon; $today = new Carbon;
$start = $this->repository->oldestJournalDate($account) ?? Carbon::now()->startOfMonth(); $start = $this->repository->oldestJournalDate($account) ?? Carbon::now()->startOfMonth();
$subTitleIcon = config('firefly.subIconsByIdentifier.' . $account->accountType->type); $subTitleIcon = config('firefly.subIconsByIdentifier.' . $account->accountType->type);
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$currency = $this->repository->getAccountCurrency($account) ?? app('amount')->getDefaultCurrency(); $currency = $this->repository->getAccountCurrency($account) ?? app('amount')->getDefaultCurrency();
$subTitle = (string)trans('firefly.all_journals_for_account', ['name' => $account->name]); $subTitle = (string) trans('firefly.all_journals_for_account', ['name' => $account->name]);
$periods = new Collection; $periods = new Collection;
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
@ -173,10 +189,22 @@ class ShowController extends Controller
return view( return view(
'accounts.show', 'accounts.show',
compact( compact(
'account', 'showAll', 'location', 'objectType', 'isLiability', 'currency', 'today', 'account',
'chartUri', 'periods', 'subTitleIcon', 'groups', 'subTitle', 'start', 'end', 'balance' 'showAll',
'location',
'objectType',
'isLiability',
'currency',
'today',
'chartUri',
'periods',
'subTitleIcon',
'groups',
'subTitle',
'start',
'end',
'balance'
) )
); );
} }
} }

View File

@ -27,7 +27,9 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Http\Middleware\IsSandStormUser; use FireflyIII\Http\Middleware\IsSandStormUser;
use FireflyIII\Http\Requests\ConfigurationRequest; use FireflyIII\Http\Requests\ConfigurationRequest;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -37,6 +39,7 @@ class ConfigurationController extends Controller
{ {
/** /**
* ConfigurationController constructor. * ConfigurationController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -45,7 +48,7 @@ class ConfigurationController extends Controller
$this->middleware( $this->middleware(
static function ($request, $next) { static function ($request, $next) {
app('view')->share('title', (string)trans('firefly.administration')); app('view')->share('title', (string) trans('firefly.administration'));
app('view')->share('mainTitleIcon', 'fa-hand-spock-o'); app('view')->share('mainTitleIcon', 'fa-hand-spock-o');
return $next($request); return $next($request);
@ -58,11 +61,11 @@ class ConfigurationController extends Controller
/** /**
* Show configuration index. * Show configuration index.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index() public function index()
{ {
$subTitle = (string)trans('firefly.instance_configuration'); $subTitle = (string) trans('firefly.instance_configuration');
$subTitleIcon = 'fa-wrench'; $subTitleIcon = 'fa-wrench';
Log::channel('audit')->info('User visits admin config index.'); Log::channel('audit')->info('User visits admin config index.');
@ -98,7 +101,7 @@ class ConfigurationController extends Controller
app('fireflyconfig')->set('is_demo_site', $data['is_demo_site']); app('fireflyconfig')->set('is_demo_site', $data['is_demo_site']);
// flash message // flash message
session()->flash('success', (string)trans('firefly.configuration_updated')); session()->flash('success', (string) trans('firefly.configuration_updated'));
app('preferences')->mark(); app('preferences')->mark();
return redirect()->route('admin.configuration.index'); return redirect()->route('admin.configuration.index');

View File

@ -27,7 +27,11 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Http\Middleware\IsSandStormUser; use FireflyIII\Http\Middleware\IsSandStormUser;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -37,6 +41,7 @@ class HomeController extends Controller
{ {
/** /**
* ConfigurationController constructor. * ConfigurationController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -49,14 +54,14 @@ class HomeController extends Controller
/** /**
* Index of the admin. * Index of the admin.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index() public function index()
{ {
Log::channel('audit')->info('User visits admin index.'); Log::channel('audit')->info('User visits admin index.');
$title = (string)trans('firefly.administration'); $title = (string) trans('firefly.administration');
$mainTitleIcon = 'fa-hand-spock-o'; $mainTitleIcon = 'fa-hand-spock-o';
$sandstorm = 1 === (int)getenv('SANDSTORM'); $sandstorm = 1 === (int) getenv('SANDSTORM');
return view('admin.index', compact('title', 'mainTitleIcon', 'sandstorm')); return view('admin.index', compact('title', 'mainTitleIcon', 'sandstorm'));
} }
@ -66,7 +71,7 @@ class HomeController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function testMessage(Request $request) public function testMessage(Request $request)
{ {
@ -76,7 +81,7 @@ class HomeController extends Controller
$ipAddress = $request->ip(); $ipAddress = $request->ip();
Log::debug(sprintf('Now in testMessage() controller. IP is %s', $ipAddress)); Log::debug(sprintf('Now in testMessage() controller. IP is %s', $ipAddress));
event(new AdminRequestedTestMessage($user, $ipAddress)); event(new AdminRequestedTestMessage($user, $ipAddress));
session()->flash('info', (string)trans('firefly.send_test_triggered')); session()->flash('info', (string) trans('firefly.send_test_triggered'));
return redirect(route('admin.index')); return redirect(route('admin.index'));
} }

View File

@ -27,7 +27,10 @@ use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Http\Requests\LinkTypeFormRequest; use FireflyIII\Http\Requests\LinkTypeFormRequest;
use FireflyIII\Models\LinkType; use FireflyIII\Models\LinkType;
use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Log; use Log;
use View; use View;
@ -42,6 +45,7 @@ class LinkController extends Controller
/** /**
* LinkController constructor. * LinkController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -50,7 +54,7 @@ class LinkController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.administration')); app('view')->share('title', (string) trans('firefly.administration'));
app('view')->share('mainTitleIcon', 'fa-hand-spock-o'); app('view')->share('mainTitleIcon', 'fa-hand-spock-o');
$this->repository = app(LinkTypeRepositoryInterface::class); $this->repository = app(LinkTypeRepositoryInterface::class);
@ -63,13 +67,13 @@ class LinkController extends Controller
/** /**
* Make a new link form. * Make a new link form.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|\Illuminate\View\View
*/ */
public function create() public function create()
{ {
Log::channel('audit')->info('User visits link index.'); Log::channel('audit')->info('User visits link index.');
$subTitle = (string)trans('firefly.create_new_link_type'); $subTitle = (string) trans('firefly.create_new_link_type');
$subTitleIcon = 'fa-link'; $subTitleIcon = 'fa-link';
// put previous url in session if not redirect from store (not "create another"). // put previous url in session if not redirect from store (not "create another").
@ -83,25 +87,25 @@ class LinkController extends Controller
/** /**
* Delete a link form. * Delete a link form.
* *
* @param Request $request * @param Request $request
* @param LinkType $linkType * @param LinkType $linkType
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View * @return RedirectResponse|Redirector|View
*/ */
public function delete(Request $request, LinkType $linkType) public function delete(Request $request, LinkType $linkType)
{ {
if (!$linkType->editable) { if (!$linkType->editable) {
$request->session()->flash('error', (string)trans('firefly.cannot_edit_link_type', ['name' => e($linkType->name)])); $request->session()->flash('error', (string) trans('firefly.cannot_edit_link_type', ['name' => e($linkType->name)]));
return redirect(route('admin.links.index')); return redirect(route('admin.links.index'));
} }
Log::channel('audit')->info(sprintf('User wants to delete link type #%d', $linkType->id)); Log::channel('audit')->info(sprintf('User wants to delete link type #%d', $linkType->id));
$subTitle = (string)trans('firefly.delete_link_type', ['name' => $linkType->name]); $subTitle = (string) trans('firefly.delete_link_type', ['name' => $linkType->name]);
$otherTypes = $this->repository->get(); $otherTypes = $this->repository->get();
$count = $this->repository->countJournals($linkType); $count = $this->repository->countJournals($linkType);
$moveTo = []; $moveTo = [];
$moveTo[0] = (string)trans('firefly.do_not_save_connection'); $moveTo[0] = (string) trans('firefly.do_not_save_connection');
/** @var LinkType $otherType */ /** @var LinkType $otherType */
foreach ($otherTypes as $otherType) { foreach ($otherTypes as $otherType) {
@ -119,19 +123,19 @@ class LinkController extends Controller
/** /**
* Actually destroy the link. * Actually destroy the link.
* *
* @param Request $request * @param Request $request
* @param LinkType $linkType * @param LinkType $linkType
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function destroy(Request $request, LinkType $linkType) public function destroy(Request $request, LinkType $linkType)
{ {
Log::channel('audit')->info(sprintf('User destroyed link type #%d', $linkType->id)); Log::channel('audit')->info(sprintf('User destroyed link type #%d', $linkType->id));
$name = $linkType->name; $name = $linkType->name;
$moveTo = $this->repository->findNull((int)$request->get('move_link_type_before_delete')); $moveTo = $this->repository->findNull((int) $request->get('move_link_type_before_delete'));
$this->repository->destroy($linkType, $moveTo); $this->repository->destroy($linkType, $moveTo);
$request->session()->flash('success', (string)trans('firefly.deleted_link_type', ['name' => $name])); $request->session()->flash('success', (string) trans('firefly.deleted_link_type', ['name' => $name]));
app('preferences')->mark(); app('preferences')->mark();
return redirect($this->getPreviousUri('link-types.delete.uri')); return redirect($this->getPreviousUri('link-types.delete.uri'));
@ -140,19 +144,19 @@ class LinkController extends Controller
/** /**
* Edit a link form. * Edit a link form.
* *
* @param Request $request * @param Request $request
* @param LinkType $linkType * @param LinkType $linkType
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View * @return Factory|RedirectResponse|Redirector|\Illuminate\View\View
*/ */
public function edit(Request $request, LinkType $linkType) public function edit(Request $request, LinkType $linkType)
{ {
if (!$linkType->editable) { if (!$linkType->editable) {
$request->session()->flash('error', (string)trans('firefly.cannot_edit_link_type', ['name' => e($linkType->name)])); $request->session()->flash('error', (string) trans('firefly.cannot_edit_link_type', ['name' => e($linkType->name)]));
return redirect(route('admin.links.index')); return redirect(route('admin.links.index'));
} }
$subTitle = (string)trans('firefly.edit_link_type', ['name' => $linkType->name]); $subTitle = (string) trans('firefly.edit_link_type', ['name' => $linkType->name]);
$subTitleIcon = 'fa-link'; $subTitleIcon = 'fa-link';
Log::channel('audit')->info(sprintf('User wants to edit link type #%d', $linkType->id)); Log::channel('audit')->info(sprintf('User wants to edit link type #%d', $linkType->id));
@ -169,11 +173,11 @@ class LinkController extends Controller
/** /**
* Show index of all links. * Show index of all links.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|\Illuminate\View\View
*/ */
public function index() public function index()
{ {
$subTitle = (string)trans('firefly.journal_link_configuration'); $subTitle = (string) trans('firefly.journal_link_configuration');
$subTitleIcon = 'fa-link'; $subTitleIcon = 'fa-link';
$linkTypes = $this->repository->get(); $linkTypes = $this->repository->get();
@ -192,11 +196,11 @@ class LinkController extends Controller
* *
* @param LinkType $linkType * @param LinkType $linkType
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|\Illuminate\View\View
*/ */
public function show(LinkType $linkType) public function show(LinkType $linkType)
{ {
$subTitle = (string)trans('firefly.overview_for_link', ['name' => $linkType->name]); $subTitle = (string) trans('firefly.overview_for_link', ['name' => $linkType->name]);
$subTitleIcon = 'fa-link'; $subTitleIcon = 'fa-link';
$links = $this->repository->getJournalLinks($linkType); $links = $this->repository->getJournalLinks($linkType);
@ -210,7 +214,7 @@ class LinkController extends Controller
* *
* @param LinkTypeFormRequest $request * @param LinkTypeFormRequest $request
* *
* @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return $this|RedirectResponse|Redirector
*/ */
public function store(LinkTypeFormRequest $request) public function store(LinkTypeFormRequest $request)
{ {
@ -223,9 +227,9 @@ class LinkController extends Controller
Log::channel('audit')->info('User stored new link type.', $linkType->toArray()); Log::channel('audit')->info('User stored new link type.', $linkType->toArray());
$request->session()->flash('success', (string)trans('firefly.stored_new_link_type', ['name' => $linkType->name])); $request->session()->flash('success', (string) trans('firefly.stored_new_link_type', ['name' => $linkType->name]));
$redirect = redirect($this->getPreviousUri('link-types.create.uri')); $redirect = redirect($this->getPreviousUri('link-types.create.uri'));
if (1 === (int)$request->get('create_another')) { if (1 === (int) $request->get('create_another')) {
// set value so create routine will not overwrite URL: // set value so create routine will not overwrite URL:
$request->session()->put('link-types.create.fromStore', true); $request->session()->put('link-types.create.fromStore', true);
@ -240,14 +244,14 @@ class LinkController extends Controller
* Update an existing link. * Update an existing link.
* *
* @param LinkTypeFormRequest $request * @param LinkTypeFormRequest $request
* @param LinkType $linkType * @param LinkType $linkType
* *
* @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return $this|RedirectResponse|Redirector
*/ */
public function update(LinkTypeFormRequest $request, LinkType $linkType) public function update(LinkTypeFormRequest $request, LinkType $linkType)
{ {
if (!$linkType->editable) { if (!$linkType->editable) {
$request->session()->flash('error', (string)trans('firefly.cannot_edit_link_type', ['name' => e($linkType->name)])); $request->session()->flash('error', (string) trans('firefly.cannot_edit_link_type', ['name' => e($linkType->name)]));
return redirect(route('admin.links.index')); return redirect(route('admin.links.index'));
} }
@ -261,10 +265,10 @@ class LinkController extends Controller
Log::channel('audit')->info(sprintf('User update link type #%d.', $linkType->id), $data); Log::channel('audit')->info(sprintf('User update link type #%d.', $linkType->id), $data);
$request->session()->flash('success', (string)trans('firefly.updated_link_type', ['name' => $linkType->name])); $request->session()->flash('success', (string) trans('firefly.updated_link_type', ['name' => $linkType->name]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('link-types.edit.uri')); $redirect = redirect($this->getPreviousUri('link-types.edit.uri'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// set value so edit routine will not overwrite URL: // set value so edit routine will not overwrite URL:
$request->session()->put('link-types.edit.fromUpdate', true); $request->session()->put('link-types.edit.fromUpdate', true);

View File

@ -21,8 +21,9 @@
namespace FireflyIII\Http\Controllers\Admin; namespace FireflyIII\Http\Controllers\Admin;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use Illuminate\Contracts\View\Factory;
use Illuminate\View\View;
/** /**
* Class TelemetryController * Class TelemetryController
@ -35,7 +36,7 @@ class TelemetryController extends Controller
$this->middleware( $this->middleware(
static function ($request, $next) { static function ($request, $next) {
app('view')->share('title', (string)trans('firefly.administration')); app('view')->share('title', (string) trans('firefly.administration'));
app('view')->share('mainTitleIcon', 'fa-hand-spock-o'); app('view')->share('mainTitleIcon', 'fa-hand-spock-o');
return $next($request); return $next($request);
@ -59,7 +60,7 @@ class TelemetryController extends Controller
public function index() public function index()
{ {
app('view')->share('subTitleIcon', 'fa-eye'); app('view')->share('subTitleIcon', 'fa-eye');
app('view')->share('subTitle', (string)trans('firefly.telemetry_admin_index')); app('view')->share('subTitle', (string) trans('firefly.telemetry_admin_index'));
$version = config('firefly.version'); $version = config('firefly.version');
$enabled = config('firefly.telemetry', false); $enabled = config('firefly.telemetry', false);
$count = 1; $count = 1;
@ -68,11 +69,10 @@ class TelemetryController extends Controller
} }
/** /**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function view() public function view()
{ {
return view('admin.telemetry.view'); return view('admin.telemetry.view');
} }
}
}

View File

@ -27,8 +27,13 @@ use FireflyIII\Helpers\Update\UpdateTrait;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Http\Middleware\IsSandStormUser; use FireflyIII\Http\Middleware\IsSandStormUser;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
/** /**
* Class HomeController. * Class HomeController.
@ -45,7 +50,7 @@ class UpdateController extends Controller
parent::__construct(); parent::__construct();
$this->middleware( $this->middleware(
static function ($request, $next) { static function ($request, $next) {
app('view')->share('title', (string)trans('firefly.administration')); app('view')->share('title', (string) trans('firefly.administration'));
app('view')->share('mainTitleIcon', 'fa-hand-spock-o'); app('view')->share('mainTitleIcon', 'fa-hand-spock-o');
return $next($request); return $next($request);
@ -58,28 +63,28 @@ class UpdateController extends Controller
/** /**
* Show page with update options. * Show page with update options.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @throws NotFoundExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface * @throws ContainerExceptionInterface
* @throws \Psr\Container\ContainerExceptionInterface * @return Factory|View
*/ */
public function index() public function index()
{ {
$subTitle = (string)trans('firefly.update_check_title'); $subTitle = (string) trans('firefly.update_check_title');
$subTitleIcon = 'fa-star'; $subTitleIcon = 'fa-star';
$permission = app('fireflyconfig')->get('permission_update_check', -1); $permission = app('fireflyconfig')->get('permission_update_check', -1);
$channel = app('fireflyconfig')->get('update_channel', 'stable'); $channel = app('fireflyconfig')->get('update_channel', 'stable');
$selected = $permission->data; $selected = $permission->data;
$channelSelected = $channel->data; $channelSelected = $channel->data;
$options = [ $options = [
-1 => (string)trans('firefly.updates_ask_me_later'), -1 => (string) trans('firefly.updates_ask_me_later'),
0 => (string)trans('firefly.updates_do_not_check'), 0 => (string) trans('firefly.updates_do_not_check'),
1 => (string)trans('firefly.updates_enable_check'), 1 => (string) trans('firefly.updates_enable_check'),
]; ];
$channelOptions = [ $channelOptions = [
'stable' => (string)trans('firefly.update_channel_stable'), 'stable' => (string) trans('firefly.update_channel_stable'),
'beta' => (string)trans('firefly.update_channel_beta'), 'beta' => (string) trans('firefly.update_channel_beta'),
'alpha' => (string)trans('firefly.update_channel_alpha'), 'alpha' => (string) trans('firefly.update_channel_alpha'),
]; ];
return view('admin.update.index', compact('subTitle', 'subTitleIcon', 'selected', 'options', 'channelSelected', 'channelOptions')); return view('admin.update.index', compact('subTitle', 'subTitleIcon', 'selected', 'options', 'channelSelected', 'channelOptions'));
@ -90,17 +95,17 @@ class UpdateController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function post(Request $request) public function post(Request $request)
{ {
$checkForUpdates = (int)$request->get('check_for_updates'); $checkForUpdates = (int) $request->get('check_for_updates');
$channel = $request->get('update_channel'); $channel = $request->get('update_channel');
$channel = in_array($channel, ['stable', 'beta', 'alpha'], true) ? $channel : 'stable'; $channel = in_array($channel, ['stable', 'beta', 'alpha'], true) ? $channel : 'stable';
app('fireflyconfig')->set('permission_update_check', $checkForUpdates); app('fireflyconfig')->set('permission_update_check', $checkForUpdates);
app('fireflyconfig')->set('last_update_check', time()); app('fireflyconfig')->set('last_update_check', time());
app('fireflyconfig')->set('update_channel', $channel); app('fireflyconfig')->set('update_channel', $channel);
session()->flash('success', (string)trans('firefly.configuration_updated')); session()->flash('success', (string) trans('firefly.configuration_updated'));
return redirect(route('admin.update-check')); return redirect(route('admin.update-check'));
} }
@ -110,7 +115,7 @@ class UpdateController extends Controller
*/ */
public function updateCheck(): RedirectResponse public function updateCheck(): RedirectResponse
{ {
$release = $this->getLatestRelease(); $release = $this->getLatestRelease();
session()->flash($release['level'], $release['message']); session()->flash($release['level'], $release['message']);

View File

@ -28,6 +28,8 @@ use FireflyIII\Http\Middleware\IsSandStormUser;
use FireflyIII\Http\Requests\UserFormRequest; use FireflyIII\Http\Requests\UserFormRequest;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Routing\Redirector;
use Log; use Log;
/** /**
@ -47,9 +49,10 @@ class UserController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.administration')); app('view')->share('title', (string) trans('firefly.administration'));
app('view')->share('mainTitleIcon', 'fa-hand-spock-o'); app('view')->share('mainTitleIcon', 'fa-hand-spock-o');
$this->repository = app(UserRepositoryInterface::class); $this->repository = app(UserRepositoryInterface::class);
return $next($request); return $next($request);
} }
); );
@ -66,7 +69,7 @@ class UserController extends Controller
*/ */
public function delete(User $user) public function delete(User $user)
{ {
$subTitle = (string)trans('firefly.delete_user', ['email' => $user->email]); $subTitle = (string) trans('firefly.delete_user', ['email' => $user->email]);
return view('admin.users.delete', compact('user', 'subTitle')); return view('admin.users.delete', compact('user', 'subTitle'));
} }
@ -74,14 +77,14 @@ class UserController extends Controller
/** /**
* Destroy a user. * Destroy a user.
* *
* @param User $user * @param User $user
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function destroy(User $user) public function destroy(User $user)
{ {
$this->repository->destroy($user); $this->repository->destroy($user);
session()->flash('success', (string)trans('firefly.user_deleted')); session()->flash('success', (string) trans('firefly.user_deleted'));
return redirect(route('admin.users')); return redirect(route('admin.users'));
} }
@ -101,13 +104,13 @@ class UserController extends Controller
} }
session()->forget('users.edit.fromUpdate'); session()->forget('users.edit.fromUpdate');
$subTitle = (string)trans('firefly.edit_user', ['email' => $user->email]); $subTitle = (string) trans('firefly.edit_user', ['email' => $user->email]);
$subTitleIcon = 'fa-user-o'; $subTitleIcon = 'fa-user-o';
$codes = [ $codes = [
'' => (string)trans('firefly.no_block_code'), '' => (string) trans('firefly.no_block_code'),
'bounced' => (string)trans('firefly.block_code_bounced'), 'bounced' => (string) trans('firefly.block_code_bounced'),
'expired' => (string)trans('firefly.block_code_expired'), 'expired' => (string) trans('firefly.block_code_expired'),
'email_changed' => (string)trans('firefly.block_code_email_changed'), 'email_changed' => (string) trans('firefly.block_code_email_changed'),
]; ];
return view('admin.users.edit', compact('user', 'subTitle', 'subTitleIcon', 'codes')); return view('admin.users.edit', compact('user', 'subTitle', 'subTitleIcon', 'codes'));
@ -120,7 +123,7 @@ class UserController extends Controller
*/ */
public function index() public function index()
{ {
$subTitle = (string)trans('firefly.user_administration'); $subTitle = (string) trans('firefly.user_administration');
$subTitleIcon = 'fa-users'; $subTitleIcon = 'fa-users';
$users = $this->repository->all(); $users = $this->repository->all();
@ -138,32 +141,38 @@ class UserController extends Controller
/** /**
* Show single user. * Show single user.
* *
* @param User $user * @param User $user
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/ */
public function show(User $user) public function show(User $user)
{ {
$title = (string)trans('firefly.administration'); $title = (string) trans('firefly.administration');
$mainTitleIcon = 'fa-hand-spock-o'; $mainTitleIcon = 'fa-hand-spock-o';
$subTitle = (string)trans('firefly.single_user_administration', ['email' => $user->email]); $subTitle = (string) trans('firefly.single_user_administration', ['email' => $user->email]);
$subTitleIcon = 'fa-user'; $subTitleIcon = 'fa-user';
$information = $this->repository->getUserData($user); $information = $this->repository->getUserData($user);
return view( return view(
'admin.users.show', compact( 'admin.users.show',
'title', 'mainTitleIcon', 'subTitle', 'subTitleIcon', 'information', 'user' compact(
) 'title',
'mainTitleIcon',
'subTitle',
'subTitleIcon',
'information',
'user'
)
); );
} }
/** /**
* Update single user. * Update single user.
* *
* @param UserFormRequest $request * @param UserFormRequest $request
* @param User $user * @param User $user
* *
* @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return $this|RedirectResponse|Redirector
*/ */
public function update(UserFormRequest $request, User $user) public function update(UserFormRequest $request, User $user)
{ {
@ -178,10 +187,10 @@ class UserController extends Controller
$this->repository->changeStatus($user, $data['blocked'], $data['blocked_code']); $this->repository->changeStatus($user, $data['blocked'], $data['blocked_code']);
$this->repository->updateEmail($user, $data['email']); $this->repository->updateEmail($user, $data['email']);
session()->flash('success', (string)trans('firefly.updated_user', ['email' => $user->email])); session()->flash('success', (string) trans('firefly.updated_user', ['email' => $user->email]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('users.edit.uri')); $redirect = redirect($this->getPreviousUri('users.edit.uri'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
session()->put('users.edit.fromUpdate', true); session()->put('users.edit.fromUpdate', true);

View File

@ -41,6 +41,7 @@ class AttachmentController extends Controller
/** /**
* AttachmentController constructor. * AttachmentController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -51,7 +52,7 @@ class AttachmentController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-paperclip'); app('view')->share('mainTitleIcon', 'fa-paperclip');
app('view')->share('title', (string)trans('firefly.attachments')); app('view')->share('title', (string) trans('firefly.attachments'));
$this->repository = app(AttachmentRepositoryInterface::class); $this->repository = app(AttachmentRepositoryInterface::class);
return $next($request); return $next($request);
@ -68,7 +69,7 @@ class AttachmentController extends Controller
*/ */
public function delete(Attachment $attachment) public function delete(Attachment $attachment)
{ {
$subTitle = (string)trans('firefly.delete_attachment', ['name' => $attachment->filename]); $subTitle = (string) trans('firefly.delete_attachment', ['name' => $attachment->filename]);
// put previous url in session // put previous url in session
$this->rememberPreviousUri('attachments.delete.uri'); $this->rememberPreviousUri('attachments.delete.uri');
@ -79,7 +80,7 @@ class AttachmentController extends Controller
/** /**
* Destroy attachment. * Destroy attachment.
* *
* @param Request $request * @param Request $request
* @param Attachment $attachment * @param Attachment $attachment
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
@ -90,7 +91,7 @@ class AttachmentController extends Controller
$this->repository->destroy($attachment); $this->repository->destroy($attachment);
$request->session()->flash('success', (string)trans('firefly.attachment_deleted', ['name' => $name])); $request->session()->flash('success', (string) trans('firefly.attachment_deleted', ['name' => $name]));
app('preferences')->mark(); app('preferences')->mark();
return redirect($this->getPreviousUri('attachments.delete.uri')); return redirect($this->getPreviousUri('attachments.delete.uri'));
@ -101,9 +102,9 @@ class AttachmentController extends Controller
* *
* @param Attachment $attachment * @param Attachment $attachment
* *
* @throws FireflyException
* @return mixed * @return mixed
* *
* @throws FireflyException
*/ */
public function download(Attachment $attachment) public function download(Attachment $attachment)
{ {
@ -132,7 +133,7 @@ class AttachmentController extends Controller
/** /**
* Edit an attachment. * Edit an attachment.
* *
* @param Request $request * @param Request $request
* @param Attachment $attachment * @param Attachment $attachment
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
@ -140,7 +141,7 @@ class AttachmentController extends Controller
public function edit(Request $request, Attachment $attachment) public function edit(Request $request, Attachment $attachment)
{ {
$subTitleIcon = 'fa-pencil'; $subTitleIcon = 'fa-pencil';
$subTitle = (string)trans('firefly.edit_attachment', ['name' => $attachment->filename]); $subTitle = (string) trans('firefly.edit_attachment', ['name' => $attachment->filename]);
// put previous url in session if not redirect from store (not "return_to_edit"). // put previous url in session if not redirect from store (not "return_to_edit").
if (true !== session('attachments.edit.fromUpdate')) { if (true !== session('attachments.edit.fromUpdate')) {
@ -179,7 +180,7 @@ class AttachmentController extends Controller
* Update attachment. * Update attachment.
* *
* @param AttachmentFormRequest $request * @param AttachmentFormRequest $request
* @param Attachment $attachment * @param Attachment $attachment
* *
* @return RedirectResponse * @return RedirectResponse
*/ */
@ -188,11 +189,11 @@ class AttachmentController extends Controller
$data = $request->getAttachmentData(); $data = $request->getAttachmentData();
$this->repository->update($attachment, $data); $this->repository->update($attachment, $data);
$request->session()->flash('success', (string)trans('firefly.attachment_updated', ['name' => $attachment->filename])); $request->session()->flash('success', (string) trans('firefly.attachment_updated', ['name' => $attachment->filename]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('attachments.edit.uri')); $redirect = redirect($this->getPreviousUri('attachments.edit.uri'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->put('attachments.edit.fromUpdate', true); $request->session()->put('attachments.edit.fromUpdate', true);
@ -209,8 +210,8 @@ class AttachmentController extends Controller
* *
* @param Attachment $attachment * @param Attachment $attachment
* *
* @return LaravelResponse
* @throws FireflyException * @throws FireflyException
* @return LaravelResponse
*/ */
public function view(Request $request, Attachment $attachment): LaravelResponse public function view(Request $request, Attachment $attachment): LaravelResponse
{ {
@ -231,11 +232,13 @@ class AttachmentController extends Controller
]; ];
return response()->make( return response()->make(
$content, 200, [ $content,
'Content-Security-Policy' => implode('; ', $csp), 200,
'Content-Type' => $attachment->mime, [
'Content-Disposition' => 'inline; filename="' . $attachment->filename . '"', 'Content-Security-Policy' => implode('; ', $csp),
] 'Content-Type' => $attachment->mime,
'Content-Disposition' => 'inline; filename="' . $attachment->filename . '"',
]
); );
} }
throw new FireflyException('Could not find the indicated attachment. The file is no longer there.'); throw new FireflyException('Could not find the indicated attachment. The file is no longer there.');

View File

@ -26,13 +26,18 @@ namespace FireflyIII\Http\Controllers\Auth;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Contracts\View\Factory;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails; use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password; use Illuminate\Support\Facades\Password;
use Illuminate\View\View;
use Log; use Log;
/** /**
* Class ForgotPasswordController * Class ForgotPasswordController
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
class ForgotPasswordController extends Controller class ForgotPasswordController extends Controller
@ -51,11 +56,11 @@ class ForgotPasswordController extends Controller
/** /**
* Send a reset link to the given user. * Send a reset link to the given user.
* *
* @param \Illuminate\Http\Request $request * @param Request $request
* *
* @param UserRepositoryInterface $repository * @param UserRepositoryInterface $repository
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse * @return RedirectResponse|JsonResponse
*/ */
public function sendResetLinkEmail(Request $request, UserRepositoryInterface $repository) public function sendResetLinkEmail(Request $request, UserRepositoryInterface $repository)
{ {
@ -77,7 +82,7 @@ class ForgotPasswordController extends Controller
$user = User::where('email', $request->get('email'))->first(); $user = User::where('email', $request->get('email'))->first();
if (null !== $user && $repository->hasRole($user, 'demo')) { if (null !== $user && $repository->hasRole($user, 'demo')) {
return back()->withErrors(['email' => (string)trans('firefly.cannot_reset_demo_user')]); return back()->withErrors(['email' => (string) trans('firefly.cannot_reset_demo_user')]);
} }
// We will send the password reset link to this user. Once we have attempted // We will send the password reset link to this user. Once we have attempted
@ -99,7 +104,7 @@ class ForgotPasswordController extends Controller
* *
* @codeCoverageIgnore * @codeCoverageIgnore
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function showLinkRequestForm() public function showLinkRequestForm()
{ {
@ -114,7 +119,7 @@ class ForgotPasswordController extends Controller
$singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
$userCount = User::count(); $userCount = User::count();
$allowRegistration = true; $allowRegistration = true;
$pageTitle = (string)trans('firefly.forgot_pw_page_title'); $pageTitle = (string) trans('firefly.forgot_pw_page_title');
if (true === $singleUserMode && $userCount > 0) { if (true === $singleUserMode && $userCount > 0) {
$allowRegistration = false; $allowRegistration = false;
} }

View File

@ -26,10 +26,15 @@ use Adldap;
use DB; use DB;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Providers\RouteServiceProvider; use FireflyIII\Providers\RouteServiceProvider;
use Illuminate\Contracts\View\Factory;
use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Illuminate\View\View;
use Log; use Log;
use Symfony\Component\HttpFoundation\Response;
/** /**
* Class LoginController * Class LoginController
@ -66,11 +71,11 @@ class LoginController extends Controller
/** /**
* Handle a login request to the application. * Handle a login request to the application.
* *
* @param \Illuminate\Http\Request $request * @param Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Http\JsonResponse * @throws ValidationException
* @return RedirectResponse|\Illuminate\Http\Response|JsonResponse
* *
* @throws \Illuminate\Validation\ValidationException
*/ */
public function login(Request $request) public function login(Request $request)
{ {
@ -121,13 +126,13 @@ class LoginController extends Controller
/** /**
* Show the application's login form. * Show the application's login form.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\Response|\Illuminate\View\View * @return Factory|\Illuminate\Http\Response|View
*/ */
public function showLoginForm(Request $request) public function showLoginForm(Request $request)
{ {
$count = DB::table('users')->count(); $count = DB::table('users')->count();
$loginProvider = config('firefly.login_provider'); $loginProvider = config('firefly.login_provider');
$title = (string)trans('firefly.login_page_title'); $title = (string) trans('firefly.login_page_title');
if (0 === $count && 'eloquent' === $loginProvider) { if (0 === $count && 'eloquent' === $loginProvider) {
return redirect(route('register')); // @codeCoverageIgnore return redirect(route('register')); // @codeCoverageIgnore
} }
@ -155,11 +160,11 @@ class LoginController extends Controller
/** /**
* Get the failed login response instance. * Get the failed login response instance.
* *
* @param \Illuminate\Http\Request $request * @param Request $request
*
* @return \Symfony\Component\HttpFoundation\Response
* *
* @throws ValidationException * @throws ValidationException
* @return Response
*
*/ */
protected function sendFailedLoginResponse(Request $request) protected function sendFailedLoginResponse(Request $request)
{ {

View File

@ -28,9 +28,12 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Support\Http\Controllers\CreateStuff; use FireflyIII\Support\Http\Controllers\CreateStuff;
use FireflyIII\Support\Http\Controllers\RequestInformation; use FireflyIII\Support\Http\Controllers\RequestInformation;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Auth\Events\Registered; use Illuminate\Contracts\View\Factory;
use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -67,7 +70,7 @@ class RegisterController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View * @return Factory|RedirectResponse|Redirector|View
*/ */
public function register(Request $request) public function register(Request $request)
{ {
@ -97,7 +100,7 @@ class RegisterController extends Controller
$this->guard()->login($user); $this->guard()->login($user);
session()->flash('success', (string)trans('firefly.registered')); session()->flash('success', (string) trans('firefly.registered'));
$this->registered($request, $user); $this->registered($request, $user);
@ -109,7 +112,7 @@ class RegisterController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function showRegistrationForm(Request $request) public function showRegistrationForm(Request $request)
{ {
@ -118,7 +121,7 @@ class RegisterController extends Controller
$isDemoSite = app('fireflyconfig')->get('is_demo_site', config('firefly.configuration.is_demo_site'))->data; $isDemoSite = app('fireflyconfig')->get('is_demo_site', config('firefly.configuration.is_demo_site'))->data;
$singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
$userCount = User::count(); $userCount = User::count();
$pageTitle = (string)trans('firefly.register_page_title'); $pageTitle = (string) trans('firefly.register_page_title');
if (true === $isDemoSite) { if (true === $isDemoSite) {
$allowRegistration = false; $allowRegistration = false;

View File

@ -25,9 +25,13 @@ namespace FireflyIII\Http\Controllers\Auth;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Contracts\View\Factory;
use Illuminate\Foundation\Auth\ResetsPasswords; use Illuminate\Foundation\Auth\ResetsPasswords;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password; use Illuminate\Support\Facades\Password;
use Illuminate\View\View;
/** /**
* Class ResetPasswordController * Class ResetPasswordController
@ -61,10 +65,10 @@ class ResetPasswordController extends Controller
/** /**
* Reset the given user's password. * Reset the given user's password.
* *
* @param \Illuminate\Http\Request $request * @param Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
* @throws \Illuminate\Validation\ValidationException * @throws \Illuminate\Validation\ValidationException
* @return RedirectResponse|JsonResponse
*/ */
public function reset(Request $request) public function reset(Request $request)
{ {
@ -87,9 +91,10 @@ class ResetPasswordController extends Controller
// will update the password on an actual user model and persist it to the // will update the password on an actual user model and persist it to the
// database. Otherwise we will parse the error and return the response. // database. Otherwise we will parse the error and return the response.
$response = $this->broker()->reset( $response = $this->broker()->reset(
$this->credentials($request), function ($user, $password) { $this->credentials($request),
$this->resetPassword($user, $password); function ($user, $password) {
} $this->resetPassword($user, $password);
}
); );
// If the password was successfully reset, we will redirect the user back to // If the password was successfully reset, we will redirect the user back to
@ -105,10 +110,10 @@ class ResetPasswordController extends Controller
* *
* If no token is present, display the link request form. * If no token is present, display the link request form.
* *
* @param Request $request * @param Request $request
* @param string|null $token * @param string|null $token
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function showResetForm(Request $request, $token = null) public function showResetForm(Request $request, $token = null)
{ {
@ -123,7 +128,7 @@ class ResetPasswordController extends Controller
$singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $singleUserMode = app('fireflyconfig')->get('single_user_mode', config('firefly.configuration.single_user_mode'))->data;
$userCount = User::count(); $userCount = User::count();
$allowRegistration = true; $allowRegistration = true;
$pageTitle = (string)trans('firefly.reset_pw_page_title'); $pageTitle = (string) trans('firefly.reset_pw_page_title');
if (true === $singleUserMode && $userCount > 0) { if (true === $singleUserMode && $userCount > 0) {
$allowRegistration = false; $allowRegistration = false;
} }

View File

@ -24,8 +24,9 @@ namespace FireflyIII\Http\Controllers\Auth;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Log; use Illuminate\Routing\Redirector;
use PragmaRX\Google2FALaravel\Support\Authenticator; use PragmaRX\Google2FALaravel\Support\Authenticator;
use Preferences; use Preferences;
@ -44,14 +45,15 @@ class TwoFactorController extends Controller
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
$siteOwner = config('firefly.site_owner'); $siteOwner = config('firefly.site_owner');
$title = (string)trans('firefly.two_factor_forgot_title'); $title = (string) trans('firefly.two_factor_forgot_title');
return view('auth.lost-two-factor', compact('user', 'siteOwner', 'title')); return view('auth.lost-two-factor', compact('user', 'siteOwner', 'title'));
} }
/** /**
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function submitMFA(Request $request) public function submitMFA(Request $request)
{ {

View File

@ -34,14 +34,17 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\TransactionRules\TransactionMatcher; use FireflyIII\TransactionRules\TransactionMatcher;
use FireflyIII\Transformers\AttachmentTransformer; use FireflyIII\Transformers\AttachmentTransformer;
use FireflyIII\Transformers\BillTransformer; use FireflyIII\Transformers\BillTransformer;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View;
use League\Fractal\Manager; use League\Fractal\Manager;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use League\Fractal\Serializer\DataArraySerializer; use League\Fractal\Serializer\DataArraySerializer;
use Symfony\Component\HttpFoundation\ParameterBag;
use Log; use Log;
use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
* Class BillController. * Class BillController.
@ -71,7 +74,7 @@ class BillController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.bills')); app('view')->share('title', (string) trans('firefly.bills'));
app('view')->share('mainTitleIcon', 'fa-calendar-o'); app('view')->share('mainTitleIcon', 'fa-calendar-o');
$this->attachments = app(AttachmentHelperInterface::class); $this->attachments = app(AttachmentHelperInterface::class);
$this->billRepository = app(BillRepositoryInterface::class); $this->billRepository = app(BillRepositoryInterface::class);
@ -86,7 +89,7 @@ class BillController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function create(Request $request) public function create(Request $request)
{ {
@ -94,9 +97,9 @@ class BillController extends Controller
/** @var array $billPeriods */ /** @var array $billPeriods */
$billPeriods = config('firefly.bill_periods'); $billPeriods = config('firefly.bill_periods');
foreach ($billPeriods as $current) { foreach ($billPeriods as $current) {
$periods[$current] = strtolower((string)trans('firefly.repeat_freq_' . $current)); $periods[$current] = strtolower((string) trans('firefly.repeat_freq_' . $current));
} }
$subTitle = (string)trans('firefly.create_new_bill'); $subTitle = (string) trans('firefly.create_new_bill');
$defaultCurrency = app('amount')->getDefaultCurrency(); $defaultCurrency = app('amount')->getDefaultCurrency();
// put previous url in session if not redirect from store (not "create another"). // put previous url in session if not redirect from store (not "create another").
@ -113,13 +116,13 @@ class BillController extends Controller
* *
* @param Bill $bill * @param Bill $bill
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function delete(Bill $bill) public function delete(Bill $bill)
{ {
// put previous url in session // put previous url in session
$this->rememberPreviousUri('bills.delete.uri'); $this->rememberPreviousUri('bills.delete.uri');
$subTitle = (string)trans('firefly.delete_bill', ['name' => $bill->name]); $subTitle = (string) trans('firefly.delete_bill', ['name' => $bill->name]);
return view('bills.delete', compact('bill', 'subTitle')); return view('bills.delete', compact('bill', 'subTitle'));
} }
@ -130,14 +133,14 @@ class BillController extends Controller
* @param Request $request * @param Request $request
* @param Bill $bill * @param Bill $bill
* *
* @return RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function destroy(Request $request, Bill $bill) public function destroy(Request $request, Bill $bill)
{ {
$name = $bill->name; $name = $bill->name;
$this->billRepository->destroy($bill); $this->billRepository->destroy($bill);
$request->session()->flash('success', (string)trans('firefly.deleted_bill', ['name' => $name])); $request->session()->flash('success', (string) trans('firefly.deleted_bill', ['name' => $name]));
app('preferences')->mark(); app('preferences')->mark();
return redirect($this->getPreviousUri('bills.delete.uri')); return redirect($this->getPreviousUri('bills.delete.uri'));
@ -149,7 +152,7 @@ class BillController extends Controller
* @param Request $request * @param Request $request
* @param Bill $bill * @param Bill $bill
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function edit(Request $request, Bill $bill) public function edit(Request $request, Bill $bill)
{ {
@ -158,10 +161,10 @@ class BillController extends Controller
$billPeriods = config('firefly.bill_periods'); $billPeriods = config('firefly.bill_periods');
foreach ($billPeriods as $current) { foreach ($billPeriods as $current) {
$periods[$current] = (string)trans('firefly.' . $current); $periods[$current] = (string) trans('firefly.' . $current);
} }
$subTitle = (string)trans('firefly.edit_bill', ['name' => $bill->name]); $subTitle = (string) trans('firefly.edit_bill', ['name' => $bill->name]);
// put previous url in session if not redirect from store (not "return_to_edit"). // put previous url in session if not redirect from store (not "return_to_edit").
if (true !== session('bills.edit.fromUpdate')) { if (true !== session('bills.edit.fromUpdate')) {
@ -169,8 +172,8 @@ class BillController extends Controller
} }
$currency = app('amount')->getDefaultCurrency(); $currency = app('amount')->getDefaultCurrency();
$bill->amount_min = round((float)$bill->amount_min, $currency->decimal_places); $bill->amount_min = round((float) $bill->amount_min, $currency->decimal_places);
$bill->amount_max = round((float)$bill->amount_max, $currency->decimal_places); $bill->amount_max = round((float) $bill->amount_max, $currency->decimal_places);
$defaultCurrency = app('amount')->getDefaultCurrency(); $defaultCurrency = app('amount')->getDefaultCurrency();
// code to handle active-checkboxes // code to handle active-checkboxes
@ -179,7 +182,7 @@ class BillController extends Controller
$preFilled = [ $preFilled = [
'notes' => $this->billRepository->getNoteText($bill), 'notes' => $this->billRepository->getNoteText($bill),
'transaction_currency_id' => $bill->transaction_currency_id, 'transaction_currency_id' => $bill->transaction_currency_id,
'active' => $hasOldInput ? (bool)$request->old('active') : $bill->active, 'active' => $hasOldInput ? (bool) $request->old('active') : $bill->active,
]; ];
$request->session()->flash('preFilled', $preFilled); $request->session()->flash('preFilled', $preFilled);
@ -191,7 +194,7 @@ class BillController extends Controller
/** /**
* Show all bills. * Show all bills.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index() public function index()
{ {
@ -244,14 +247,14 @@ class BillController extends Controller
* @param Request $request * @param Request $request
* @param Bill $bill * @param Bill $bill
* *
* @return RedirectResponse|\Illuminate\Routing\Redirector * @throws FireflyException
* @throws \FireflyIII\Exceptions\FireflyException * @return RedirectResponse|Redirector
*/ */
public function rescan(Request $request, Bill $bill) public function rescan(Request $request, Bill $bill)
{ {
$total = 0; $total = 0;
if (false === $bill->active) { if (false === $bill->active) {
$request->session()->flash('warning', (string)trans('firefly.cannot_scan_inactive_bill')); $request->session()->flash('warning', (string) trans('firefly.cannot_scan_inactive_bill'));
return redirect(route('bills.show', [$bill->id])); return redirect(route('bills.show', [$bill->id]));
} }
@ -261,7 +264,7 @@ class BillController extends Controller
$total = 0; $total = 0;
} }
if (0 === $set->count()) { if (0 === $set->count()) {
$request->session()->flash('error', (string)trans('firefly.no_rules_for_bill')); $request->session()->flash('error', (string) trans('firefly.no_rules_for_bill'));
return redirect(route('bills.show', [$bill->id])); return redirect(route('bills.show', [$bill->id]));
} }
@ -282,7 +285,7 @@ class BillController extends Controller
} }
$request->session()->flash('success', (string)trans('firefly.rescanned_bill', ['total' => $total])); $request->session()->flash('success', (string) trans('firefly.rescanned_bill', ['total' => $total]));
app('preferences')->mark(); app('preferences')->mark();
return redirect(route('bills.show', [$bill->id])); return redirect(route('bills.show', [$bill->id]));
@ -294,7 +297,7 @@ class BillController extends Controller
* @param Request $request * @param Request $request
* @param Bill $bill * @param Bill $bill
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function show(Request $request, Bill $bill) public function show(Request $request, Bill $bill)
{ {
@ -306,8 +309,8 @@ class BillController extends Controller
/** @var Carbon $end */ /** @var Carbon $end */
$end = session('end'); $end = session('end');
$year = $start->year; $year = $start->year;
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$yearAverage = $this->billRepository->getYearAverage($bill, $start); $yearAverage = $this->billRepository->getYearAverage($bill, $start);
$overallAverage = $this->billRepository->getOverallAverage($bill); $overallAverage = $this->billRepository->getOverallAverage($bill);
$manager = new Manager(); $manager = new Manager();
@ -372,11 +375,11 @@ class BillController extends Controller
$bill = $this->billRepository->store($billData); $bill = $this->billRepository->store($billData);
} catch (FireflyException $e) { } catch (FireflyException $e) {
Log::error($e->getMessage()); Log::error($e->getMessage());
$request->session()->flash('error', (string)trans('firefly.bill_store_error')); $request->session()->flash('error', (string) trans('firefly.bill_store_error'));
return redirect(route('bills.create'))->withInput(); return redirect(route('bills.create'))->withInput();
} }
$request->session()->flash('success', (string)trans('firefly.stored_new_bill', ['name' => $bill->name])); $request->session()->flash('success', (string) trans('firefly.stored_new_bill', ['name' => $bill->name]));
app('preferences')->mark(); app('preferences')->mark();
/** @var array $files */ /** @var array $files */
@ -403,7 +406,7 @@ class BillController extends Controller
$billData = $request->getBillData(); $billData = $request->getBillData();
$bill = $this->billRepository->update($bill, $billData); $bill = $this->billRepository->update($bill, $billData);
$request->session()->flash('success', (string)trans('firefly.updated_bill', ['name' => $bill->name])); $request->session()->flash('success', (string) trans('firefly.updated_bill', ['name' => $bill->name]));
app('preferences')->mark(); app('preferences')->mark();
/** @var array $files */ /** @var array $files */
@ -416,7 +419,7 @@ class BillController extends Controller
} }
$redirect = redirect($this->getPreviousUri('bills.edit.uri')); $redirect = redirect($this->getPreviousUri('bills.edit.uri'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->put('bills.edit.fromUpdate', true); $request->session()->put('bills.edit.fromUpdate', true);
@ -455,8 +458,8 @@ class BillController extends Controller
'avg' => '0', 'avg' => '0',
]; ];
$avg = bcdiv(bcadd((string)$bill['amount_min'], (string)$bill['amount_max']), '2'); $avg = bcdiv(bcadd((string) $bill['amount_min'], (string) $bill['amount_max']), '2');
$avg = bcmul($avg, (string)count($bill['pay_dates'])); $avg = bcmul($avg, (string) count($bill['pay_dates']));
$sums[$currencyId]['avg'] = bcadd($sums[$currencyId]['avg'], $avg); $sums[$currencyId]['avg'] = bcadd($sums[$currencyId]['avg'], $avg);
} }

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Budget; namespace FireflyIII\Http\Controllers\Budget;
use Carbon\Carbon; use Carbon\Carbon;
use Carbon\Exceptions\InvalidDateException; use Carbon\Exceptions\InvalidDateException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@ -31,7 +30,11 @@ use FireflyIII\Models\AvailableBudget;
use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -55,7 +58,7 @@ class AvailableBudgetController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.budgets')); app('view')->share('title', (string) trans('firefly.budgets'));
app('view')->share('mainTitleIcon', 'fa-tasks'); app('view')->share('mainTitleIcon', 'fa-tasks');
$this->abRepository = app(AvailableBudgetRepositoryInterface::class); $this->abRepository = app(AvailableBudgetRepositoryInterface::class);
$this->currencyRepos = app(CurrencyRepositoryInterface::class); $this->currencyRepos = app(CurrencyRepositoryInterface::class);
@ -75,7 +78,7 @@ class AvailableBudgetController extends Controller
* @param Carbon $end * @param Carbon $end
* @param TransactionCurrency|null $currency * @param TransactionCurrency|null $currency
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View * @return Factory|RedirectResponse|Redirector|View
*/ */
public function create(Request $request, Carbon $start, Carbon $end, ?TransactionCurrency $currency = null) public function create(Request $request, Carbon $start, Carbon $end, ?TransactionCurrency $currency = null)
{ {
@ -92,7 +95,7 @@ class AvailableBudgetController extends Controller
return redirect(route('available-budgets.edit', [$first->id])); return redirect(route('available-budgets.edit', [$first->id]));
} }
$page = (int)($request->get('page') ?? 1); $page = (int) ($request->get('page') ?? 1);
return view('budgets.available-budgets.create', compact('start', 'end', 'page', 'currency')); return view('budgets.available-budgets.create', compact('start', 'end', 'page', 'currency'));
} }
@ -104,7 +107,7 @@ class AvailableBudgetController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function createAlternative(Request $request, Carbon $start, Carbon $end) public function createAlternative(Request $request, Carbon $start, Carbon $end)
{ {
@ -126,7 +129,7 @@ class AvailableBudgetController extends Controller
); );
$page = (int)($request->get('page') ?? 1); $page = (int) ($request->get('page') ?? 1);
return view('budgets.available-budgets.create-alternative', compact('start', 'end', 'page', 'currencies')); return view('budgets.available-budgets.create-alternative', compact('start', 'end', 'page', 'currencies'));
} }
@ -134,7 +137,7 @@ class AvailableBudgetController extends Controller
/** /**
* @param AvailableBudget $availableBudget * @param AvailableBudget $availableBudget
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function delete(AvailableBudget $availableBudget) public function delete(AvailableBudget $availableBudget)
{ {
@ -150,17 +153,17 @@ class AvailableBudgetController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function edit(AvailableBudget $availableBudget, Carbon $start, Carbon $end) public function edit(AvailableBudget $availableBudget, Carbon $start, Carbon $end)
{ {
return view('budgets.available-budgets.edit', compact('availableBudget','start','end')); return view('budgets.available-budgets.edit', compact('availableBudget', 'start', 'end'));
} }
/** /**
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function store(Request $request) public function store(Request $request)
{ {
@ -174,7 +177,7 @@ class AvailableBudgetController extends Controller
Log::info($e->getMessage()); Log::info($e->getMessage());
} }
// find currency // find currency
$currency = $this->currencyRepos->find((int)$request->get('currency_id')); $currency = $this->currencyRepos->find((int) $request->get('currency_id'));
if (null === $currency) { if (null === $currency) {
session()->flash('error', trans('firefly.invalid_currency')); session()->flash('error', trans('firefly.invalid_currency'));
@ -209,7 +212,7 @@ class AvailableBudgetController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function update(Request $request, AvailableBudget $availableBudget, Carbon $start, Carbon $end) public function update(Request $request, AvailableBudget $availableBudget, Carbon $start, Carbon $end)
{ {
@ -218,5 +221,4 @@ class AvailableBudgetController extends Controller
return redirect(route('budgets.index', [$start->format('Y-m-d'), $end->format('Y-m-d')])); return redirect(route('budgets.index', [$start->format('Y-m-d'), $end->format('Y-m-d')]));
} }
}
}

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Budget; namespace FireflyIII\Http\Controllers\Budget;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@ -36,9 +35,13 @@ use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; use FireflyIII\Repositories\Budget\OperationsRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Http\Controllers\DateCalculation; use FireflyIII\Support\Http\Controllers\DateCalculation;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -66,7 +69,7 @@ class BudgetLimitController extends Controller
parent::__construct(); parent::__construct();
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.budgets')); app('view')->share('title', (string) trans('firefly.budgets'));
app('view')->share('mainTitleIcon', 'fa-tasks'); app('view')->share('mainTitleIcon', 'fa-tasks');
$this->repository = app(BudgetRepositoryInterface::class); $this->repository = app(BudgetRepositoryInterface::class);
$this->opsRepository = app(OperationsRepositoryInterface::class); $this->opsRepository = app(OperationsRepositoryInterface::class);
@ -83,7 +86,7 @@ class BudgetLimitController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function create(Budget $budget, Carbon $start, Carbon $end) public function create(Budget $budget, Carbon $start, Carbon $end)
{ {
@ -111,7 +114,7 @@ class BudgetLimitController extends Controller
* @param Request $request * @param Request $request
* @param BudgetLimit $budgetLimit * @param BudgetLimit $budgetLimit
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function delete(Request $request, BudgetLimit $budgetLimit) public function delete(Request $request, BudgetLimit $budgetLimit)
{ {
@ -124,14 +127,14 @@ class BudgetLimitController extends Controller
/** /**
* @param Request $request * @param Request $request
* *
* @return JsonResponse|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
* @throws FireflyException * @throws FireflyException
* @return JsonResponse|RedirectResponse|Redirector
*/ */
public function store(Request $request) public function store(Request $request)
{ {
// first search for existing one and update it if necessary. // first search for existing one and update it if necessary.
$currency = $this->currencyRepos->find((int)$request->get('transaction_currency_id')); $currency = $this->currencyRepos->find((int) $request->get('transaction_currency_id'));
$budget = $this->repository->findNull((int)$request->get('budget_id')); $budget = $this->repository->findNull((int) $request->get('budget_id'));
if (null === $currency || null === $budget) { if (null === $currency || null === $budget) {
throw new FireflyException('No valid currency or budget.'); throw new FireflyException('No valid currency or budget.');
} }
@ -169,7 +172,7 @@ class BudgetLimitController extends Controller
$array['spent'] = $spentArr[$currency->id]['sum'] ?? '0'; $array['spent'] = $spentArr[$currency->id]['sum'] ?? '0';
$array['left_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, bcadd($array['spent'], $array['amount'])); $array['left_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, bcadd($array['spent'], $array['amount']));
$array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']); $array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']);
$array['days_left'] = (string)$this->activeDaysLeft($start, $end); $array['days_left'] = (string) $this->activeDaysLeft($start, $end);
// left per day: // left per day:
$array['left_per_day'] = bcdiv(bcadd($array['spent'], $array['amount']), $array['days_left']); $array['left_per_day'] = bcdiv(bcadd($array['spent'], $array['amount']), $array['days_left']);
@ -196,12 +199,16 @@ class BudgetLimitController extends Controller
$array = $limit->toArray(); $array = $limit->toArray();
$spentArr = $this->opsRepository->sumExpenses( $spentArr = $this->opsRepository->sumExpenses(
$limit->start_date, $limit->end_date, null, new Collection([$budgetLimit->budget]), $budgetLimit->transactionCurrency $limit->start_date,
$limit->end_date,
null,
new Collection([$budgetLimit->budget]),
$budgetLimit->transactionCurrency
); );
$array['spent'] = $spentArr[$budgetLimit->transactionCurrency->id]['sum'] ?? '0'; $array['spent'] = $spentArr[$budgetLimit->transactionCurrency->id]['sum'] ?? '0';
$array['left_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, bcadd($array['spent'], $array['amount'])); $array['left_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, bcadd($array['spent'], $array['amount']));
$array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']); $array['amount_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $limit['amount']);
$array['days_left'] = (string)$this->activeDaysLeft($limit->start_date, $limit->end_date); $array['days_left'] = (string) $this->activeDaysLeft($limit->start_date, $limit->end_date);
// left per day: // left per day:
$array['left_per_day'] = bcdiv(bcadd($array['spent'], $array['amount']), $array['days_left']); $array['left_per_day'] = bcdiv(bcadd($array['spent'], $array['amount']), $array['days_left']);
@ -210,7 +217,5 @@ class BudgetLimitController extends Controller
$array['left_per_day_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $array['left_per_day']); $array['left_per_day_formatted'] = app('amount')->formatAnything($limit->transactionCurrency, $array['left_per_day']);
return response()->json($array); return response()->json($array);
} }
}
}

View File

@ -24,12 +24,14 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Budget; namespace FireflyIII\Http\Controllers\Budget;
use FireflyIII\Models\AutoBudget;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\BudgetFormStoreRequest; use FireflyIII\Http\Requests\BudgetFormStoreRequest;
use FireflyIII\Models\AutoBudget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\View\View;
/** /**
* Class CreateController * Class CreateController
@ -41,6 +43,7 @@ class CreateController extends Controller
/** /**
* CreateController constructor. * CreateController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -50,7 +53,7 @@ class CreateController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.budgets')); app('view')->share('title', (string) trans('firefly.budgets'));
app('view')->share('mainTitleIcon', 'fa-tasks'); app('view')->share('mainTitleIcon', 'fa-tasks');
$this->repository = app(BudgetRepositoryInterface::class); $this->repository = app(BudgetRepositoryInterface::class);
@ -65,31 +68,31 @@ class CreateController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function create(Request $request) public function create(Request $request)
{ {
$hasOldInput = null !== $request->old('_token'); $hasOldInput = null !== $request->old('_token');
// auto budget types // auto budget types
$autoBudgetTypes = [ $autoBudgetTypes = [
0 => (string)trans('firefly.auto_budget_none'), 0 => (string) trans('firefly.auto_budget_none'),
AutoBudget::AUTO_BUDGET_RESET => (string)trans('firefly.auto_budget_reset'), AutoBudget::AUTO_BUDGET_RESET => (string) trans('firefly.auto_budget_reset'),
AutoBudget::AUTO_BUDGET_ROLLOVER => (string)trans('firefly.auto_budget_rollover'), AutoBudget::AUTO_BUDGET_ROLLOVER => (string) trans('firefly.auto_budget_rollover'),
]; ];
$autoBudgetPeriods = [ $autoBudgetPeriods = [
'daily' => (string)trans('firefly.auto_budget_period_daily'), 'daily' => (string) trans('firefly.auto_budget_period_daily'),
'weekly' => (string)trans('firefly.auto_budget_period_weekly'), 'weekly' => (string) trans('firefly.auto_budget_period_weekly'),
'monthly' => (string)trans('firefly.auto_budget_period_monthly'), 'monthly' => (string) trans('firefly.auto_budget_period_monthly'),
'quarterly' => (string)trans('firefly.auto_budget_period_quarterly'), 'quarterly' => (string) trans('firefly.auto_budget_period_quarterly'),
'half_year' => (string)trans('firefly.auto_budget_period_half_year'), 'half_year' => (string) trans('firefly.auto_budget_period_half_year'),
'yearly' => (string)trans('firefly.auto_budget_period_yearly'), 'yearly' => (string) trans('firefly.auto_budget_period_yearly'),
]; ];
$currency = app('amount')->getDefaultCurrency(); $currency = app('amount')->getDefaultCurrency();
$preFilled = [ $preFilled = [
'auto_budget_period' => $hasOldInput ? (bool)$request->old('auto_budget_period') : 'monthly', 'auto_budget_period' => $hasOldInput ? (bool) $request->old('auto_budget_period') : 'monthly',
'auto_budget_currency_id' => $hasOldInput ? (int)$request->old('auto_budget_currency_id') : $currency->id, 'auto_budget_currency_id' => $hasOldInput ? (int) $request->old('auto_budget_currency_id') : $currency->id,
]; ];
$request->session()->flash('preFilled', $preFilled); $request->session()->flash('preFilled', $preFilled);
@ -99,7 +102,7 @@ class CreateController extends Controller
$this->rememberPreviousUri('budgets.create.uri'); $this->rememberPreviousUri('budgets.create.uri');
} }
$request->session()->forget('budgets.create.fromStore'); $request->session()->forget('budgets.create.fromStore');
$subTitle = (string)trans('firefly.create_new_budget'); $subTitle = (string) trans('firefly.create_new_budget');
return view('budgets.create', compact('subTitle', 'autoBudgetTypes', 'autoBudgetPeriods')); return view('budgets.create', compact('subTitle', 'autoBudgetTypes', 'autoBudgetPeriods'));
} }
@ -110,20 +113,20 @@ class CreateController extends Controller
* *
* @param BudgetFormStoreRequest $request * @param BudgetFormStoreRequest $request
* *
* @return \Illuminate\Http\RedirectResponse * @return RedirectResponse
*/ */
public function store(BudgetFormStoreRequest $request): RedirectResponse public function store(BudgetFormStoreRequest $request): RedirectResponse
{ {
$data = $request->getBudgetData(); $data = $request->getBudgetData();
$budget = $this->repository->store($data); $budget = $this->repository->store($data);
$this->repository->cleanupBudgets(); $this->repository->cleanupBudgets();
$request->session()->flash('success', (string)trans('firefly.stored_new_budget', ['name' => $budget->name])); $request->session()->flash('success', (string) trans('firefly.stored_new_budget', ['name' => $budget->name]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('budgets.create.uri')); $redirect = redirect($this->getPreviousUri('budgets.create.uri'));
if (1 === (int)$request->get('create_another')) { if (1 === (int) $request->get('create_another')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->put('budgets.create.fromStore', true); $request->session()->put('budgets.create.fromStore', true);

View File

@ -27,7 +27,11 @@ namespace FireflyIII\Http\Controllers\Budget;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* *
@ -40,6 +44,7 @@ class DeleteController extends Controller
/** /**
* DeleteController constructor. * DeleteController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -48,7 +53,7 @@ class DeleteController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.budgets')); app('view')->share('title', (string) trans('firefly.budgets'));
app('view')->share('mainTitleIcon', 'fa-tasks'); app('view')->share('mainTitleIcon', 'fa-tasks');
$this->repository = app(BudgetRepositoryInterface::class); $this->repository = app(BudgetRepositoryInterface::class);
@ -63,11 +68,11 @@ class DeleteController extends Controller
* *
* @param Budget $budget * @param Budget $budget
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function delete(Budget $budget) public function delete(Budget $budget)
{ {
$subTitle = (string)trans('firefly.delete_budget', ['name' => $budget->name]); $subTitle = (string) trans('firefly.delete_budget', ['name' => $budget->name]);
// put previous url in session // put previous url in session
$this->rememberPreviousUri('budgets.delete.uri'); $this->rememberPreviousUri('budgets.delete.uri');
@ -81,13 +86,13 @@ class DeleteController extends Controller
* @param Request $request * @param Request $request
* @param Budget $budget * @param Budget $budget
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function destroy(Request $request, Budget $budget) public function destroy(Request $request, Budget $budget)
{ {
$name = $budget->name; $name = $budget->name;
$this->repository->destroy($budget); $this->repository->destroy($budget);
$request->session()->flash('success', (string)trans('firefly.deleted_budget', ['name' => $name])); $request->session()->flash('success', (string) trans('firefly.deleted_budget', ['name' => $name]));
app('preferences')->mark(); app('preferences')->mark();
return redirect($this->getPreviousUri('budgets.delete.uri')); return redirect($this->getPreviousUri('budgets.delete.uri'));

View File

@ -29,8 +29,10 @@ use FireflyIII\Http\Requests\BudgetFormUpdateRequest;
use FireflyIII\Models\AutoBudget; use FireflyIII\Models\AutoBudget;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\View\View;
/** /**
* *
@ -43,6 +45,7 @@ class EditController extends Controller
/** /**
* EditController constructor. * EditController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -51,7 +54,7 @@ class EditController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.budgets')); app('view')->share('title', (string) trans('firefly.budgets'));
app('view')->share('mainTitleIcon', 'fa-tasks'); app('view')->share('mainTitleIcon', 'fa-tasks');
$this->repository = app(BudgetRepositoryInterface::class); $this->repository = app(BudgetRepositoryInterface::class);
@ -66,36 +69,36 @@ class EditController extends Controller
* @param Request $request * @param Request $request
* @param Budget $budget * @param Budget $budget
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function edit(Request $request, Budget $budget) public function edit(Request $request, Budget $budget)
{ {
$subTitle = (string)trans('firefly.edit_budget', ['name' => $budget->name]); $subTitle = (string) trans('firefly.edit_budget', ['name' => $budget->name]);
$autoBudget = $this->repository->getAutoBudget($budget); $autoBudget = $this->repository->getAutoBudget($budget);
// auto budget types // auto budget types
$autoBudgetTypes = [ $autoBudgetTypes = [
0 => (string)trans('firefly.auto_budget_none'), 0 => (string) trans('firefly.auto_budget_none'),
AutoBudget::AUTO_BUDGET_RESET => (string)trans('firefly.auto_budget_reset'), AutoBudget::AUTO_BUDGET_RESET => (string) trans('firefly.auto_budget_reset'),
AutoBudget::AUTO_BUDGET_ROLLOVER => (string)trans('firefly.auto_budget_rollover'), AutoBudget::AUTO_BUDGET_ROLLOVER => (string) trans('firefly.auto_budget_rollover'),
]; ];
$autoBudgetPeriods = [ $autoBudgetPeriods = [
'daily' => (string)trans('firefly.auto_budget_period_daily'), 'daily' => (string) trans('firefly.auto_budget_period_daily'),
'weekly' => (string)trans('firefly.auto_budget_period_weekly'), 'weekly' => (string) trans('firefly.auto_budget_period_weekly'),
'monthly' => (string)trans('firefly.auto_budget_period_monthly'), 'monthly' => (string) trans('firefly.auto_budget_period_monthly'),
'quarterly' => (string)trans('firefly.auto_budget_period_quarterly'), 'quarterly' => (string) trans('firefly.auto_budget_period_quarterly'),
'half_year' => (string)trans('firefly.auto_budget_period_half_year'), 'half_year' => (string) trans('firefly.auto_budget_period_half_year'),
'yearly' => (string)trans('firefly.auto_budget_period_yearly'), 'yearly' => (string) trans('firefly.auto_budget_period_yearly'),
]; ];
// code to handle active-checkboxes // code to handle active-checkboxes
$hasOldInput = null !== $request->old('_token'); $hasOldInput = null !== $request->old('_token');
$currency = app('amount')->getDefaultCurrency(); $currency = app('amount')->getDefaultCurrency();
$preFilled = [ $preFilled = [
'active' => $hasOldInput ? (bool)$request->old('active') : $budget->active, 'active' => $hasOldInput ? (bool) $request->old('active') : $budget->active,
'auto_budget_currency_id' => $hasOldInput ? (int)$request->old('auto_budget_currency_id') : $currency->id, 'auto_budget_currency_id' => $hasOldInput ? (int) $request->old('auto_budget_currency_id') : $currency->id,
]; ];
if($autoBudget) { if ($autoBudget) {
$preFilled['auto_budget_amount'] = $hasOldInput ? $request->old('auto_budget_amount') : $autoBudget->amount; $preFilled['auto_budget_amount'] = $hasOldInput ? $request->old('auto_budget_amount') : $autoBudget->amount;
} }
@ -113,22 +116,22 @@ class EditController extends Controller
* Budget update routine. * Budget update routine.
* *
* @param BudgetFormUpdateRequest $request * @param BudgetFormUpdateRequest $request
* @param Budget $budget * @param Budget $budget
* *
* @return \Illuminate\Http\RedirectResponse * @return RedirectResponse
*/ */
public function update(BudgetFormUpdateRequest $request, Budget $budget): RedirectResponse public function update(BudgetFormUpdateRequest $request, Budget $budget): RedirectResponse
{ {
$data = $request->getBudgetData(); $data = $request->getBudgetData();
$this->repository->update($budget, $data); $this->repository->update($budget, $data);
$request->session()->flash('success', (string)trans('firefly.updated_budget', ['name' => $budget->name])); $request->session()->flash('success', (string) trans('firefly.updated_budget', ['name' => $budget->name]));
$this->repository->cleanupBudgets(); $this->repository->cleanupBudgets();
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('budgets.edit.uri')); $redirect = redirect($this->getPreviousUri('budgets.edit.uri'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->put('budgets.edit.fromUpdate', true); $request->session()->put('budgets.edit.fromUpdate', true);

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Budget; namespace FireflyIII\Http\Controllers\Budget;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\AvailableBudget; use FireflyIII\Models\AvailableBudget;
@ -36,9 +35,11 @@ use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; use FireflyIII\Repositories\Budget\OperationsRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Http\Controllers\DateCalculation; use FireflyIII\Support\Http\Controllers\DateCalculation;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -47,7 +48,6 @@ use Log;
*/ */
class IndexController extends Controller class IndexController extends Controller
{ {
use DateCalculation; use DateCalculation;
/** @var AvailableBudgetRepositoryInterface */ /** @var AvailableBudgetRepositoryInterface */
private $abRepository; private $abRepository;
@ -71,7 +71,7 @@ class IndexController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.budgets')); app('view')->share('title', (string) trans('firefly.budgets'));
app('view')->share('mainTitleIcon', 'fa-tasks'); app('view')->share('mainTitleIcon', 'fa-tasks');
$this->repository = app(BudgetRepositoryInterface::class); $this->repository = app(BudgetRepositoryInterface::class);
$this->opsRepository = app(OperationsRepositoryInterface::class); $this->opsRepository = app(OperationsRepositoryInterface::class);
@ -94,7 +94,7 @@ class IndexController extends Controller
* @param Carbon|null $start * @param Carbon|null $start
* @param Carbon|null $end * @param Carbon|null $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index(Request $request, Carbon $start = null, Carbon $end = null) public function index(Request $request, Carbon $start = null, Carbon $end = null)
{ {
@ -157,15 +157,15 @@ class IndexController extends Controller
// complement budget with budget limits in range, and expenses in currency X in range. // complement budget with budget limits in range, and expenses in currency X in range.
/** @var Budget $current */ /** @var Budget $current */
foreach ($collection as $current) { foreach ($collection as $current) {
$array = $current->toArray(); $array = $current->toArray();
$array['spent'] = []; $array['spent'] = [];
$array['budgeted'] = []; $array['budgeted'] = [];
$array['auto_budget'] = $this->repository->getAutoBudget($current); $array['auto_budget'] = $this->repository->getAutoBudget($current);
$budgetLimits = $this->blRepository->getBudgetLimits($current, $start, $end); $budgetLimits = $this->blRepository->getBudgetLimits($current, $start, $end);
/** @var BudgetLimit $limit */ /** @var BudgetLimit $limit */
foreach ($budgetLimits as $limit) { foreach ($budgetLimits as $limit) {
$currency = $limit->transactionCurrency ?? $defaultCurrency; $currency = $limit->transactionCurrency ?? $defaultCurrency;
$array['budgeted'][] = [ $array['budgeted'][] = [
'id' => $limit->id, 'id' => $limit->id,
'amount' => round($limit->amount, $currency->decimal_places), 'amount' => round($limit->amount, $currency->decimal_places),
@ -184,7 +184,6 @@ class IndexController extends Controller
$array['spent'][$currency->id]['currency_id'] = $currency->id; $array['spent'][$currency->id]['currency_id'] = $currency->id;
$array['spent'][$currency->id]['currency_symbol'] = $currency->symbol; $array['spent'][$currency->id]['currency_symbol'] = $currency->symbol;
$array['spent'][$currency->id]['currency_decimal_places'] = $currency->decimal_places; $array['spent'][$currency->id]['currency_decimal_places'] = $currency->decimal_places;
} }
} }
$budgets[] = $array; $budgets[] = $array;
@ -195,18 +194,25 @@ class IndexController extends Controller
return view( return view(
'budgets.index', compact( 'budgets.index',
'availableBudgets', compact(
'budgeted', 'spent', 'availableBudgets',
'prevLoop', 'nextLoop', 'budgeted',
'budgets', 'spent',
'currencies', 'prevLoop',
'enableAddButton', 'nextLoop',
'periodTitle', 'budgets',
'defaultCurrency', 'currencies',
'activeDaysPassed', 'activeDaysLeft', 'enableAddButton',
'inactive', 'budgets', 'start', 'end' 'periodTitle',
) 'defaultCurrency',
'activeDaysPassed',
'activeDaysLeft',
'inactive',
'budgets',
'start',
'end'
)
); );
} }
@ -222,7 +228,7 @@ class IndexController extends Controller
$budgetIds = $request->get('budgetIds'); $budgetIds = $request->get('budgetIds');
foreach ($budgetIds as $index => $budgetId) { foreach ($budgetIds as $index => $budgetId) {
$budgetId = (int)$budgetId; $budgetId = (int) $budgetId;
$budget = $repository->findNull($budgetId); $budget = $repository->findNull($budgetId);
if (null !== $budget) { if (null !== $budget) {
Log::debug(sprintf('Set budget #%d ("%s") to position %d', $budget->id, $budget->name, $index + 1)); Log::debug(sprintf('Set budget #%d ("%s") to position %d', $budget->id, $budget->name, $index + 1));
@ -232,6 +238,4 @@ class IndexController extends Controller
return response()->json(['OK']); return response()->json(['OK']);
} }
} }

View File

@ -34,7 +34,9 @@ use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Support\Http\Controllers\AugumentData; use FireflyIII\Support\Http\Controllers\AugumentData;
use FireflyIII\Support\Http\Controllers\PeriodOverview; use FireflyIII\Support\Http\Controllers\PeriodOverview;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\View\View;
/** /**
* *
@ -57,7 +59,7 @@ class ShowController extends Controller
parent::__construct(); parent::__construct();
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.budgets')); app('view')->share('title', (string) trans('firefly.budgets'));
app('view')->share('mainTitleIcon', 'fa-tasks'); app('view')->share('mainTitleIcon', 'fa-tasks');
$this->journalRepos = app(JournalRepositoryInterface::class); $this->journalRepos = app(JournalRepositoryInterface::class);
@ -69,11 +71,11 @@ class ShowController extends Controller
/** /**
* Show transactions without a budget. * Show transactions without a budget.
* *
* @param Request $request * @param Request $request
* @param Carbon|null $start * @param Carbon|null $start
* @param Carbon|null $end * @param Carbon|null $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function noBudget(Request $request, Carbon $start = null, Carbon $end = null) public function noBudget(Request $request, Carbon $start = null, Carbon $end = null)
{ {
@ -92,8 +94,8 @@ class ShowController extends Controller
$first = $this->journalRepos->firstNull(); $first = $this->journalRepos->firstNull();
$firstDate = null !== $first ? $first->date : $start; $firstDate = null !== $first ? $first->date : $start;
$periods = $this->getNoBudgetPeriodOverview($firstDate, $end); $periods = $this->getNoBudgetPeriodOverview($firstDate, $end);
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
@ -110,17 +112,17 @@ class ShowController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function noBudgetAll(Request $request) public function noBudgetAll(Request $request)
{ {
$subTitle = (string)trans('firefly.all_journals_without_budget'); $subTitle = (string) trans('firefly.all_journals_without_budget');
$first = $this->journalRepos->firstNull(); $first = $this->journalRepos->firstNull();
$start = null === $first ? new Carbon : $first->date; $start = null === $first ? new Carbon : $first->date;
$end = new Carbon; $end = new Carbon;
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
@ -137,23 +139,23 @@ class ShowController extends Controller
* Show a single budget. * Show a single budget.
* *
* @param Request $request * @param Request $request
* @param Budget $budget * @param Budget $budget
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function show(Request $request, Budget $budget) public function show(Request $request, Budget $budget)
{ {
/** @var Carbon $start */ /** @var Carbon $start */
$allStart = session('first', Carbon::now()->startOfYear()); $allStart = session('first', Carbon::now()->startOfYear());
$allEnd = new Carbon; $allEnd = new Carbon;
// use session range: // use session range:
$start = session('start'); $start = session('start');
$end = session('end'); $end = session('end');
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$limits = $this->getLimits($budget, $allStart, $allEnd); $limits = $this->getLimits($budget, $allStart, $allEnd);
$repetition = null; $repetition = null;
@ -161,12 +163,12 @@ class ShowController extends Controller
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setRange($start, $end)->setBudget($budget) $collector->setRange($start, $end)->setBudget($budget)
->withAccountInformation() ->withAccountInformation()
->setLimit($pageSize)->setPage($page)->withBudgetInformation()->withCategoryInformation(); ->setLimit($pageSize)->setPage($page)->withBudgetInformation()->withCategoryInformation();
$groups = $collector->getPaginatedGroups(); $groups = $collector->getPaginatedGroups();
$groups->setPath(route('budgets.show', [$budget->id])); $groups->setPath(route('budgets.show', [$budget->id]));
$subTitle = (string)trans('firefly.all_journals_for_budget', ['name' => $budget->name]); $subTitle = (string) trans('firefly.all_journals_for_budget', ['name' => $budget->name]);
return view('budgets.show', compact('limits', 'budget', 'repetition', 'groups', 'subTitle')); return view('budgets.show', compact('limits', 'budget', 'repetition', 'groups', 'subTitle'));
} }
@ -174,12 +176,12 @@ class ShowController extends Controller
/** /**
* Show a single budget by a budget limit. * Show a single budget by a budget limit.
* *
* @param Request $request * @param Request $request
* @param Budget $budget * @param Budget $budget
* @param BudgetLimit $budgetLimit * @param BudgetLimit $budgetLimit
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @throws FireflyException * @throws FireflyException
* @return Factory|View
*/ */
public function showByBudgetLimit(Request $request, Budget $budget, BudgetLimit $budgetLimit) public function showByBudgetLimit(Request $request, Budget $budget, BudgetLimit $budgetLimit)
{ {
@ -187,14 +189,14 @@ class ShowController extends Controller
throw new FireflyException('This budget limit is not part of this budget.'); // @codeCoverageIgnore throw new FireflyException('This budget limit is not part of this budget.'); // @codeCoverageIgnore
} }
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$subTitle = trans( $subTitle = trans(
'firefly.budget_in_period', 'firefly.budget_in_period',
[ [
'name' => $budget->name, 'name' => $budget->name,
'start' => $budgetLimit->start_date->formatLocalized($this->monthAndDayFormat), 'start' => $budgetLimit->start_date->formatLocalized($this->monthAndDayFormat),
'end' => $budgetLimit->end_date->formatLocalized($this->monthAndDayFormat), 'end' => $budgetLimit->end_date->formatLocalized($this->monthAndDayFormat),
'currency' => $budgetLimit->transactionCurrency->name, 'currency' => $budgetLimit->transactionCurrency->name,
] ]
); );

View File

@ -27,7 +27,11 @@ namespace FireflyIII\Http\Controllers\Category;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\CategoryFormRequest; use FireflyIII\Http\Requests\CategoryFormRequest;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* Class CreateController * Class CreateController
@ -39,6 +43,7 @@ class CreateController extends Controller
/** /**
* CategoryController constructor. * CategoryController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -47,7 +52,7 @@ class CreateController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.categories')); app('view')->share('title', (string) trans('firefly.categories'));
app('view')->share('mainTitleIcon', 'fa-bar-chart'); app('view')->share('mainTitleIcon', 'fa-bar-chart');
$this->repository = app(CategoryRepositoryInterface::class); $this->repository = app(CategoryRepositoryInterface::class);
@ -62,7 +67,7 @@ class CreateController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function create(Request $request) public function create(Request $request)
{ {
@ -70,7 +75,7 @@ class CreateController extends Controller
$this->rememberPreviousUri('categories.create.uri'); $this->rememberPreviousUri('categories.create.uri');
} }
$request->session()->forget('categories.create.fromStore'); $request->session()->forget('categories.create.fromStore');
$subTitle = (string)trans('firefly.create_new_category'); $subTitle = (string) trans('firefly.create_new_category');
return view('categories.create', compact('subTitle')); return view('categories.create', compact('subTitle'));
} }
@ -81,18 +86,18 @@ class CreateController extends Controller
* *
* @param CategoryFormRequest $request * @param CategoryFormRequest $request
* *
* @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return $this|RedirectResponse|Redirector
*/ */
public function store(CategoryFormRequest $request) public function store(CategoryFormRequest $request)
{ {
$data = $request->getCategoryData(); $data = $request->getCategoryData();
$category = $this->repository->store($data); $category = $this->repository->store($data);
$request->session()->flash('success', (string)trans('firefly.stored_category', ['name' => $category->name])); $request->session()->flash('success', (string) trans('firefly.stored_category', ['name' => $category->name]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect(route('categories.index')); $redirect = redirect(route('categories.index'));
if (1 === (int)$request->get('create_another')) { if (1 === (int) $request->get('create_another')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->put('categories.create.fromStore', true); $request->session()->put('categories.create.fromStore', true);

View File

@ -27,7 +27,11 @@ namespace FireflyIII\Http\Controllers\Category;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* Class DeleteController * Class DeleteController
@ -39,6 +43,7 @@ class DeleteController extends Controller
/** /**
* CategoryController constructor. * CategoryController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -47,7 +52,7 @@ class DeleteController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.categories')); app('view')->share('title', (string) trans('firefly.categories'));
app('view')->share('mainTitleIcon', 'fa-bar-chart'); app('view')->share('mainTitleIcon', 'fa-bar-chart');
$this->repository = app(CategoryRepositoryInterface::class); $this->repository = app(CategoryRepositoryInterface::class);
@ -61,11 +66,11 @@ class DeleteController extends Controller
* *
* @param Category $category * @param Category $category
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function delete(Category $category) public function delete(Category $category)
{ {
$subTitle = (string)trans('firefly.delete_category', ['name' => $category->name]); $subTitle = (string) trans('firefly.delete_category', ['name' => $category->name]);
// put previous url in session // put previous url in session
$this->rememberPreviousUri('categories.delete.uri'); $this->rememberPreviousUri('categories.delete.uri');
@ -79,14 +84,14 @@ class DeleteController extends Controller
* @param Request $request * @param Request $request
* @param Category $category * @param Category $category
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function destroy(Request $request, Category $category) public function destroy(Request $request, Category $category)
{ {
$name = $category->name; $name = $category->name;
$this->repository->destroy($category); $this->repository->destroy($category);
$request->session()->flash('success', (string)trans('firefly.deleted_category', ['name' => $name])); $request->session()->flash('success', (string) trans('firefly.deleted_category', ['name' => $name]));
app('preferences')->mark(); app('preferences')->mark();
return redirect($this->getPreviousUri('categories.delete.uri')); return redirect($this->getPreviousUri('categories.delete.uri'));

View File

@ -28,7 +28,11 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\CategoryFormRequest; use FireflyIII\Http\Requests\CategoryFormRequest;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* Class EditController * Class EditController
@ -41,6 +45,7 @@ class EditController extends Controller
/** /**
* CategoryController constructor. * CategoryController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -49,7 +54,7 @@ class EditController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.categories')); app('view')->share('title', (string) trans('firefly.categories'));
app('view')->share('mainTitleIcon', 'fa-bar-chart'); app('view')->share('mainTitleIcon', 'fa-bar-chart');
$this->repository = app(CategoryRepositoryInterface::class); $this->repository = app(CategoryRepositoryInterface::class);
@ -65,11 +70,11 @@ class EditController extends Controller
* @param Request $request * @param Request $request
* @param Category $category * @param Category $category
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function edit(Request $request, Category $category) public function edit(Request $request, Category $category)
{ {
$subTitle = (string)trans('firefly.edit_category', ['name' => $category->name]); $subTitle = (string) trans('firefly.edit_category', ['name' => $category->name]);
// put previous url in session if not redirect from store (not "return_to_edit"). // put previous url in session if not redirect from store (not "return_to_edit").
if (true !== session('categories.edit.fromUpdate')) { if (true !== session('categories.edit.fromUpdate')) {
@ -83,22 +88,22 @@ class EditController extends Controller
/** /**
* Update category. * Update category.
* *
* @param CategoryFormRequest $request * @param CategoryFormRequest $request
* @param Category $category * @param Category $category
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function update(CategoryFormRequest $request, Category $category) public function update(CategoryFormRequest $request, Category $category)
{ {
$data = $request->getCategoryData(); $data = $request->getCategoryData();
$this->repository->update($category, $data); $this->repository->update($category, $data);
$request->session()->flash('success', (string)trans('firefly.updated_category', ['name' => $category->name])); $request->session()->flash('success', (string) trans('firefly.updated_category', ['name' => $category->name]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('categories.edit.uri')); $redirect = redirect($this->getPreviousUri('categories.edit.uri'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->put('categories.edit.fromUpdate', true); $request->session()->put('categories.edit.fromUpdate', true);

View File

@ -27,9 +27,11 @@ namespace FireflyIII\Http\Controllers\Category;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View;
/** /**
* Class IndexController * Class IndexController
@ -41,6 +43,7 @@ class IndexController extends Controller
/** /**
* CategoryController constructor. * CategoryController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -49,7 +52,7 @@ class IndexController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.categories')); app('view')->share('title', (string) trans('firefly.categories'));
app('view')->share('mainTitleIcon', 'fa-bar-chart'); app('view')->share('mainTitleIcon', 'fa-bar-chart');
$this->repository = app(CategoryRepositoryInterface::class); $this->repository = app(CategoryRepositoryInterface::class);
@ -59,18 +62,17 @@ class IndexController extends Controller
} }
/** /**
* Show all categories. * Show all categories.
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index(Request $request) public function index(Request $request)
{ {
$page = 0 === (int)$request->get('page') ? 1 : (int)$request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$collection = $this->repository->getCategories(); $collection = $this->repository->getCategories();
$total = $collection->count(); $total = $collection->count();
$collection = $collection->slice(($page - 1) * $pageSize, $pageSize); $collection = $collection->slice(($page - 1) * $pageSize, $pageSize);

View File

@ -30,8 +30,10 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Support\Http\Controllers\PeriodOverview; use FireflyIII\Support\Http\Controllers\PeriodOverview;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -46,6 +48,7 @@ class NoCategoryController extends Controller
/** /**
* CategoryController constructor. * CategoryController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -55,7 +58,7 @@ class NoCategoryController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.categories')); app('view')->share('title', (string) trans('firefly.categories'));
app('view')->share('mainTitleIcon', 'fa-bar-chart'); app('view')->share('mainTitleIcon', 'fa-bar-chart');
$this->journalRepos = app(JournalRepositoryInterface::class); $this->journalRepos = app(JournalRepositoryInterface::class);
@ -67,11 +70,11 @@ class NoCategoryController extends Controller
/** /**
* Show transactions without a category. * Show transactions without a category.
* *
* @param Request $request * @param Request $request
* @param Carbon|null $start * @param Carbon|null $start
* @param Carbon|null $end * @param Carbon|null $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function show(Request $request, Carbon $start = null, Carbon $end = null) public function show(Request $request, Carbon $start = null, Carbon $end = null)
{ {
@ -80,8 +83,8 @@ class NoCategoryController extends Controller
$start = $start ?? session('start'); $start = $start ?? session('start');
/** @var Carbon $end */ /** @var Carbon $end */
$end = $end ?? session('end'); $end = $end ?? session('end');
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$subTitle = trans( $subTitle = trans(
'firefly.without_category_between', 'firefly.without_category_between',
['start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat)] ['start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat)]
@ -95,7 +98,7 @@ class NoCategoryController extends Controller
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setRange($start, $end) $collector->setRange($start, $end)
->setLimit($pageSize)->setPage($page)->withoutCategory() ->setLimit($pageSize)->setPage($page)->withoutCategory()
->withAccountInformation()->withBudgetInformation() ->withAccountInformation()->withBudgetInformation()
->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER]); ->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER]);
$groups = $collector->getPaginatedGroups(); $groups = $collector->getPaginatedGroups();
$groups->setPath(route('categories.no-category')); $groups->setPath(route('categories.no-category'));
@ -109,7 +112,7 @@ class NoCategoryController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function showAll(Request $request) public function showAll(Request $request)
{ {
@ -117,10 +120,10 @@ class NoCategoryController extends Controller
$start = null; $start = null;
$end = null; $end = null;
$periods = new Collection; $periods = new Collection;
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
Log::debug('Start of noCategory()'); Log::debug('Start of noCategory()');
$subTitle = (string)trans('firefly.all_journals_without_category'); $subTitle = (string) trans('firefly.all_journals_without_category');
$first = $this->journalRepos->firstNull(); $first = $this->journalRepos->firstNull();
$start = null === $first ? new Carbon : $first->date; $start = null === $first ? new Carbon : $first->date;
$end = new Carbon; $end = new Carbon;
@ -130,7 +133,7 @@ class NoCategoryController extends Controller
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setRange($start, $end)->setLimit($pageSize)->setPage($page)->withoutCategory() $collector->setRange($start, $end)->setLimit($pageSize)->setPage($page)->withoutCategory()
->withAccountInformation()->withBudgetInformation() ->withAccountInformation()->withBudgetInformation()
->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER]); ->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER]);
$groups = $collector->getPaginatedGroups(); $groups = $collector->getPaginatedGroups();
$groups->setPath(route('categories.no-category.all')); $groups->setPath(route('categories.no-category.all'));

View File

@ -29,8 +29,10 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use FireflyIII\Support\Http\Controllers\PeriodOverview; use FireflyIII\Support\Http\Controllers\PeriodOverview;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View;
/** /**
* *
@ -45,6 +47,7 @@ class ShowController extends Controller
/** /**
* CategoryController constructor. * CategoryController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -54,7 +57,7 @@ class ShowController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.categories')); app('view')->share('title', (string) trans('firefly.categories'));
app('view')->share('mainTitleIcon', 'fa-bar-chart'); app('view')->share('mainTitleIcon', 'fa-bar-chart');
$this->repository = app(CategoryRepositoryInterface::class); $this->repository = app(CategoryRepositoryInterface::class);
@ -64,16 +67,15 @@ class ShowController extends Controller
} }
/** /**
* Show a single category. * Show a single category.
* *
* @param Request $request * @param Request $request
* @param Category $category * @param Category $category
* @param Carbon|null $start * @param Carbon|null $start
* @param Carbon|null $end * @param Carbon|null $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function show(Request $request, Category $category, Carbon $start = null, Carbon $end = null) public function show(Request $request, Category $category, Carbon $start = null, Carbon $end = null)
{ {
@ -83,8 +85,8 @@ class ShowController extends Controller
/** @var Carbon $end */ /** @var Carbon $end */
$end = $end ?? session('end', Carbon::now()->endOfMonth()); $end = $end ?? session('end', Carbon::now()->endOfMonth());
$subTitleIcon = 'fa-bar-chart'; $subTitleIcon = 'fa-bar-chart';
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$oldest = $this->repository->firstUseDate($category) ?? Carbon::now()->startOfYear(); $oldest = $this->repository->firstUseDate($category) ?? Carbon::now()->startOfYear();
$periods = $this->getCategoryPeriodOverview($category, $oldest, $end); $periods = $this->getCategoryPeriodOverview($category, $oldest, $end);
$path = route('categories.show', [$category->id, $start->format('Y-m-d'), $end->format('Y-m-d')]); $path = route('categories.show', [$category->id, $start->format('Y-m-d'), $end->format('Y-m-d')]);
@ -111,22 +113,22 @@ class ShowController extends Controller
/** /**
* Show all transactions within a category. * Show all transactions within a category.
* *
* @param Request $request * @param Request $request
* @param Category $category * @param Category $category
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function showAll(Request $request, Category $category) public function showAll(Request $request, Category $category)
{ {
// default values: // default values:
$subTitleIcon = 'fa-bar-chart'; $subTitleIcon = 'fa-bar-chart';
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$start = null; $start = null;
$end = null; $end = null;
$periods = new Collection; $periods = new Collection;
$subTitle = (string)trans('firefly.all_journals_for_category', ['name' => $category->name]); $subTitle = (string) trans('firefly.all_journals_for_category', ['name' => $category->name]);
$first = $this->repository->firstUseDate($category); $first = $this->repository->firstUseDate($category);
/** @var Carbon $start */ /** @var Carbon $start */
$start = $first ?? new Carbon; $start = $first ?? new Carbon;

View File

@ -59,6 +59,7 @@ class AccountController extends Controller
/** /**
* AccountController constructor. * AccountController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -116,10 +117,10 @@ class AccountController extends Controller
// loop the end balances. This is an array for each account ($expenses) // loop the end balances. This is an array for each account ($expenses)
foreach ($endBalances as $accountId => $expenses) { foreach ($endBalances as $accountId => $expenses) {
$accountId = (int)$accountId; $accountId = (int) $accountId;
// loop each expense entry (each entry can be a different currency). // loop each expense entry (each entry can be a different currency).
foreach ($expenses as $currencyId => $endAmount) { foreach ($expenses as $currencyId => $endAmount) {
$currencyId = (int)$currencyId; $currencyId = (int) $currencyId;
// see if there is an accompanying start amount. // see if there is an accompanying start amount.
// grab the difference and find the currency. // grab the difference and find the currency.
@ -131,7 +132,7 @@ class AccountController extends Controller
$tempData[] = [ $tempData[] = [
'name' => $accountNames[$accountId], 'name' => $accountNames[$accountId],
'difference' => $diff, 'difference' => $diff,
'diff_float' => (float)$diff, 'diff_float' => (float) $diff,
'currency_id' => $currencyId, 'currency_id' => $currencyId,
]; ];
} }
@ -144,13 +145,13 @@ class AccountController extends Controller
// loop all found currencies and build the data array for the chart. // loop all found currencies and build the data array for the chart.
/** /**
* @var int $currencyId * @var int $currencyId
* @var TransactionCurrency $currency * @var TransactionCurrency $currency
*/ */
foreach ($currencies as $currencyId => $currency) { foreach ($currencies as $currencyId => $currency) {
$dataSet $dataSet
= [ = [
'label' => (string)trans('firefly.spent'), 'label' => (string) trans('firefly.spent'),
'type' => 'bar', 'type' => 'bar',
'currency_symbol' => $currency->symbol, 'currency_symbol' => $currency->symbol,
'entries' => $this->expandNames($tempData), 'entries' => $this->expandNames($tempData),
@ -171,28 +172,12 @@ class AccountController extends Controller
return response()->json($data); return response()->json($data);
} }
/**
* Expenses per budget for all time, as shown on account overview.
*
* @param AccountRepositoryInterface $repository
* @param Account $account
*
* @return JsonResponse
*/
public function expenseBudgetAll(AccountRepositoryInterface $repository, Account $account): JsonResponse
{
$start = $repository->oldestJournalDate($account) ?? Carbon::now()->startOfMonth();
$end = Carbon::now();
return $this->expenseBudget($account, $start, $end);
}
/** /**
* Expenses per budget, as shown on account overview. * Expenses per budget, as shown on account overview.
* *
* @param Account $account * @param Account $account
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return JsonResponse * @return JsonResponse
*/ */
@ -215,7 +200,7 @@ class AccountController extends Controller
$budgetIds = []; $budgetIds = [];
/** @var array $journal */ /** @var array $journal */
foreach ($journals as $journal) { foreach ($journals as $journal) {
$budgetId = (int)$journal['budget_id']; $budgetId = (int) $journal['budget_id'];
$key = sprintf('%d-%d', $budgetId, $journal['currency_id']); $key = sprintf('%d-%d', $budgetId, $journal['currency_id']);
$budgetIds[] = $budgetId; $budgetIds[] = $budgetId;
if (!isset($result[$key])) { if (!isset($result[$key])) {
@ -234,7 +219,7 @@ class AccountController extends Controller
foreach ($result as $row) { foreach ($result as $row) {
$budgetId = $row['budget_id']; $budgetId = $row['budget_id'];
$name = $names[$budgetId]; $name = $names[$budgetId];
$label = (string)trans('firefly.name_in_currency', ['name' => $name, 'currency' => $row['currency_name']]); $label = (string) trans('firefly.name_in_currency', ['name' => $name, 'currency' => $row['currency_name']]);
$chartData[$label] = ['amount' => $row['total'], 'currency_symbol' => $row['currency_symbol']]; $chartData[$label] = ['amount' => $row['total'], 'currency_symbol' => $row['currency_symbol']];
} }
@ -245,27 +230,27 @@ class AccountController extends Controller
} }
/** /**
* Expenses grouped by category for account. * Expenses per budget for all time, as shown on account overview.
* *
* @param AccountRepositoryInterface $repository * @param AccountRepositoryInterface $repository
* @param Account $account * @param Account $account
* *
* @return JsonResponse * @return JsonResponse
*/ */
public function expenseCategoryAll(AccountRepositoryInterface $repository, Account $account): JsonResponse public function expenseBudgetAll(AccountRepositoryInterface $repository, Account $account): JsonResponse
{ {
$start = $repository->oldestJournalDate($account) ?? Carbon::now()->startOfMonth(); $start = $repository->oldestJournalDate($account) ?? Carbon::now()->startOfMonth();
$end = Carbon::now(); $end = Carbon::now();
return $this->expenseCategory($account, $start, $end); return $this->expenseBudget($account, $start, $end);
} }
/** /**
* Expenses per category for one single account. * Expenses per category for one single account.
* *
* @param Account $account * @param Account $account
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return JsonResponse * @return JsonResponse
*/ */
@ -283,9 +268,9 @@ class AccountController extends Controller
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setAccounts(new Collection([$account]))->setRange($start, $end)->withCategoryInformation()->setTypes([TransactionType::WITHDRAWAL]); $collector->setAccounts(new Collection([$account]))->setRange($start, $end)->withCategoryInformation()->setTypes([TransactionType::WITHDRAWAL]);
$journals = $collector->getExtractedJournals(); $journals = $collector->getExtractedJournals();
$result = []; $result = [];
$chartData = []; $chartData = [];
/** @var array $journal */ /** @var array $journal */
foreach ($journals as $journal) { foreach ($journals as $journal) {
@ -293,7 +278,7 @@ class AccountController extends Controller
if (!isset($result[$key])) { if (!isset($result[$key])) {
$result[$key] = [ $result[$key] = [
'total' => '0', 'total' => '0',
'category_id' => (int)$journal['category_id'], 'category_id' => (int) $journal['category_id'],
'currency_name' => $journal['currency_name'], 'currency_name' => $journal['currency_name'],
'currency_symbol' => $journal['currency_symbol'], 'currency_symbol' => $journal['currency_symbol'],
]; ];
@ -305,7 +290,7 @@ class AccountController extends Controller
foreach ($result as $row) { foreach ($result as $row) {
$categoryId = $row['category_id']; $categoryId = $row['category_id'];
$name = $names[$categoryId] ?? '(unknown)'; $name = $names[$categoryId] ?? '(unknown)';
$label = (string)trans('firefly.name_in_currency', ['name' => $name, 'currency' => $row['currency_name']]); $label = (string) trans('firefly.name_in_currency', ['name' => $name, 'currency' => $row['currency_name']]);
$chartData[$label] = ['amount' => $row['total'], 'currency_symbol' => $row['currency_symbol']]; $chartData[$label] = ['amount' => $row['total'], 'currency_symbol' => $row['currency_symbol']];
} }
@ -315,6 +300,22 @@ class AccountController extends Controller
return response()->json($data); return response()->json($data);
} }
/**
* Expenses grouped by category for account.
*
* @param AccountRepositoryInterface $repository
* @param Account $account
*
* @return JsonResponse
*/
public function expenseCategoryAll(AccountRepositoryInterface $repository, Account $account): JsonResponse
{
$start = $repository->oldestJournalDate($account) ?? Carbon::now()->startOfMonth();
$end = Carbon::now();
return $this->expenseCategory($account, $start, $end);
}
/** /**
* Shows the balances for all the user's frontpage accounts. * Shows the balances for all the user's frontpage accounts.
* *
@ -341,28 +342,12 @@ class AccountController extends Controller
return response()->json($this->accountBalanceChart($accounts, $start, $end)); return response()->json($this->accountBalanceChart($accounts, $start, $end));
} }
/**
* Shows the income grouped by category for an account, in all time.
*
* @param AccountRepositoryInterface $repository
* @param Account $account
*
* @return JsonResponse
*/
public function incomeCategoryAll(AccountRepositoryInterface $repository, Account $account): JsonResponse
{
$start = $repository->oldestJournalDate($account) ?? Carbon::now()->startOfMonth();
$end = Carbon::now();
return $this->incomeCategory($account, $start, $end);
}
/** /**
* Shows all income per account for each category. * Shows all income per account for each category.
* *
* @param Account $account * @param Account $account
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return JsonResponse * @return JsonResponse
*/ */
@ -382,9 +367,9 @@ class AccountController extends Controller
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$collector->setAccounts(new Collection([$account]))->setRange($start, $end)->withCategoryInformation()->setTypes([TransactionType::DEPOSIT]); $collector->setAccounts(new Collection([$account]))->setRange($start, $end)->withCategoryInformation()->setTypes([TransactionType::DEPOSIT]);
$journals = $collector->getExtractedJournals(); $journals = $collector->getExtractedJournals();
$result = []; $result = [];
$chartData = []; $chartData = [];
/** @var array $journal */ /** @var array $journal */
foreach ($journals as $journal) { foreach ($journals as $journal) {
$key = sprintf('%d-%d', $journal['category_id'], $journal['currency_id']); $key = sprintf('%d-%d', $journal['category_id'], $journal['currency_id']);
@ -403,7 +388,7 @@ class AccountController extends Controller
foreach ($result as $row) { foreach ($result as $row) {
$categoryId = $row['category_id']; $categoryId = $row['category_id'];
$name = $names[$categoryId] ?? '(unknown)'; $name = $names[$categoryId] ?? '(unknown)';
$label = (string)trans('firefly.name_in_currency', ['name' => $name, 'currency' => $row['currency_name']]); $label = (string) trans('firefly.name_in_currency', ['name' => $name, 'currency' => $row['currency_name']]);
$chartData[$label] = ['amount' => $row['total'], 'currency_symbol' => $row['currency_symbol']]; $chartData[$label] = ['amount' => $row['total'], 'currency_symbol' => $row['currency_symbol']];
} }
$data = $this->generator->multiCurrencyPieChart($chartData); $data = $this->generator->multiCurrencyPieChart($chartData);
@ -412,15 +397,31 @@ class AccountController extends Controller
return response()->json($data); return response()->json($data);
} }
/**
* Shows the income grouped by category for an account, in all time.
*
* @param AccountRepositoryInterface $repository
* @param Account $account
*
* @return JsonResponse
*/
public function incomeCategoryAll(AccountRepositoryInterface $repository, Account $account): JsonResponse
{
$start = $repository->oldestJournalDate($account) ?? Carbon::now()->startOfMonth();
$end = Carbon::now();
return $this->incomeCategory($account, $start, $end);
}
/** /**
* Shows overview of account during a single period. * Shows overview of account during a single period.
* *
* TODO this chart is not multi-currency aware. * TODO this chart is not multi-currency aware.
* *
* @param Account $account * @param Account $account
* @param Carbon $start * @param Carbon $start
* *
* @param Carbon $end * @param Carbon $end
* *
* @return JsonResponse * @return JsonResponse
*/ */
@ -440,14 +441,14 @@ class AccountController extends Controller
$current = clone $start; $current = clone $start;
switch ($step) { switch ($step) {
case '1D': case '1D':
$format = (string)trans('config.month_and_day'); $format = (string) trans('config.month_and_day');
$range = app('steam')->balanceInRange($account, $start, $end); $range = app('steam')->balanceInRange($account, $start, $end);
$previous = array_values($range)[0]; $previous = array_values($range)[0];
while ($end >= $current) { while ($end >= $current) {
$theDate = $current->format('Y-m-d'); $theDate = $current->format('Y-m-d');
$balance = $range[$theDate] ?? $previous; $balance = $range[$theDate] ?? $previous;
$label = $current->formatLocalized($format); $label = $current->formatLocalized($format);
$chartData[$label] = (float)$balance; $chartData[$label] = (float) $balance;
$previous = $balance; $previous = $balance;
$current->addDay(); $current->addDay();
} }
@ -457,7 +458,7 @@ class AccountController extends Controller
case '1M': case '1M':
case '1Y': case '1Y':
while ($end >= $current) { while ($end >= $current) {
$balance = (float)app('steam')->balance($account, $current); $balance = (float) app('steam')->balance($account, $current);
$label = app('navigation')->periodShow($current, $step); $label = app('navigation')->periodShow($current, $step);
$chartData[$label] = $balance; $chartData[$label] = $balance;
$current = app('navigation')->addPeriod($current, $step, 0); $current = app('navigation')->addPeriod($current, $step, 0);
@ -476,8 +477,8 @@ class AccountController extends Controller
* *
* TODO this chart is not multi-currency aware. * TODO this chart is not multi-currency aware.
* *
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* @param Collection $accounts * @param Collection $accounts
* *
* @return JsonResponse * @return JsonResponse
@ -525,10 +526,10 @@ class AccountController extends Controller
// loop the end balances. This is an array for each account ($expenses) // loop the end balances. This is an array for each account ($expenses)
foreach ($endBalances as $accountId => $expenses) { foreach ($endBalances as $accountId => $expenses) {
$accountId = (int)$accountId; $accountId = (int) $accountId;
// loop each expense entry (each entry can be a different currency). // loop each expense entry (each entry can be a different currency).
foreach ($expenses as $currencyId => $endAmount) { foreach ($expenses as $currencyId => $endAmount) {
$currencyId = (int)$currencyId; $currencyId = (int) $currencyId;
// see if there is an accompanying start amount. // see if there is an accompanying start amount.
// grab the difference and find the currency. // grab the difference and find the currency.
@ -540,7 +541,7 @@ class AccountController extends Controller
$tempData[] = [ $tempData[] = [
'name' => $accountNames[$accountId], 'name' => $accountNames[$accountId],
'difference' => $diff, 'difference' => $diff,
'diff_float' => (float)$diff, 'diff_float' => (float) $diff,
'currency_id' => $currencyId, 'currency_id' => $currencyId,
]; ];
} }
@ -553,13 +554,13 @@ class AccountController extends Controller
// loop all found currencies and build the data array for the chart. // loop all found currencies and build the data array for the chart.
/** /**
* @var int $currencyId * @var int $currencyId
* @var TransactionCurrency $currency * @var TransactionCurrency $currency
*/ */
foreach ($currencies as $currencyId => $currency) { foreach ($currencies as $currencyId => $currency) {
$dataSet $dataSet
= [ = [
'label' => (string)trans('firefly.earned'), 'label' => (string) trans('firefly.earned'),
'type' => 'bar', 'type' => 'bar',
'currency_symbol' => $currency->symbol, 'currency_symbol' => $currency->symbol,
'entries' => $this->expandNames($tempData), 'entries' => $this->expandNames($tempData),

View File

@ -42,6 +42,7 @@ class BillController extends Controller
/** /**
* BillController constructor. * BillController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -79,12 +80,12 @@ class BillController extends Controller
foreach ($paid as $currencyId => $amount) { foreach ($paid as $currencyId => $amount) {
$currencies[$currencyId] = $currencies[$currencyId] ?? $currencyRepository->findNull($currencyId); $currencies[$currencyId] = $currencies[$currencyId] ?? $currencyRepository->findNull($currencyId);
$label = (string)trans('firefly.paid_in_currency', ['currency' => $currencies[$currencyId]->name]); $label = (string) trans('firefly.paid_in_currency', ['currency' => $currencies[$currencyId]->name]);
$chartData[$label] = ['amount' => $amount, 'currency_symbol' => $currencies[$currencyId]->symbol]; $chartData[$label] = ['amount' => $amount, 'currency_symbol' => $currencies[$currencyId]->symbol];
} }
foreach ($unpaid as $currencyId => $amount) { foreach ($unpaid as $currencyId => $amount) {
$currencies[$currencyId] = $currencies[$currencyId] ?? $currencyRepository->findNull($currencyId); $currencies[$currencyId] = $currencies[$currencyId] ?? $currencyRepository->findNull($currencyId);
$label = (string)trans('firefly.unpaid_in_currency', ['currency' => $currencies[$currencyId]->name]); $label = (string) trans('firefly.unpaid_in_currency', ['currency' => $currencies[$currencyId]->name]);
$chartData[$label] = ['amount' => $amount, 'currency_symbol' => $currencies[$currencyId]->symbol]; $chartData[$label] = ['amount' => $amount, 'currency_symbol' => $currencies[$currencyId]->symbol];
} }
@ -116,18 +117,21 @@ class BillController extends Controller
$journals = $collector->setBill($bill)->getExtractedJournals(); $journals = $collector->setBill($bill)->getExtractedJournals();
// sort the other way around: // sort the other way around:
usort($journals, static function (array $left, array $right) { usort(
return $left['date']->gte($right['date'])? 1 : 0; $journals,
}); static function (array $left, array $right) {
return $left['date']->gte($right['date']) ? 1 : 0;
}
);
$chartData = [ $chartData = [
['type' => 'line', 'label' => (string)trans('firefly.max-amount'), 'currency_symbol' => $bill->transactionCurrency->symbol, 'entries' => []], ['type' => 'line', 'label' => (string) trans('firefly.max-amount'), 'currency_symbol' => $bill->transactionCurrency->symbol, 'entries' => []],
['type' => 'line', 'label' => (string)trans('firefly.min-amount'), 'currency_symbol' => $bill->transactionCurrency->symbol, 'entries' => []], ['type' => 'line', 'label' => (string) trans('firefly.min-amount'), 'currency_symbol' => $bill->transactionCurrency->symbol, 'entries' => []],
['type' => 'bar', 'label' => (string)trans('firefly.journal-amount'), 'currency_symbol' => $bill->transactionCurrency->symbol, 'entries' => []], ['type' => 'bar', 'label' => (string) trans('firefly.journal-amount'), 'currency_symbol' => $bill->transactionCurrency->symbol, 'entries' => []],
]; ];
foreach ($journals as $journal) { foreach ($journals as $journal) {
$date = $journal['date']->formatLocalized((string)trans('config.month_and_day')); $date = $journal['date']->formatLocalized((string) trans('config.month_and_day'));
$chartData[0]['entries'][$date] = $bill->amount_min; // minimum amount of bill $chartData[0]['entries'][$date] = $bill->amount_min; // minimum amount of bill
$chartData[1]['entries'][$date] = $bill->amount_max; // maximum amount of bill $chartData[1]['entries'][$date] = $bill->amount_max; // maximum amount of bill

View File

@ -27,9 +27,9 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Generator\Chart\Basic\GeneratorInterface;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\BudgetLimit;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
@ -104,11 +104,11 @@ class BudgetController extends Controller
if ($cache->has()) { if ($cache->has()) {
return response()->json($cache->get()); // @codeCoverageIgnore return response()->json($cache->get()); // @codeCoverageIgnore
} }
$step = $this->calculateStep($start, $end); // depending on diff, do something with range of chart. $step = $this->calculateStep($start, $end); // depending on diff, do something with range of chart.
$collection = new Collection([$budget]); $collection = new Collection([$budget]);
$chartData = []; $chartData = [];
$loopStart = clone $start; $loopStart = clone $start;
$loopStart = app('navigation')->startOfPeriod($loopStart, $step); $loopStart = app('navigation')->startOfPeriod($loopStart, $step);
$currencies = []; $currencies = [];
$defaultEntries = []; $defaultEntries = [];
// echo '<hr>'; // echo '<hr>';
@ -135,10 +135,10 @@ class BudgetController extends Controller
// loop all currencies: // loop all currencies:
foreach ($currencies as $currencyId => $currency) { foreach ($currencies as $currencyId => $currency) {
$chartData[$currencyId] = [ $chartData[$currencyId] = [
'label' => count($currencies) > 1 ? sprintf('%s (%s)', $budget->name, $currency['currency_name']) : $budget->name, 'label' => count($currencies) > 1 ? sprintf('%s (%s)', $budget->name, $currency['currency_name']) : $budget->name,
'type' => 'bar', 'type' => 'bar',
'currency_symbol' => $currency['currency_symbol'], 'currency_symbol' => $currency['currency_symbol'],
'entries' => $defaultEntries, 'entries' => $defaultEntries,
]; ];
foreach ($currency['spent'] as $label => $spent) { foreach ($currency['spent'] as $label => $spent) {
$chartData[$currencyId]['entries'][$label] = round(bcmul($spent, '-1'), $currency['currency_decimal_places']); $chartData[$currencyId]['entries'][$label] = round(bcmul($spent, '-1'), $currency['currency_decimal_places']);
@ -157,9 +157,9 @@ class BudgetController extends Controller
* @param Budget $budget * @param Budget $budget
* @param BudgetLimit $budgetLimit * @param BudgetLimit $budgetLimit
* *
* @throws FireflyException
* @return JsonResponse * @return JsonResponse
* *
* @throws FireflyException
*/ */
public function budgetLimit(Budget $budget, BudgetLimit $budgetLimit): JsonResponse public function budgetLimit(Budget $budget, BudgetLimit $budgetLimit): JsonResponse
{ {
@ -186,12 +186,12 @@ class BudgetController extends Controller
while ($start <= $end) { while ($start <= $end) {
$spent = $this->opsRepository->spentInPeriod($budgetCollection, new Collection, $start, $start); $spent = $this->opsRepository->spentInPeriod($budgetCollection, new Collection, $start, $start);
$amount = bcadd($amount, $spent); $amount = bcadd($amount, $spent);
$format = $start->formatLocalized((string)trans('config.month_and_day')); $format = $start->formatLocalized((string) trans('config.month_and_day'));
$entries[$format] = $amount; $entries[$format] = $amount;
$start->addDay(); $start->addDay();
} }
$data = $this->generator->singleSet((string)trans('firefly.left'), $entries); $data = $this->generator->singleSet((string) trans('firefly.left'), $entries);
// add currency symbol from budget limit: // add currency symbol from budget limit:
$data['datasets'][0]['currency_symbol'] = $budgetLimit->transactionCurrency->symbol; $data['datasets'][0]['currency_symbol'] = $budgetLimit->transactionCurrency->symbol;
$cache->store($data); $cache->store($data);
@ -211,7 +211,7 @@ class BudgetController extends Controller
public function expenseAsset(Budget $budget, ?BudgetLimit $budgetLimit = null): JsonResponse public function expenseAsset(Budget $budget, ?BudgetLimit $budgetLimit = null): JsonResponse
{ {
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$budgetLimitId = null === $budgetLimit ? 0 : $budgetLimit->id; $budgetLimitId = null === $budgetLimit ? 0 : $budgetLimit->id;
$cache = new CacheProperties; $cache = new CacheProperties;
$cache->addProperty($budget->id); $cache->addProperty($budget->id);
@ -238,7 +238,7 @@ class BudgetController extends Controller
// group by asset account ID: // group by asset account ID:
foreach ($journals as $journal) { foreach ($journals as $journal) {
$key = sprintf('%d-%d', (int)$journal['source_account_id'], $journal['currency_id']); $key = sprintf('%d-%d', (int) $journal['source_account_id'], $journal['currency_id']);
$result[$key] = $result[$key] ?? [ $result[$key] = $result[$key] ?? [
'amount' => '0', 'amount' => '0',
'currency_symbol' => $journal['currency_symbol'], 'currency_symbol' => $journal['currency_symbol'],
@ -250,7 +250,7 @@ class BudgetController extends Controller
$names = $this->getAccountNames(array_keys($result)); $names = $this->getAccountNames(array_keys($result));
foreach ($result as $combinedId => $info) { foreach ($result as $combinedId => $info) {
$parts = explode('-', $combinedId); $parts = explode('-', $combinedId);
$assetId = (int)$parts[0]; $assetId = (int) $parts[0];
$title = sprintf('%s (%s)', $names[$assetId] ?? '(empty)', $info['currency_name']); $title = sprintf('%s (%s)', $names[$assetId] ?? '(empty)', $info['currency_name']);
$chartData[$title] $chartData[$title]
= [ = [
@ -277,7 +277,7 @@ class BudgetController extends Controller
public function expenseCategory(Budget $budget, ?BudgetLimit $budgetLimit = null): JsonResponse public function expenseCategory(Budget $budget, ?BudgetLimit $budgetLimit = null): JsonResponse
{ {
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$budgetLimitId = null === $budgetLimit ? 0 : $budgetLimit->id; $budgetLimitId = null === $budgetLimit ? 0 : $budgetLimit->id;
$cache = new CacheProperties; $cache = new CacheProperties;
$cache->addProperty($budget->id); $cache->addProperty($budget->id);
@ -314,7 +314,7 @@ class BudgetController extends Controller
$names = $this->getCategoryNames(array_keys($result)); $names = $this->getCategoryNames(array_keys($result));
foreach ($result as $combinedId => $info) { foreach ($result as $combinedId => $info) {
$parts = explode('-', $combinedId); $parts = explode('-', $combinedId);
$categoryId = (int)$parts[0]; $categoryId = (int) $parts[0];
$title = sprintf('%s (%s)', $names[$categoryId] ?? '(empty)', $info['currency_name']); $title = sprintf('%s (%s)', $names[$categoryId] ?? '(empty)', $info['currency_name']);
$chartData[$title] = [ $chartData[$title] = [
'amount' => $info['amount'], 'amount' => $info['amount'],
@ -340,7 +340,7 @@ class BudgetController extends Controller
public function expenseExpense(Budget $budget, ?BudgetLimit $budgetLimit = null): JsonResponse public function expenseExpense(Budget $budget, ?BudgetLimit $budgetLimit = null): JsonResponse
{ {
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
$budgetLimitId = null === $budgetLimit ? 0 : $budgetLimit->id; $budgetLimitId = null === $budgetLimit ? 0 : $budgetLimit->id;
$cache = new CacheProperties; $cache = new CacheProperties;
$cache->addProperty($budget->id); $cache->addProperty($budget->id);
@ -379,7 +379,7 @@ class BudgetController extends Controller
$names = $this->getAccountNames(array_keys($result)); $names = $this->getAccountNames(array_keys($result));
foreach ($result as $combinedId => $info) { foreach ($result as $combinedId => $info) {
$parts = explode('-', $combinedId); $parts = explode('-', $combinedId);
$opposingId = (int)$parts[0]; $opposingId = (int) $parts[0];
$name = $names[$opposingId] ?? 'no name'; $name = $names[$opposingId] ?? 'no name';
$title = sprintf('%s (%s)', $name, $info['currency_name']); $title = sprintf('%s (%s)', $name, $info['currency_name']);
$chartData[$title] = [ $chartData[$title] = [
@ -418,9 +418,9 @@ class BudgetController extends Controller
} }
$budgets = $this->repository->getActiveBudgets(); $budgets = $this->repository->getActiveBudgets();
$chartData = [ $chartData = [
['label' => (string)trans('firefly.spent_in_budget'), 'entries' => [], 'type' => 'bar'], ['label' => (string) trans('firefly.spent_in_budget'), 'entries' => [], 'type' => 'bar'],
['label' => (string)trans('firefly.left_to_spend'), 'entries' => [], 'type' => 'bar'], ['label' => (string) trans('firefly.left_to_spend'), 'entries' => [], 'type' => 'bar'],
['label' => (string)trans('firefly.overspent'), 'entries' => [], 'type' => 'bar'], ['label' => (string) trans('firefly.overspent'), 'entries' => [], 'type' => 'bar'],
]; ];
/** @var Budget $budget */ /** @var Budget $budget */
@ -440,14 +440,20 @@ class BudgetController extends Controller
/** @var BudgetLimit $limit */ /** @var BudgetLimit $limit */
foreach ($limits as $limit) { foreach ($limits as $limit) {
$spent = $this->opsRepository->sumExpenses( $spent = $this->opsRepository->sumExpenses(
$limit->start_date, $limit->end_date, null, new Collection([$budget]), $limit->transactionCurrency $limit->start_date,
$limit->end_date,
null,
new Collection([$budget]),
$limit->transactionCurrency
); );
/** @var array $entry */ /** @var array $entry */
foreach ($spent as $entry) { foreach ($spent as $entry) {
$title = sprintf('%s (%s)', $budget->name, $entry['currency_name']); $title = sprintf('%s (%s)', $budget->name, $entry['currency_name']);
if ($limit->start_date->startOfDay()->ne($start->startOfDay()) || $limit->end_date->startOfDay()->ne($end->startOfDay())) { if ($limit->start_date->startOfDay()->ne($start->startOfDay()) || $limit->end_date->startOfDay()->ne($end->startOfDay())) {
$title = sprintf( $title = sprintf(
'%s (%s) (%s - %s)', $budget->name, $entry['currency_name'], '%s (%s) (%s - %s)',
$budget->name,
$entry['currency_name'],
$limit->start_date->formatLocalized($this->monthAndDayFormat), $limit->start_date->formatLocalized($this->monthAndDayFormat),
$limit->end_date->formatLocalized($this->monthAndDayFormat) $limit->end_date->formatLocalized($this->monthAndDayFormat)
); );
@ -498,13 +504,13 @@ class BudgetController extends Controller
$preferredRange = app('navigation')->preferredRangeFormat($start, $end); $preferredRange = app('navigation')->preferredRangeFormat($start, $end);
$chartData = [ $chartData = [
[ [
'label' => (string)trans('firefly.box_spent_in_currency', ['currency' => $currency->name]), 'label' => (string) trans('firefly.box_spent_in_currency', ['currency' => $currency->name]),
'type' => 'bar', 'type' => 'bar',
'entries' => [], 'entries' => [],
'currency_symbol' => $currency->symbol, 'currency_symbol' => $currency->symbol,
], ],
[ [
'label' => (string)trans('firefly.box_budgeted_in_currency', ['currency' => $currency->name]), 'label' => (string) trans('firefly.box_budgeted_in_currency', ['currency' => $currency->name]),
'type' => 'bar', 'type' => 'bar',
'currency_symbol' => $currency->symbol, 'currency_symbol' => $currency->symbol,
'entries' => [], 'entries' => [],
@ -513,9 +519,9 @@ class BudgetController extends Controller
$currentStart = clone $start; $currentStart = clone $start;
while ($currentStart <= $end) { while ($currentStart <= $end) {
$currentStart= app('navigation')->startOfPeriod($currentStart, $preferredRange); $currentStart = app('navigation')->startOfPeriod($currentStart, $preferredRange);
$title = $currentStart->formatLocalized($titleFormat); $title = $currentStart->formatLocalized($titleFormat);
$currentEnd = app('navigation')->endOfPeriod($currentStart, $preferredRange); $currentEnd = app('navigation')->endOfPeriod($currentStart, $preferredRange);
// default limit is no limit: // default limit is no limit:
$chartData[0]['entries'][$title] = 0; $chartData[0]['entries'][$title] = 0;
@ -582,11 +588,9 @@ class BudgetController extends Controller
$currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0); $currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0);
} }
$data = $this->generator->singleSet((string)trans('firefly.spent'), $chartData); $data = $this->generator->singleSet((string) trans('firefly.spent'), $chartData);
$cache->store($data); $cache->store($data);
return response()->json($data); return response()->json($data);
} }
} }

View File

@ -18,7 +18,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
/** @noinspection MoreThanThreeArgumentsInspection */ /** @noinspection MoreThanThreeArgumentsInspection */
declare(strict_types=1); declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Chart; namespace FireflyIII\Http\Controllers\Chart;
@ -118,8 +118,6 @@ class BudgetReportController extends Controller
// loop expenses. // loop expenses.
foreach ($spent as $currency) { foreach ($spent as $currency) {
foreach ($currency['budgets'] as $budget) { foreach ($currency['budgets'] as $budget) {
foreach ($budget['transaction_journals'] as $journal) { foreach ($budget['transaction_journals'] as $journal) {
$categoryName = $journal['category_name'] ?? trans('firefly.no_category'); $categoryName = $journal['category_name'] ?? trans('firefly.no_category');
$title = sprintf('%s (%s)', $categoryName, $currency['currency_name']); $title = sprintf('%s (%s)', $categoryName, $currency['currency_name']);
@ -157,8 +155,6 @@ class BudgetReportController extends Controller
// loop expenses. // loop expenses.
foreach ($spent as $currency) { foreach ($spent as $currency) {
foreach ($currency['budgets'] as $budget) { foreach ($currency['budgets'] as $budget) {
foreach ($budget['transaction_journals'] as $journal) { foreach ($budget['transaction_journals'] as $journal) {
$title = sprintf('%s (%s)', $journal['destination_account_name'], $currency['currency_name']); $title = sprintf('%s (%s)', $journal['destination_account_name'], $currency['currency_name']);
$result[$title] = $result[$title] ?? [ $result[$title] = $result[$title] ?? [
@ -199,7 +195,9 @@ class BudgetReportController extends Controller
$spentKey = sprintf('%d-spent', $currency['currency_id']); $spentKey = sprintf('%d-spent', $currency['currency_id']);
$chartData[$spentKey] = $chartData[$spentKey] ?? [ $chartData[$spentKey] = $chartData[$spentKey] ?? [
'label' => sprintf( 'label' => sprintf(
'%s (%s)', (string)trans('firefly.spent_in_specific_budget', ['budget' => $budget->name]), $currency['currency_name'] '%s (%s)',
(string) trans('firefly.spent_in_specific_budget', ['budget' => $budget->name]),
$currency['currency_name']
), ),
'type' => 'bar', 'type' => 'bar',
'currency_symbol' => $currency['currency_symbol'], 'currency_symbol' => $currency['currency_symbol'],
@ -240,8 +238,6 @@ class BudgetReportController extends Controller
// loop expenses. // loop expenses.
foreach ($spent as $currency) { foreach ($spent as $currency) {
foreach ($currency['budgets'] as $budget) { foreach ($currency['budgets'] as $budget) {
foreach ($budget['transaction_journals'] as $journal) { foreach ($budget['transaction_journals'] as $journal) {
$title = sprintf('%s (%s)', $journal['source_account_name'], $currency['currency_name']); $title = sprintf('%s (%s)', $journal['source_account_name'], $currency['currency_name']);
$result[$title] = $result[$title] ?? [ $result[$title] = $result[$title] ?? [
@ -282,5 +278,4 @@ class BudgetReportController extends Controller
return $return; return $return;
} }
} }

View File

@ -191,7 +191,7 @@ class CategoryController extends Controller
/** @var array $currency */ /** @var array $currency */
foreach ($currencies as $currency) { foreach ($currencies as $currency) {
$dataSet = [ $dataSet = [
'label' => sprintf('%s (%s)', (string)trans('firefly.spent'), $currency['currency_name']), 'label' => sprintf('%s (%s)', (string) trans('firefly.spent'), $currency['currency_name']),
'type' => 'bar', 'type' => 'bar',
'currency_symbol' => $currency['currency_symbol'], 'currency_symbol' => $currency['currency_symbol'],
'entries' => $this->expandNames($tempData), 'entries' => $this->expandNames($tempData),
@ -353,7 +353,7 @@ class CategoryController extends Controller
if (null !== $category) { if (null !== $category) {
/** @var OperationsRepositoryInterface $opsRepository */ /** @var OperationsRepositoryInterface $opsRepository */
$opsRepository = app(OperationsRepositoryInterface::class); $opsRepository = app(OperationsRepositoryInterface::class);
$categoryId = (int)$category->id; $categoryId = (int) $category->id;
// this gives us all currencies // this gives us all currencies
$collection = new Collection([$category]); $collection = new Collection([$category]);
$expenses = $opsRepository->listExpenses($start, $end, null, $collection); $expenses = $opsRepository->listExpenses($start, $end, null, $collection);
@ -372,7 +372,7 @@ class CategoryController extends Controller
$inKey = sprintf('%d-in', $currencyId); $inKey = sprintf('%d-in', $currencyId);
$chartData[$outKey] $chartData[$outKey]
= [ = [
'label' => sprintf('%s (%s)', (string)trans('firefly.spent'), $currencyInfo['currency_name']), 'label' => sprintf('%s (%s)', (string) trans('firefly.spent'), $currencyInfo['currency_name']),
'entries' => [], 'entries' => [],
'type' => 'bar', 'type' => 'bar',
'backgroundColor' => 'rgba(219, 68, 55, 0.5)', // red 'backgroundColor' => 'rgba(219, 68, 55, 0.5)', // red
@ -380,7 +380,7 @@ class CategoryController extends Controller
$chartData[$inKey] $chartData[$inKey]
= [ = [
'label' => sprintf('%s (%s)', (string)trans('firefly.earned'), $currencyInfo['currency_name']), 'label' => sprintf('%s (%s)', (string) trans('firefly.earned'), $currencyInfo['currency_name']),
'entries' => [], 'entries' => [],
'type' => 'bar', 'type' => 'bar',
'backgroundColor' => 'rgba(0, 141, 76, 0.5)', // green 'backgroundColor' => 'rgba(0, 141, 76, 0.5)', // green

View File

@ -316,7 +316,9 @@ class CategoryReportController extends Controller
$spentKey = sprintf('%d-spent', $currency['currency_id']); $spentKey = sprintf('%d-spent', $currency['currency_id']);
$chartData[$spentKey] = $chartData[$spentKey] ?? [ $chartData[$spentKey] = $chartData[$spentKey] ?? [
'label' => sprintf( 'label' => sprintf(
'%s (%s)', (string)trans('firefly.spent_in_specific_category', ['category' => $category->name]), $currency['currency_name'] '%s (%s)',
(string) trans('firefly.spent_in_specific_category', ['category' => $category->name]),
$currency['currency_name']
), ),
'type' => 'bar', 'type' => 'bar',
'currency_symbol' => $currency['currency_symbol'], 'currency_symbol' => $currency['currency_symbol'],
@ -340,7 +342,9 @@ class CategoryReportController extends Controller
$spentKey = sprintf('%d-earned', $currency['currency_id']); $spentKey = sprintf('%d-earned', $currency['currency_id']);
$chartData[$spentKey] = $chartData[$spentKey] ?? [ $chartData[$spentKey] = $chartData[$spentKey] ?? [
'label' => sprintf( 'label' => sprintf(
'%s (%s)', (string)trans('firefly.earned_in_specific_category', ['category' => $category->name]), $currency['currency_name'] '%s (%s)',
(string) trans('firefly.earned_in_specific_category', ['category' => $category->name]),
$currency['currency_name']
), ),
'type' => 'bar', 'type' => 'bar',
'currency_symbol' => $currency['currency_symbol'], 'currency_symbol' => $currency['currency_symbol'],
@ -457,5 +461,4 @@ class CategoryReportController extends Controller
return $return; return $return;
} }
} }

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Chart; namespace FireflyIII\Http\Controllers\Chart;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Generator\Chart\Basic\GeneratorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@ -196,7 +195,9 @@ class DoubleReportController extends Controller
$chartData[$spentKey] = $chartData[$spentKey] ?? [ $chartData[$spentKey] = $chartData[$spentKey] ?? [
'label' => sprintf( 'label' => sprintf(
'%s (%s)', (string)trans('firefly.spent_in_specific_double', ['account' => $name]), $currency['currency_name'] '%s (%s)',
(string) trans('firefly.spent_in_specific_double', ['account' => $name]),
$currency['currency_name']
), ),
'type' => 'bar', 'type' => 'bar',
'currency_symbol' => $currency['currency_symbol'], 'currency_symbol' => $currency['currency_symbol'],
@ -210,7 +211,6 @@ class DoubleReportController extends Controller
$chartData[$spentKey]['entries'][$key] = $chartData[$spentKey]['entries'][$key] ?? '0'; $chartData[$spentKey]['entries'][$key] = $chartData[$spentKey]['entries'][$key] ?? '0';
$chartData[$spentKey]['entries'][$key] = bcadd($chartData[$spentKey]['entries'][$key], $amount); $chartData[$spentKey]['entries'][$key] = bcadd($chartData[$spentKey]['entries'][$key], $amount);
} }
} }
// loop income. // loop income.
foreach ($earned as $currency) { foreach ($earned as $currency) {
@ -220,7 +220,9 @@ class DoubleReportController extends Controller
$chartData[$earnedKey] = $chartData[$earnedKey] ?? [ $chartData[$earnedKey] = $chartData[$earnedKey] ?? [
'label' => sprintf( 'label' => sprintf(
'%s (%s)', (string)trans('firefly.earned_in_specific_double', ['account' => $name]), $currency['currency_name'] '%s (%s)',
(string) trans('firefly.earned_in_specific_double', ['account' => $name]),
$currency['currency_name']
), ),
'type' => 'bar', 'type' => 'bar',
'currency_symbol' => $currency['currency_symbol'], 'currency_symbol' => $currency['currency_symbol'],
@ -242,7 +244,6 @@ class DoubleReportController extends Controller
} }
/** /**
* @param Collection $accounts * @param Collection $accounts
* @param Collection $others * @param Collection $others
@ -275,7 +276,6 @@ class DoubleReportController extends Controller
]; ];
$amount = app('steam')->positive($journal['amount']); $amount = app('steam')->positive($journal['amount']);
$result[$title]['amount'] = bcadd($result[$title]['amount'], $amount); $result[$title]['amount'] = bcadd($result[$title]['amount'], $amount);
} }
// loop each tag: // loop each tag:
/** @var array $tag */ /** @var array $tag */
@ -334,7 +334,6 @@ class DoubleReportController extends Controller
]; ];
$amount = app('steam')->positive($journal['amount']); $amount = app('steam')->positive($journal['amount']);
$result[$title]['amount'] = bcadd($result[$title]['amount'], $amount); $result[$title]['amount'] = bcadd($result[$title]['amount'], $amount);
} }
// loop each tag: // loop each tag:
/** @var array $tag */ /** @var array $tag */
@ -364,10 +363,10 @@ class DoubleReportController extends Controller
/** /**
* TODO this method is double. * TODO this method is double.
* *
* @param Collection $accounts * @param Collection $accounts
* @param int $id * @param int $id
* @param string $name * @param string $name
* @param null|string $iban * @param null|string $iban
* *
* @return string * @return string
*/ */
@ -410,6 +409,4 @@ class DoubleReportController extends Controller
return $return; return $return;
} }
}
}

View File

@ -49,6 +49,7 @@ class ExpenseReportController extends Controller
/** /**
* ExpenseReportController constructor. * ExpenseReportController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -72,8 +73,8 @@ class ExpenseReportController extends Controller
* *
* @param Collection $accounts * @param Collection $accounts
* @param Collection $expense * @param Collection $expense
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return JsonResponse * @return JsonResponse
* *
@ -87,7 +88,7 @@ class ExpenseReportController extends Controller
$cache->addProperty($start); $cache->addProperty($start);
$cache->addProperty($end); $cache->addProperty($end);
if ($cache->has()) { if ($cache->has()) {
return response()->json($cache->get()); // @codeCoverageIgnore return response()->json($cache->get()); // @codeCoverageIgnore
} }
$format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); $format = app('navigation')->preferredCarbonLocalizedFormat($start, $end);
@ -103,7 +104,7 @@ class ExpenseReportController extends Controller
// prep chart data: // prep chart data:
/** /**
* @var string $name * @var string $name
* @var Collection $combination * @var Collection $combination
*/ */
foreach ($combined as $name => $combination) { foreach ($combined as $name => $combination) {
@ -111,27 +112,27 @@ class ExpenseReportController extends Controller
/** @var Account $exp */ /** @var Account $exp */
$exp = $combination->first(); $exp = $combination->first();
$chartData[$exp->id . '-in'] = [ $chartData[$exp->id . '-in'] = [
'label' => sprintf('%s (%s)', $name, strtolower((string)trans('firefly.income'))), 'label' => sprintf('%s (%s)', $name, strtolower((string) trans('firefly.income'))),
'type' => 'bar', 'type' => 'bar',
'yAxisID' => 'y-axis-0', 'yAxisID' => 'y-axis-0',
'entries' => [], 'entries' => [],
]; ];
$chartData[$exp->id . '-out'] = [ $chartData[$exp->id . '-out'] = [
'label' => sprintf('%s (%s)', $name, strtolower((string)trans('firefly.expenses'))), 'label' => sprintf('%s (%s)', $name, strtolower((string) trans('firefly.expenses'))),
'type' => 'bar', 'type' => 'bar',
'yAxisID' => 'y-axis-0', 'yAxisID' => 'y-axis-0',
'entries' => [], 'entries' => [],
]; ];
// total in, total out: // total in, total out:
$chartData[$exp->id . '-total-in'] = [ $chartData[$exp->id . '-total-in'] = [
'label' => sprintf('%s (%s)', $name, strtolower((string)trans('firefly.sum_of_income'))), 'label' => sprintf('%s (%s)', $name, strtolower((string) trans('firefly.sum_of_income'))),
'type' => 'line', 'type' => 'line',
'fill' => false, 'fill' => false,
'yAxisID' => 'y-axis-1', 'yAxisID' => 'y-axis-1',
'entries' => [], 'entries' => [],
]; ];
$chartData[$exp->id . '-total-out'] = [ $chartData[$exp->id . '-total-out'] = [
'label' => sprintf('%s (%s)', $name, strtolower((string)trans('firefly.sum_of_expenses'))), 'label' => sprintf('%s (%s)', $name, strtolower((string) trans('firefly.sum_of_expenses'))),
'type' => 'line', 'type' => 'line',
'fill' => false, 'fill' => false,
'yAxisID' => 'y-axis-1', 'yAxisID' => 'y-axis-1',

View File

@ -44,6 +44,7 @@ class PiggyBankController extends Controller
/** /**
* PiggyBankController constructor. * PiggyBankController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -98,7 +99,7 @@ class PiggyBankController extends Controller
} }
); );
$currentSum = $filtered->sum('amount'); $currentSum = $filtered->sum('amount');
$label = $oldest->formatLocalized((string)trans('config.month_and_day')); $label = $oldest->formatLocalized((string) trans('config.month_and_day'));
$chartData[$label] = $currentSum; $chartData[$label] = $currentSum;
$oldest = app('navigation')->addPeriod($oldest, $step, 0); $oldest = app('navigation')->addPeriod($oldest, $step, 0);
} }
@ -109,7 +110,7 @@ class PiggyBankController extends Controller
} }
); );
$finalSum = $finalFiltered->sum('amount'); $finalSum = $finalFiltered->sum('amount');
$finalLabel = $today->formatLocalized((string)trans('config.month_and_day')); $finalLabel = $today->formatLocalized((string) trans('config.month_and_day'));
$chartData[$finalLabel] = $finalSum; $chartData[$finalLabel] = $finalSum;
$data = $this->generator->singleSet($piggyBank->name, $chartData); $data = $this->generator->singleSet($piggyBank->name, $chartData);

View File

@ -110,7 +110,7 @@ class ReportController extends Controller
/** @var array $netWorthItem */ /** @var array $netWorthItem */
foreach ($result as $netWorthItem) { foreach ($result as $netWorthItem) {
$currencyId = $netWorthItem['currency']->id; $currencyId = $netWorthItem['currency']->id;
$label = $current->formatLocalized((string)trans('config.month_and_day')); $label = $current->formatLocalized((string) trans('config.month_and_day'));
if (!isset($chartData[$currencyId])) { if (!isset($chartData[$currencyId])) {
$chartData[$currencyId] = [ $chartData[$currencyId] = [
'label' => 'Net worth in ' . $netWorthItem['currency']->name, 'label' => 'Net worth in ' . $netWorthItem['currency']->name,
@ -138,7 +138,7 @@ class ReportController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Http\JsonResponse * @return JsonResponse
*/ */
public function operations(Collection $accounts, Carbon $start, Carbon $end): JsonResponse public function operations(Collection $accounts, Carbon $start, Carbon $end): JsonResponse
{ {
@ -152,10 +152,10 @@ class ReportController extends Controller
return response()->json($cache->get()); // @codeCoverageIgnore return response()->json($cache->get()); // @codeCoverageIgnore
} }
Log::debug('Going to do operations for accounts ', $accounts->pluck('id')->toArray()); Log::debug('Going to do operations for accounts ', $accounts->pluck('id')->toArray());
$format = app('navigation')->preferredCarbonFormat($start, $end); $format = app('navigation')->preferredCarbonFormat($start, $end);
$titleFormat = app('navigation')->preferredCarbonLocalizedFormat($start, $end); $titleFormat = app('navigation')->preferredCarbonLocalizedFormat($start, $end);
$preferredRange = app('navigation')->preferredRangeFormat($start, $end); $preferredRange = app('navigation')->preferredRangeFormat($start, $end);
$ids = $accounts->pluck('id')->toArray(); $ids = $accounts->pluck('id')->toArray();
// get journals for entire period: // get journals for entire period:
$data = []; $data = [];
@ -173,13 +173,13 @@ class ReportController extends Controller
/** @var array $journal */ /** @var array $journal */
foreach ($journals as $journal) { foreach ($journals as $journal) {
$period = $journal['date']->format($format); $period = $journal['date']->format($format);
$currencyId = (int)$journal['currency_id']; $currencyId = (int) $journal['currency_id'];
$data[$currencyId] = $data[$currencyId] ?? [ $data[$currencyId] = $data[$currencyId] ?? [
'currency_id' => $currencyId, 'currency_id' => $currencyId,
'currency_symbol' => $journal['currency_symbol'], 'currency_symbol' => $journal['currency_symbol'],
'currency_code' => $journal['currency_code'], 'currency_code' => $journal['currency_code'],
'currency_name' => $journal['currency_name'], 'currency_name' => $journal['currency_name'],
'currency_decimal_places' => (int)$journal['currency_decimal_places'], 'currency_decimal_places' => (int) $journal['currency_decimal_places'],
]; ];
$data[$currencyId][$period] = $data[$currencyId][$period] ?? [ $data[$currencyId][$period] = $data[$currencyId][$period] ?? [
'period' => $period, 'period' => $period,
@ -211,7 +211,7 @@ class ReportController extends Controller
/** @var array $currency */ /** @var array $currency */
foreach ($data as $currency) { foreach ($data as $currency) {
$income = [ $income = [
'label' => (string)trans('firefly.box_earned_in_currency', ['currency' => $currency['currency_name']]), 'label' => (string) trans('firefly.box_earned_in_currency', ['currency' => $currency['currency_name']]),
'type' => 'bar', 'type' => 'bar',
'backgroundColor' => 'rgba(0, 141, 76, 0.5)', // green 'backgroundColor' => 'rgba(0, 141, 76, 0.5)', // green
'currency_id' => $currency['currency_id'], 'currency_id' => $currency['currency_id'],
@ -219,7 +219,7 @@ class ReportController extends Controller
'entries' => [], 'entries' => [],
]; ];
$expense = [ $expense = [
'label' => (string)trans('firefly.box_spent_in_currency', ['currency' => $currency['currency_name']]), 'label' => (string) trans('firefly.box_spent_in_currency', ['currency' => $currency['currency_name']]),
'type' => 'bar', 'type' => 'bar',
'backgroundColor' => 'rgba(219, 68, 55, 0.5)', // red 'backgroundColor' => 'rgba(219, 68, 55, 0.5)', // red
'currency_id' => $currency['currency_id'], 'currency_id' => $currency['currency_id'],
@ -234,7 +234,7 @@ class ReportController extends Controller
$title = $currentStart->formatLocalized($titleFormat); $title = $currentStart->formatLocalized($titleFormat);
$income['entries'][$title] = round($currency[$key]['earned'] ?? '0', $currency['currency_decimal_places']); $income['entries'][$title] = round($currency[$key]['earned'] ?? '0', $currency['currency_decimal_places']);
$expense['entries'][$title] = round($currency[$key]['spent'] ?? '0', $currency['currency_decimal_places']); $expense['entries'][$title] = round($currency[$key]['spent'] ?? '0', $currency['currency_decimal_places']);
$currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0); $currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0);
} }
$chartData[] = $income; $chartData[] = $income;

View File

@ -264,7 +264,9 @@ class TagReportController extends Controller
$spentKey = sprintf('%d-spent', $currency['currency_id']); $spentKey = sprintf('%d-spent', $currency['currency_id']);
$chartData[$spentKey] = $chartData[$spentKey] ?? [ $chartData[$spentKey] = $chartData[$spentKey] ?? [
'label' => sprintf( 'label' => sprintf(
'%s (%s)', (string)trans('firefly.spent_in_specific_tag', ['tag' => $tag->tag]), $currency['currency_name'] '%s (%s)',
(string) trans('firefly.spent_in_specific_tag', ['tag' => $tag->tag]),
$currency['currency_name']
), ),
'type' => 'bar', 'type' => 'bar',
'currency_symbol' => $currency['currency_symbol'], 'currency_symbol' => $currency['currency_symbol'],
@ -288,7 +290,9 @@ class TagReportController extends Controller
$spentKey = sprintf('%d-earned', $currency['currency_id']); $spentKey = sprintf('%d-earned', $currency['currency_id']);
$chartData[$spentKey] = $chartData[$spentKey] ?? [ $chartData[$spentKey] = $chartData[$spentKey] ?? [
'label' => sprintf( 'label' => sprintf(
'%s (%s)', (string)trans('firefly.earned_in_specific_tag', ['tag' => $tag->tag]), $currency['currency_name'] '%s (%s)',
(string) trans('firefly.earned_in_specific_tag', ['tag' => $tag->tag]),
$currency['currency_name']
), ),
'type' => 'bar', 'type' => 'bar',
'currency_symbol' => $currency['currency_symbol'], 'currency_symbol' => $currency['currency_symbol'],
@ -475,5 +479,4 @@ class TagReportController extends Controller
return $return; return $return;
} }
} }

View File

@ -21,7 +21,6 @@
namespace FireflyIII\Http\Controllers\Chart; namespace FireflyIII\Http\Controllers\Chart;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Generator\Chart\Basic\GeneratorInterface;
@ -29,6 +28,7 @@ use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\Support\CacheProperties; use FireflyIII\Support\CacheProperties;
use Illuminate\Http\JsonResponse;
/** /**
* Class TransactionController * Class TransactionController
@ -53,8 +53,8 @@ class TransactionController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Http\JsonResponse
* @throws FireflyException * @throws FireflyException
* @return JsonResponse
*/ */
public function budgets(Carbon $start, Carbon $end) public function budgets(Carbon $start, Carbon $end)
{ {
@ -79,7 +79,7 @@ class TransactionController extends Controller
// group by category. // group by category.
/** @var array $journal */ /** @var array $journal */
foreach ($result as $journal) { foreach ($result as $journal) {
$budget = $journal['budget_name'] ?? (string)trans('firefly.no_budget'); $budget = $journal['budget_name'] ?? (string) trans('firefly.no_budget');
$title = sprintf('%s (%s)', $budget, $journal['currency_symbol']); $title = sprintf('%s (%s)', $budget, $journal['currency_symbol']);
// key => [value => x, 'currency_symbol' => 'x'] // key => [value => x, 'currency_symbol' => 'x']
$data[$title] = $data[$title] ?? [ $data[$title] = $data[$title] ?? [
@ -108,8 +108,8 @@ class TransactionController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Http\JsonResponse
* @throws FireflyException * @throws FireflyException
* @return JsonResponse
*/ */
public function categories(string $objectType, Carbon $start, Carbon $end) public function categories(string $objectType, Carbon $start, Carbon $end)
{ {
@ -146,7 +146,7 @@ class TransactionController extends Controller
// group by category. // group by category.
/** @var array $journal */ /** @var array $journal */
foreach ($result as $journal) { foreach ($result as $journal) {
$category = $journal['category_name'] ?? (string)trans('firefly.no_category'); $category = $journal['category_name'] ?? (string) trans('firefly.no_category');
$title = sprintf('%s (%s)', $category, $journal['currency_symbol']); $title = sprintf('%s (%s)', $category, $journal['currency_symbol']);
// key => [value => x, 'currency_symbol' => 'x'] // key => [value => x, 'currency_symbol' => 'x']
$data[$title] = $data[$title] ?? [ $data[$title] = $data[$title] ?? [
@ -175,8 +175,8 @@ class TransactionController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Http\JsonResponse
* @throws FireflyException * @throws FireflyException
* @return JsonResponse
*/ */
public function destinationAccounts(string $objectType, Carbon $start, Carbon $end) public function destinationAccounts(string $objectType, Carbon $start, Carbon $end)
{ {
@ -213,8 +213,8 @@ class TransactionController extends Controller
// group by category. // group by category.
/** @var array $journal */ /** @var array $journal */
foreach ($result as $journal) { foreach ($result as $journal) {
$name = $journal['destination_account_name']; $name = $journal['destination_account_name'];
$title = sprintf('%s (%s)', $name, $journal['currency_symbol']); $title = sprintf('%s (%s)', $name, $journal['currency_symbol']);
$data[$title] = $data[$title] ?? [ $data[$title] = $data[$title] ?? [
'amount' => '0', 'amount' => '0',
'currency_symbol' => $journal['currency_symbol'], 'currency_symbol' => $journal['currency_symbol'],
@ -241,8 +241,8 @@ class TransactionController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Http\JsonResponse
* @throws FireflyException * @throws FireflyException
* @return JsonResponse
*/ */
public function sourceAccounts(string $objectType, Carbon $start, Carbon $end) public function sourceAccounts(string $objectType, Carbon $start, Carbon $end)
{ {
@ -279,8 +279,8 @@ class TransactionController extends Controller
// group by category. // group by category.
/** @var array $journal */ /** @var array $journal */
foreach ($result as $journal) { foreach ($result as $journal) {
$name = $journal['source_account_name']; $name = $journal['source_account_name'];
$title = sprintf('%s (%s)', $name, $journal['currency_symbol']); $title = sprintf('%s (%s)', $name, $journal['currency_symbol']);
$data[$title] = $data[$title] ?? [ $data[$title] = $data[$title] ?? [
'amount' => '0', 'amount' => '0',
'currency_symbol' => $journal['currency_symbol'], 'currency_symbol' => $journal['currency_symbol'],
@ -301,5 +301,4 @@ class TransactionController extends Controller
return response()->json($chart); return response()->json($chart);
} }
}
}

View File

@ -78,9 +78,9 @@ class Controller extends BaseController
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
// translations for specific strings: // translations for specific strings:
$this->monthFormat = (string)trans('config.month'); $this->monthFormat = (string) trans('config.month');
$this->monthAndDayFormat = (string)trans('config.month_and_day'); $this->monthAndDayFormat = (string) trans('config.month_and_day');
$this->dateTimeFormat = (string)trans('config.date_time'); $this->dateTimeFormat = (string) trans('config.date_time');
// get shown-intro-preference: // get shown-intro-preference:
if (auth()->check()) { if (auth()->check()) {
@ -97,5 +97,4 @@ class Controller extends BaseController
} }
); );
} }
} }

View File

@ -29,8 +29,11 @@ use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Routing\Redirector;
use Log; use Log;
use View; use View;
@ -47,6 +50,7 @@ class CurrencyController extends Controller
/** /**
* CurrencyController constructor. * CurrencyController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -55,7 +59,7 @@ class CurrencyController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.currencies')); app('view')->share('title', (string) trans('firefly.currencies'));
app('view')->share('mainTitleIcon', 'fa-usd'); app('view')->share('mainTitleIcon', 'fa-usd');
$this->repository = app(CurrencyRepositoryInterface::class); $this->repository = app(CurrencyRepositoryInterface::class);
$this->userRepository = app(UserRepositoryInterface::class); $this->userRepository = app(UserRepositoryInterface::class);
@ -71,20 +75,20 @@ class CurrencyController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View * @return RedirectResponse|Redirector|View
*/ */
public function create(Request $request) public function create(Request $request)
{ {
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
if (!$this->userRepository->hasRole($user, 'owner')) { if (!$this->userRepository->hasRole($user, 'owner')) {
$request->session()->flash('error', (string)trans('firefly.ask_site_owner', ['owner' => e(config('firefly.site_owner'))])); $request->session()->flash('error', (string) trans('firefly.ask_site_owner', ['owner' => e(config('firefly.site_owner'))]));
return redirect(route('currencies.index')); return redirect(route('currencies.index'));
} }
$subTitleIcon = 'fa-plus'; $subTitleIcon = 'fa-plus';
$subTitle = (string)trans('firefly.create_currency'); $subTitle = (string) trans('firefly.create_currency');
// put previous url in session if not redirect from store (not "create another"). // put previous url in session if not redirect from store (not "create another").
if (true !== session('currencies.create.fromStore')) { if (true !== session('currencies.create.fromStore')) {
@ -103,7 +107,7 @@ class CurrencyController extends Controller
* @param Request $request * @param Request $request
* @param TransactionCurrency $currency * @param TransactionCurrency $currency
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function defaultCurrency(Request $request, TransactionCurrency $currency) public function defaultCurrency(Request $request, TransactionCurrency $currency)
{ {
@ -113,7 +117,7 @@ class CurrencyController extends Controller
Log::channel('audit')->info(sprintf('Make %s the default currency.', $currency->code)); Log::channel('audit')->info(sprintf('Make %s the default currency.', $currency->code));
$this->repository->enable($currency); $this->repository->enable($currency);
$request->session()->flash('success', (string)trans('firefly.new_default_currency', ['name' => $currency->name])); $request->session()->flash('success', (string) trans('firefly.new_default_currency', ['name' => $currency->name]));
return redirect(route('currencies.index')); return redirect(route('currencies.index'));
} }
@ -124,7 +128,7 @@ class CurrencyController extends Controller
* @param Request $request * @param Request $request
* @param TransactionCurrency $currency * @param TransactionCurrency $currency
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View * @return RedirectResponse|Redirector|View
*/ */
public function delete(Request $request, TransactionCurrency $currency) public function delete(Request $request, TransactionCurrency $currency)
{ {
@ -132,7 +136,7 @@ class CurrencyController extends Controller
$user = auth()->user(); $user = auth()->user();
if (!$this->userRepository->hasRole($user, 'owner')) { if (!$this->userRepository->hasRole($user, 'owner')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->flash('error', (string)trans('firefly.ask_site_owner', ['owner' => e(config('firefly.site_owner'))])); $request->session()->flash('error', (string) trans('firefly.ask_site_owner', ['owner' => e(config('firefly.site_owner'))]));
Log::channel('audit')->info(sprintf('Tried to visit page to delete currency %s but is not site owner.', $currency->code)); Log::channel('audit')->info(sprintf('Tried to visit page to delete currency %s but is not site owner.', $currency->code));
return redirect(route('currencies.index')); return redirect(route('currencies.index'));
@ -141,7 +145,7 @@ class CurrencyController extends Controller
if ($this->repository->currencyInUse($currency)) { if ($this->repository->currencyInUse($currency)) {
$location = $this->repository->currencyInUseAt($currency); $location = $this->repository->currencyInUseAt($currency);
$message = (string)trans(sprintf('firefly.cannot_disable_currency_%s', $location), ['name' => e($currency->name)]); $message = (string) trans(sprintf('firefly.cannot_disable_currency_%s', $location), ['name' => e($currency->name)]);
$request->session()->flash('error', $message); $request->session()->flash('error', $message);
Log::channel('audit')->info(sprintf('Tried to visit page to delete currency %s but currency is in use.', $currency->code)); Log::channel('audit')->info(sprintf('Tried to visit page to delete currency %s but currency is in use.', $currency->code));
@ -150,7 +154,7 @@ class CurrencyController extends Controller
// put previous url in session // put previous url in session
$this->rememberPreviousUri('currencies.delete.uri'); $this->rememberPreviousUri('currencies.delete.uri');
$subTitle = (string)trans('form.delete_currency', ['name' => $currency->name]); $subTitle = (string) trans('form.delete_currency', ['name' => $currency->name]);
Log::channel('audit')->info(sprintf('Visit page to delete currency %s.', $currency->code)); Log::channel('audit')->info(sprintf('Visit page to delete currency %s.', $currency->code));
return view('currencies.delete', compact('currency', 'subTitle')); return view('currencies.delete', compact('currency', 'subTitle'));
@ -162,7 +166,7 @@ class CurrencyController extends Controller
* @param Request $request * @param Request $request
* @param TransactionCurrency $currency * @param TransactionCurrency $currency
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function destroy(Request $request, TransactionCurrency $currency) public function destroy(Request $request, TransactionCurrency $currency)
{ {
@ -170,7 +174,7 @@ class CurrencyController extends Controller
$user = auth()->user(); $user = auth()->user();
if (!$this->userRepository->hasRole($user, 'owner')) { if (!$this->userRepository->hasRole($user, 'owner')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->flash('error', (string)trans('firefly.ask_site_owner', ['owner' => e(config('firefly.site_owner'))])); $request->session()->flash('error', (string) trans('firefly.ask_site_owner', ['owner' => e(config('firefly.site_owner'))]));
Log::channel('audit')->info(sprintf('Tried to delete currency %s but is not site owner.', $currency->code)); Log::channel('audit')->info(sprintf('Tried to delete currency %s but is not site owner.', $currency->code));
return redirect(route('currencies.index')); return redirect(route('currencies.index'));
@ -178,14 +182,14 @@ class CurrencyController extends Controller
} }
if ($this->repository->currencyInUse($currency)) { if ($this->repository->currencyInUse($currency)) {
$request->session()->flash('error', (string)trans('firefly.cannot_delete_currency', ['name' => e($currency->name)])); $request->session()->flash('error', (string) trans('firefly.cannot_delete_currency', ['name' => e($currency->name)]));
Log::channel('audit')->info(sprintf('Tried to delete currency %s but is in use.', $currency->code)); Log::channel('audit')->info(sprintf('Tried to delete currency %s but is in use.', $currency->code));
return redirect(route('currencies.index')); return redirect(route('currencies.index'));
} }
if ($this->repository->isFallbackCurrency($currency)) { if ($this->repository->isFallbackCurrency($currency)) {
$request->session()->flash('error', (string)trans('firefly.cannot_delete_fallback_currency', ['name' => e($currency->name)])); $request->session()->flash('error', (string) trans('firefly.cannot_delete_fallback_currency', ['name' => e($currency->name)]));
Log::channel('audit')->info(sprintf('Tried to delete currency %s but is FALLBACK.', $currency->code)); Log::channel('audit')->info(sprintf('Tried to delete currency %s but is FALLBACK.', $currency->code));
return redirect(route('currencies.index')); return redirect(route('currencies.index'));
@ -194,7 +198,7 @@ class CurrencyController extends Controller
Log::channel('audit')->info(sprintf('Deleted currency %s.', $currency->code)); Log::channel('audit')->info(sprintf('Deleted currency %s.', $currency->code));
$this->repository->destroy($currency); $this->repository->destroy($currency);
$request->session()->flash('success', (string)trans('firefly.deleted_currency', ['name' => $currency->name])); $request->session()->flash('success', (string) trans('firefly.deleted_currency', ['name' => $currency->name]));
return redirect($this->getPreviousUri('currencies.delete.uri')); return redirect($this->getPreviousUri('currencies.delete.uri'));
} }
@ -203,8 +207,8 @@ class CurrencyController extends Controller
* @param Request $request * @param Request $request
* @param TransactionCurrency $currency * @param TransactionCurrency $currency
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
* @throws FireflyException * @throws FireflyException
* @return RedirectResponse|Redirector
*/ */
public function disableCurrency(Request $request, TransactionCurrency $currency) public function disableCurrency(Request $request, TransactionCurrency $currency)
{ {
@ -214,7 +218,7 @@ class CurrencyController extends Controller
$user = auth()->user(); $user = auth()->user();
if (!$this->userRepository->hasRole($user, 'owner')) { if (!$this->userRepository->hasRole($user, 'owner')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->flash('error', (string)trans('firefly.ask_site_owner', ['owner' => e(config('firefly.site_owner'))])); $request->session()->flash('error', (string) trans('firefly.ask_site_owner', ['owner' => e(config('firefly.site_owner'))]));
Log::channel('audit')->info(sprintf('Tried to disable currency %s but is not site owner.', $currency->code)); Log::channel('audit')->info(sprintf('Tried to disable currency %s but is not site owner.', $currency->code));
return redirect(route('currencies.index')); return redirect(route('currencies.index'));
@ -224,7 +228,7 @@ class CurrencyController extends Controller
if ($this->repository->currencyInUse($currency)) { if ($this->repository->currencyInUse($currency)) {
$location = $this->repository->currencyInUseAt($currency); $location = $this->repository->currencyInUseAt($currency);
$message = (string)trans(sprintf('firefly.cannot_disable_currency_%s', $location), ['name' => e($currency->name)]); $message = (string) trans(sprintf('firefly.cannot_disable_currency_%s', $location), ['name' => e($currency->name)]);
$request->session()->flash('error', $message); $request->session()->flash('error', $message);
Log::channel('audit')->info(sprintf('Tried to disable currency %s but is in use.', $currency->code)); Log::channel('audit')->info(sprintf('Tried to disable currency %s but is in use.', $currency->code));
@ -248,10 +252,10 @@ class CurrencyController extends Controller
} }
if ('EUR' === $currency->code) { if ('EUR' === $currency->code) {
session()->flash('warning', (string)trans('firefly.disable_EUR_side_effects')); session()->flash('warning', (string) trans('firefly.disable_EUR_side_effects'));
} }
session()->flash('success', (string)trans('firefly.currency_is_now_disabled', ['name' => $currency->name])); session()->flash('success', (string) trans('firefly.currency_is_now_disabled', ['name' => $currency->name]));
return redirect(route('currencies.index')); return redirect(route('currencies.index'));
} }
@ -262,7 +266,7 @@ class CurrencyController extends Controller
* @param Request $request * @param Request $request
* @param TransactionCurrency $currency * @param TransactionCurrency $currency
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View * @return RedirectResponse|Redirector|View
*/ */
public function edit(Request $request, TransactionCurrency $currency) public function edit(Request $request, TransactionCurrency $currency)
{ {
@ -270,7 +274,7 @@ class CurrencyController extends Controller
$user = auth()->user(); $user = auth()->user();
if (!$this->userRepository->hasRole($user, 'owner')) { if (!$this->userRepository->hasRole($user, 'owner')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->flash('error', (string)trans('firefly.ask_site_owner', ['owner' => e(config('firefly.site_owner'))])); $request->session()->flash('error', (string) trans('firefly.ask_site_owner', ['owner' => e(config('firefly.site_owner'))]));
Log::channel('audit')->info(sprintf('Tried to edit currency %s but is not owner.', $currency->code)); Log::channel('audit')->info(sprintf('Tried to edit currency %s but is not owner.', $currency->code));
return redirect(route('currencies.index')); return redirect(route('currencies.index'));
@ -278,13 +282,13 @@ class CurrencyController extends Controller
} }
$subTitleIcon = 'fa-pencil'; $subTitleIcon = 'fa-pencil';
$subTitle = (string)trans('breadcrumbs.edit_currency', ['name' => $currency->name]); $subTitle = (string) trans('breadcrumbs.edit_currency', ['name' => $currency->name]);
$currency->symbol = htmlentities($currency->symbol); $currency->symbol = htmlentities($currency->symbol);
// code to handle active-checkboxes // code to handle active-checkboxes
$hasOldInput = null !== $request->old('_token'); $hasOldInput = null !== $request->old('_token');
$preFilled = [ $preFilled = [
'enabled' => $hasOldInput ? (bool)$request->old('enabled') : $currency->enabled, 'enabled' => $hasOldInput ? (bool) $request->old('enabled') : $currency->enabled,
]; ];
$request->session()->flash('preFilled', $preFilled); $request->session()->flash('preFilled', $preFilled);
@ -302,14 +306,14 @@ class CurrencyController extends Controller
/** /**
* @param TransactionCurrency $currency * @param TransactionCurrency $currency
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function enableCurrency(TransactionCurrency $currency) public function enableCurrency(TransactionCurrency $currency)
{ {
app('preferences')->mark(); app('preferences')->mark();
$this->repository->enable($currency); $this->repository->enable($currency);
session()->flash('success', (string)trans('firefly.currency_is_now_enabled', ['name' => $currency->name])); session()->flash('success', (string) trans('firefly.currency_is_now_enabled', ['name' => $currency->name]));
Log::channel('audit')->info(sprintf('Enabled currency %s.', $currency->code)); Log::channel('audit')->info(sprintf('Enabled currency %s.', $currency->code));
return redirect(route('currencies.index')); return redirect(route('currencies.index'));
@ -320,14 +324,14 @@ class CurrencyController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|\Illuminate\View\View
*/ */
public function index(Request $request) public function index(Request $request)
{ {
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
$page = 0 === (int)$request->get('page') ? 1 : (int)$request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$collection = $this->repository->getAll(); $collection = $this->repository->getAll();
$total = $collection->count(); $total = $collection->count();
$collection = $collection->slice(($page - 1) * $pageSize, $pageSize); $collection = $collection->slice(($page - 1) * $pageSize, $pageSize);
@ -337,7 +341,7 @@ class CurrencyController extends Controller
$defaultCurrency = $this->repository->getCurrencyByPreference(app('preferences')->get('currencyPreference', config('firefly.default_currency', 'EUR'))); $defaultCurrency = $this->repository->getCurrencyByPreference(app('preferences')->get('currencyPreference', config('firefly.default_currency', 'EUR')));
$isOwner = true; $isOwner = true;
if (!$this->userRepository->hasRole($user, 'owner')) { if (!$this->userRepository->hasRole($user, 'owner')) {
$request->session()->flash('info', (string)trans('firefly.ask_site_owner', ['owner' => config('firefly.site_owner')])); $request->session()->flash('info', (string) trans('firefly.ask_site_owner', ['owner' => config('firefly.site_owner')]));
$isOwner = false; $isOwner = false;
} }
@ -350,7 +354,7 @@ class CurrencyController extends Controller
* *
* @param CurrencyFormRequest $request * @param CurrencyFormRequest $request
* *
* @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return $this|RedirectResponse|Redirector
*/ */
public function store(CurrencyFormRequest $request) public function store(CurrencyFormRequest $request)
{ {
@ -372,15 +376,15 @@ class CurrencyController extends Controller
} catch (FireflyException $e) { } catch (FireflyException $e) {
Log::error($e->getMessage()); Log::error($e->getMessage());
Log::channel('audit')->info('Could not store (POST) currency without admin rights.', $data); Log::channel('audit')->info('Could not store (POST) currency without admin rights.', $data);
$request->session()->flash('error', (string)trans('firefly.could_not_store_currency')); $request->session()->flash('error', (string) trans('firefly.could_not_store_currency'));
$currency = null; $currency = null;
} }
$redirect = redirect($this->getPreviousUri('currencies.create.uri')); $redirect = redirect($this->getPreviousUri('currencies.create.uri'));
if (null !== $currency) { if (null !== $currency) {
$request->session()->flash('success', (string)trans('firefly.created_currency', ['name' => $currency->name])); $request->session()->flash('success', (string) trans('firefly.created_currency', ['name' => $currency->name]));
Log::channel('audit')->info('Created (POST) currency.', $data); Log::channel('audit')->info('Created (POST) currency.', $data);
if (1 === (int)$request->get('create_another')) { if (1 === (int) $request->get('create_another')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->put('currencies.create.fromStore', true); $request->session()->put('currencies.create.fromStore', true);
@ -399,7 +403,7 @@ class CurrencyController extends Controller
* @param CurrencyFormRequest $request * @param CurrencyFormRequest $request
* @param TransactionCurrency $currency * @param TransactionCurrency $currency
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function update(CurrencyFormRequest $request, TransactionCurrency $currency) public function update(CurrencyFormRequest $request, TransactionCurrency $currency)
{ {
@ -412,7 +416,7 @@ class CurrencyController extends Controller
} }
if (!$this->userRepository->hasRole($user, 'owner')) { if (!$this->userRepository->hasRole($user, 'owner')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->flash('error', (string)trans('firefly.ask_site_owner', ['owner' => e(config('firefly.site_owner'))])); $request->session()->flash('error', (string) trans('firefly.ask_site_owner', ['owner' => e(config('firefly.site_owner'))]));
Log::channel('audit')->info('Tried to update (POST) currency without admin rights.', $data); Log::channel('audit')->info('Tried to update (POST) currency without admin rights.', $data);
return redirect(route('currencies.index')); return redirect(route('currencies.index'));
@ -422,10 +426,10 @@ class CurrencyController extends Controller
$currency = $this->repository->update($currency, $data); $currency = $this->repository->update($currency, $data);
Log::channel('audit')->info('Updated (POST) currency.', $data); Log::channel('audit')->info('Updated (POST) currency.', $data);
$request->session()->flash('success', (string)trans('firefly.updated_currency', ['name' => $currency->name])); $request->session()->flash('success', (string) trans('firefly.updated_currency', ['name' => $currency->name]));
app('preferences')->mark(); app('preferences')->mark();
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
$request->session()->put('currencies.edit.fromUpdate', true); $request->session()->put('currencies.edit.fromUpdate', true);

View File

@ -30,7 +30,9 @@ use Exception;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Support\Http\Controllers\GetConfigurationData; use FireflyIII\Support\Http\Controllers\GetConfigurationData;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Routing\Route; use Illuminate\Routing\Route;
use Log; use Log;
use Monolog\Handler\RotatingFileHandler; use Monolog\Handler\RotatingFileHandler;
@ -46,6 +48,7 @@ class DebugController extends Controller
/** /**
* DebugController constructor. * DebugController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -77,7 +80,7 @@ class DebugController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function flush(Request $request) public function flush(Request $request)
{ {
@ -129,7 +132,7 @@ class DebugController extends Controller
$userAgent = $request->header('user-agent'); $userAgent = $request->header('user-agent');
$trustedProxies = config('firefly.trusted_proxies'); $trustedProxies = config('firefly.trusted_proxies');
$displayErrors = ini_get('display_errors'); $displayErrors = ini_get('display_errors');
$errorReporting = $this->errorReporting((int)ini_get('error_reporting')); $errorReporting = $this->errorReporting((int) ini_get('error_reporting'));
$appEnv = config('app.env'); $appEnv = config('app.env');
$appDebug = var_export(config('app.debug'), true); $appDebug = var_export(config('app.debug'), true);
$logChannel = config('logging.default'); $logChannel = config('logging.default');
@ -140,7 +143,7 @@ class DebugController extends Controller
// set languages, see what happens: // set languages, see what happens:
$original = setlocale(LC_ALL, 0); $original = setlocale(LC_ALL, 0);
$localeAttempts = []; $localeAttempts = [];
$parts = explode(',', (string)trans('config.locale')); $parts = explode(',', (string) trans('config.locale'));
foreach ($parts as $code) { foreach ($parts as $code) {
$code = trim($code); $code = trim($code);
$localeAttempts[$code] = var_export(setlocale(LC_ALL, $code), true); $localeAttempts[$code] = var_export(setlocale(LC_ALL, $code), true);
@ -172,11 +175,29 @@ class DebugController extends Controller
} }
return view( return view(
'debug', compact( 'debug',
'phpVersion', 'extensions', 'localeAttempts', 'appEnv', 'appDebug', 'logChannel', 'appLogLevel', 'now', 'drivers', 'currentDriver', compact(
'loginProvider', 'phpVersion',
'userAgent', 'displayErrors', 'installationId', 'errorReporting', 'phpOs', 'interface', 'logContent', 'cacheDriver', 'trustedProxies' 'extensions',
) 'localeAttempts',
'appEnv',
'appDebug',
'logChannel',
'appLogLevel',
'now',
'drivers',
'currentDriver',
'loginProvider',
'userAgent',
'displayErrors',
'installationId',
'errorReporting',
'phpOs',
'interface',
'logContent',
'cacheDriver',
'trustedProxies'
)
); );
} }
@ -203,7 +224,7 @@ class DebugController extends Controller
$return = '&nbsp;'; $return = '&nbsp;';
/** @var Route $route */ /** @var Route $route */
foreach ($set as $route) { foreach ($set as $route) {
$name = (string)$route->getName(); $name = (string) $route->getName();
if (in_array('GET', $route->methods(), true)) { if (in_array('GET', $route->methods(), true)) {
$found = false; $found = false;
foreach ($ignore as $string) { foreach ($ignore as $string) {
@ -226,7 +247,7 @@ class DebugController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function testFlash(Request $request) public function testFlash(Request $request)
{ {
@ -237,6 +258,4 @@ class DebugController extends Controller
return redirect(route('home')); return redirect(route('home'));
} }
} }

View File

@ -27,7 +27,10 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Http\Middleware\IsDemoUser;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Support\Export\ExportDataGenerator; use FireflyIII\Support\Export\ExportDataGenerator;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\Response as LaravelResponse; use Illuminate\Http\Response as LaravelResponse;
use Illuminate\View\View;
use League\Csv\CannotInsertRecord;
/** /**
* Class IndexController * Class IndexController
@ -51,7 +54,7 @@ class IndexController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-life-bouy'); app('view')->share('mainTitleIcon', 'fa-life-bouy');
app('view')->share('title', (string)trans('firefly.export_data_title')); app('view')->share('title', (string) trans('firefly.export_data_title'));
$this->journalRepository = app(JournalRepositoryInterface::class); $this->journalRepository = app(JournalRepositoryInterface::class);
$this->middleware(IsDemoUser::class)->except(['index']); $this->middleware(IsDemoUser::class)->except(['index']);
@ -61,8 +64,8 @@ class IndexController extends Controller
} }
/** /**
* @throws CannotInsertRecord
* @return LaravelResponse * @return LaravelResponse
* @throws \League\Csv\CannotInsertRecord
*/ */
public function export(): LaravelResponse public function export(): LaravelResponse
{ {
@ -97,12 +100,13 @@ class IndexController extends Controller
->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->header('Pragma', 'public') ->header('Pragma', 'public')
->header('Content-Length', strlen($result['transactions'])); ->header('Content-Length', strlen($result['transactions']));
// return CSV file made from 'transactions' array. // return CSV file made from 'transactions' array.
return $response; return $response;
} }
/** /**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index() public function index()
{ {

View File

@ -31,9 +31,13 @@ use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -59,8 +63,8 @@ class HomeController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return JsonResponse
* @throws Exception * @throws Exception
* @return JsonResponse
*/ */
public function dateRange(Request $request): JsonResponse public function dateRange(Request $request): JsonResponse
{ {
@ -74,7 +78,7 @@ class HomeController extends Controller
// check if the label is "everything" or "Custom range" which will betray // check if the label is "everything" or "Custom range" which will betray
// a possible problem with the budgets. // a possible problem with the budgets.
if ($label === (string)trans('firefly.everything') || $label === (string)trans('firefly.customRange')) { if ($label === (string) trans('firefly.everything') || $label === (string) trans('firefly.customRange')) {
$isCustomRange = true; $isCustomRange = true;
Log::debug('Range is now marked as "custom".'); Log::debug('Range is now marked as "custom".');
} }
@ -82,7 +86,7 @@ class HomeController extends Controller
$diff = $start->diffInDays($end); $diff = $start->diffInDays($end);
if ($diff > 50) { if ($diff > 50) {
$request->session()->flash('warning', (string)trans('firefly.warning_much_data', ['days' => $diff])); $request->session()->flash('warning', (string) trans('firefly.warning_much_data', ['days' => $diff]));
} }
$request->session()->put('is_custom_range', $isCustomRange); $request->session()->put('is_custom_range', $isCustomRange);
@ -101,8 +105,8 @@ class HomeController extends Controller
* *
* @param AccountRepositoryInterface $repository * @param AccountRepositoryInterface $repository
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View
* @throws Exception * @throws Exception
* @return Factory|RedirectResponse|Redirector|View
*/ */
public function index(AccountRepositoryInterface $repository) public function index(AccountRepositoryInterface $repository)
{ {
@ -113,10 +117,11 @@ class HomeController extends Controller
if (0 === $count) { if (0 === $count) {
return redirect(route('new-user.index')); return redirect(route('new-user.index'));
} }
$subTitle = (string)trans('firefly.welcomeBack'); $subTitle = (string) trans('firefly.welcomeBack');
$transactions = []; $transactions = [];
$frontPage = app('preferences')->get( $frontPage = app('preferences')->get(
'frontPageAccounts', $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])->pluck('id')->toArray() 'frontPageAccounts',
$repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])->pluck('id')->toArray()
); );
/** @var Carbon $start */ /** @var Carbon $start */
$start = session('start', Carbon::now()->startOfMonth()); $start = session('start', Carbon::now()->startOfMonth());
@ -145,5 +150,4 @@ class HomeController extends Controller
return view('index', compact('count', 'subTitle', 'transactions', 'billCount', 'start', 'end', 'today')); return view('index', compact('count', 'subTitle', 'transactions', 'billCount', 'start', 'end', 'today'));
} }
} }

View File

@ -26,11 +26,16 @@ namespace FireflyIII\Http\Controllers\Import;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Log; use Log;
/** /**
* Class CallbackController * Class CallbackController
*
* @deprecated * @deprecated
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
@ -44,12 +49,12 @@ class CallbackController extends Controller
* *
* @param ImportJobRepositoryInterface $repository * @param ImportJobRepositoryInterface $repository
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View * @return Factory|RedirectResponse|Redirector|View
*/ */
public function ynab(Request $request, ImportJobRepositoryInterface $repository) public function ynab(Request $request, ImportJobRepositoryInterface $repository)
{ {
$code = (string)$request->get('code'); $code = (string) $request->get('code');
$jobKey = (string)$request->get('state'); $jobKey = (string) $request->get('state');
if ('' === $code) { if ('' === $code) {
return view('error')->with('message', 'You Need A Budget did not reply with a valid authorization code. Firefly III cannot continue.'); return view('error')->with('message', 'You Need A Budget did not reply with a valid authorization code. Firefly III cannot continue.');

View File

@ -28,12 +28,17 @@ use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Binder\ImportProvider; use FireflyIII\Support\Binder\ImportProvider;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Response as LaravelResponse; use Illuminate\Http\Response as LaravelResponse;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Log; use Log;
/** /**
* *
* Class IndexController * Class IndexController
*
* @deprecated * @deprecated
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
@ -56,7 +61,7 @@ class IndexController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-archive'); app('view')->share('mainTitleIcon', 'fa-archive');
app('view')->share('title', (string)trans('firefly.import_index_title')); app('view')->share('title', (string) trans('firefly.import_index_title'));
$this->repository = app(ImportJobRepositoryInterface::class); $this->repository = app(ImportJobRepositoryInterface::class);
$this->userRepository = app(UserRepositoryInterface::class); $this->userRepository = app(UserRepositoryInterface::class);
$this->providers = ImportProvider::getProviders(); $this->providers = ImportProvider::getProviders();
@ -71,14 +76,14 @@ class IndexController extends Controller
* *
* @param string $importProvider * @param string $importProvider
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
* *
*/ */
public function create(string $importProvider) public function create(string $importProvider)
{ {
$hasPreReq = (bool)config(sprintf('import.has_prereq.%s', $importProvider)); $hasPreReq = (bool) config(sprintf('import.has_prereq.%s', $importProvider));
$hasConfig = (bool)config(sprintf('import.has_job_config.%s', $importProvider)); $hasConfig = (bool) config(sprintf('import.has_job_config.%s', $importProvider));
$allowedForDemo = (bool)config(sprintf('import.allowed_for_demo.%s', $importProvider)); $allowedForDemo = (bool) config(sprintf('import.allowed_for_demo.%s', $importProvider));
$isDemoUser = $this->userRepository->hasRole(auth()->user(), 'demo'); $isDemoUser = $this->userRepository->hasRole(auth()->user(), 'demo');
Log::debug(sprintf('Will create job for provider "%s"', $importProvider)); Log::debug(sprintf('Will create job for provider "%s"', $importProvider));
@ -111,7 +116,7 @@ class IndexController extends Controller
// job has prerequisites: // job has prerequisites:
Log::debug('Job provider has prerequisites.'); Log::debug('Job provider has prerequisites.');
/** @var PrerequisitesInterface $providerPre */ /** @var PrerequisitesInterface $providerPre */
$providerPre = app((string)config(sprintf('import.prerequisites.%s', $importProvider))); $providerPre = app((string) config(sprintf('import.prerequisites.%s', $importProvider)));
$providerPre->setUser($importJob->user); $providerPre->setUser($importJob->user);
// and are not filled in: // and are not filled in:
@ -179,12 +184,12 @@ class IndexController extends Controller
/** /**
* General import index. * General import index.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index() public function index()
{ {
$providers = $this->providers; $providers = $this->providers;
$subTitle = (string)trans('import.index_breadcrumb'); $subTitle = (string) trans('import.index_breadcrumb');
$subTitleIcon = 'fa-home'; $subTitleIcon = 'fa-home';
$isDemoUser = $this->userRepository->hasRole(auth()->user(), 'demo'); $isDemoUser = $this->userRepository->hasRole(auth()->user(), 'demo');

View File

@ -27,13 +27,18 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\ImportJob; use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Http\Controllers\CreateStuff; use FireflyIII\Support\Http\Controllers\CreateStuff;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile; use Illuminate\Http\UploadedFile;
use Illuminate\Routing\Redirector;
use Illuminate\Support\MessageBag; use Illuminate\Support\MessageBag;
use Illuminate\View\View;
use Log; use Log;
/** /**
* Class JobConfigurationController * Class JobConfigurationController
*
* @deprecated * @deprecated
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
@ -53,7 +58,7 @@ class JobConfigurationController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-archive'); app('view')->share('mainTitleIcon', 'fa-archive');
app('view')->share('title', (string)trans('firefly.import_index_title')); app('view')->share('title', (string) trans('firefly.import_index_title'));
$this->repository = app(ImportJobRepositoryInterface::class); $this->repository = app(ImportJobRepositoryInterface::class);
return $next($request); return $next($request);
@ -66,10 +71,10 @@ class JobConfigurationController extends Controller
* *
* @param ImportJob $importJob * @param ImportJob $importJob
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View
*
* @throws FireflyException * @throws FireflyException
* *
* @return Factory|RedirectResponse|Redirector|View
*
*/ */
public function index(ImportJob $importJob) public function index(ImportJob $importJob)
{ {
@ -77,7 +82,7 @@ class JobConfigurationController extends Controller
$allowed = ['has_prereq', 'need_job_config']; $allowed = ['has_prereq', 'need_job_config'];
if (null !== $importJob && !in_array($importJob->status, $allowed, true)) { if (null !== $importJob && !in_array($importJob->status, $allowed, true)) {
Log::error(sprintf('Job has state "%s", but we only accept %s', $importJob->status, json_encode($allowed))); Log::error(sprintf('Job has state "%s", but we only accept %s', $importJob->status, json_encode($allowed)));
session()->flash('error', (string)trans('import.bad_job_status', ['status' => e($importJob->status)])); session()->flash('error', (string) trans('import.bad_job_status', ['status' => e($importJob->status)]));
return redirect(route('import.index')); return redirect(route('import.index'));
} }
@ -85,7 +90,7 @@ class JobConfigurationController extends Controller
// if provider has no config, just push it through: // if provider has no config, just push it through:
$importProvider = $importJob->provider; $importProvider = $importJob->provider;
if (!(bool)config(sprintf('import.has_job_config.%s', $importProvider))) { if (!(bool) config(sprintf('import.has_job_config.%s', $importProvider))) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
Log::debug('Job needs no config, is ready to run!'); Log::debug('Job needs no config, is ready to run!');
$this->repository->setStatus($importJob, 'ready_to_run'); $this->repository->setStatus($importJob, 'ready_to_run');
@ -104,7 +109,7 @@ class JobConfigurationController extends Controller
$view = $configurator->getNextView(); $view = $configurator->getNextView();
$data = $configurator->getNextData(); $data = $configurator->getNextData();
$subTitle = (string)trans('import.job_configuration_breadcrumb', ['key' => $importJob->key]); $subTitle = (string) trans('import.job_configuration_breadcrumb', ['key' => $importJob->key]);
$subTitleIcon = 'fa-wrench'; $subTitleIcon = 'fa-wrench';
return view($view, compact('data', 'importJob', 'subTitle', 'subTitleIcon')); return view($view, compact('data', 'importJob', 'subTitle', 'subTitleIcon'));
@ -116,16 +121,16 @@ class JobConfigurationController extends Controller
* @param Request $request * @param Request $request
* @param ImportJob $importJob * @param ImportJob $importJob
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*
* @throws FireflyException * @throws FireflyException
* @return RedirectResponse|Redirector
*
*/ */
public function post(Request $request, ImportJob $importJob) public function post(Request $request, ImportJob $importJob)
{ {
// catch impossible status: // catch impossible status:
$allowed = ['has_prereq', 'need_job_config']; $allowed = ['has_prereq', 'need_job_config'];
if (null !== $importJob && !in_array($importJob->status, $allowed, true)) { if (null !== $importJob && !in_array($importJob->status, $allowed, true)) {
session()->flash('error', (string)trans('import.bad_job_status', ['status' => e($importJob->status)])); session()->flash('error', (string) trans('import.bad_job_status', ['status' => e($importJob->status)]));
return redirect(route('import.index')); return redirect(route('import.index'));
} }

View File

@ -34,6 +34,7 @@ use Log;
/** /**
* Class JobStatusController * Class JobStatusController
*
* @deprecated * @deprecated
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
@ -55,7 +56,7 @@ class JobStatusController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-archive'); app('view')->share('mainTitleIcon', 'fa-archive');
app('view')->share('title', (string)trans('firefly.import_index_title')); app('view')->share('title', (string) trans('firefly.import_index_title'));
$this->repository = app(ImportJobRepositoryInterface::class); $this->repository = app(ImportJobRepositoryInterface::class);
return $next($request); return $next($request);
@ -73,7 +74,7 @@ class JobStatusController extends Controller
public function index(ImportJob $importJob) public function index(ImportJob $importJob)
{ {
$subTitleIcon = 'fa-gear'; $subTitleIcon = 'fa-gear';
$subTitle = (string)trans('import.job_status_breadcrumb', ['key' => $importJob->key]); $subTitle = (string) trans('import.job_status_breadcrumb', ['key' => $importJob->key]);
return view('import.status', compact('importJob', 'subTitle', 'subTitleIcon')); return view('import.status', compact('importJob', 'subTitle', 'subTitleIcon'));
} }
@ -94,7 +95,7 @@ class JobStatusController extends Controller
'count' => $count, 'count' => $count,
'tag_id' => $importJob->tag_id, 'tag_id' => $importJob->tag_id,
'tag_name' => null === $importJob->tag_id ? null : $importJob->tag->tag, 'tag_name' => null === $importJob->tag_id ? null : $importJob->tag->tag,
'report_txt' => (string)trans('import.unknown_import_result'), 'report_txt' => (string) trans('import.unknown_import_result'),
'download_config' => false, 'download_config' => false,
'download_config_text' => '', 'download_config_text' => '',
]; ];
@ -111,11 +112,12 @@ class JobStatusController extends Controller
$count = $this->repository->countByTag($importJob); $count = $this->repository->countByTag($importJob);
} }
if (0 === $count) { if (0 === $count) {
$json['report_txt'] = (string)trans('import.result_no_transactions'); $json['report_txt'] = (string) trans('import.result_no_transactions');
} }
if (1 === $count && null !== $importJob->tag_id) { if (1 === $count && null !== $importJob->tag_id) {
$json['report_txt'] = trans( $json['report_txt'] = trans(
'import.result_one_transaction', ['route' => route('tags.show', [$importJob->tag_id, 'all']), 'tag' => $importJob->tag->tag] 'import.result_one_transaction',
['route' => route('tags.show', [$importJob->tag_id, 'all']), 'tag' => $importJob->tag->tag]
); );
} }
if ($count > 1 && null !== $importJob->tag_id) { if ($count > 1 && null !== $importJob->tag_id) {
@ -235,6 +237,4 @@ class JobStatusController extends Controller
// expect nothing from routine, just return OK to user. // expect nothing from routine, just return OK to user.
return response()->json(['status' => 'OK', 'message' => 'storage_finished']); return response()->json(['status' => 'OK', 'message' => 'storage_finished']);
} }
} }

View File

@ -27,11 +27,16 @@ use FireflyIII\Import\Prerequisites\PrerequisitesInterface;
use FireflyIII\Models\ImportJob; use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Log; use Log;
/** /**
* Class PrerequisitesController * Class PrerequisitesController
*
* @deprecated * @deprecated
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
@ -51,7 +56,7 @@ class PrerequisitesController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-archive'); app('view')->share('mainTitleIcon', 'fa-archive');
app('view')->share('title', (string)trans('firefly.import_index_title')); app('view')->share('title', (string) trans('firefly.import_index_title'));
app('view')->share('subTitleIcon', 'fa-check'); app('view')->share('subTitleIcon', 'fa-check');
$this->repository = app(ImportJobRepositoryInterface::class); $this->repository = app(ImportJobRepositoryInterface::class);
@ -68,7 +73,7 @@ class PrerequisitesController extends Controller
* @param string $importProvider * @param string $importProvider
* @param ImportJob $importJob * @param ImportJob $importJob
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index(string $importProvider, ImportJob $importJob = null) public function index(string $importProvider, ImportJob $importJob = null)
{ {
@ -76,13 +81,13 @@ class PrerequisitesController extends Controller
$allowed = ['new']; $allowed = ['new'];
if (null !== $importJob && !in_array($importJob->status, $allowed, true)) { if (null !== $importJob && !in_array($importJob->status, $allowed, true)) {
Log::error(sprintf('Job has state "%s" but this Prerequisites::index() only accepts %s', $importJob->status, json_encode($allowed))); Log::error(sprintf('Job has state "%s" but this Prerequisites::index() only accepts %s', $importJob->status, json_encode($allowed)));
session()->flash('error', (string)trans('import.bad_job_status', ['status' => e($importJob->status)])); session()->flash('error', (string) trans('import.bad_job_status', ['status' => e($importJob->status)]));
return redirect(route('import.index')); return redirect(route('import.index'));
} }
app('view')->share('subTitle', (string)trans('import.prerequisites_breadcrumb_' . $importProvider)); app('view')->share('subTitle', (string) trans('import.prerequisites_breadcrumb_' . $importProvider));
$class = (string)config(sprintf('import.prerequisites.%s', $importProvider)); $class = (string) config(sprintf('import.prerequisites.%s', $importProvider));
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
/** @var PrerequisitesInterface $object */ /** @var PrerequisitesInterface $object */
@ -99,7 +104,7 @@ class PrerequisitesController extends Controller
$view = $object->getView(); $view = $object->getView();
$parameters = ['title' => (string)trans('firefly.import_index_title'), 'mainTitleIcon' => 'fa-archive', 'importJob' => $importJob]; $parameters = ['title' => (string) trans('firefly.import_index_title'), 'mainTitleIcon' => 'fa-archive', 'importJob' => $importJob];
$parameters = array_merge($object->getViewParameters(), $parameters); $parameters = array_merge($object->getViewParameters(), $parameters);
return view($view, $parameters); return view($view, $parameters);
@ -115,7 +120,7 @@ class PrerequisitesController extends Controller
* @param string $importProvider * @param string $importProvider
* @param ImportJob $importJob * @param ImportJob $importJob
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
* @see PrerequisitesInterface::storePrerequisites * @see PrerequisitesInterface::storePrerequisites
* *
*/ */
@ -127,13 +132,13 @@ class PrerequisitesController extends Controller
$allowed = ['new']; $allowed = ['new'];
if (null !== $importJob && !in_array($importJob->status, $allowed, true)) { if (null !== $importJob && !in_array($importJob->status, $allowed, true)) {
Log::error(sprintf('Job has state "%s" but this Prerequisites::post() only accepts %s', $importJob->status, json_encode($allowed))); Log::error(sprintf('Job has state "%s" but this Prerequisites::post() only accepts %s', $importJob->status, json_encode($allowed)));
session()->flash('error', (string)trans('import.bad_job_status', ['status' => e($importJob->status)])); session()->flash('error', (string) trans('import.bad_job_status', ['status' => e($importJob->status)]));
return redirect(route('import.index')); return redirect(route('import.index'));
} }
$class = (string)config(sprintf('import.prerequisites.%s', $importProvider)); $class = (string) config(sprintf('import.prerequisites.%s', $importProvider));
/** @var User $user */ /** @var User $user */
$user = auth()->user(); $user = auth()->user();
/** @var PrerequisitesInterface $object */ /** @var PrerequisitesInterface $object */
@ -153,7 +158,7 @@ class PrerequisitesController extends Controller
} }
// session flash! // session flash!
$request->session()->flash('success', (string)trans('import.prerequisites_saved_for_' . $importProvider)); $request->session()->flash('success', (string) trans('import.prerequisites_saved_for_' . $importProvider));
// if has job, redirect to global config for provider // if has job, redirect to global config for provider
// if no job, back to index! // if no job, back to index!

View File

@ -44,7 +44,7 @@ class JavascriptController extends Controller
* @param AccountRepositoryInterface $repository * @param AccountRepositoryInterface $repository
* @param CurrencyRepositoryInterface $currencyRepository * @param CurrencyRepositoryInterface $currencyRepository
* *
* @return \Illuminate\Http\Response * @return Response
*/ */
public function accounts(AccountRepositoryInterface $repository, CurrencyRepositoryInterface $currencyRepository): Response public function accounts(AccountRepositoryInterface $repository, CurrencyRepositoryInterface $currencyRepository): Response
{ {
@ -60,7 +60,7 @@ class JavascriptController extends Controller
/** @var Account $account */ /** @var Account $account */
foreach ($accounts as $account) { foreach ($accounts as $account) {
$accountId = $account->id; $accountId = $account->id;
$currency = (int)$repository->getMetaValue($account, 'currency_id'); $currency = (int) $repository->getMetaValue($account, 'currency_id');
/** @noinspection NullPointerExceptionInspection */ /** @noinspection NullPointerExceptionInspection */
$currency = 0 === $currency ? $default->id : $currency; $currency = 0 === $currency ? $default->id : $currency;
$entry = ['preferredCurrency' => $currency, 'name' => $account->name]; $entry = ['preferredCurrency' => $currency, 'name' => $account->name];
@ -102,15 +102,15 @@ class JavascriptController extends Controller
* @param AccountRepositoryInterface $repository * @param AccountRepositoryInterface $repository
* @param CurrencyRepositoryInterface $currencyRepository * @param CurrencyRepositoryInterface $currencyRepository
* *
* @return \Illuminate\Http\Response * @return Response
*/ */
public function variables(Request $request, AccountRepositoryInterface $repository, CurrencyRepositoryInterface $currencyRepository): Response public function variables(Request $request, AccountRepositoryInterface $repository, CurrencyRepositoryInterface $currencyRepository): Response
{ {
$account = $repository->findNull((int)$request->get('account')); $account = $repository->findNull((int) $request->get('account'));
$currencyId = 0; $currencyId = 0;
if (null !== $account) { if (null !== $account) {
// TODO we can use getAccountCurrency() instead // TODO we can use getAccountCurrency() instead
$currencyId = (int)$repository->getMetaValue($account, 'currency_id'); $currencyId = (int) $repository->getMetaValue($account, 'currency_id');
} }
/** @var TransactionCurrency $currency */ /** @var TransactionCurrency $currency */
$currency = $currencyRepository->findNull($currencyId); $currency = $currencyRepository->findNull($currencyId);

View File

@ -22,6 +22,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Json; namespace FireflyIII\Http\Controllers\Json;
use Amount;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
@ -78,7 +79,7 @@ class AutoCompleteController extends Controller
Log::debug(sprintf('Now in accounts("%s"). Filtering results.', $search), $filteredAccountTypes); Log::debug(sprintf('Now in accounts("%s"). Filtering results.', $search), $filteredAccountTypes);
$return = []; $return = [];
$result = $repository->searchAccount((string)$search, $filteredAccountTypes); $result = $repository->searchAccount((string) $search, $filteredAccountTypes);
$defaultCurrency = app('amount')->getDefaultCurrency(); $defaultCurrency = app('amount')->getDefaultCurrency();
/** @var Account $account */ /** @var Account $account */
@ -117,7 +118,7 @@ class AutoCompleteController extends Controller
*/ */
public function allJournals(Request $request): JsonResponse public function allJournals(Request $request): JsonResponse
{ {
$search = (string)$request->get('search'); $search = (string) $request->get('search');
/** @var JournalRepositoryInterface $repository */ /** @var JournalRepositoryInterface $repository */
$repository = app(JournalRepositoryInterface::class); $repository = app(JournalRepositoryInterface::class);
$result = $repository->searchJournalDescriptions($search); $result = $repository->searchJournalDescriptions($search);
@ -132,7 +133,8 @@ class AutoCompleteController extends Controller
$journal['name'] = $journal['description']; $journal['name'] = $journal['description'];
return $journal; return $journal;
}, $array },
$array
); );
return response()->json(array_values($array)); return response()->json(array_values($array));
@ -150,7 +152,7 @@ class AutoCompleteController extends Controller
*/ */
public function allJournalsWithID(Request $request): JsonResponse public function allJournalsWithID(Request $request): JsonResponse
{ {
$search = (string)$request->get('search'); $search = (string) $request->get('search');
/** @var JournalRepositoryInterface $repository */ /** @var JournalRepositoryInterface $repository */
$repository = app(JournalRepositoryInterface::class); $repository = app(JournalRepositoryInterface::class);
@ -161,7 +163,7 @@ class AutoCompleteController extends Controller
$array = []; $array = [];
if (is_numeric($search)) { if (is_numeric($search)) {
// search for group, not journal. // search for group, not journal.
$firstResult = $groupRepos->find((int)$search); $firstResult = $groupRepos->find((int) $search);
if (null !== $firstResult) { if (null !== $firstResult) {
// group may contain multiple journals, each a result: // group may contain multiple journals, each a result:
foreach ($firstResult->transactionJournals as $journal) { foreach ($firstResult->transactionJournals as $journal) {
@ -201,7 +203,7 @@ class AutoCompleteController extends Controller
Log::debug(sprintf('Now in expenseAccounts(%s). Filtering results.', $search), $allowedAccountTypes); Log::debug(sprintf('Now in expenseAccounts(%s). Filtering results.', $search), $allowedAccountTypes);
$return = []; $return = [];
$result = $repository->searchAccount((string)$search, $allowedAccountTypes); $result = $repository->searchAccount((string) $search, $allowedAccountTypes);
/** @var Account $account */ /** @var Account $account */
foreach ($result as $account) { foreach ($result as $account) {
@ -223,7 +225,7 @@ class AutoCompleteController extends Controller
*/ */
public function bills(Request $request): JsonResponse public function bills(Request $request): JsonResponse
{ {
$query = (string)$request->get('search'); $query = (string) $request->get('search');
/** @var BillRepositoryInterface $repository */ /** @var BillRepositoryInterface $repository */
$repository = app(BillRepositoryInterface::class); $repository = app(BillRepositoryInterface::class);
$result = $repository->searchBill($query); $result = $repository->searchBill($query);
@ -239,7 +241,7 @@ class AutoCompleteController extends Controller
*/ */
public function budgets(Request $request): JsonResponse public function budgets(Request $request): JsonResponse
{ {
$search = (string)$request->get('search'); $search = (string) $request->get('search');
/** @var BudgetRepositoryInterface $repository */ /** @var BudgetRepositoryInterface $repository */
$repository = app(BudgetRepositoryInterface::class); $repository = app(BudgetRepositoryInterface::class);
$result = $repository->searchBudget($search); $result = $repository->searchBudget($search);
@ -255,7 +257,7 @@ class AutoCompleteController extends Controller
*/ */
public function categories(Request $request): JsonResponse public function categories(Request $request): JsonResponse
{ {
$query = (string)$request->get('search'); $query = (string) $request->get('search');
/** @var CategoryRepositoryInterface $repository */ /** @var CategoryRepositoryInterface $repository */
$repository = app(CategoryRepositoryInterface::class); $repository = app(CategoryRepositoryInterface::class);
$result = $repository->searchCategory($query); $result = $repository->searchCategory($query);
@ -297,7 +299,7 @@ class AutoCompleteController extends Controller
*/ */
public function currencyNames(Request $request): JsonResponse public function currencyNames(Request $request): JsonResponse
{ {
$query = (string)$request->get('search'); $query = (string) $request->get('search');
/** @var CurrencyRepositoryInterface $repository */ /** @var CurrencyRepositoryInterface $repository */
$repository = app(CurrencyRepositoryInterface::class); $repository = app(CurrencyRepositoryInterface::class);
$result = $repository->searchCurrency($query)->toArray(); $result = $repository->searchCurrency($query)->toArray();
@ -326,7 +328,7 @@ class AutoCompleteController extends Controller
Log::debug(sprintf('Now in expenseAccounts(%s). Filtering results.', $search), $allowedAccountTypes); Log::debug(sprintf('Now in expenseAccounts(%s). Filtering results.', $search), $allowedAccountTypes);
$return = []; $return = [];
$result = $repository->searchAccount((string)$search, $allowedAccountTypes); $result = $repository->searchAccount((string) $search, $allowedAccountTypes);
/** @var Account $account */ /** @var Account $account */
foreach ($result as $account) { foreach ($result as $account) {
@ -353,7 +355,7 @@ class AutoCompleteController extends Controller
$accountRepos = app(AccountRepositoryInterface::class); $accountRepos = app(AccountRepositoryInterface::class);
$piggies = $repository->getPiggyBanks(); $piggies = $repository->getPiggyBanks();
$defaultCurrency = \Amount::getDefaultCurrency(); $defaultCurrency = Amount::getDefaultCurrency();
$response = []; $response = [];
/** @var PiggyBank $piggy */ /** @var PiggyBank $piggy */
foreach ($piggies as $piggy) { foreach ($piggies as $piggy) {
@ -389,7 +391,7 @@ class AutoCompleteController extends Controller
Log::debug('Now in revenueAccounts(). Filtering results.', $allowedAccountTypes); Log::debug('Now in revenueAccounts(). Filtering results.', $allowedAccountTypes);
$return = []; $return = [];
$result = $repository->searchAccount((string)$search, $allowedAccountTypes); $result = $repository->searchAccount((string) $search, $allowedAccountTypes);
/** @var Account $account */ /** @var Account $account */
foreach ($result as $account) { foreach ($result as $account) {
@ -411,7 +413,7 @@ class AutoCompleteController extends Controller
*/ */
public function tags(Request $request): JsonResponse public function tags(Request $request): JsonResponse
{ {
$search = (string)$request->get('search'); $search = (string) $request->get('search');
/** @var TagRepositoryInterface $repository */ /** @var TagRepositoryInterface $repository */
$repository = app(TagRepositoryInterface::class); $repository = app(TagRepositoryInterface::class);
$result = $repository->searchTags($search); $result = $repository->searchTags($search);
@ -432,7 +434,7 @@ class AutoCompleteController extends Controller
*/ */
public function transactionTypes(Request $request): JsonResponse public function transactionTypes(Request $request): JsonResponse
{ {
$query = (string)$request->get('search'); $query = (string) $request->get('search');
/** @var TransactionTypeRepositoryInterface $repository */ /** @var TransactionTypeRepositoryInterface $repository */
$repository = app(TransactionTypeRepositoryInterface::class); $repository = app(TransactionTypeRepositoryInterface::class);
$array = $repository->searchTypes($query)->toArray(); $array = $repository->searchTypes($query)->toArray();
@ -444,5 +446,4 @@ class AutoCompleteController extends Controller
return response()->json($array); return response()->json($array);
} }
} }

View File

@ -34,7 +34,6 @@ use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Budget\OperationsRepositoryInterface; use FireflyIII\Repositories\Budget\OperationsRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\CacheProperties; use FireflyIII\Support\CacheProperties;
@ -71,7 +70,7 @@ class BoxController extends Controller
$end = session('end', Carbon::now()->endOfMonth()); $end = session('end', Carbon::now()->endOfMonth());
$today = new Carbon; $today = new Carbon;
$display = 2; // see method docs. $display = 2; // see method docs.
$boxTitle = (string)trans('firefly.spent'); $boxTitle = (string) trans('firefly.spent');
$cache = new CacheProperties; $cache = new CacheProperties;
$cache->addProperty($start); $cache->addProperty($start);
@ -98,19 +97,19 @@ class BoxController extends Controller
// spent in this period, in budgets, for default currency. // spent in this period, in budgets, for default currency.
// also calculate spent per day. // also calculate spent per day.
$spent = $opsRepository->sumExpenses($start, $end, null, null, $currency); $spent = $opsRepository->sumExpenses($start, $end, null, null, $currency);
$spentAmount = $spent[(int)$currency->id]['sum'] ?? '0'; $spentAmount = $spent[(int) $currency->id]['sum'] ?? '0';
$spentPerDay = '-1'; $spentPerDay = '-1';
if ($availableBudgets->count() > 0) { if ($availableBudgets->count() > 0) {
$display = 0; // assume user overspent $display = 0; // assume user overspent
$boxTitle = (string)trans('firefly.overspent'); $boxTitle = (string) trans('firefly.overspent');
$totalAvailableSum = (string)$availableBudgets->sum('amount'); $totalAvailableSum = (string) $availableBudgets->sum('amount');
// calculate with available budget. // calculate with available budget.
$leftToSpendAmount = bcadd($totalAvailableSum, $spentAmount); $leftToSpendAmount = bcadd($totalAvailableSum, $spentAmount);
if (1 === bccomp($leftToSpendAmount, '0')) { if (1 === bccomp($leftToSpendAmount, '0')) {
$boxTitle = (string)trans('firefly.left_to_spend'); $boxTitle = (string) trans('firefly.left_to_spend');
$days = $today->diffInDays($end) + 1; $days = $today->diffInDays($end) + 1;
$display = 1; // not overspent $display = 1; // not overspent
$leftPerDayAmount = bcdiv($leftToSpendAmount, (string)$days); $leftPerDayAmount = bcdiv($leftToSpendAmount, (string) $days);
} }
} }
@ -164,7 +163,7 @@ class BoxController extends Controller
$set = $collector->getExtractedJournals(); $set = $collector->getExtractedJournals();
/** @var array $journal */ /** @var array $journal */
foreach ($set as $journal) { foreach ($set as $journal) {
$currencyId = (int)$journal['currency_id']; $currencyId = (int) $journal['currency_id'];
$amount = $journal['amount'] ?? '0'; $amount = $journal['amount'] ?? '0';
$incomes[$currencyId] = $incomes[$currencyId] ?? '0'; $incomes[$currencyId] = $incomes[$currencyId] ?? '0';
$incomes[$currencyId] = bcadd($incomes[$currencyId], app('steam')->positive($amount)); $incomes[$currencyId] = bcadd($incomes[$currencyId], app('steam')->positive($amount));
@ -180,7 +179,7 @@ class BoxController extends Controller
$set = $collector->getExtractedJournals(); $set = $collector->getExtractedJournals();
/** @var array $journal */ /** @var array $journal */
foreach ($set as $journal) { foreach ($set as $journal) {
$currencyId = (int)$journal['currency_id']; $currencyId = (int) $journal['currency_id'];
$expenses[$currencyId] = $expenses[$currencyId] ?? '0'; $expenses[$currencyId] = $expenses[$currencyId] ?? '0';
$expenses[$currencyId] = bcadd($expenses[$currencyId], $journal['amount'] ?? '0'); $expenses[$currencyId] = bcadd($expenses[$currencyId], $journal['amount'] ?? '0');
$sums[$currencyId] = $sums[$currencyId] ?? '0'; $sums[$currencyId] = $sums[$currencyId] ?? '0';

View File

@ -73,7 +73,7 @@ class ExchangeController extends Controller
$return['amount'] = null; $return['amount'] = null;
if (null !== $request->get('amount')) { if (null !== $request->get('amount')) {
// assume amount is in "from" currency: // assume amount is in "from" currency:
$return['amount'] = bcmul($request->get('amount'), (string)$rate->rate, 12); $return['amount'] = bcmul($request->get('amount'), (string) $rate->rate, 12);
// round to toCurrency decimal places: // round to toCurrency decimal places:
$return['amount'] = round($return['amount'], $toCurrency->decimal_places); $return['amount'] = round($return['amount'], $toCurrency->decimal_places);
} }

View File

@ -115,7 +115,7 @@ class IntroController
app('preferences')->set($key, false); app('preferences')->set($key, false);
app('preferences')->mark(); app('preferences')->mark();
return response()->json(['message' => (string)trans('firefly.intro_boxes_after_refresh')]); return response()->json(['message' => (string) trans('firefly.intro_boxes_after_refresh')]);
} }
/** /**

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Json; namespace FireflyIII\Http\Controllers\Json;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@ -56,6 +55,7 @@ class ReconcileController extends Controller
/** /**
* ReconcileController constructor. * ReconcileController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -66,7 +66,7 @@ class ReconcileController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-credit-card'); app('view')->share('mainTitleIcon', 'fa-credit-card');
app('view')->share('title', (string)trans('firefly.accounts')); app('view')->share('title', (string) trans('firefly.accounts'));
$this->repository = app(JournalRepositoryInterface::class); $this->repository = app(JournalRepositoryInterface::class);
$this->accountRepos = app(AccountRepositoryInterface::class); $this->accountRepos = app(AccountRepositoryInterface::class);
$this->currencyRepos = app(CurrencyRepositoryInterface::class); $this->currencyRepos = app(CurrencyRepositoryInterface::class);
@ -81,8 +81,8 @@ class ReconcileController extends Controller
* *
* @param Request $request * @param Request $request
* @param Account $account * @param Account $account
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return JsonResponse * @return JsonResponse
*/ */
@ -141,11 +141,22 @@ class ReconcileController extends Controller
try { try {
$view = view( $view = view(
'accounts.reconcile.overview', compact( 'accounts.reconcile.overview',
'account', 'start', 'diffCompare', 'difference', 'end', 'clearedAmount', compact(
'startBalance', 'endBalance', 'amount', 'account',
'route', 'countCleared', 'reconSum', 'selectedIds' 'start',
) 'diffCompare',
'difference',
'end',
'clearedAmount',
'startBalance',
'endBalance',
'amount',
'route',
'countCleared',
'reconSum',
'selectedIds'
)
)->render(); )->render();
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
} catch (Throwable $e) { } catch (Throwable $e) {
@ -168,8 +179,8 @@ class ReconcileController extends Controller
* Returns a list of transactions in a modal. * Returns a list of transactions in a modal.
* *
* @param Account $account * @param Account $account
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return mixed * @return mixed
* *
@ -231,8 +242,10 @@ class ReconcileController extends Controller
} }
try { try {
$html = view('accounts.reconcile.transactions', $html = view(
compact('account', 'journals', 'currency', 'start', 'end', 'selectionStart', 'selectionEnd'))->render(); 'accounts.reconcile.transactions',
compact('account', 'journals', 'currency', 'start', 'end', 'selectionStart', 'selectionEnd')
)->render();
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
} catch (Throwable $e) { } catch (Throwable $e) {
Log::debug(sprintf('Could not render: %s', $e->getMessage())); Log::debug(sprintf('Could not render: %s', $e->getMessage()));
@ -245,10 +258,11 @@ class ReconcileController extends Controller
} }
/** /**
* @param Account $account * @param Account $account
* @param TransactionCurrency $currency * @param TransactionCurrency $currency
* @param array $journal * @param array $journal
* @param string $amount * @param string $amount
*
* @return string * @return string
*/ */
private function processJournal(Account $account, TransactionCurrency $currency, array $journal, string $amount): string private function processJournal(Account $account, TransactionCurrency $currency, array $journal, string $amount): string

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Json; namespace FireflyIII\Http\Controllers\Json;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@ -65,9 +64,9 @@ class RecurrenceController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @throws FireflyException
* @return JsonResponse * @return JsonResponse
* *
* @throws FireflyException
*/ */
public function events(Request $request): JsonResponse public function events(Request $request): JsonResponse
{ {
@ -75,10 +74,10 @@ class RecurrenceController extends Controller
$start = Carbon::createFromFormat('Y-m-d', $request->get('start')); $start = Carbon::createFromFormat('Y-m-d', $request->get('start'));
$end = Carbon::createFromFormat('Y-m-d', $request->get('end')); $end = Carbon::createFromFormat('Y-m-d', $request->get('end'));
$firstDate = Carbon::createFromFormat('Y-m-d', $request->get('first_date')); $firstDate = Carbon::createFromFormat('Y-m-d', $request->get('first_date'));
$endDate = '' !== (string)$request->get('end_date') ? Carbon::createFromFormat('Y-m-d', $request->get('end_date')) : null; $endDate = '' !== (string) $request->get('end_date') ? Carbon::createFromFormat('Y-m-d', $request->get('end_date')) : null;
$endsAt = (string)$request->get('ends'); $endsAt = (string) $request->get('ends');
$repetitionType = explode(',', $request->get('type'))[0]; $repetitionType = explode(',', $request->get('type'))[0];
$repetitions = (int)$request->get('reps'); $repetitions = (int) $request->get('reps');
$repetitionMoment = ''; $repetitionMoment = '';
$start->startOfDay(); $start->startOfDay();
@ -101,8 +100,8 @@ class RecurrenceController extends Controller
$repetition = new RecurrenceRepetition; $repetition = new RecurrenceRepetition;
$repetition->repetition_type = $repetitionType; $repetition->repetition_type = $repetitionType;
$repetition->repetition_moment = $repetitionMoment; $repetition->repetition_moment = $repetitionMoment;
$repetition->repetition_skip = (int)$request->get('skip'); $repetition->repetition_skip = (int) $request->get('skip');
$repetition->weekend = (int)$request->get('weekend'); $repetition->weekend = (int) $request->get('weekend');
$actualEnd = clone $end; $actualEnd = clone $end;
$occurrences = []; $occurrences = [];
switch ($endsAt) { switch ($endsAt) {
@ -150,30 +149,31 @@ class RecurrenceController extends Controller
{ {
$string = $request->get('date') ?? date('Y-m-d'); $string = $request->get('date') ?? date('Y-m-d');
$today = Carbon::now()->startOfDay(); $today = Carbon::now()->startOfDay();
$date = Carbon::createFromFormat('Y-m-d', $string)->startOfDay();; $date = Carbon::createFromFormat('Y-m-d', $string)->startOfDay();
$preSelected = (string)$request->get('pre_select'); $preSelected = (string) $request->get('pre_select');
Log::debug(sprintf('date = %s, today = %s. date > today? %s', $date->toAtomString(), $today->toAtomString(), var_export($date > $today, true) )); Log::debug(sprintf('date = %s, today = %s. date > today? %s', $date->toAtomString(), $today->toAtomString(), var_export($date > $today, true)));
Log::debug(sprintf('past = true? %s', var_export('true' === (string)$request->get('past'), true))); Log::debug(sprintf('past = true? %s', var_export('true' === (string) $request->get('past'), true)));
$result = []; $result = [];
if ($date > $today || 'true' === (string)$request->get('past')) { if ($date > $today || 'true' === (string) $request->get('past')) {
Log::debug('Will fill dropdown.'); Log::debug('Will fill dropdown.');
$weekly = sprintf('weekly,%s', $date->dayOfWeekIso); $weekly = sprintf('weekly,%s', $date->dayOfWeekIso);
$monthly = sprintf('monthly,%s', $date->day); $monthly = sprintf('monthly,%s', $date->day);
$dayOfWeek = (string)trans(sprintf('config.dow_%s', $date->dayOfWeekIso)); $dayOfWeek = (string) trans(sprintf('config.dow_%s', $date->dayOfWeekIso));
$ndom = sprintf('ndom,%s,%s', $date->weekOfMonth, $date->dayOfWeekIso); $ndom = sprintf('ndom,%s,%s', $date->weekOfMonth, $date->dayOfWeekIso);
$yearly = sprintf('yearly,%s', $date->format('Y-m-d')); $yearly = sprintf('yearly,%s', $date->format('Y-m-d'));
$yearlyDate = $date->formatLocalized((string)trans('config.month_and_day_no_year')); $yearlyDate = $date->formatLocalized((string) trans('config.month_and_day_no_year'));
$result = [ $result = [
'daily' => ['label' => (string)trans('firefly.recurring_daily'), 'selected' => 0 === strpos($preSelected, 'daily')], 'daily' => ['label' => (string) trans('firefly.recurring_daily'), 'selected' => 0 === strpos($preSelected, 'daily')],
$weekly => ['label' => (string)trans('firefly.recurring_weekly', ['weekday' => $dayOfWeek]), $weekly => ['label' => (string) trans('firefly.recurring_weekly', ['weekday' => $dayOfWeek]),
'selected' => 0 === strpos($preSelected, 'weekly')], 'selected' => 0 === strpos($preSelected, 'weekly')],
$monthly => ['label' => (string)trans('firefly.recurring_monthly', ['dayOfMonth' => $date->day]), $monthly => ['label' => (string) trans('firefly.recurring_monthly', ['dayOfMonth' => $date->day]),
'selected' => 0 === strpos($preSelected, 'monthly')], 'selected' => 0 === strpos($preSelected, 'monthly')],
$ndom => ['label' => (string)trans('firefly.recurring_ndom', ['weekday' => $dayOfWeek, 'dayOfMonth' => $date->weekOfMonth]), $ndom => ['label' => (string) trans('firefly.recurring_ndom', ['weekday' => $dayOfWeek, 'dayOfMonth' => $date->weekOfMonth]),
'selected' => 0 === strpos($preSelected, 'ndom')], 'selected' => 0 === strpos($preSelected, 'ndom')],
$yearly => ['label' => (string)trans('firefly.recurring_yearly', ['date' => $yearlyDate]), 'selected' => 0 === strpos($preSelected, 'yearly')], $yearly => ['label' => (string) trans('firefly.recurring_yearly', ['date' => $yearlyDate]),
'selected' => 0 === strpos($preSelected, 'yearly')],
]; ];
} }
Log::debug('Dropdown is', $result); Log::debug('Dropdown is', $result);
@ -181,5 +181,4 @@ class RecurrenceController extends Controller
return response()->json($result); return response()->json($result);
} }
} }

View File

@ -44,11 +44,11 @@ class RuleController extends Controller
*/ */
public function action(Request $request): JsonResponse public function action(Request $request): JsonResponse
{ {
$count = (int)$request->get('count') > 0 ? (int)$request->get('count') : 1; $count = (int) $request->get('count') > 0 ? (int) $request->get('count') : 1;
$keys = array_keys(config('firefly.rule-actions')); $keys = array_keys(config('firefly.rule-actions'));
$actions = []; $actions = [];
foreach ($keys as $key) { foreach ($keys as $key) {
$actions[$key] = (string)trans('firefly.rule_action_' . $key . '_choice'); $actions[$key] = (string) trans('firefly.rule_action_' . $key . '_choice');
} }
try { try {
$view = view('rules.partials.action', compact('actions', 'count'))->render(); $view = view('rules.partials.action', compact('actions', 'count'))->render();
@ -72,12 +72,12 @@ class RuleController extends Controller
*/ */
public function trigger(Request $request): JsonResponse public function trigger(Request $request): JsonResponse
{ {
$count = (int)$request->get('count') > 0 ? (int)$request->get('count') : 1; $count = (int) $request->get('count') > 0 ? (int) $request->get('count') : 1;
$keys = array_keys(config('firefly.rule-triggers')); $keys = array_keys(config('firefly.rule-triggers'));
$triggers = []; $triggers = [];
foreach ($keys as $key) { foreach ($keys as $key) {
if ('user_action' !== $key) { if ('user_action' !== $key) {
$triggers[$key] = (string)trans('firefly.rule_trigger_' . $key . '_choice'); $triggers[$key] = (string) trans('firefly.rule_trigger_' . $key . '_choice');
} }
} }
asort($triggers); asort($triggers);

View File

@ -26,6 +26,8 @@ use FireflyIII\Http\Requests\NewUserFormRequest;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\Http\Controllers\CreateStuff; use FireflyIII\Support\Http\Controllers\CreateStuff;
use Illuminate\Http\RedirectResponse;
use Illuminate\Routing\Redirector;
use View; use View;
/** /**
@ -56,11 +58,11 @@ class NewUserController extends Controller
/** /**
* Form the user gets when he has no data in the system. * Form the user gets when he has no data in the system.
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View * @return RedirectResponse|Redirector|View
*/ */
public function index() public function index()
{ {
app('view')->share('title', (string)trans('firefly.welcome')); app('view')->share('title', (string) trans('firefly.welcome'));
app('view')->share('mainTitleIcon', 'fa-fire'); app('view')->share('mainTitleIcon', 'fa-fire');
$types = config('firefly.accountTypesByIdentifier.asset'); $types = config('firefly.accountTypesByIdentifier.asset');
@ -81,7 +83,7 @@ class NewUserController extends Controller
* @param NewUserFormRequest $request * @param NewUserFormRequest $request
* @param CurrencyRepositoryInterface $currencyRepository * @param CurrencyRepositoryInterface $currencyRepository
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function submit(NewUserFormRequest $request, CurrencyRepositoryInterface $currencyRepository) public function submit(NewUserFormRequest $request, CurrencyRepositoryInterface $currencyRepository)
{ {
@ -94,7 +96,7 @@ class NewUserController extends Controller
// set language preference: // set language preference:
app('preferences')->set('language', $language); app('preferences')->set('language', $language);
// Store currency preference from input: // Store currency preference from input:
$currency = $currencyRepository->findNull((int)$request->input('amount_currency_id_bank_balance')); $currency = $currencyRepository->findNull((int) $request->input('amount_currency_id_bank_balance'));
// if is null, set to EUR: // if is null, set to EUR:
if (null === $currency) { if (null === $currency) {
@ -115,7 +117,7 @@ class NewUserController extends Controller
'invoice_date' => false, 'internal_reference' => false, 'notes' => true, 'attachments' => true,]; 'invoice_date' => false, 'internal_reference' => false, 'notes' => true, 'attachments' => true,];
app('preferences')->set('transaction_journal_optional_fields', $visibleFields); app('preferences')->set('transaction_journal_optional_fields', $visibleFields);
session()->flash('success', (string)trans('firefly.stored_new_accounts_new_user')); session()->flash('success', (string) trans('firefly.stored_new_accounts_new_user'));
app('preferences')->mark(); app('preferences')->mark();
return redirect(route('index')); return redirect(route('index'));

View File

@ -30,11 +30,14 @@ use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
use FireflyIII\Transformers\AccountTransformer; use FireflyIII\Transformers\AccountTransformer;
use FireflyIII\Transformers\PiggyBankTransformer; use FireflyIII\Transformers\PiggyBankTransformer;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View;
use Log; use Log;
use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\ParameterBag;
@ -54,6 +57,7 @@ class PiggyBankController extends Controller
/** /**
* PiggyBankController constructor. * PiggyBankController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -62,7 +66,7 @@ class PiggyBankController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.piggyBanks')); app('view')->share('title', (string) trans('firefly.piggyBanks'));
app('view')->share('mainTitleIcon', 'fa-sort-amount-asc'); app('view')->share('mainTitleIcon', 'fa-sort-amount-asc');
$this->piggyRepos = app(PiggyBankRepositoryInterface::class); $this->piggyRepos = app(PiggyBankRepositoryInterface::class);
@ -79,7 +83,7 @@ class PiggyBankController extends Controller
* *
* @param PiggyBank $piggyBank * @param PiggyBank $piggyBank
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function add(PiggyBank $piggyBank) public function add(PiggyBank $piggyBank)
{ {
@ -99,7 +103,7 @@ class PiggyBankController extends Controller
* *
* @param PiggyBank $piggyBank * @param PiggyBank $piggyBank
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function addMobile(PiggyBank $piggyBank) public function addMobile(PiggyBank $piggyBank)
{ {
@ -117,11 +121,11 @@ class PiggyBankController extends Controller
/** /**
* Create a piggy bank. * Create a piggy bank.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function create() public function create()
{ {
$subTitle = (string)trans('firefly.new_piggy_bank'); $subTitle = (string) trans('firefly.new_piggy_bank');
$subTitleIcon = 'fa-plus'; $subTitleIcon = 'fa-plus';
// put previous url in session if not redirect from store (not "create another"). // put previous url in session if not redirect from store (not "create another").
@ -138,11 +142,11 @@ class PiggyBankController extends Controller
* *
* @param PiggyBank $piggyBank * @param PiggyBank $piggyBank
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function delete(PiggyBank $piggyBank) public function delete(PiggyBank $piggyBank)
{ {
$subTitle = (string)trans('firefly.delete_piggy_bank', ['name' => $piggyBank->name]); $subTitle = (string) trans('firefly.delete_piggy_bank', ['name' => $piggyBank->name]);
// put previous url in session // put previous url in session
$this->rememberPreviousUri('piggy-banks.delete.uri'); $this->rememberPreviousUri('piggy-banks.delete.uri');
@ -159,7 +163,7 @@ class PiggyBankController extends Controller
*/ */
public function destroy(PiggyBank $piggyBank): RedirectResponse public function destroy(PiggyBank $piggyBank): RedirectResponse
{ {
session()->flash('success', (string)trans('firefly.deleted_piggy_bank', ['name' => $piggyBank->name])); session()->flash('success', (string) trans('firefly.deleted_piggy_bank', ['name' => $piggyBank->name]));
app('preferences')->mark(); app('preferences')->mark();
$this->piggyRepos->destroy($piggyBank); $this->piggyRepos->destroy($piggyBank);
@ -171,11 +175,11 @@ class PiggyBankController extends Controller
* *
* @param PiggyBank $piggyBank * @param PiggyBank $piggyBank
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function edit(PiggyBank $piggyBank) public function edit(PiggyBank $piggyBank)
{ {
$subTitle = (string)trans('firefly.update_piggy_title', ['name' => $piggyBank->name]); $subTitle = (string) trans('firefly.update_piggy_title', ['name' => $piggyBank->name]);
$subTitleIcon = 'fa-pencil'; $subTitleIcon = 'fa-pencil';
$targetDate = null; $targetDate = null;
$startDate = null; $startDate = null;
@ -211,15 +215,15 @@ class PiggyBankController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index(Request $request) public function index(Request $request)
{ {
$this->piggyRepos->correctOrder(); $this->piggyRepos->correctOrder();
$collection = $this->piggyRepos->getPiggyBanks(); $collection = $this->piggyRepos->getPiggyBanks();
$total = $collection->count(); $total = $collection->count();
$page = 0 === (int)$request->get('page') ? 1 : (int)$request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$accounts = []; $accounts = [];
/** @var Carbon $end */ /** @var Carbon $end */
$end = session('end', Carbon::now()->endOfMonth()); $end = session('end', Carbon::now()->endOfMonth());
@ -240,7 +244,7 @@ class PiggyBankController extends Controller
foreach ($collection as $piggy) { foreach ($collection as $piggy) {
$array = $transformer->transform($piggy); $array = $transformer->transform($piggy);
$account = $accountTransformer->transform($piggy->account); $account = $accountTransformer->transform($piggy->account);
$accountId = (int)$account['id']; $accountId = (int) $account['id'];
if (!isset($accounts[$accountId])) { if (!isset($accounts[$accountId])) {
// create new: // create new:
$accounts[$accountId] = $account; $accounts[$accountId] = $account;
@ -288,7 +292,7 @@ class PiggyBankController extends Controller
$this->piggyRepos->addAmount($piggyBank, $amount); $this->piggyRepos->addAmount($piggyBank, $amount);
session()->flash( session()->flash(
'success', 'success',
(string)trans( (string) trans(
'firefly.added_amount_to_piggy', 'firefly.added_amount_to_piggy',
['amount' => app('amount')->formatAnything($currency, $amount, false), 'name' => $piggyBank->name] ['amount' => app('amount')->formatAnything($currency, $amount, false), 'name' => $piggyBank->name]
) )
@ -301,7 +305,7 @@ class PiggyBankController extends Controller
Log::error('Cannot add ' . $amount . ' because canAddAmount returned false.'); Log::error('Cannot add ' . $amount . ' because canAddAmount returned false.');
session()->flash( session()->flash(
'error', 'error',
(string)trans( (string) trans(
'firefly.cannot_add_amount_piggy', 'firefly.cannot_add_amount_piggy',
['amount' => app('amount')->formatAnything($currency, $amount, false), 'name' => e($piggyBank->name)] ['amount' => app('amount')->formatAnything($currency, $amount, false), 'name' => e($piggyBank->name)]
) )
@ -330,7 +334,7 @@ class PiggyBankController extends Controller
$this->piggyRepos->removeAmount($piggyBank, $amount); $this->piggyRepos->removeAmount($piggyBank, $amount);
session()->flash( session()->flash(
'success', 'success',
(string)trans( (string) trans(
'firefly.removed_amount_from_piggy', 'firefly.removed_amount_from_piggy',
['amount' => app('amount')->formatAnything($currency, $amount, false), 'name' => $piggyBank->name] ['amount' => app('amount')->formatAnything($currency, $amount, false), 'name' => $piggyBank->name]
) )
@ -340,11 +344,11 @@ class PiggyBankController extends Controller
return redirect(route('piggy-banks.index')); return redirect(route('piggy-banks.index'));
} }
$amount = (string)round($request->get('amount'), 12); $amount = (string) round($request->get('amount'), 12);
session()->flash( session()->flash(
'error', 'error',
(string)trans( (string) trans(
'firefly.cannot_remove_from_piggy', 'firefly.cannot_remove_from_piggy',
['amount' => app('amount')->formatAnything($currency, $amount, false), 'name' => e($piggyBank->name)] ['amount' => app('amount')->formatAnything($currency, $amount, false), 'name' => e($piggyBank->name)]
) )
@ -358,12 +362,12 @@ class PiggyBankController extends Controller
* *
* @param PiggyBank $piggyBank * @param PiggyBank $piggyBank
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function remove(PiggyBank $piggyBank) public function remove(PiggyBank $piggyBank)
{ {
$repetition = $this->piggyRepos->getRepetition($piggyBank); $repetition = $this->piggyRepos->getRepetition($piggyBank);
$currency = $this->accountRepos->getAccountCurrency($piggyBank->account) ?? app('amount')->getDefaultCurrency(); $currency = $this->accountRepos->getAccountCurrency($piggyBank->account) ?? app('amount')->getDefaultCurrency();
return view('piggy-banks.remove', compact('piggyBank', 'repetition', 'currency')); return view('piggy-banks.remove', compact('piggyBank', 'repetition', 'currency'));
} }
@ -373,12 +377,12 @@ class PiggyBankController extends Controller
* *
* @param PiggyBank $piggyBank * @param PiggyBank $piggyBank
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function removeMobile(PiggyBank $piggyBank) public function removeMobile(PiggyBank $piggyBank)
{ {
$repetition = $this->piggyRepos->getRepetition($piggyBank); $repetition = $this->piggyRepos->getRepetition($piggyBank);
$currency = $this->accountRepos->getAccountCurrency($piggyBank->account) ?? app('amount')->getDefaultCurrency(); $currency = $this->accountRepos->getAccountCurrency($piggyBank->account) ?? app('amount')->getDefaultCurrency();
return view('piggy-banks.remove-mobile', compact('piggyBank', 'repetition', 'currency')); return view('piggy-banks.remove-mobile', compact('piggyBank', 'repetition', 'currency'));
} }
@ -393,7 +397,7 @@ class PiggyBankController extends Controller
*/ */
public function setOrder(Request $request, PiggyBank $piggyBank): JsonResponse public function setOrder(Request $request, PiggyBank $piggyBank): JsonResponse
{ {
$newOrder = (int)$request->get('order'); $newOrder = (int) $request->get('order');
$this->piggyRepos->setOrder($piggyBank, $newOrder); $this->piggyRepos->setOrder($piggyBank, $newOrder);
return response()->json(['data' => 'OK']); return response()->json(['data' => 'OK']);
@ -404,7 +408,7 @@ class PiggyBankController extends Controller
* *
* @param PiggyBank $piggyBank * @param PiggyBank $piggyBank
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function show(PiggyBank $piggyBank) public function show(PiggyBank $piggyBank)
{ {
@ -429,7 +433,7 @@ class PiggyBankController extends Controller
* *
* @param PiggyBankFormRequest $request * @param PiggyBankFormRequest $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function store(PiggyBankFormRequest $request) public function store(PiggyBankFormRequest $request)
{ {
@ -439,12 +443,12 @@ class PiggyBankController extends Controller
} }
$piggyBank = $this->piggyRepos->store($data); $piggyBank = $this->piggyRepos->store($data);
session()->flash('success', (string)trans('firefly.stored_piggy_bank', ['name' => $piggyBank->name])); session()->flash('success', (string) trans('firefly.stored_piggy_bank', ['name' => $piggyBank->name]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('piggy-banks.create.uri')); $redirect = redirect($this->getPreviousUri('piggy-banks.create.uri'));
if (1 === (int)$request->get('create_another')) { if (1 === (int) $request->get('create_another')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
session()->put('piggy-banks.create.fromStore', true); session()->put('piggy-banks.create.fromStore', true);
@ -461,19 +465,19 @@ class PiggyBankController extends Controller
* @param PiggyBankFormRequest $request * @param PiggyBankFormRequest $request
* @param PiggyBank $piggyBank * @param PiggyBank $piggyBank
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function update(PiggyBankFormRequest $request, PiggyBank $piggyBank) public function update(PiggyBankFormRequest $request, PiggyBank $piggyBank)
{ {
$data = $request->getPiggyBankData(); $data = $request->getPiggyBankData();
$piggyBank = $this->piggyRepos->update($piggyBank, $data); $piggyBank = $this->piggyRepos->update($piggyBank, $data);
session()->flash('success', (string)trans('firefly.updated_piggy_bank', ['name' => $piggyBank->name])); session()->flash('success', (string) trans('firefly.updated_piggy_bank', ['name' => $piggyBank->name]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('piggy-banks.edit.uri')); $redirect = redirect($this->getPreviousUri('piggy-banks.edit.uri'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
session()->put('piggy-banks.edit.fromUpdate', true); session()->put('piggy-banks.edit.fromUpdate', true);

View File

@ -26,7 +26,11 @@ use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType; use FireflyIII\Models\AccountType;
use FireflyIII\Models\Preference; use FireflyIII\Models\Preference;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* Class PreferencesController. * Class PreferencesController.
@ -35,6 +39,7 @@ class PreferencesController extends Controller
{ {
/** /**
* PreferencesController constructor. * PreferencesController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -43,7 +48,7 @@ class PreferencesController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.preferences')); app('view')->share('title', (string) trans('firefly.preferences'));
app('view')->share('mainTitleIcon', 'fa-gear'); app('view')->share('mainTitleIcon', 'fa-gear');
return $next($request); return $next($request);
@ -56,7 +61,7 @@ class PreferencesController extends Controller
* *
* @param AccountRepositoryInterface $repository * @param AccountRepositoryInterface $repository
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index(AccountRepositoryInterface $repository) public function index(AccountRepositoryInterface $repository)
{ {
@ -70,13 +75,13 @@ class PreferencesController extends Controller
$role = sprintf('opt_group_%s', $repository->getMetaValue($account, 'account_role')); $role = sprintf('opt_group_%s', $repository->getMetaValue($account, 'account_role'));
if (in_array($type, [AccountType::MORTGAGE, AccountType::DEBT, AccountType::LOAN], true)) { if (in_array($type, [AccountType::MORTGAGE, AccountType::DEBT, AccountType::LOAN], true)) {
$role = sprintf('opt_group_l_%s',$type); $role = sprintf('opt_group_l_%s', $type);
} }
if ('' === $role || 'opt_group_' === $role) { if ('' === $role || 'opt_group_' === $role) {
$role = 'opt_group_defaultAsset'; $role = 'opt_group_defaultAsset';
} }
$groupedAccounts[trans(sprintf('firefly.%s',$role))][$account->id] = $account->name; $groupedAccounts[trans(sprintf('firefly.%s', $role))][$account->id] = $account->name;
} }
ksort($groupedAccounts); ksort($groupedAccounts);
@ -122,7 +127,7 @@ class PreferencesController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
* *
*/ */
public function postIndex(Request $request) public function postIndex(Request $request)
@ -131,7 +136,7 @@ class PreferencesController extends Controller
$frontPageAccounts = []; $frontPageAccounts = [];
if (is_array($request->get('frontPageAccounts')) && count($request->get('frontPageAccounts')) > 0) { if (is_array($request->get('frontPageAccounts')) && count($request->get('frontPageAccounts')) > 0) {
foreach ($request->get('frontPageAccounts') as $id) { foreach ($request->get('frontPageAccounts') as $id) {
$frontPageAccounts[] = (int)$id; $frontPageAccounts[] = (int) $id;
} }
app('preferences')->set('frontPageAccounts', $frontPageAccounts); app('preferences')->set('frontPageAccounts', $frontPageAccounts);
} }
@ -144,14 +149,14 @@ class PreferencesController extends Controller
session()->forget('range'); session()->forget('range');
// custom fiscal year // custom fiscal year
$customFiscalYear = 1 === (int)$request->get('customFiscalYear'); $customFiscalYear = 1 === (int) $request->get('customFiscalYear');
$fiscalYearStart = date('m-d', strtotime((string)$request->get('fiscalYearStart'))); $fiscalYearStart = date('m-d', strtotime((string) $request->get('fiscalYearStart')));
app('preferences')->set('customFiscalYear', $customFiscalYear); app('preferences')->set('customFiscalYear', $customFiscalYear);
app('preferences')->set('fiscalYearStart', $fiscalYearStart); app('preferences')->set('fiscalYearStart', $fiscalYearStart);
// save page size: // save page size:
app('preferences')->set('listPageSize', 50); app('preferences')->set('listPageSize', 50);
$listPageSize = (int)$request->get('listPageSize'); $listPageSize = (int) $request->get('listPageSize');
if ($listPageSize > 0 && $listPageSize < 1337) { if ($listPageSize > 0 && $listPageSize < 1337) {
app('preferences')->set('listPageSize', $listPageSize); app('preferences')->set('listPageSize', $listPageSize);
} }
@ -182,7 +187,7 @@ class PreferencesController extends Controller
]; ];
app('preferences')->set('transaction_journal_optional_fields', $optionalTj); app('preferences')->set('transaction_journal_optional_fields', $optionalTj);
session()->flash('success', (string)trans('firefly.saved_preferences')); session()->flash('success', (string) trans('firefly.saved_preferences'));
app('preferences')->mark(); app('preferences')->mark();
return redirect(route('preferences.index')); return redirect(route('preferences.index'));

View File

@ -21,7 +21,6 @@
namespace FireflyIII\Http\Controllers\Profile; namespace FireflyIII\Http\Controllers\Profile;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface; use FireflyIII\Repositories\Budget\AvailableBudgetRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface;
@ -86,4 +85,4 @@ class DataController extends Controller
return redirect(route('profile.index')); return redirect(route('profile.index'));
} }
} }

View File

@ -41,8 +41,12 @@ use FireflyIII\User;
use Google2FA; use Google2FA;
use Hash; use Hash;
use Illuminate\Contracts\Auth\Guard; use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View;
use Laravel\Passport\ClientRepository; use Laravel\Passport\ClientRepository;
use Log; use Log;
use PragmaRX\Recovery\Recovery; use PragmaRX\Recovery\Recovery;
@ -59,6 +63,7 @@ class ProfileController extends Controller
/** /**
* ProfileController constructor. * ProfileController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -67,7 +72,7 @@ class ProfileController extends Controller
$this->middleware( $this->middleware(
static function ($request, $next) { static function ($request, $next) {
app('view')->share('title', (string)trans('firefly.profile')); app('view')->share('title', (string) trans('firefly.profile'));
app('view')->share('mainTitleIcon', 'fa-user'); app('view')->share('mainTitleIcon', 'fa-user');
return $next($request); return $next($request);
@ -83,7 +88,7 @@ class ProfileController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function changeEmail(Request $request) public function changeEmail(Request $request)
{ {
@ -98,7 +103,7 @@ class ProfileController extends Controller
$title = auth()->user()->email; $title = auth()->user()->email;
$email = auth()->user()->email; $email = auth()->user()->email;
$subTitle = (string)trans('firefly.change_your_email'); $subTitle = (string) trans('firefly.change_your_email');
$subTitleIcon = 'fa-envelope'; $subTitleIcon = 'fa-envelope';
return view('profile.change-email', compact('title', 'subTitle', 'subTitleIcon', 'email')); return view('profile.change-email', compact('title', 'subTitle', 'subTitleIcon', 'email'));
@ -109,7 +114,7 @@ class ProfileController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function changePassword(Request $request) public function changePassword(Request $request)
{ {
@ -123,7 +128,7 @@ class ProfileController extends Controller
} }
$title = auth()->user()->email; $title = auth()->user()->email;
$subTitle = (string)trans('firefly.change_your_password'); $subTitle = (string) trans('firefly.change_your_password');
$subTitleIcon = 'fa-key'; $subTitleIcon = 'fa-key';
return view('profile.change-password', compact('title', 'subTitle', 'subTitleIcon')); return view('profile.change-password', compact('title', 'subTitle', 'subTitleIcon'));
@ -132,7 +137,7 @@ class ProfileController extends Controller
/** /**
* View that generates a 2FA code for the user. * View that generates a 2FA code for the user.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function code() public function code()
{ {
@ -172,7 +177,7 @@ class ProfileController extends Controller
$image = Google2FA::getQRCodeInline($domain, auth()->user()->email, $secret); $image = Google2FA::getQRCodeInline($domain, auth()->user()->email, $secret);
return view('profile.code', compact('image', 'secret','codes')); return view('profile.code', compact('image', 'secret', 'codes'));
} }
/** /**
@ -181,9 +186,9 @@ class ProfileController extends Controller
* @param UserRepositoryInterface $repository * @param UserRepositoryInterface $repository
* @param string $token * @param string $token
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*
* @throws FireflyException * @throws FireflyException
* @return RedirectResponse|Redirector
*
*/ */
public function confirmEmailChange(UserRepositoryInterface $repository, string $token) public function confirmEmailChange(UserRepositoryInterface $repository, string $token)
{ {
@ -214,7 +219,7 @@ class ProfileController extends Controller
$repository->unblockUser($user); $repository->unblockUser($user);
// return to login. // return to login.
session()->flash('success', (string)trans('firefly.login_with_new_email')); session()->flash('success', (string) trans('firefly.login_with_new_email'));
return redirect(route('login')); return redirect(route('login'));
} }
@ -224,7 +229,7 @@ class ProfileController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function deleteAccount(Request $request) public function deleteAccount(Request $request)
{ {
@ -235,7 +240,7 @@ class ProfileController extends Controller
// @codeCoverageIgnoreEnd // @codeCoverageIgnoreEnd
} }
$title = auth()->user()->email; $title = auth()->user()->email;
$subTitle = (string)trans('firefly.delete_account'); $subTitle = (string) trans('firefly.delete_account');
$subTitleIcon = 'fa-trash'; $subTitleIcon = 'fa-trash';
return view('profile.delete-account', compact('title', 'subTitle', 'subTitleIcon')); return view('profile.delete-account', compact('title', 'subTitle', 'subTitleIcon'));
@ -244,7 +249,7 @@ class ProfileController extends Controller
/** /**
* Delete 2FA routine. * Delete 2FA routine.
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function deleteCode() public function deleteCode()
{ {
@ -255,8 +260,8 @@ class ProfileController extends Controller
$user = auth()->user(); $user = auth()->user();
$repository->setMFACode($user, null); $repository->setMFACode($user, null);
session()->flash('success', (string)trans('firefly.pref_two_factor_auth_disabled')); session()->flash('success', (string) trans('firefly.pref_two_factor_auth_disabled'));
session()->flash('info', (string)trans('firefly.pref_two_factor_auth_remove_it')); session()->flash('info', (string) trans('firefly.pref_two_factor_auth_remove_it'));
return redirect(route('profile.index')); return redirect(route('profile.index'));
} }
@ -264,7 +269,7 @@ class ProfileController extends Controller
/** /**
* Enable 2FA screen. * Enable 2FA screen.
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function enable2FA() public function enable2FA()
{ {
@ -279,7 +284,7 @@ class ProfileController extends Controller
// If FF3 already has a secret, just set the two factor auth enabled to 1, // If FF3 already has a secret, just set the two factor auth enabled to 1,
// and let the user continue with the existing secret. // and let the user continue with the existing secret.
session()->flash('info', (string)trans('firefly.2fa_already_enabled')); session()->flash('info', (string) trans('firefly.2fa_already_enabled'));
return redirect(route('profile.index')); return redirect(route('profile.index'));
} }
@ -287,7 +292,7 @@ class ProfileController extends Controller
/** /**
* Index for profile. * Index for profile.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index() public function index()
{ {
@ -320,7 +325,7 @@ class ProfileController extends Controller
} }
/** /**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function newBackupCodes() public function newBackupCodes()
{ {
@ -335,6 +340,7 @@ class ProfileController extends Controller
app('preferences')->set('mfa_recovery', $recoveryCodes); app('preferences')->set('mfa_recovery', $recoveryCodes);
app('preferences')->mark(); app('preferences')->mark();
return view('profile.new-backup-codes', compact('codes')); return view('profile.new-backup-codes', compact('codes'));
} }
@ -344,7 +350,7 @@ class ProfileController extends Controller
* @param EmailFormRequest $request * @param EmailFormRequest $request
* @param UserRepositoryInterface $repository * @param UserRepositoryInterface $repository
* *
* @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return $this|RedirectResponse|Redirector
*/ */
public function postChangeEmail(EmailFormRequest $request, UserRepositoryInterface $repository) public function postChangeEmail(EmailFormRequest $request, UserRepositoryInterface $repository)
{ {
@ -362,7 +368,7 @@ class ProfileController extends Controller
$newEmail = $request->string('email'); $newEmail = $request->string('email');
$oldEmail = $user->email; $oldEmail = $user->email;
if ($newEmail === $user->email) { if ($newEmail === $user->email) {
session()->flash('error', (string)trans('firefly.email_not_changed')); session()->flash('error', (string) trans('firefly.email_not_changed'));
return redirect(route('profile.change-email'))->withInput(); return redirect(route('profile.change-email'))->withInput();
} }
@ -372,7 +378,7 @@ class ProfileController extends Controller
Auth::guard()->logout(); Auth::guard()->logout();
$request->session()->invalidate(); $request->session()->invalidate();
session()->flash('success', (string)trans('firefly.email_changed')); session()->flash('success', (string) trans('firefly.email_changed'));
return redirect(route('index')); return redirect(route('index'));
} }
@ -387,7 +393,7 @@ class ProfileController extends Controller
// force user logout. // force user logout.
Auth::guard()->logout(); Auth::guard()->logout();
$request->session()->invalidate(); $request->session()->invalidate();
session()->flash('success', (string)trans('firefly.email_changed')); session()->flash('success', (string) trans('firefly.email_changed'));
return redirect(route('index')); return redirect(route('index'));
} }
@ -398,7 +404,7 @@ class ProfileController extends Controller
* @param ProfileFormRequest $request * @param ProfileFormRequest $request
* @param UserRepositoryInterface $repository * @param UserRepositoryInterface $repository
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function postChangePassword(ProfileFormRequest $request, UserRepositoryInterface $repository) public function postChangePassword(ProfileFormRequest $request, UserRepositoryInterface $repository)
{ {
@ -425,7 +431,7 @@ class ProfileController extends Controller
} }
$repository->changePassword($user, $request->get('new_password')); $repository->changePassword($user, $request->get('new_password'));
session()->flash('success', (string)trans('firefly.password_changed')); session()->flash('success', (string) trans('firefly.password_changed'));
return redirect(route('profile.index')); return redirect(route('profile.index'));
} }
@ -436,7 +442,7 @@ class ProfileController extends Controller
* *
* @param TokenFormRequest $request * @param TokenFormRequest $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function postCode(TokenFormRequest $request) public function postCode(TokenFormRequest $request)
{ {
@ -448,7 +454,7 @@ class ProfileController extends Controller
$secret = session()->get('two-factor-secret'); $secret = session()->get('two-factor-secret');
$repository->setMFACode($user, $secret); $repository->setMFACode($user, $secret);
session()->flash('success', (string)trans('firefly.saved_preferences')); session()->flash('success', (string) trans('firefly.saved_preferences'));
app('preferences')->mark(); app('preferences')->mark();
// also save the code so replay attack is prevented. // also save the code so replay attack is prevented.
@ -475,12 +481,12 @@ class ProfileController extends Controller
* @param UserRepositoryInterface $repository * @param UserRepositoryInterface $repository
* @param DeleteAccountFormRequest $request * @param DeleteAccountFormRequest $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function postDeleteAccount(UserRepositoryInterface $repository, DeleteAccountFormRequest $request) public function postDeleteAccount(UserRepositoryInterface $repository, DeleteAccountFormRequest $request)
{ {
if (!Hash::check($request->get('password'), auth()->user()->password)) { if (!Hash::check($request->get('password'), auth()->user()->password)) {
session()->flash('error', (string)trans('firefly.invalid_password')); session()->flash('error', (string) trans('firefly.invalid_password'));
return redirect(route('profile.delete-account')); return redirect(route('profile.delete-account'));
} }
@ -498,7 +504,7 @@ class ProfileController extends Controller
/** /**
* Regenerate access token. * Regenerate access token.
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function regenerate() public function regenerate()
{ {
@ -506,7 +512,7 @@ class ProfileController extends Controller
$user = auth()->user(); $user = auth()->user();
$token = $user->generateAccessToken(); $token = $user->generateAccessToken();
app('preferences')->set('access_token', $token); app('preferences')->set('access_token', $token);
session()->flash('success', (string)trans('firefly.token_regenerated')); session()->flash('success', (string) trans('firefly.token_regenerated'));
return redirect(route('profile.index')); return redirect(route('profile.index'));
} }
@ -518,9 +524,9 @@ class ProfileController extends Controller
* @param string $token * @param string $token
* @param string $hash * @param string $hash
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*
* @throws FireflyException * @throws FireflyException
* @return RedirectResponse|Redirector
*
*/ */
public function undoEmailChange(UserRepositoryInterface $repository, string $token, string $hash) public function undoEmailChange(UserRepositoryInterface $repository, string $token, string $hash)
{ {
@ -564,7 +570,7 @@ class ProfileController extends Controller
$repository->unblockUser($user); $repository->unblockUser($user);
// return to login. // return to login.
session()->flash('success', (string)trans('firefly.login_with_old_email')); session()->flash('success', (string) trans('firefly.login_with_old_email'));
return redirect(route('login')); return redirect(route('login'));
} }

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Recurring; namespace FireflyIII\Http\Controllers\Recurring;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@ -31,7 +30,11 @@ use FireflyIII\Http\Requests\RecurrenceFormRequest;
use FireflyIII\Models\RecurrenceRepetition; use FireflyIII\Models\RecurrenceRepetition;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* *
@ -46,6 +49,7 @@ class CreateController extends Controller
/** /**
* CreateController constructor. * CreateController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -56,8 +60,8 @@ class CreateController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-paint-brush'); app('view')->share('mainTitleIcon', 'fa-paint-brush');
app('view')->share('title', (string)trans('firefly.recurrences')); app('view')->share('title', (string) trans('firefly.recurrences'));
app('view')->share('subTitle', (string)trans('firefly.create_new_recurrence')); app('view')->share('subTitle', (string) trans('firefly.create_new_recurrence'));
$this->recurring = app(RecurringRepositoryInterface::class); $this->recurring = app(RecurringRepositoryInterface::class);
$this->budgets = app(BudgetRepositoryInterface::class); $this->budgets = app(BudgetRepositoryInterface::class);
@ -72,7 +76,7 @@ class CreateController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function create(Request $request) public function create(Request $request)
{ {
@ -88,15 +92,15 @@ class CreateController extends Controller
} }
$request->session()->forget('recurring.create.fromStore'); $request->session()->forget('recurring.create.fromStore');
$repetitionEnds = [ $repetitionEnds = [
'forever' => (string)trans('firefly.repeat_forever'), 'forever' => (string) trans('firefly.repeat_forever'),
'until_date' => (string)trans('firefly.repeat_until_date'), 'until_date' => (string) trans('firefly.repeat_until_date'),
'times' => (string)trans('firefly.repeat_times'), 'times' => (string) trans('firefly.repeat_times'),
]; ];
$weekendResponses = [ $weekendResponses = [
RecurrenceRepetition::WEEKEND_DO_NOTHING => (string)trans('firefly.do_nothing'), RecurrenceRepetition::WEEKEND_DO_NOTHING => (string) trans('firefly.do_nothing'),
RecurrenceRepetition::WEEKEND_SKIP_CREATION => (string)trans('firefly.skip_transaction'), RecurrenceRepetition::WEEKEND_SKIP_CREATION => (string) trans('firefly.skip_transaction'),
RecurrenceRepetition::WEEKEND_TO_FRIDAY => (string)trans('firefly.jump_to_friday'), RecurrenceRepetition::WEEKEND_TO_FRIDAY => (string) trans('firefly.jump_to_friday'),
RecurrenceRepetition::WEEKEND_TO_MONDAY => (string)trans('firefly.jump_to_monday'), RecurrenceRepetition::WEEKEND_TO_MONDAY => (string) trans('firefly.jump_to_monday'),
]; ];
@ -104,13 +108,14 @@ class CreateController extends Controller
$preFilled = [ $preFilled = [
'first_date' => $tomorrow->format('Y-m-d'), 'first_date' => $tomorrow->format('Y-m-d'),
'transaction_type' => $hasOldInput ? $request->old('transaction_type') : 'withdrawal', 'transaction_type' => $hasOldInput ? $request->old('transaction_type') : 'withdrawal',
'active' => $hasOldInput ? (bool)$request->old('active') : true, 'active' => $hasOldInput ? (bool) $request->old('active') : true,
'apply_rules' => $hasOldInput ? (bool)$request->old('apply_rules') : true, 'apply_rules' => $hasOldInput ? (bool) $request->old('apply_rules') : true,
]; ];
$request->session()->flash('preFilled', $preFilled); $request->session()->flash('preFilled', $preFilled);
return view( return view(
'recurring.create', compact('tomorrow', 'oldRepetitionType', 'weekendResponses', 'preFilled', 'repetitionEnds', 'defaultCurrency', 'budgets') 'recurring.create',
compact('tomorrow', 'oldRepetitionType', 'weekendResponses', 'preFilled', 'repetitionEnds', 'defaultCurrency', 'budgets')
); );
} }
@ -120,7 +125,7 @@ class CreateController extends Controller
* *
* @param RecurrenceFormRequest $request * @param RecurrenceFormRequest $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function store(RecurrenceFormRequest $request) public function store(RecurrenceFormRequest $request)
{ {
@ -129,13 +134,14 @@ class CreateController extends Controller
$recurrence = $this->recurring->store($data); $recurrence = $this->recurring->store($data);
} catch (FireflyException $e) { } catch (FireflyException $e) {
session()->flash('error', $e->getMessage()); session()->flash('error', $e->getMessage());
return redirect(route('recurring.create'))->withInput(); return redirect(route('recurring.create'))->withInput();
} }
$request->session()->flash('success', (string)trans('firefly.stored_new_recurrence', ['title' => $recurrence->title])); $request->session()->flash('success', (string) trans('firefly.stored_new_recurrence', ['title' => $recurrence->title]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('recurring.create.uri')); $redirect = redirect($this->getPreviousUri('recurring.create.uri'));
if (1 === (int)$request->get('create_another')) { if (1 === (int) $request->get('create_another')) {
// set value so create routine will not overwrite URL: // set value so create routine will not overwrite URL:
$request->session()->put('recurring.create.fromStore', true); $request->session()->put('recurring.create.fromStore', true);
@ -144,7 +150,5 @@ class CreateController extends Controller
// redirect to previous URL. // redirect to previous URL.
return $redirect; return $redirect;
} }
} }

View File

@ -27,7 +27,11 @@ namespace FireflyIII\Http\Controllers\Recurring;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Recurrence; use FireflyIII\Models\Recurrence;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* Class DeleteController * Class DeleteController
@ -39,6 +43,7 @@ class DeleteController extends Controller
/** /**
* DeleteController constructor. * DeleteController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -49,7 +54,7 @@ class DeleteController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-paint-brush'); app('view')->share('mainTitleIcon', 'fa-paint-brush');
app('view')->share('title', (string)trans('firefly.recurrences')); app('view')->share('title', (string) trans('firefly.recurrences'));
$this->recurring = app(RecurringRepositoryInterface::class); $this->recurring = app(RecurringRepositoryInterface::class);
@ -63,11 +68,11 @@ class DeleteController extends Controller
* *
* @param Recurrence $recurrence * @param Recurrence $recurrence
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function delete(Recurrence $recurrence) public function delete(Recurrence $recurrence)
{ {
$subTitle = (string)trans('firefly.delete_recurring', ['title' => $recurrence->title]); $subTitle = (string) trans('firefly.delete_recurring', ['title' => $recurrence->title]);
// put previous url in session // put previous url in session
$this->rememberPreviousUri('recurrences.delete.uri'); $this->rememberPreviousUri('recurrences.delete.uri');
@ -80,15 +85,15 @@ class DeleteController extends Controller
* Destroy the recurring transaction. * Destroy the recurring transaction.
* *
* @param RecurringRepositoryInterface $repository * @param RecurringRepositoryInterface $repository
* @param Request $request * @param Request $request
* @param Recurrence $recurrence * @param Recurrence $recurrence
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function destroy(RecurringRepositoryInterface $repository, Request $request, Recurrence $recurrence) public function destroy(RecurringRepositoryInterface $repository, Request $request, Recurrence $recurrence)
{ {
$repository->destroy($recurrence); $repository->destroy($recurrence);
$request->session()->flash('success', (string)trans('firefly.' . 'recurrence_deleted', ['title' => $recurrence->title])); $request->session()->flash('success', (string) trans('firefly.' . 'recurrence_deleted', ['title' => $recurrence->title]));
app('preferences')->mark(); app('preferences')->mark();
return redirect($this->getPreviousUri('recurrences.delete.uri')); return redirect($this->getPreviousUri('recurrences.delete.uri'));

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Recurring; namespace FireflyIII\Http\Controllers\Recurring;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\RecurrenceFormRequest; use FireflyIII\Http\Requests\RecurrenceFormRequest;
use FireflyIII\Models\Recurrence; use FireflyIII\Models\Recurrence;
@ -31,7 +32,11 @@ use FireflyIII\Models\RecurrenceRepetition;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use FireflyIII\Transformers\RecurrenceTransformer; use FireflyIII\Transformers\RecurrenceTransformer;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
@ -47,6 +52,7 @@ class EditController extends Controller
/** /**
* EditController constructor. * EditController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -57,8 +63,8 @@ class EditController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-paint-brush'); app('view')->share('mainTitleIcon', 'fa-paint-brush');
app('view')->share('title', (string)trans('firefly.recurrences')); app('view')->share('title', (string) trans('firefly.recurrences'));
app('view')->share('subTitle', (string)trans('firefly.recurrences')); app('view')->share('subTitle', (string) trans('firefly.recurrences'));
$this->recurring = app(RecurringRepositoryInterface::class); $this->recurring = app(RecurringRepositoryInterface::class);
$this->budgets = app(BudgetRepositoryInterface::class); $this->budgets = app(BudgetRepositoryInterface::class);
@ -71,12 +77,12 @@ class EditController extends Controller
/** /**
* Edit a recurring transaction. * Edit a recurring transaction.
* *
* @param Request $request * @param Request $request
* @param Recurrence $recurrence * @param Recurrence $recurrence
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @throws FireflyException
* @throws \FireflyIII\Exceptions\FireflyException
* *
* @return Factory|View
*/ */
public function edit(Request $request, Recurrence $recurrence) public function edit(Request $request, Recurrence $recurrence)
{ {
@ -100,11 +106,11 @@ class EditController extends Controller
} }
$request->session()->forget('recurrences.edit.fromUpdate'); $request->session()->forget('recurrences.edit.fromUpdate');
$repetitionEnd = 'forever'; $repetitionEnd = 'forever';
$repetitionEnds = [ $repetitionEnds = [
'forever' => (string)trans('firefly.repeat_forever'), 'forever' => (string) trans('firefly.repeat_forever'),
'until_date' => (string)trans('firefly.repeat_until_date'), 'until_date' => (string) trans('firefly.repeat_until_date'),
'times' => (string)trans('firefly.repeat_times'), 'times' => (string) trans('firefly.repeat_times'),
]; ];
if (null !== $recurrence->repeat_until) { if (null !== $recurrence->repeat_until) {
$repetitionEnd = 'until_date'; // @codeCoverageIgnore $repetitionEnd = 'until_date'; // @codeCoverageIgnore
@ -114,17 +120,17 @@ class EditController extends Controller
} }
$weekendResponses = [ $weekendResponses = [
RecurrenceRepetition::WEEKEND_DO_NOTHING => (string)trans('firefly.do_nothing'), RecurrenceRepetition::WEEKEND_DO_NOTHING => (string) trans('firefly.do_nothing'),
RecurrenceRepetition::WEEKEND_SKIP_CREATION => (string)trans('firefly.skip_transaction'), RecurrenceRepetition::WEEKEND_SKIP_CREATION => (string) trans('firefly.skip_transaction'),
RecurrenceRepetition::WEEKEND_TO_FRIDAY => (string)trans('firefly.jump_to_friday'), RecurrenceRepetition::WEEKEND_TO_FRIDAY => (string) trans('firefly.jump_to_friday'),
RecurrenceRepetition::WEEKEND_TO_MONDAY => (string)trans('firefly.jump_to_monday'), RecurrenceRepetition::WEEKEND_TO_MONDAY => (string) trans('firefly.jump_to_monday'),
]; ];
$hasOldInput = null !== $request->old('_token'); $hasOldInput = null !== $request->old('_token');
$preFilled = [ $preFilled = [
'transaction_type' => strtolower($recurrence->transactionType->type), 'transaction_type' => strtolower($recurrence->transactionType->type),
'active' => $hasOldInput ? (bool)$request->old('active') : $recurrence->active, 'active' => $hasOldInput ? (bool) $request->old('active') : $recurrence->active,
'apply_rules' => $hasOldInput ? (bool)$request->old('apply_rules') : $recurrence->apply_rules, 'apply_rules' => $hasOldInput ? (bool) $request->old('apply_rules') : $recurrence->apply_rules,
'deposit_source_id' => $array['transactions'][0]['source_id'], 'deposit_source_id' => $array['transactions'][0]['source_id'],
'withdrawal_destination_id' => $array['transactions'][0]['destination_id'], 'withdrawal_destination_id' => $array['transactions'][0]['destination_id'],
]; ];
@ -141,10 +147,10 @@ class EditController extends Controller
* Update the recurring transaction. * Update the recurring transaction.
* *
* @param RecurrenceFormRequest $request * @param RecurrenceFormRequest $request
* @param Recurrence $recurrence * @param Recurrence $recurrence
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @throws FireflyException
* @throws \FireflyIII\Exceptions\FireflyException * @return RedirectResponse|Redirector
*/ */
public function update(RecurrenceFormRequest $request, Recurrence $recurrence) public function update(RecurrenceFormRequest $request, Recurrence $recurrence)
{ {
@ -152,10 +158,10 @@ class EditController extends Controller
$this->recurring->update($recurrence, $data); $this->recurring->update($recurrence, $data);
$request->session()->flash('success', (string)trans('firefly.updated_recurrence', ['title' => $recurrence->title])); $request->session()->flash('success', (string) trans('firefly.updated_recurrence', ['title' => $recurrence->title]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('recurrences.edit.uri')); $redirect = redirect($this->getPreviousUri('recurrences.edit.uri'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// set value so edit routine will not overwrite URL: // set value so edit routine will not overwrite URL:
$request->session()->put('recurrences.edit.fromUpdate', true); $request->session()->put('recurrences.edit.fromUpdate', true);

View File

@ -25,14 +25,17 @@ namespace FireflyIII\Http\Controllers\Recurring;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Recurrence; use FireflyIII\Models\Recurrence;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use FireflyIII\Support\Http\Controllers\GetConfigurationData; use FireflyIII\Support\Http\Controllers\GetConfigurationData;
use FireflyIII\Transformers\RecurrenceTransformer; use FireflyIII\Transformers\RecurrenceTransformer;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View;
use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
@ -58,7 +61,7 @@ class IndexController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-paint-brush'); app('view')->share('mainTitleIcon', 'fa-paint-brush');
app('view')->share('title', (string)trans('firefly.recurrences')); app('view')->share('title', (string) trans('firefly.recurrences'));
$this->recurring = app(RecurringRepositoryInterface::class); $this->recurring = app(RecurringRepositoryInterface::class);
@ -73,14 +76,14 @@ class IndexController extends Controller
* *
* @param Request $request * @param Request $request
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @throws FireflyException
* @throws \FireflyIII\Exceptions\FireflyException
* *
* @return Factory|View
*/ */
public function index(Request $request) public function index(Request $request)
{ {
$page = 0 === (int)$request->get('page') ? 1 : (int)$request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$collection = $this->recurring->get(); $collection = $this->recurring->get();
// split collection // split collection
@ -95,19 +98,19 @@ class IndexController extends Controller
$recurring = []; $recurring = [];
/** @var Recurrence $recurrence */ /** @var Recurrence $recurrence */
foreach ($recurrences as $recurrence) { foreach ($recurrences as $recurrence) {
$today = new Carbon; $today = new Carbon;
$year = new Carbon; $year = new Carbon;
$year->addYear(); $year->addYear();
if($recurrence->first_date > $today) { if ($recurrence->first_date > $today) {
$today =clone $recurrence->first_date; $today = clone $recurrence->first_date;
$year = clone $today; $year = clone $today;
$year->addYear(); $year->addYear();
} }
$array = $transformer->transform($recurrence); $array = $transformer->transform($recurrence);
$array['first_date'] = new Carbon($array['first_date']); $array['first_date'] = new Carbon($array['first_date']);
$array['repeat_until'] = null === $array['repeat_until'] ? null : new Carbon($array['repeat_until']); $array['repeat_until'] = null === $array['repeat_until'] ? null : new Carbon($array['repeat_until']);
$array['latest_date'] = null === $array['latest_date'] ? null : new Carbon($array['latest_date']); $array['latest_date'] = null === $array['latest_date'] ? null : new Carbon($array['latest_date']);
$array['occurrences'] = array_slice($this->recurring->getOccurrencesInRange($recurrence->recurrenceRepetitions->first(), $today, $year),0,1); $array['occurrences'] = array_slice($this->recurring->getOccurrencesInRange($recurrence->recurrenceRepetitions->first(), $today, $year), 0, 1);
$recurring[] = $array; $recurring[] = $array;
} }
$paginator = new LengthAwarePaginator($recurring, $total, $pageSize, $page); $paginator = new LengthAwarePaginator($recurring, $total, $pageSize, $page);

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Recurring; namespace FireflyIII\Http\Controllers\Recurring;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
@ -31,6 +30,8 @@ use FireflyIII\Models\Recurrence;
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface; use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
use FireflyIII\Support\Http\Controllers\GetConfigurationData; use FireflyIII\Support\Http\Controllers\GetConfigurationData;
use FireflyIII\Transformers\RecurrenceTransformer; use FireflyIII\Transformers\RecurrenceTransformer;
use Illuminate\Contracts\View\Factory;
use Illuminate\View\View;
use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\ParameterBag;
/** /**
@ -45,6 +46,7 @@ class ShowController extends Controller
/** /**
* IndexController constructor. * IndexController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -56,7 +58,7 @@ class ShowController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-paint-brush'); app('view')->share('mainTitleIcon', 'fa-paint-brush');
app('view')->share('title', (string)trans('firefly.recurrences')); app('view')->share('title', (string) trans('firefly.recurrences'));
$this->recurring = app(RecurringRepositoryInterface::class); $this->recurring = app(RecurringRepositoryInterface::class);
@ -71,8 +73,8 @@ class ShowController extends Controller
* *
* @param Recurrence $recurrence * @param Recurrence $recurrence
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @throws FireflyException * @throws FireflyException
* @return Factory|View
*/ */
public function show(Recurrence $recurrence) public function show(Recurrence $recurrence)
{ {
@ -90,8 +92,8 @@ class ShowController extends Controller
} }
} }
$subTitle = (string)trans('firefly.overview_for_recurrence', ['title' => $recurrence->title]); $subTitle = (string) trans('firefly.overview_for_recurrence', ['title' => $recurrence->title]);
return view('recurring.show', compact('recurrence', 'subTitle', 'array', 'groups')); return view('recurring.show', compact('recurrence', 'subTitle', 'array', 'groups'));
} }
} }

View File

@ -118,7 +118,8 @@ class BudgetController extends Controller
= $report[$sourceAccountId]['currencies'][$currencyId]['budgets'][$budget['id']] = $report[$sourceAccountId]['currencies'][$currencyId]['budgets'][$budget['id']]
?? '0'; ?? '0';
$report[$sourceAccountId]['currencies'][$currencyId]['budgets'][$budget['id']] = bcadd( $report[$sourceAccountId]['currencies'][$currencyId]['budgets'][$budget['id']] = bcadd(
$report[$sourceAccountId]['currencies'][$currencyId]['budgets'][$budget['id']], $journal['amount'] $report[$sourceAccountId]['currencies'][$currencyId]['budgets'][$budget['id']],
$journal['amount']
); );
} }
} }
@ -172,7 +173,8 @@ class BudgetController extends Controller
'sum' => '0', 'sum' => '0',
]; ];
$report[$sourceAccountId]['currencies'][$currencyId]['sum'] = bcadd( $report[$sourceAccountId]['currencies'][$currencyId]['sum'] = bcadd(
$report[$sourceAccountId]['currencies'][$currencyId]['sum'], $journal['amount'] $report[$sourceAccountId]['currencies'][$currencyId]['sum'],
$journal['amount']
); );
$sums[$currencyId]['sum'] = bcadd($sums[$currencyId]['sum'], $journal['amount']); $sums[$currencyId]['sum'] = bcadd($sums[$currencyId]['sum'], $journal['amount']);
} }
@ -214,8 +216,8 @@ class BudgetController extends Controller
]; ];
$result[$key]['transactions']++; $result[$key]['transactions']++;
$result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']); $result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']);
$result[$key]['avg'] = bcdiv($result[$key]['sum'], (string)$result[$key]['transactions']); $result[$key]['avg'] = bcdiv($result[$key]['sum'], (string) $result[$key]['transactions']);
$result[$key]['avg_float'] = (float)$result[$key]['avg']; $result[$key]['avg_float'] = (float) $result[$key]['avg'];
} }
} }
} }
@ -295,11 +297,11 @@ class BudgetController extends Controller
$pct = '0'; $pct = '0';
if (0 !== bccomp($sum, '0') && 0 !== bccomp($total, '9')) { if (0 !== bccomp($sum, '0') && 0 !== bccomp($total, '9')) {
$pct = round(bcmul(bcdiv($sum, $total), '100')); $pct = round(bcmul(bcdiv($sum, $total), '100'));
} }
$report[$budgetId]['currencies'][$currencyId]['sum_pct'] = $pct; $report[$budgetId]['currencies'][$currencyId]['sum_pct'] = $pct;
} }
} }
return view('reports.budget.partials.budgets', compact('sums', 'report')); return view('reports.budget.partials.budgets', compact('sums', 'report'));
} }
@ -323,7 +325,7 @@ class BudgetController extends Controller
$defaultCurrency = app('amount')->getDefaultCurrency(); $defaultCurrency = app('amount')->getDefaultCurrency();
/** @var Budget $budget */ /** @var Budget $budget */
foreach ($budgets as $budget) { foreach ($budgets as $budget) {
$budgetId = (int)$budget->id; $budgetId = (int) $budget->id;
$report['budgets'][$budgetId] = $report['budgets'][$budgetId] ?? [ $report['budgets'][$budgetId] = $report['budgets'][$budgetId] ?? [
'budget_id' => $budgetId, 'budget_id' => $budgetId,
'budget_name' => $budget->name, 'budget_name' => $budget->name,
@ -335,9 +337,9 @@ class BudgetController extends Controller
$limits = $this->blRepository->getBudgetLimits($budget, $start, $end); $limits = $this->blRepository->getBudgetLimits($budget, $start, $end);
/** @var BudgetLimit $limit */ /** @var BudgetLimit $limit */
foreach ($limits as $limit) { foreach ($limits as $limit) {
$limitId = (int)$limit->id; $limitId = (int) $limit->id;
$currency = $limit->transactionCurrency ?? $defaultCurrency; $currency = $limit->transactionCurrency ?? $defaultCurrency;
$currencyId = (int)$currency->id; $currencyId = (int) $currency->id;
$expenses = $this->opsRepository->sumExpenses($limit->start_date, $limit->end_date, $accounts, new Collection([$budget])); $expenses = $this->opsRepository->sumExpenses($limit->start_date, $limit->end_date, $accounts, new Collection([$budget]));
$spent = $expenses[$currencyId]['sum'] ?? '0'; $spent = $expenses[$currencyId]['sum'] ?? '0';
$left = -1 === bccomp(bcadd($limit->amount, $spent), '0') ? '0' : bcadd($limit->amount, $spent); $left = -1 === bccomp(bcadd($limit->amount, $spent), '0') ? '0' : bcadd($limit->amount, $spent);
@ -392,7 +394,7 @@ class BudgetController extends Controller
foreach ($noBudget as $noBudgetEntry) { foreach ($noBudget as $noBudgetEntry) {
// currency information: // currency information:
$nbCurrencyId = (int)($noBudgetEntry['currency_id'] ?? $defaultCurrency->id); $nbCurrencyId = (int) ($noBudgetEntry['currency_id'] ?? $defaultCurrency->id);
$nbCurrencyCode = $noBudgetEntry['currency_code'] ?? $defaultCurrency->code; $nbCurrencyCode = $noBudgetEntry['currency_code'] ?? $defaultCurrency->code;
$nbCurrencyName = $noBudgetEntry['currency_name'] ?? $defaultCurrency->name; $nbCurrencyName = $noBudgetEntry['currency_name'] ?? $defaultCurrency->name;
$nbCurrencySymbol = $noBudgetEntry['currency_symbol'] ?? $defaultCurrency->symbol; $nbCurrencySymbol = $noBudgetEntry['currency_symbol'] ?? $defaultCurrency->symbol;
@ -426,14 +428,13 @@ class BudgetController extends Controller
$report['sums'][$nbCurrencyId]['overspent'] = $report['sums'][$nbCurrencyId]['overspent'] ?? '0'; $report['sums'][$nbCurrencyId]['overspent'] = $report['sums'][$nbCurrencyId]['overspent'] ?? '0';
$report['sums'][$nbCurrencyId]['left'] = $report['sums'][$nbCurrencyId]['left'] ?? '0'; $report['sums'][$nbCurrencyId]['left'] = $report['sums'][$nbCurrencyId]['left'] ?? '0';
$report['sums'][$nbCurrencyId]['budgeted'] = $report['sums'][$nbCurrencyId]['budgeted'] ?? '0'; $report['sums'][$nbCurrencyId]['budgeted'] = $report['sums'][$nbCurrencyId]['budgeted'] ?? '0';
} }
// make percentages based on total amount. // make percentages based on total amount.
foreach ($report['budgets'] as $budgetId => $data) { foreach ($report['budgets'] as $budgetId => $data) {
foreach ($data['budget_limits'] as $limitId => $entry) { foreach ($data['budget_limits'] as $limitId => $entry) {
$budgetId = (int)$budgetId; $budgetId = (int) $budgetId;
$limitId = (int)$limitId; $limitId = (int) $limitId;
$currencyId = (int)$entry['currency_id']; $currencyId = (int) $entry['currency_id'];
$spent = $entry['spent']; $spent = $entry['spent'];
$totalSpent = $report['sums'][$currencyId]['spent'] ?? '0'; $totalSpent = $report['sums'][$currencyId]['spent'] ?? '0';
$spentPct = '0'; $spentPct = '0';
@ -504,8 +505,8 @@ class BudgetController extends Controller
]; ];
$report[$key]['entries'][$dateKey] = $report[$key] ['entries'][$dateKey] ?? '0'; $report[$key]['entries'][$dateKey] = $report[$key] ['entries'][$dateKey] ?? '0';
$report[$key]['entries'][$dateKey] = bcadd($journal['amount'], $report[$key] ['entries'][$dateKey]); $report[$key]['entries'][$dateKey] = bcadd($journal['amount'], $report[$key] ['entries'][$dateKey]);
$report[$key]['sum'] = bcadd($report[$key] ['sum'], $journal['amount']); $report[$key]['sum'] = bcadd($report[$key] ['sum'], $journal['amount']);
$report[$key]['avg'] = bcdiv($report[$key]['sum'], (string)$count); $report[$key]['avg'] = bcdiv($report[$key]['sum'], (string) $count);
} }
} }
} }
@ -541,7 +542,7 @@ class BudgetController extends Controller
$result[] = [ $result[] = [
'description' => $journal['description'], 'description' => $journal['description'],
'transaction_group_id' => $journal['transaction_group_id'], 'transaction_group_id' => $journal['transaction_group_id'],
'amount_float' => (float)$journal['amount'], 'amount_float' => (float) $journal['amount'],
'amount' => $journal['amount'], 'amount' => $journal['amount'],
'date' => $journal['date']->formatLocalized($this->monthAndDayFormat), 'date' => $journal['date']->formatLocalized($this->monthAndDayFormat),
'destination_account_name' => $journal['destination_account_name'], 'destination_account_name' => $journal['destination_account_name'],
@ -571,5 +572,4 @@ class BudgetController extends Controller
return $result; return $result;
} }
} }

View File

@ -114,10 +114,12 @@ class CategoryController extends Controller
'sum' => '0', 'sum' => '0',
]; ];
$report[$sourceAccountId]['currencies'][$currencyId]['categories'][$category['id']]['spent'] = bcadd( $report[$sourceAccountId]['currencies'][$currencyId]['categories'][$category['id']]['spent'] = bcadd(
$report[$sourceAccountId]['currencies'][$currencyId]['categories'][$category['id']]['spent'], $journal['amount'] $report[$sourceAccountId]['currencies'][$currencyId]['categories'][$category['id']]['spent'],
$journal['amount']
); );
$report[$sourceAccountId]['currencies'][$currencyId]['categories'][$category['id']]['sum'] = bcadd( $report[$sourceAccountId]['currencies'][$currencyId]['categories'][$category['id']]['sum'] = bcadd(
$report[$sourceAccountId]['currencies'][$currencyId]['categories'][$category['id']]['sum'], $journal['amount'] $report[$sourceAccountId]['currencies'][$currencyId]['categories'][$category['id']]['sum'],
$journal['amount']
); );
} }
} }
@ -152,10 +154,12 @@ class CategoryController extends Controller
'sum' => '0', 'sum' => '0',
]; ];
$report[$destinationId]['currencies'][$currencyId]['categories'][$category['id']]['earned'] = bcadd( $report[$destinationId]['currencies'][$currencyId]['categories'][$category['id']]['earned'] = bcadd(
$report[$destinationId]['currencies'][$currencyId]['categories'][$category['id']]['earned'], $journal['amount'] $report[$destinationId]['currencies'][$currencyId]['categories'][$category['id']]['earned'],
$journal['amount']
); );
$report[$destinationId]['currencies'][$currencyId]['categories'][$category['id']]['sum'] = bcadd( $report[$destinationId]['currencies'][$currencyId]['categories'][$category['id']]['sum'] = bcadd(
$report[$destinationId]['currencies'][$currencyId]['categories'][$category['id']]['sum'], $journal['amount'] $report[$destinationId]['currencies'][$currencyId]['categories'][$category['id']]['sum'],
$journal['amount']
); );
} }
} }
@ -214,10 +218,12 @@ class CategoryController extends Controller
'sum' => '0', 'sum' => '0',
]; ];
$report[$sourceAccountId]['currencies'][$currencyId]['spent'] = bcadd( $report[$sourceAccountId]['currencies'][$currencyId]['spent'] = bcadd(
$report[$sourceAccountId]['currencies'][$currencyId]['spent'], $journal['amount'] $report[$sourceAccountId]['currencies'][$currencyId]['spent'],
$journal['amount']
); );
$report[$sourceAccountId]['currencies'][$currencyId]['sum'] = bcadd( $report[$sourceAccountId]['currencies'][$currencyId]['sum'] = bcadd(
$report[$sourceAccountId]['currencies'][$currencyId]['sum'], $journal['amount'] $report[$sourceAccountId]['currencies'][$currencyId]['sum'],
$journal['amount']
); );
$sums[$currencyId]['spent_sum'] = bcadd($sums[$currencyId]['spent_sum'], $journal['amount']); $sums[$currencyId]['spent_sum'] = bcadd($sums[$currencyId]['spent_sum'], $journal['amount']);
$sums[$currencyId]['total_sum'] = bcadd($sums[$currencyId]['total_sum'], $journal['amount']); $sums[$currencyId]['total_sum'] = bcadd($sums[$currencyId]['total_sum'], $journal['amount']);
@ -250,10 +256,12 @@ class CategoryController extends Controller
'sum' => '0', 'sum' => '0',
]; ];
$report[$destinationAccountId]['currencies'][$currencyId]['earned'] = bcadd( $report[$destinationAccountId]['currencies'][$currencyId]['earned'] = bcadd(
$report[$destinationAccountId]['currencies'][$currencyId]['earned'], $journal['amount'] $report[$destinationAccountId]['currencies'][$currencyId]['earned'],
$journal['amount']
); );
$report[$destinationAccountId]['currencies'][$currencyId]['sum'] = bcadd( $report[$destinationAccountId]['currencies'][$currencyId]['sum'] = bcadd(
$report[$destinationAccountId]['currencies'][$currencyId]['sum'], $journal['amount'] $report[$destinationAccountId]['currencies'][$currencyId]['sum'],
$journal['amount']
); );
$sums[$currencyId]['earned_sum'] = bcadd($sums[$currencyId]['earned_sum'], $journal['amount']); $sums[$currencyId]['earned_sum'] = bcadd($sums[$currencyId]['earned_sum'], $journal['amount']);
$sums[$currencyId]['total_sum'] = bcadd($sums[$currencyId]['total_sum'], $journal['amount']); $sums[$currencyId]['total_sum'] = bcadd($sums[$currencyId]['total_sum'], $journal['amount']);
@ -296,8 +304,8 @@ class CategoryController extends Controller
]; ];
$result[$key]['transactions']++; $result[$key]['transactions']++;
$result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']); $result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']);
$result[$key]['avg'] = bcdiv($result[$key]['sum'], (string)$result[$key]['transactions']); $result[$key]['avg'] = bcdiv($result[$key]['sum'], (string) $result[$key]['transactions']);
$result[$key]['avg_float'] = (float)$result[$key]['avg']; $result[$key]['avg_float'] = (float) $result[$key]['avg'];
} }
} }
} }
@ -349,8 +357,8 @@ class CategoryController extends Controller
]; ];
$result[$key]['transactions']++; $result[$key]['transactions']++;
$result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']); $result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']);
$result[$key]['avg'] = bcdiv($result[$key]['sum'], (string)$result[$key]['transactions']); $result[$key]['avg'] = bcdiv($result[$key]['sum'], (string) $result[$key]['transactions']);
$result[$key]['avg_float'] = (float)$result[$key]['avg']; $result[$key]['avg_float'] = (float) $result[$key]['avg'];
} }
} }
} }
@ -420,10 +428,12 @@ class CategoryController extends Controller
'currency_decimal_places' => $currency['currency_decimal_places'], 'currency_decimal_places' => $currency['currency_decimal_places'],
]; ];
$report[$categoryId]['currencies'][$currencyId]['spent'] = bcadd( $report[$categoryId]['currencies'][$currencyId]['spent'] = bcadd(
$report[$categoryId]['currencies'][$currencyId]['spent'], $journal['amount'] $report[$categoryId]['currencies'][$currencyId]['spent'],
$journal['amount']
); );
$report[$categoryId]['currencies'][$currencyId]['sum'] = bcadd( $report[$categoryId]['currencies'][$currencyId]['sum'] = bcadd(
$report[$categoryId]['currencies'][$currencyId]['sum'], $journal['amount'] $report[$categoryId]['currencies'][$currencyId]['sum'],
$journal['amount']
); );
$sums[$currencyId]['spent_sum'] = bcadd($sums[$currencyId]['spent_sum'], $journal['amount']); $sums[$currencyId]['spent_sum'] = bcadd($sums[$currencyId]['spent_sum'], $journal['amount']);
@ -459,10 +469,12 @@ class CategoryController extends Controller
'currency_decimal_places' => $currency['currency_decimal_places'], 'currency_decimal_places' => $currency['currency_decimal_places'],
]; ];
$report[$categoryId]['currencies'][$currencyId]['earned'] = bcadd( $report[$categoryId]['currencies'][$currencyId]['earned'] = bcadd(
$report[$categoryId]['currencies'][$currencyId]['earned'], $journal['amount'] $report[$categoryId]['currencies'][$currencyId]['earned'],
$journal['amount']
); );
$report[$categoryId]['currencies'][$currencyId]['sum'] = bcadd( $report[$categoryId]['currencies'][$currencyId]['sum'] = bcadd(
$report[$categoryId]['currencies'][$currencyId]['sum'], $journal['amount'] $report[$categoryId]['currencies'][$currencyId]['sum'],
$journal['amount']
); );
$sums[$currencyId]['earned_sum'] = bcadd($sums[$currencyId]['earned_sum'], $journal['amount']); $sums[$currencyId]['earned_sum'] = bcadd($sums[$currencyId]['earned_sum'], $journal['amount']);
@ -517,31 +529,31 @@ class CategoryController extends Controller
$data = []; $data = [];
$with = $opsRepository->listExpenses($start, $end, $accounts); $with = $opsRepository->listExpenses($start, $end, $accounts);
$without = $noCatRepos->listExpenses($start, $end, $accounts); $without = $noCatRepos->listExpenses($start, $end, $accounts);
foreach([$with, $without] as $set) { foreach ([$with, $without] as $set) {
foreach ($set as $currencyId => $currencyRow) { foreach ($set as $currencyId => $currencyRow) {
foreach ($currencyRow['categories'] as $categoryId => $categoryRow) { foreach ($currencyRow['categories'] as $categoryId => $categoryRow) {
$key = sprintf('%d-%d', $currencyId, $categoryId); $key = sprintf('%d-%d', $currencyId, $categoryId);
$data[$key] = $data[$key] ?? [ $data[$key] = $data[$key] ?? [
'id' => $categoryRow['id'], 'id' => $categoryRow['id'],
'title' => sprintf('%s (%s)', $categoryRow['name'], $currencyRow['currency_name']), 'title' => sprintf('%s (%s)', $categoryRow['name'], $currencyRow['currency_name']),
'currency_id' => $currencyRow['currency_id'], 'currency_id' => $currencyRow['currency_id'],
'currency_symbol' => $currencyRow['currency_symbol'], 'currency_symbol' => $currencyRow['currency_symbol'],
'currency_name' => $currencyRow['currency_name'], 'currency_name' => $currencyRow['currency_name'],
'currency_code' => $currencyRow['currency_code'], 'currency_code' => $currencyRow['currency_code'],
'currency_decimal_places' => $currencyRow['currency_decimal_places'], 'currency_decimal_places' => $currencyRow['currency_decimal_places'],
'sum' => '0', 'sum' => '0',
'entries' => [], 'entries' => [],
]; ];
foreach ($categoryRow['transaction_journals'] as $journalId => $journal) { foreach ($categoryRow['transaction_journals'] as $journalId => $journal) {
$date = $journal['date']->format($format); $date = $journal['date']->format($format);
$data[$key]['entries'][$date] = $data[$key]['entries'][$date] ?? '0'; $data[$key]['entries'][$date] = $data[$key]['entries'][$date] ?? '0';
$data[$key]['entries'][$date] = bcadd($data[$key]['entries'][$date], $journal['amount']); $data[$key]['entries'][$date] = bcadd($data[$key]['entries'][$date], $journal['amount']);
$data[$key]['sum'] = bcadd($data[$key]['sum'], $journal['amount']); $data[$key]['sum'] = bcadd($data[$key]['sum'], $journal['amount']);
}
} }
} }
} }
}
$cache->store($data); $cache->store($data);
@ -603,7 +615,7 @@ class CategoryController extends Controller
$data = []; $data = [];
$with = $opsRepository->listIncome($start, $end, $accounts); $with = $opsRepository->listIncome($start, $end, $accounts);
$without = $noCatRepos->listIncome($start, $end, $accounts); $without = $noCatRepos->listIncome($start, $end, $accounts);
foreach([$with, $without] as $set) { foreach ([$with, $without] as $set) {
foreach ($set as $currencyId => $currencyRow) { foreach ($set as $currencyId => $currencyRow) {
foreach ($currencyRow['categories'] as $categoryId => $categoryRow) { foreach ($currencyRow['categories'] as $categoryId => $categoryRow) {
$key = sprintf('%d-%d', $currencyId, $categoryId); $key = sprintf('%d-%d', $currencyId, $categoryId);
@ -722,22 +734,26 @@ class CategoryController extends Controller
$report['sums'][$currencyId]['sum'] = bcadd($report['sums'][$currencyId]['sum'], $journal['amount']); $report['sums'][$currencyId]['sum'] = bcadd($report['sums'][$currencyId]['sum'], $journal['amount']);
// sum of spent: // sum of spent:
$report['sums'][$currencyId]['spent'] = -1 === bccomp($journal['amount'], '0') ? bcadd( $report['sums'][$currencyId]['spent'] = -1 === bccomp($journal['amount'], '0') ? bcadd(
$report['sums'][$currencyId]['spent'], $journal['amount'] $report['sums'][$currencyId]['spent'],
$journal['amount']
) : $report['sums'][$currencyId]['spent']; ) : $report['sums'][$currencyId]['spent'];
// sum of earned // sum of earned
$report['sums'][$currencyId]['earned'] = 1 === bccomp($journal['amount'], '0') ? bcadd( $report['sums'][$currencyId]['earned'] = 1 === bccomp($journal['amount'], '0') ? bcadd(
$report['sums'][$currencyId]['earned'], $journal['amount'] $report['sums'][$currencyId]['earned'],
$journal['amount']
) : $report['sums'][$currencyId]['earned']; ) : $report['sums'][$currencyId]['earned'];
// sum of category // sum of category
$report['categories'][$key]['sum'] = bcadd($report['categories'][$key]['sum'], $journal['amount']); $report['categories'][$key]['sum'] = bcadd($report['categories'][$key]['sum'], $journal['amount']);
// total spent in category // total spent in category
$report['categories'][$key]['spent'] = -1 === bccomp($journal['amount'], '0') ? bcadd( $report['categories'][$key]['spent'] = -1 === bccomp($journal['amount'], '0') ? bcadd(
$report['categories'][$key]['spent'], $journal['amount'] $report['categories'][$key]['spent'],
$journal['amount']
) : $report['categories'][$key]['spent']; ) : $report['categories'][$key]['spent'];
// total earned in category // total earned in category
$report['categories'][$key]['earned'] = 1 === bccomp($journal['amount'], '0') ? bcadd( $report['categories'][$key]['earned'] = 1 === bccomp($journal['amount'], '0') ? bcadd(
$report['categories'][$key]['earned'], $journal['amount'] $report['categories'][$key]['earned'],
$journal['amount']
) : $report['categories'][$key]['earned']; ) : $report['categories'][$key]['earned'];
} }
} }
@ -777,7 +793,7 @@ class CategoryController extends Controller
$result[] = [ $result[] = [
'description' => $journal['description'], 'description' => $journal['description'],
'transaction_group_id' => $journal['transaction_group_id'], 'transaction_group_id' => $journal['transaction_group_id'],
'amount_float' => (float)$journal['amount'], 'amount_float' => (float) $journal['amount'],
'amount' => $journal['amount'], 'amount' => $journal['amount'],
'date' => $journal['date']->formatLocalized($this->monthAndDayFormat), 'date' => $journal['date']->formatLocalized($this->monthAndDayFormat),
'destination_account_name' => $journal['destination_account_name'], 'destination_account_name' => $journal['destination_account_name'],
@ -827,7 +843,7 @@ class CategoryController extends Controller
$result[] = [ $result[] = [
'description' => $journal['description'], 'description' => $journal['description'],
'transaction_group_id' => $journal['transaction_group_id'], 'transaction_group_id' => $journal['transaction_group_id'],
'amount_float' => (float)$journal['amount'], 'amount_float' => (float) $journal['amount'],
'amount' => $journal['amount'], 'amount' => $journal['amount'],
'date' => $journal['date']->formatLocalized($this->monthAndDayFormat), 'date' => $journal['date']->formatLocalized($this->monthAndDayFormat),
'source_account_name' => $journal['source_account_name'], 'source_account_name' => $journal['source_account_name'],
@ -871,6 +887,4 @@ class CategoryController extends Controller
return false; return false;
} }
} }

View File

@ -100,8 +100,8 @@ class DoubleController extends Controller
]; ];
$result[$key]['transactions']++; $result[$key]['transactions']++;
$result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']); $result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']);
$result[$key]['avg'] = bcdiv($result[$key]['sum'], (string)$result[$key]['transactions']); $result[$key]['avg'] = bcdiv($result[$key]['sum'], (string) $result[$key]['transactions']);
$result[$key]['avg_float'] = (float)$result[$key]['avg']; $result[$key]['avg_float'] = (float) $result[$key]['avg'];
} }
} }
// sort by amount_float // sort by amount_float
@ -152,8 +152,8 @@ class DoubleController extends Controller
]; ];
$result[$key]['transactions']++; $result[$key]['transactions']++;
$result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']); $result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']);
$result[$key]['avg'] = bcdiv($result[$key]['sum'], (string)$result[$key]['transactions']); $result[$key]['avg'] = bcdiv($result[$key]['sum'], (string) $result[$key]['transactions']);
$result[$key]['avg_float'] = (float)$result[$key]['avg']; $result[$key]['avg_float'] = (float) $result[$key]['avg'];
} }
} }
// sort by amount_float // sort by amount_float
@ -410,7 +410,7 @@ class DoubleController extends Controller
$result[] = [ $result[] = [
'description' => $journal['description'], 'description' => $journal['description'],
'transaction_group_id' => $journal['transaction_group_id'], 'transaction_group_id' => $journal['transaction_group_id'],
'amount_float' => (float)$journal['amount'], 'amount_float' => (float) $journal['amount'],
'amount' => $journal['amount'], 'amount' => $journal['amount'],
'date' => $journal['date']->formatLocalized($this->monthAndDayFormat), 'date' => $journal['date']->formatLocalized($this->monthAndDayFormat),
'destination_account_name' => $journal['destination_account_name'], 'destination_account_name' => $journal['destination_account_name'],
@ -459,7 +459,7 @@ class DoubleController extends Controller
$result[] = [ $result[] = [
'description' => $journal['description'], 'description' => $journal['description'],
'transaction_group_id' => $journal['transaction_group_id'], 'transaction_group_id' => $journal['transaction_group_id'],
'amount_float' => (float)$journal['amount'], 'amount_float' => (float) $journal['amount'],
'amount' => $journal['amount'], 'amount' => $journal['amount'],
'date' => $journal['date']->formatLocalized($this->monthAndDayFormat), 'date' => $journal['date']->formatLocalized($this->monthAndDayFormat),
'destination_account_name' => $journal['destination_account_name'], 'destination_account_name' => $journal['destination_account_name'],
@ -773,10 +773,10 @@ class DoubleController extends Controller
/** /**
* TODO this method is double. * TODO this method is double.
* *
* @param Collection $accounts * @param Collection $accounts
* @param int $id * @param int $id
* @param string $name * @param string $name
* @param string|null $iban * @param string|null $iban
* *
* @return string * @return string
*/ */

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Report; namespace FireflyIII\Http\Controllers\Report;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Account; use FireflyIII\Models\Account;
@ -112,10 +111,12 @@ class TagController extends Controller
'sum' => '0', 'sum' => '0',
]; ];
$report[$sourceAccountId]['currencies'][$currencyId]['tags'][$tag['id']]['spent'] = bcadd( $report[$sourceAccountId]['currencies'][$currencyId]['tags'][$tag['id']]['spent'] = bcadd(
$report[$sourceAccountId]['currencies'][$currencyId]['tags'][$tag['id']]['spent'], $journal['amount'] $report[$sourceAccountId]['currencies'][$currencyId]['tags'][$tag['id']]['spent'],
$journal['amount']
); );
$report[$sourceAccountId]['currencies'][$currencyId]['tags'][$tag['id']]['sum'] = bcadd( $report[$sourceAccountId]['currencies'][$currencyId]['tags'][$tag['id']]['sum'] = bcadd(
$report[$sourceAccountId]['currencies'][$currencyId]['tags'][$tag['id']]['sum'], $journal['amount'] $report[$sourceAccountId]['currencies'][$currencyId]['tags'][$tag['id']]['sum'],
$journal['amount']
); );
} }
} }
@ -150,10 +151,12 @@ class TagController extends Controller
'sum' => '0', 'sum' => '0',
]; ];
$report[$destinationId]['currencies'][$currencyId]['tags'][$tag['id']]['earned'] = bcadd( $report[$destinationId]['currencies'][$currencyId]['tags'][$tag['id']]['earned'] = bcadd(
$report[$destinationId]['currencies'][$currencyId]['tags'][$tag['id']]['earned'], $journal['amount'] $report[$destinationId]['currencies'][$currencyId]['tags'][$tag['id']]['earned'],
$journal['amount']
); );
$report[$destinationId]['currencies'][$currencyId]['tags'][$tag['id']]['sum'] = bcadd( $report[$destinationId]['currencies'][$currencyId]['tags'][$tag['id']]['sum'] = bcadd(
$report[$destinationId]['currencies'][$currencyId]['tags'][$tag['id']]['sum'], $journal['amount'] $report[$destinationId]['currencies'][$currencyId]['tags'][$tag['id']]['sum'],
$journal['amount']
); );
} }
} }
@ -212,10 +215,12 @@ class TagController extends Controller
'sum' => '0', 'sum' => '0',
]; ];
$report[$sourceAccountId]['currencies'][$currencyId]['spent'] = bcadd( $report[$sourceAccountId]['currencies'][$currencyId]['spent'] = bcadd(
$report[$sourceAccountId]['currencies'][$currencyId]['spent'], $journal['amount'] $report[$sourceAccountId]['currencies'][$currencyId]['spent'],
$journal['amount']
); );
$report[$sourceAccountId]['currencies'][$currencyId]['sum'] = bcadd( $report[$sourceAccountId]['currencies'][$currencyId]['sum'] = bcadd(
$report[$sourceAccountId]['currencies'][$currencyId]['sum'], $journal['amount'] $report[$sourceAccountId]['currencies'][$currencyId]['sum'],
$journal['amount']
); );
$sums[$currencyId]['spent_sum'] = bcadd($sums[$currencyId]['spent_sum'], $journal['amount']); $sums[$currencyId]['spent_sum'] = bcadd($sums[$currencyId]['spent_sum'], $journal['amount']);
$sums[$currencyId]['total_sum'] = bcadd($sums[$currencyId]['total_sum'], $journal['amount']); $sums[$currencyId]['total_sum'] = bcadd($sums[$currencyId]['total_sum'], $journal['amount']);
@ -248,10 +253,12 @@ class TagController extends Controller
'sum' => '0', 'sum' => '0',
]; ];
$report[$destinationAccountId]['currencies'][$currencyId]['earned'] = bcadd( $report[$destinationAccountId]['currencies'][$currencyId]['earned'] = bcadd(
$report[$destinationAccountId]['currencies'][$currencyId]['earned'], $journal['amount'] $report[$destinationAccountId]['currencies'][$currencyId]['earned'],
$journal['amount']
); );
$report[$destinationAccountId]['currencies'][$currencyId]['sum'] = bcadd( $report[$destinationAccountId]['currencies'][$currencyId]['sum'] = bcadd(
$report[$destinationAccountId]['currencies'][$currencyId]['sum'], $journal['amount'] $report[$destinationAccountId]['currencies'][$currencyId]['sum'],
$journal['amount']
); );
$sums[$currencyId]['earned_sum'] = bcadd($sums[$currencyId]['earned_sum'], $journal['amount']); $sums[$currencyId]['earned_sum'] = bcadd($sums[$currencyId]['earned_sum'], $journal['amount']);
$sums[$currencyId]['total_sum'] = bcadd($sums[$currencyId]['total_sum'], $journal['amount']); $sums[$currencyId]['total_sum'] = bcadd($sums[$currencyId]['total_sum'], $journal['amount']);
@ -294,8 +301,8 @@ class TagController extends Controller
]; ];
$result[$key]['transactions']++; $result[$key]['transactions']++;
$result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']); $result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']);
$result[$key]['avg'] = bcdiv($result[$key]['sum'], (string)$result[$key]['transactions']); $result[$key]['avg'] = bcdiv($result[$key]['sum'], (string) $result[$key]['transactions']);
$result[$key]['avg_float'] = (float)$result[$key]['avg']; $result[$key]['avg_float'] = (float) $result[$key]['avg'];
} }
} }
} }
@ -347,8 +354,8 @@ class TagController extends Controller
]; ];
$result[$key]['transactions']++; $result[$key]['transactions']++;
$result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']); $result[$key]['sum'] = bcadd($journal['amount'], $result[$key]['sum']);
$result[$key]['avg'] = bcdiv($result[$key]['sum'], (string)$result[$key]['transactions']); $result[$key]['avg'] = bcdiv($result[$key]['sum'], (string) $result[$key]['transactions']);
$result[$key]['avg_float'] = (float)$result[$key]['avg']; $result[$key]['avg_float'] = (float) $result[$key]['avg'];
} }
} }
} }
@ -418,10 +425,12 @@ class TagController extends Controller
'currency_decimal_places' => $currency['currency_decimal_places'], 'currency_decimal_places' => $currency['currency_decimal_places'],
]; ];
$report[$tagId]['currencies'][$currencyId]['spent'] = bcadd( $report[$tagId]['currencies'][$currencyId]['spent'] = bcadd(
$report[$tagId]['currencies'][$currencyId]['spent'], $journal['amount'] $report[$tagId]['currencies'][$currencyId]['spent'],
$journal['amount']
); );
$report[$tagId]['currencies'][$currencyId]['sum'] = bcadd( $report[$tagId]['currencies'][$currencyId]['sum'] = bcadd(
$report[$tagId]['currencies'][$currencyId]['sum'], $journal['amount'] $report[$tagId]['currencies'][$currencyId]['sum'],
$journal['amount']
); );
$sums[$currencyId]['spent_sum'] = bcadd($sums[$currencyId]['spent_sum'], $journal['amount']); $sums[$currencyId]['spent_sum'] = bcadd($sums[$currencyId]['spent_sum'], $journal['amount']);
@ -457,10 +466,12 @@ class TagController extends Controller
'currency_decimal_places' => $currency['currency_decimal_places'], 'currency_decimal_places' => $currency['currency_decimal_places'],
]; ];
$report[$tagId]['currencies'][$currencyId]['earned'] = bcadd( $report[$tagId]['currencies'][$currencyId]['earned'] = bcadd(
$report[$tagId]['currencies'][$currencyId]['earned'], $journal['amount'] $report[$tagId]['currencies'][$currencyId]['earned'],
$journal['amount']
); );
$report[$tagId]['currencies'][$currencyId]['sum'] = bcadd( $report[$tagId]['currencies'][$currencyId]['sum'] = bcadd(
$report[$tagId]['currencies'][$currencyId]['sum'], $journal['amount'] $report[$tagId]['currencies'][$currencyId]['sum'],
$journal['amount']
); );
$sums[$currencyId]['earned_sum'] = bcadd($sums[$currencyId]['earned_sum'], $journal['amount']); $sums[$currencyId]['earned_sum'] = bcadd($sums[$currencyId]['earned_sum'], $journal['amount']);
@ -491,7 +502,7 @@ class TagController extends Controller
$result[] = [ $result[] = [
'description' => $journal['description'], 'description' => $journal['description'],
'transaction_group_id' => $journal['transaction_group_id'], 'transaction_group_id' => $journal['transaction_group_id'],
'amount_float' => (float)$journal['amount'], 'amount_float' => (float) $journal['amount'],
'amount' => $journal['amount'], 'amount' => $journal['amount'],
'date' => $journal['date']->formatLocalized($this->monthAndDayFormat), 'date' => $journal['date']->formatLocalized($this->monthAndDayFormat),
'destination_account_name' => $journal['destination_account_name'], 'destination_account_name' => $journal['destination_account_name'],
@ -541,7 +552,7 @@ class TagController extends Controller
$result[] = [ $result[] = [
'description' => $journal['description'], 'description' => $journal['description'],
'transaction_group_id' => $journal['transaction_group_id'], 'transaction_group_id' => $journal['transaction_group_id'],
'amount_float' => (float)$journal['amount'], 'amount_float' => (float) $journal['amount'],
'amount' => $journal['amount'], 'amount' => $journal['amount'],
'date' => $journal['date']->formatLocalized($this->monthAndDayFormat), 'date' => $journal['date']->formatLocalized($this->monthAndDayFormat),
'source_account_name' => $journal['source_account_name'], 'source_account_name' => $journal['source_account_name'],
@ -571,5 +582,4 @@ class TagController extends Controller
return $result; return $result;
} }
}
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers; namespace FireflyIII\Http\Controllers;
use Carbon\Carbon; use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Generator\Report\ReportGeneratorFactory; use FireflyIII\Generator\Report\ReportGeneratorFactory;
use FireflyIII\Helpers\Report\ReportHelperInterface; use FireflyIII\Helpers\Report\ReportHelperInterface;
use FireflyIII\Http\Requests\ReportFormRequest; use FireflyIII\Http\Requests\ReportFormRequest;
@ -32,8 +33,11 @@ use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Support\Http\Controllers\RenderPartialViews; use FireflyIII\Support\Http\Controllers\RenderPartialViews;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -59,7 +63,7 @@ class ReportController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.reports')); app('view')->share('title', (string) trans('firefly.reports'));
app('view')->share('mainTitleIcon', 'fa-line-chart'); app('view')->share('mainTitleIcon', 'fa-line-chart');
app('view')->share('subTitleIcon', 'fa-calendar'); app('view')->share('subTitleIcon', 'fa-calendar');
$this->helper = app(ReportHelperInterface::class); $this->helper = app(ReportHelperInterface::class);
@ -70,39 +74,6 @@ class ReportController extends Controller
); );
} }
/**
* Show account report.
*
* @param Collection $accounts
* @param Collection $expense
* @param Carbon $start
* @param Carbon $end
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View|string
* @throws \FireflyIII\Exceptions\FireflyException
*/
public function doubleReport(Collection $accounts, Collection $expense, Carbon $start, Carbon $end)
{
if ($end < $start) {
[$start, $end] = [$end, $start];
}
$this->repository->cleanupBudgets();
app('view')->share(
'subTitle', trans(
'firefly.report_double',
['start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat)]
)
);
$generator = ReportGeneratorFactory::reportGenerator('Account', $start, $end);
$generator->setAccounts($accounts);
$generator->setExpense($expense);
return $generator->generate();
}
/** /**
* Show audit report. * Show audit report.
* *
@ -110,14 +81,14 @@ class ReportController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View|string * @throws FireflyException
* @return Factory|View|string
* *
* @throws \FireflyIII\Exceptions\FireflyException
*/ */
public function auditReport(Collection $accounts, Carbon $start, Carbon $end) public function auditReport(Collection $accounts, Carbon $start, Carbon $end)
{ {
if ($end < $start) { if ($end < $start) {
return view('error')->with('message', (string)trans('firefly.end_after_start_date')); // @codeCoverageIgnore return view('error')->with('message', (string) trans('firefly.end_after_start_date')); // @codeCoverageIgnore
} }
$this->repository->cleanupBudgets(); $this->repository->cleanupBudgets();
@ -138,7 +109,6 @@ class ReportController extends Controller
return $generator->generate(); return $generator->generate();
} }
/** /**
* Show budget report. * Show budget report.
* *
@ -147,14 +117,14 @@ class ReportController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View|string * @throws FireflyException
* @return Factory|View|string
* *
* @throws \FireflyIII\Exceptions\FireflyException
*/ */
public function budgetReport(Collection $accounts, Collection $budgets, Carbon $start, Carbon $end) public function budgetReport(Collection $accounts, Collection $budgets, Carbon $start, Carbon $end)
{ {
if ($end < $start) { if ($end < $start) {
return view('error')->with('message', (string)trans('firefly.end_after_start_date')); // @codeCoverageIgnore return view('error')->with('message', (string) trans('firefly.end_after_start_date')); // @codeCoverageIgnore
} }
$this->repository->cleanupBudgets(); $this->repository->cleanupBudgets();
@ -176,7 +146,6 @@ class ReportController extends Controller
return $generator->generate(); return $generator->generate();
} }
/** /**
* Show category report. * Show category report.
* *
@ -185,14 +154,14 @@ class ReportController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View|string * @throws FireflyException
* @return Factory|View|string
* *
* @throws \FireflyIII\Exceptions\FireflyException
*/ */
public function categoryReport(Collection $accounts, Collection $categories, Carbon $start, Carbon $end) public function categoryReport(Collection $accounts, Collection $categories, Carbon $start, Carbon $end)
{ {
if ($end < $start) { if ($end < $start) {
return view('error')->with('message', (string)trans('firefly.end_after_start_date')); // @codeCoverageIgnore return view('error')->with('message', (string) trans('firefly.end_after_start_date')); // @codeCoverageIgnore
} }
$this->repository->cleanupBudgets(); $this->repository->cleanupBudgets();
@ -221,14 +190,14 @@ class ReportController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View|string * @throws FireflyException
* @return Factory|View|string
* *
* @throws \FireflyIII\Exceptions\FireflyException
*/ */
public function defaultReport(Collection $accounts, Carbon $start, Carbon $end) public function defaultReport(Collection $accounts, Carbon $start, Carbon $end)
{ {
if ($end < $start) { if ($end < $start) {
return view('error')->with('message', (string)trans('firefly.end_after_start_date')); return view('error')->with('message', (string) trans('firefly.end_after_start_date'));
} }
$this->repository->cleanupBudgets(); $this->repository->cleanupBudgets();
@ -250,12 +219,46 @@ class ReportController extends Controller
return $generator->generate(); return $generator->generate();
} }
/**
* Show account report.
*
* @param Collection $accounts
* @param Collection $expense
* @param Carbon $start
* @param Carbon $end
*
* @throws FireflyException
* @return Factory|View|string
*/
public function doubleReport(Collection $accounts, Collection $expense, Carbon $start, Carbon $end)
{
if ($end < $start) {
[$start, $end] = [$end, $start];
}
$this->repository->cleanupBudgets();
app('view')->share(
'subTitle',
trans(
'firefly.report_double',
['start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat)]
)
);
$generator = ReportGeneratorFactory::reportGenerator('Account', $start, $end);
$generator->setAccounts($accounts);
$generator->setExpense($expense);
return $generator->generate();
}
/** /**
* Show index. * Show index.
* *
* @param AccountRepositoryInterface $repository * @param AccountRepositoryInterface $repository
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index(AccountRepositoryInterface $repository) public function index(AccountRepositoryInterface $repository)
{ {
@ -275,20 +278,20 @@ class ReportController extends Controller
$role = sprintf('opt_group_%s', $repository->getMetaValue($account, 'account_role')); $role = sprintf('opt_group_%s', $repository->getMetaValue($account, 'account_role'));
if (in_array($type, [AccountType::MORTGAGE, AccountType::DEBT, AccountType::LOAN], true)) { if (in_array($type, [AccountType::MORTGAGE, AccountType::DEBT, AccountType::LOAN], true)) {
$role = sprintf('opt_group_l_%s',$type); $role = sprintf('opt_group_l_%s', $type);
} }
if ('' === $role || 'opt_group_' === $role) { if ('' === $role || 'opt_group_' === $role) {
$role = 'opt_group_defaultAsset'; $role = 'opt_group_defaultAsset';
} }
$groupedAccounts[trans(sprintf('firefly.%s',$role))][$account->id] = $account; $groupedAccounts[trans(sprintf('firefly.%s', $role))][$account->id] = $account;
} }
ksort($groupedAccounts); ksort($groupedAccounts);
$accountList = implode(',', $accounts->pluck('id')->toArray()); $accountList = implode(',', $accounts->pluck('id')->toArray());
$this->repository->cleanupBudgets(); $this->repository->cleanupBudgets();
return view('reports.index', compact('months', 'accounts', 'start', 'accountList','groupedAccounts', 'customFiscalYear')); return view('reports.index', compact('months', 'accounts', 'start', 'accountList', 'groupedAccounts', 'customFiscalYear'));
} }
/** /**
@ -327,9 +330,9 @@ class ReportController extends Controller
* *
* @param ReportFormRequest $request * @param ReportFormRequest $request
* *
* @return RedirectResponse|\Illuminate\Routing\Redirector * @throws FireflyException
* *
* @throws \FireflyIII\Exceptions\FireflyException * @return RedirectResponse|Redirector
* *
*/ */
public function postIndex(ReportFormRequest $request) public function postIndex(ReportFormRequest $request)
@ -342,42 +345,42 @@ class ReportController extends Controller
$categories = implode(',', $request->getCategoryList()->pluck('id')->toArray()); $categories = implode(',', $request->getCategoryList()->pluck('id')->toArray());
$budgets = implode(',', $request->getBudgetList()->pluck('id')->toArray()); $budgets = implode(',', $request->getBudgetList()->pluck('id')->toArray());
$tags = implode(',', $request->getTagList()->pluck('id')->toArray()); $tags = implode(',', $request->getTagList()->pluck('id')->toArray());
$double = implode(',', $request->getDoubleList()->pluck('id')->toArray()); $double = implode(',', $request->getDoubleList()->pluck('id')->toArray());
$uri = route('reports.index'); $uri = route('reports.index');
if (0 === $request->getAccountList()->count()) { if (0 === $request->getAccountList()->count()) {
Log::debug('Account count is zero'); Log::debug('Account count is zero');
session()->flash('error', (string)trans('firefly.select_at_least_one_account')); session()->flash('error', (string) trans('firefly.select_at_least_one_account'));
return redirect(route('reports.index')); return redirect(route('reports.index'));
} }
if ('category' === $reportType && 0 === $request->getCategoryList()->count()) { if ('category' === $reportType && 0 === $request->getCategoryList()->count()) {
session()->flash('error', (string)trans('firefly.select_at_least_one_category')); session()->flash('error', (string) trans('firefly.select_at_least_one_category'));
return redirect(route('reports.index')); return redirect(route('reports.index'));
} }
if ('budget' === $reportType && 0 === $request->getBudgetList()->count()) { if ('budget' === $reportType && 0 === $request->getBudgetList()->count()) {
session()->flash('error', (string)trans('firefly.select_at_least_one_budget')); session()->flash('error', (string) trans('firefly.select_at_least_one_budget'));
return redirect(route('reports.index')); return redirect(route('reports.index'));
} }
if ('tag' === $reportType && 0 === $request->getTagList()->count()) { if ('tag' === $reportType && 0 === $request->getTagList()->count()) {
session()->flash('error', (string)trans('firefly.select_at_least_one_tag')); session()->flash('error', (string) trans('firefly.select_at_least_one_tag'));
return redirect(route('reports.index')); return redirect(route('reports.index'));
} }
if ('double' === $reportType && 0 === $request->getDoubleList()->count()) { if ('double' === $reportType && 0 === $request->getDoubleList()->count()) {
session()->flash('error', (string)trans('firefly.select_at_least_one_expense')); session()->flash('error', (string) trans('firefly.select_at_least_one_expense'));
return redirect(route('reports.index')); return redirect(route('reports.index'));
} }
if ($request->getEndDate() < $request->getStartDate()) { if ($request->getEndDate() < $request->getStartDate()) {
return view('error')->with('message', (string)trans('firefly.end_after_start_date')); return view('error')->with('message', (string) trans('firefly.end_after_start_date'));
} }
switch ($reportType) { switch ($reportType) {
@ -413,13 +416,13 @@ class ReportController extends Controller
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View|string * @throws FireflyException
* @throws \FireflyIII\Exceptions\FireflyException * @return Factory|View|string
*/ */
public function tagReport(Collection $accounts, Collection $tags, Carbon $start, Carbon $end) public function tagReport(Collection $accounts, Collection $tags, Carbon $start, Carbon $end)
{ {
if ($end < $start) { if ($end < $start) {
return view('error')->with('message', (string)trans('firefly.end_after_start_date')); // @codeCoverageIgnore return view('error')->with('message', (string) trans('firefly.end_after_start_date')); // @codeCoverageIgnore
} }
$this->repository->cleanupBudgets(); $this->repository->cleanupBudgets();
@ -440,6 +443,4 @@ class ReportController extends Controller
return $generator->generate(); return $generator->generate();
} }
} }

View File

@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Rule; namespace FireflyIII\Http\Controllers\Rule;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\RuleFormRequest; use FireflyIII\Http\Requests\RuleFormRequest;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
@ -33,8 +32,11 @@ use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\Support\Http\Controllers\ModelInformation; use FireflyIII\Support\Http\Controllers\ModelInformation;
use FireflyIII\Support\Http\Controllers\RuleManagement; use FireflyIII\Support\Http\Controllers\RuleManagement;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* Class CreateController * Class CreateController
@ -56,7 +58,7 @@ class CreateController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('title', (string) trans('firefly.rules'));
app('view')->share('mainTitleIcon', 'fa-random'); app('view')->share('mainTitleIcon', 'fa-random');
$this->ruleRepos = app(RuleRepositoryInterface::class); $this->ruleRepos = app(RuleRepositoryInterface::class);
@ -72,7 +74,7 @@ class CreateController extends Controller
* @param Request $request * @param Request $request
* @param RuleGroup $ruleGroup * @param RuleGroup $ruleGroup
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function create(Request $request, RuleGroup $ruleGroup = null) public function create(Request $request, RuleGroup $ruleGroup = null)
{ {
@ -95,9 +97,9 @@ class CreateController extends Controller
$subTitleIcon = 'fa-clone'; $subTitleIcon = 'fa-clone';
// title depends on whether or not there is a rule group: // title depends on whether or not there is a rule group:
$subTitle = (string)trans('firefly.make_new_rule_no_group'); $subTitle = (string) trans('firefly.make_new_rule_no_group');
if (null !== $ruleGroup) { if (null !== $ruleGroup) {
$subTitle = (string)trans('firefly.make_new_rule', ['title' => $ruleGroup->title]); $subTitle = (string) trans('firefly.make_new_rule', ['title' => $ruleGroup->title]);
} }
// flash old data // flash old data
@ -110,43 +112,29 @@ class CreateController extends Controller
session()->forget('rules.create.fromStore'); session()->forget('rules.create.fromStore');
return view( return view(
'rules.rule.create', compact('subTitleIcon', 'oldTriggers', 'preFilled', 'oldActions', 'triggerCount', 'actionCount', 'ruleGroup', 'subTitle') 'rules.rule.create',
compact('subTitleIcon', 'oldTriggers', 'preFilled', 'oldActions', 'triggerCount', 'actionCount', 'ruleGroup', 'subTitle')
); );
} }
/**
* @param Rule $rule
*
* @return RedirectResponse
*/
public function duplicate(Rule $rule): RedirectResponse
{
/** @var Rule $newRule */
$newRule = $this->ruleRepos->duplicate($rule);
session()->flash('success', trans('firefly.duplicated_rule', ['title' => $rule->title,'newTitle' => $newRule->title]));
return redirect(route('rules.index'));
}
/** /**
* Create a new rule. It will be stored under the given $ruleGroup. * Create a new rule. It will be stored under the given $ruleGroup.
* *
* @param Request $request * @param Request $request
* @param Bill $bill * @param Bill $bill
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function createFromBill(Request $request, Bill $bill) public function createFromBill(Request $request, Bill $bill)
{ {
$request->session()->flash('info', (string)trans('firefly.instructions_rule_from_bill', ['name' => e($bill->name)])); $request->session()->flash('info', (string) trans('firefly.instructions_rule_from_bill', ['name' => e($bill->name)]));
$this->createDefaultRuleGroup(); $this->createDefaultRuleGroup();
$this->createDefaultRule(); $this->createDefaultRule();
$preFilled = [ $preFilled = [
'strict' => true, 'strict' => true,
'title' => (string)trans('firefly.new_rule_for_bill_title', ['name' => $bill->name]), 'title' => (string) trans('firefly.new_rule_for_bill_title', ['name' => $bill->name]),
'description' => (string)trans('firefly.new_rule_for_bill_description', ['name' => $bill->name]), 'description' => (string) trans('firefly.new_rule_for_bill_description', ['name' => $bill->name]),
]; ];
// make triggers and actions from the bill itself. // make triggers and actions from the bill itself.
@ -160,7 +148,7 @@ class CreateController extends Controller
$subTitleIcon = 'fa-clone'; $subTitleIcon = 'fa-clone';
// title depends on whether or not there is a rule group: // title depends on whether or not there is a rule group:
$subTitle = (string)trans('firefly.make_new_rule_no_group'); $subTitle = (string) trans('firefly.make_new_rule_no_group');
// flash old data // flash old data
$request->session()->flash('preFilled', $preFilled); $request->session()->flash('preFilled', $preFilled);
@ -172,7 +160,8 @@ class CreateController extends Controller
session()->forget('rules.create.fromStore'); session()->forget('rules.create.fromStore');
return view( return view(
'rules.rule.create', compact('subTitleIcon', 'oldTriggers', 'preFilled', 'oldActions', 'triggerCount', 'actionCount', 'subTitle') 'rules.rule.create',
compact('subTitleIcon', 'oldTriggers', 'preFilled', 'oldActions', 'triggerCount', 'actionCount', 'subTitle')
); );
} }
@ -182,14 +171,14 @@ class CreateController extends Controller
*/ */
public function createFromJournal(Request $request, TransactionJournal $journal) public function createFromJournal(Request $request, TransactionJournal $journal)
{ {
$request->session()->flash('info', (string)trans('firefly.instructions_rule_from_journal', ['name' => e($journal->name)])); $request->session()->flash('info', (string) trans('firefly.instructions_rule_from_journal', ['name' => e($journal->name)]));
$subTitleIcon = 'fa-clone'; $subTitleIcon = 'fa-clone';
$subTitle = (string)trans('firefly.make_new_rule_no_group'); $subTitle = (string) trans('firefly.make_new_rule_no_group');
// get triggers and actions for journal. // get triggers and actions for journal.
$oldTriggers = $this->getTriggersForJournal($journal); $oldTriggers = $this->getTriggersForJournal($journal);
$oldActions = []; $oldActions = [];
$triggerCount = count($oldTriggers); $triggerCount = count($oldTriggers);
$actionCount = count($oldActions); $actionCount = count($oldActions);
@ -199,8 +188,8 @@ class CreateController extends Controller
// collect pre-filled information: // collect pre-filled information:
$preFilled = [ $preFilled = [
'strict' => true, 'strict' => true,
'title' => (string)trans('firefly.new_rule_for_journal_title', ['description' => $journal->description]), 'title' => (string) trans('firefly.new_rule_for_journal_title', ['description' => $journal->description]),
'description' => (string)trans('firefly.new_rule_for_journal_description', ['description' => $journal->description]), 'description' => (string) trans('firefly.new_rule_for_journal_description', ['description' => $journal->description]),
]; ];
// flash old data // flash old data
@ -213,9 +202,24 @@ class CreateController extends Controller
session()->forget('rules.create.fromStore'); session()->forget('rules.create.fromStore');
return view( return view(
'rules.rule.create', compact('subTitleIcon', 'oldTriggers', 'preFilled', 'oldActions', 'triggerCount', 'actionCount', 'subTitle') 'rules.rule.create',
compact('subTitleIcon', 'oldTriggers', 'preFilled', 'oldActions', 'triggerCount', 'actionCount', 'subTitle')
); );
}
/**
* @param Rule $rule
*
* @return RedirectResponse
*/
public function duplicate(Rule $rule): RedirectResponse
{
/** @var Rule $newRule */
$newRule = $this->ruleRepos->duplicate($rule);
session()->flash('success', trans('firefly.duplicated_rule', ['title' => $rule->title, 'newTitle' => $newRule->title]));
return redirect(route('rules.index'));
} }
/** /**
@ -223,29 +227,29 @@ class CreateController extends Controller
* *
* @param RuleFormRequest $request * @param RuleFormRequest $request
* *
* @return RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
* *
*/ */
public function store(RuleFormRequest $request) public function store(RuleFormRequest $request)
{ {
$data = $request->getRuleData(); $data = $request->getRuleData();
$rule = $this->ruleRepos->store($data); $rule = $this->ruleRepos->store($data);
session()->flash('success', (string)trans('firefly.stored_new_rule', ['title' => $rule->title])); session()->flash('success', (string) trans('firefly.stored_new_rule', ['title' => $rule->title]));
app('preferences')->mark(); app('preferences')->mark();
// redirect to show bill. // redirect to show bill.
if ('true' === $request->get('return_to_bill') && (int)$request->get('bill_id') > 0) { if ('true' === $request->get('return_to_bill') && (int) $request->get('bill_id') > 0) {
return redirect(route('bills.show', [(int)$request->get('bill_id')])); // @codeCoverageIgnore return redirect(route('bills.show', [(int) $request->get('bill_id')])); // @codeCoverageIgnore
} }
// redirect to new bill creation. // redirect to new bill creation.
if ((int)$request->get('bill_id') > 0) { if ((int) $request->get('bill_id') > 0) {
return redirect($this->getPreviousUri('bills.create.uri')); // @codeCoverageIgnore return redirect($this->getPreviousUri('bills.create.uri')); // @codeCoverageIgnore
} }
$redirect = redirect($this->getPreviousUri('rules.create.uri')); $redirect = redirect($this->getPreviousUri('rules.create.uri'));
if (1 === (int)$request->get('create_another')) { if (1 === (int) $request->get('create_another')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
session()->put('rules.create.fromStore', true); session()->put('rules.create.fromStore', true);
$redirect = redirect(route('rules.create', [$data['rule_group_id']]))->withInput(); $redirect = redirect(route('rules.create', [$data['rule_group_id']]))->withInput();
@ -254,5 +258,4 @@ class CreateController extends Controller
return $redirect; return $redirect;
} }
} }

View File

@ -27,7 +27,9 @@ namespace FireflyIII\Http\Controllers\Rule;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\Rule; use FireflyIII\Models\Rule;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;
/** /**
* Class DeleteController * Class DeleteController
@ -39,6 +41,7 @@ class DeleteController extends Controller
/** /**
* RuleController constructor. * RuleController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -47,7 +50,7 @@ class DeleteController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('title', (string) trans('firefly.rules'));
app('view')->share('mainTitleIcon', 'fa-random'); app('view')->share('mainTitleIcon', 'fa-random');
$this->ruleRepos = app(RuleRepositoryInterface::class); $this->ruleRepos = app(RuleRepositoryInterface::class);
@ -62,11 +65,11 @@ class DeleteController extends Controller
* *
* @param Rule $rule * @param Rule $rule
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function delete(Rule $rule) public function delete(Rule $rule)
{ {
$subTitle = (string)trans('firefly.delete_rule', ['title' => $rule->title]); $subTitle = (string) trans('firefly.delete_rule', ['title' => $rule->title]);
// put previous url in session // put previous url in session
$this->rememberPreviousUri('rules.delete.uri'); $this->rememberPreviousUri('rules.delete.uri');
@ -86,7 +89,7 @@ class DeleteController extends Controller
$title = $rule->title; $title = $rule->title;
$this->ruleRepos->destroy($rule); $this->ruleRepos->destroy($rule);
session()->flash('success', (string)trans('firefly.deleted_rule', ['title' => $title])); session()->flash('success', (string) trans('firefly.deleted_rule', ['title' => $title]));
app('preferences')->mark(); app('preferences')->mark();
return redirect($this->getPreviousUri('rules.delete.uri')); return redirect($this->getPreviousUri('rules.delete.uri'));

View File

@ -30,8 +30,11 @@ use FireflyIII\Models\Rule;
use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\Support\Http\Controllers\RenderPartialViews; use FireflyIII\Support\Http\Controllers\RenderPartialViews;
use FireflyIII\Support\Http\Controllers\RuleManagement; use FireflyIII\Support\Http\Controllers\RuleManagement;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* Class EditController * Class EditController
@ -45,6 +48,7 @@ class EditController extends Controller
/** /**
* RuleController constructor. * RuleController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -53,7 +57,7 @@ class EditController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('title', (string) trans('firefly.rules'));
app('view')->share('mainTitleIcon', 'fa-random'); app('view')->share('mainTitleIcon', 'fa-random');
$this->ruleRepos = app(RuleRepositoryInterface::class); $this->ruleRepos = app(RuleRepositoryInterface::class);
@ -69,7 +73,7 @@ class EditController extends Controller
* @param Request $request * @param Request $request
* @param Rule $rule * @param Rule $rule
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function edit(Request $request, Rule $rule) public function edit(Request $request, Rule $rule)
{ {
@ -95,15 +99,15 @@ class EditController extends Controller
$hasOldInput = null !== $request->old('_token'); $hasOldInput = null !== $request->old('_token');
$preFilled = [ $preFilled = [
'active' => $hasOldInput ? (bool)$request->old('active') : $rule->active, 'active' => $hasOldInput ? (bool) $request->old('active') : $rule->active,
'stop_processing' => $hasOldInput ? (bool)$request->old('stop_processing') : $rule->stop_processing, 'stop_processing' => $hasOldInput ? (bool) $request->old('stop_processing') : $rule->stop_processing,
'strict' => $hasOldInput ? (bool)$request->old('strict') : $rule->strict, 'strict' => $hasOldInput ? (bool) $request->old('strict') : $rule->strict,
]; ];
// get rule trigger for update / store-journal: // get rule trigger for update / store-journal:
$primaryTrigger = $this->ruleRepos->getPrimaryTrigger($rule); $primaryTrigger = $this->ruleRepos->getPrimaryTrigger($rule);
$subTitle = (string)trans('firefly.edit_rule', ['title' => $rule->title]); $subTitle = (string) trans('firefly.edit_rule', ['title' => $rule->title]);
// put previous url in session if not redirect from store (not "return_to_edit"). // put previous url in session if not redirect from store (not "return_to_edit").
if (true !== session('rules.edit.fromUpdate')) { if (true !== session('rules.edit.fromUpdate')) {
@ -122,17 +126,17 @@ class EditController extends Controller
* @param RuleFormRequest $request * @param RuleFormRequest $request
* @param Rule $rule * @param Rule $rule
* *
* @return RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function update(RuleFormRequest $request, Rule $rule) public function update(RuleFormRequest $request, Rule $rule)
{ {
$data = $request->getRuleData(); $data = $request->getRuleData();
$this->ruleRepos->update($rule, $data); $this->ruleRepos->update($rule, $data);
session()->flash('success', (string)trans('firefly.updated_rule', ['title' => $rule->title])); session()->flash('success', (string) trans('firefly.updated_rule', ['title' => $rule->title]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('rules.edit.uri')); $redirect = redirect($this->getPreviousUri('rules.edit.uri'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
session()->put('rules.edit.fromUpdate', true); session()->put('rules.edit.fromUpdate', true);

View File

@ -28,9 +28,12 @@ use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use FireflyIII\Support\Http\Controllers\RuleManagement; use FireflyIII\Support\Http\Controllers\RuleManagement;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* Class IndexController * Class IndexController
@ -45,6 +48,7 @@ class IndexController extends Controller
/** /**
* RuleController constructor. * RuleController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -52,7 +56,7 @@ class IndexController extends Controller
parent::__construct(); parent::__construct();
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('title', (string) trans('firefly.rules'));
app('view')->share('mainTitleIcon', 'fa-random'); app('view')->share('mainTitleIcon', 'fa-random');
$this->ruleGroupRepos = app(RuleGroupRepositoryInterface::class); $this->ruleGroupRepos = app(RuleGroupRepositoryInterface::class);
$this->ruleRepos = app(RuleRepositoryInterface::class); $this->ruleRepos = app(RuleRepositoryInterface::class);
@ -67,7 +71,7 @@ class IndexController extends Controller
* *
* @param Rule $rule * @param Rule $rule
* *
* @return RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function down(Rule $rule) public function down(Rule $rule)
{ {
@ -79,7 +83,7 @@ class IndexController extends Controller
/** /**
* Index of all rules and groups. * Index of all rules and groups.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index() public function index()
{ {
@ -134,7 +138,7 @@ class IndexController extends Controller
* *
* @param Rule $rule * @param Rule $rule
* *
* @return RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function up(Rule $rule) public function up(Rule $rule)
{ {

View File

@ -38,9 +38,11 @@ use FireflyIII\Support\Http\Controllers\RuleManagement;
use FireflyIII\TransactionRules\Engine\RuleEngine; use FireflyIII\TransactionRules\Engine\RuleEngine;
use FireflyIII\TransactionRules\TransactionMatcher; use FireflyIII\TransactionRules\TransactionMatcher;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\View\View;
use Log; use Log;
use Throwable; use Throwable;
@ -63,7 +65,7 @@ class SelectController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('title', (string) trans('firefly.rules'));
app('view')->share('mainTitleIcon', 'fa-random'); app('view')->share('mainTitleIcon', 'fa-random');
$this->accountRepos = app(AccountRepositoryInterface::class); $this->accountRepos = app(AccountRepositoryInterface::class);
@ -77,7 +79,7 @@ class SelectController extends Controller
* Execute the given rule on a set of existing transactions. * Execute the given rule on a set of existing transactions.
* *
* @param SelectTransactionsRequest $request * @param SelectTransactionsRequest $request
* @param Rule $rule * @param Rule $rule
* *
* @return RedirectResponse * @return RedirectResponse
*/ */
@ -89,7 +91,7 @@ class SelectController extends Controller
$accounts = $this->accountRepos->getAccountsById($request->get('accounts')); $accounts = $this->accountRepos->getAccountsById($request->get('accounts'));
$startDate = new Carbon($request->get('start_date')); $startDate = new Carbon($request->get('start_date'));
$endDate = new Carbon($request->get('end_date')); $endDate = new Carbon($request->get('end_date'));
$rules = [$rule->id]; $rules = [$rule->id];
/** @var RuleEngine $ruleEngine */ /** @var RuleEngine $ruleEngine */
$ruleEngine = app(RuleEngine::class); $ruleEngine = app(RuleEngine::class);
@ -111,7 +113,7 @@ class SelectController extends Controller
} }
// Tell the user that the job is queued // Tell the user that the job is queued
session()->flash('success', (string)trans('firefly.applied_rule_selection', ['title' => $rule->title])); session()->flash('success', (string) trans('firefly.applied_rule_selection', ['title' => $rule->title]));
return redirect()->route('rules.index'); return redirect()->route('rules.index');
} }
@ -122,14 +124,14 @@ class SelectController extends Controller
* *
* @param Rule $rule * @param Rule $rule
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function selectTransactions(Rule $rule) public function selectTransactions(Rule $rule)
{ {
// does the user have shared accounts? // does the user have shared accounts?
$first = session('first', Carbon::now()->subYear())->format('Y-m-d'); $first = session('first', Carbon::now()->subYear())->format('Y-m-d');
$today = Carbon::now()->format('Y-m-d'); $today = Carbon::now()->format('Y-m-d');
$subTitle = (string)trans('firefly.apply_rule_selection', ['title' => $rule->title]); $subTitle = (string) trans('firefly.apply_rule_selection', ['title' => $rule->title]);
return view('rules.rule.select-transactions', compact('first', 'today', 'rule', 'subTitle')); return view('rules.rule.select-transactions', compact('first', 'today', 'rule', 'subTitle'));
} }
@ -153,11 +155,11 @@ class SelectController extends Controller
$triggers = $this->getValidTriggerList($request); $triggers = $this->getValidTriggerList($request);
if (0 === count($triggers)) { if (0 === count($triggers)) {
return response()->json(['html' => '', 'warning' => (string)trans('firefly.warning_no_valid_triggers')]); // @codeCoverageIgnore return response()->json(['html' => '', 'warning' => (string) trans('firefly.warning_no_valid_triggers')]); // @codeCoverageIgnore
} }
$limit = (int)config('firefly.test-triggers.limit'); $limit = (int) config('firefly.test-triggers.limit');
$range = (int)config('firefly.test-triggers.range'); $range = (int) config('firefly.test-triggers.range');
$matchingTransactions = new Collection; $matchingTransactions = new Collection;
$strict = '1' === $request->get('strict'); $strict = '1' === $request->get('strict');
/** @var TransactionMatcher $matcher */ /** @var TransactionMatcher $matcher */
@ -179,10 +181,10 @@ class SelectController extends Controller
// Warn the user if only a subset of transactions is returned // Warn the user if only a subset of transactions is returned
$warning = ''; $warning = '';
if (count($matchingTransactions) === $limit) { if (count($matchingTransactions) === $limit) {
$warning = (string)trans('firefly.warning_transaction_subset', ['max_num_transactions' => $limit]); // @codeCoverageIgnore $warning = (string) trans('firefly.warning_transaction_subset', ['max_num_transactions' => $limit]); // @codeCoverageIgnore
} }
if (0 === count($matchingTransactions)) { if (0 === count($matchingTransactions)) {
$warning = (string)trans('firefly.warning_no_matching_transactions', ['num_transactions' => $range]); // @codeCoverageIgnore $warning = (string) trans('firefly.warning_no_matching_transactions', ['num_transactions' => $range]); // @codeCoverageIgnore
} }
// Return json response // Return json response
@ -219,11 +221,11 @@ class SelectController extends Controller
$triggers = $rule->ruleTriggers; $triggers = $rule->ruleTriggers;
if (0 === count($triggers)) { if (0 === count($triggers)) {
return response()->json(['html' => '', 'warning' => (string)trans('firefly.warning_no_valid_triggers')]); // @codeCoverageIgnore return response()->json(['html' => '', 'warning' => (string) trans('firefly.warning_no_valid_triggers')]); // @codeCoverageIgnore
} }
$limit = (int)config('firefly.test-triggers.limit'); $limit = (int) config('firefly.test-triggers.limit');
$range = (int)config('firefly.test-triggers.range'); $range = (int) config('firefly.test-triggers.range');
$matchingTransactions = new Collection; $matchingTransactions = new Collection;
/** @var TransactionMatcher $matcher */ /** @var TransactionMatcher $matcher */
@ -243,10 +245,10 @@ class SelectController extends Controller
// Warn the user if only a subset of transactions is returned // Warn the user if only a subset of transactions is returned
$warning = ''; $warning = '';
if (count($matchingTransactions) === $limit) { if (count($matchingTransactions) === $limit) {
$warning = (string)trans('firefly.warning_transaction_subset', ['max_num_transactions' => $limit]); // @codeCoverageIgnore $warning = (string) trans('firefly.warning_transaction_subset', ['max_num_transactions' => $limit]); // @codeCoverageIgnore
} }
if (0 === count($matchingTransactions)) { if (0 === count($matchingTransactions)) {
$warning = (string)trans('firefly.warning_no_matching_transactions', ['num_transactions' => $range]); // @codeCoverageIgnore $warning = (string) trans('firefly.warning_no_matching_transactions', ['num_transactions' => $range]); // @codeCoverageIgnore
} }
// Return json response // Return json response

View File

@ -27,6 +27,10 @@ namespace FireflyIII\Http\Controllers\RuleGroup;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\RuleGroupFormRequest; use FireflyIII\Http\Requests\RuleGroupFormRequest;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* Class CreateController * Class CreateController
@ -38,6 +42,7 @@ class CreateController extends Controller
/** /**
* CreateController constructor. * CreateController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -46,7 +51,7 @@ class CreateController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('title', (string) trans('firefly.rules'));
app('view')->share('mainTitleIcon', 'fa-random'); app('view')->share('mainTitleIcon', 'fa-random');
$this->repository = app(RuleGroupRepositoryInterface::class); $this->repository = app(RuleGroupRepositoryInterface::class);
@ -59,12 +64,12 @@ class CreateController extends Controller
/** /**
* Create a new rule group. * Create a new rule group.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function create() public function create()
{ {
$subTitleIcon = 'fa-clone'; $subTitleIcon = 'fa-clone';
$subTitle = (string)trans('firefly.make_new_rule_group'); $subTitle = (string) trans('firefly.make_new_rule_group');
// put previous url in session if not redirect from store (not "create another"). // put previous url in session if not redirect from store (not "create another").
if (true !== session('rule-groups.create.fromStore')) { if (true !== session('rule-groups.create.fromStore')) {
@ -80,18 +85,18 @@ class CreateController extends Controller
* *
* @param RuleGroupFormRequest $request * @param RuleGroupFormRequest $request
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function store(RuleGroupFormRequest $request) public function store(RuleGroupFormRequest $request)
{ {
$data = $request->getRuleGroupData(); $data = $request->getRuleGroupData();
$ruleGroup = $this->repository->store($data); $ruleGroup = $this->repository->store($data);
session()->flash('success', (string)trans('firefly.created_new_rule_group', ['title' => $ruleGroup->title])); session()->flash('success', (string) trans('firefly.created_new_rule_group', ['title' => $ruleGroup->title]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('rule-groups.create.uri')); $redirect = redirect($this->getPreviousUri('rule-groups.create.uri'));
if (1 === (int)$request->get('create_another')) { if (1 === (int) $request->get('create_another')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
session()->put('rule-groups.create.fromStore', true); session()->put('rule-groups.create.fromStore', true);

View File

@ -27,7 +27,11 @@ namespace FireflyIII\Http\Controllers\RuleGroup;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\RuleGroup; use FireflyIII\Models\RuleGroup;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* Class DeleteController * Class DeleteController
@ -39,6 +43,7 @@ class DeleteController extends Controller
/** /**
* DeleteController constructor. * DeleteController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -47,7 +52,7 @@ class DeleteController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('title', (string) trans('firefly.rules'));
app('view')->share('mainTitleIcon', 'fa-random'); app('view')->share('mainTitleIcon', 'fa-random');
$this->repository = app(RuleGroupRepositoryInterface::class); $this->repository = app(RuleGroupRepositoryInterface::class);
@ -63,11 +68,11 @@ class DeleteController extends Controller
* *
* @param RuleGroup $ruleGroup * @param RuleGroup $ruleGroup
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function delete(RuleGroup $ruleGroup) public function delete(RuleGroup $ruleGroup)
{ {
$subTitle = (string)trans('firefly.delete_rule_group', ['title' => $ruleGroup->title]); $subTitle = (string) trans('firefly.delete_rule_group', ['title' => $ruleGroup->title]);
// put previous url in session // put previous url in session
$this->rememberPreviousUri('rule-groups.delete.uri'); $this->rememberPreviousUri('rule-groups.delete.uri');
@ -78,20 +83,20 @@ class DeleteController extends Controller
/** /**
* Actually destroy the rule group. * Actually destroy the rule group.
* *
* @param Request $request * @param Request $request
* @param RuleGroup $ruleGroup * @param RuleGroup $ruleGroup
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function destroy(Request $request, RuleGroup $ruleGroup) public function destroy(Request $request, RuleGroup $ruleGroup)
{ {
$title = $ruleGroup->title; $title = $ruleGroup->title;
/** @var RuleGroup $moveTo */ /** @var RuleGroup $moveTo */
$moveTo = $this->repository->find((int)$request->get('move_rules_before_delete')); $moveTo = $this->repository->find((int) $request->get('move_rules_before_delete'));
$this->repository->destroy($ruleGroup, $moveTo); $this->repository->destroy($ruleGroup, $moveTo);
session()->flash('success', (string)trans('firefly.deleted_rule_group', ['title' => $title])); session()->flash('success', (string) trans('firefly.deleted_rule_group', ['title' => $title]));
app('preferences')->mark(); app('preferences')->mark();
return redirect($this->getPreviousUri('rule-groups.delete.uri')); return redirect($this->getPreviousUri('rule-groups.delete.uri'));

View File

@ -27,7 +27,11 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\RuleGroupFormRequest; use FireflyIII\Http\Requests\RuleGroupFormRequest;
use FireflyIII\Models\RuleGroup; use FireflyIII\Models\RuleGroup;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
/** /**
* Class EditController * Class EditController
@ -39,6 +43,7 @@ class EditController extends Controller
/** /**
* EditController constructor. * EditController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -47,7 +52,7 @@ class EditController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('title', (string) trans('firefly.rules'));
app('view')->share('mainTitleIcon', 'fa-random'); app('view')->share('mainTitleIcon', 'fa-random');
$this->repository = app(RuleGroupRepositoryInterface::class); $this->repository = app(RuleGroupRepositoryInterface::class);
@ -62,7 +67,7 @@ class EditController extends Controller
* *
* @param RuleGroup $ruleGroup * @param RuleGroup $ruleGroup
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function down(RuleGroup $ruleGroup) public function down(RuleGroup $ruleGroup)
{ {
@ -75,18 +80,18 @@ class EditController extends Controller
/** /**
* Edit a rule group. * Edit a rule group.
* *
* @param Request $request * @param Request $request
* @param RuleGroup $ruleGroup * @param RuleGroup $ruleGroup
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function edit(Request $request, RuleGroup $ruleGroup) public function edit(Request $request, RuleGroup $ruleGroup)
{ {
$subTitle = (string)trans('firefly.edit_rule_group', ['title' => $ruleGroup->title]); $subTitle = (string) trans('firefly.edit_rule_group', ['title' => $ruleGroup->title]);
$hasOldInput = null !== $request->old('_token'); $hasOldInput = null !== $request->old('_token');
$preFilled = [ $preFilled = [
'active' => $hasOldInput ? (bool)$request->old('active') : $ruleGroup->active, 'active' => $hasOldInput ? (bool) $request->old('active') : $ruleGroup->active,
]; ];
@ -105,7 +110,7 @@ class EditController extends Controller
* *
* @param RuleGroup $ruleGroup * @param RuleGroup $ruleGroup
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
* *
*/ */
public function up(RuleGroup $ruleGroup) public function up(RuleGroup $ruleGroup)
@ -119,24 +124,24 @@ class EditController extends Controller
* Update the rule group. * Update the rule group.
* *
* @param RuleGroupFormRequest $request * @param RuleGroupFormRequest $request
* @param RuleGroup $ruleGroup * @param RuleGroup $ruleGroup
* *
* @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return $this|RedirectResponse|Redirector
*/ */
public function update(RuleGroupFormRequest $request, RuleGroup $ruleGroup) public function update(RuleGroupFormRequest $request, RuleGroup $ruleGroup)
{ {
$data = [ $data = [
'title' => $request->string('title'), 'title' => $request->string('title'),
'description' => $request->nlString('description'), 'description' => $request->nlString('description'),
'active' => 1 === (int)$request->input('active'), 'active' => 1 === (int) $request->input('active'),
]; ];
$this->repository->update($ruleGroup, $data); $this->repository->update($ruleGroup, $data);
session()->flash('success', (string)trans('firefly.updated_rule_group', ['title' => $ruleGroup->title])); session()->flash('success', (string) trans('firefly.updated_rule_group', ['title' => $ruleGroup->title]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('rule-groups.edit.uri')); $redirect = redirect($this->getPreviousUri('rule-groups.edit.uri'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
session()->put('rule-groups.edit.fromUpdate', true); session()->put('rule-groups.edit.fromUpdate', true);

View File

@ -25,6 +25,7 @@ namespace FireflyIII\Http\Controllers\RuleGroup;
use Carbon\Carbon; use Carbon\Carbon;
use Exception;
use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Http\Requests\SelectTransactionsRequest; use FireflyIII\Http\Requests\SelectTransactionsRequest;
@ -33,7 +34,9 @@ use FireflyIII\Models\RuleGroup;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface;
use FireflyIII\TransactionRules\Engine\RuleEngine; use FireflyIII\TransactionRules\Engine\RuleEngine;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -49,6 +52,7 @@ class ExecutionController extends Controller
/** /**
* ExecutionController constructor. * ExecutionController constructor.
*
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */
public function __construct() public function __construct()
@ -57,7 +61,7 @@ class ExecutionController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
app('view')->share('title', (string)trans('firefly.rules')); app('view')->share('title', (string) trans('firefly.rules'));
app('view')->share('mainTitleIcon', 'fa-random'); app('view')->share('mainTitleIcon', 'fa-random');
$this->repository = app(AccountRepositoryInterface::class); $this->repository = app(AccountRepositoryInterface::class);
@ -73,10 +77,10 @@ class ExecutionController extends Controller
* Execute the given rulegroup on a set of existing transactions. * Execute the given rulegroup on a set of existing transactions.
* *
* @param SelectTransactionsRequest $request * @param SelectTransactionsRequest $request
* @param RuleGroup $ruleGroup * @param RuleGroup $ruleGroup
* *
* @throws Exception
* @return RedirectResponse * @return RedirectResponse
* @throws \Exception
*/ */
public function execute(SelectTransactionsRequest $request, RuleGroup $ruleGroup): RedirectResponse public function execute(SelectTransactionsRequest $request, RuleGroup $ruleGroup): RedirectResponse
{ {
@ -113,7 +117,7 @@ class ExecutionController extends Controller
} }
// Tell the user that the job is queued // Tell the user that the job is queued
session()->flash('success', (string)trans('firefly.applied_rule_group_selection', ['title' => $ruleGroup->title])); session()->flash('success', (string) trans('firefly.applied_rule_group_selection', ['title' => $ruleGroup->title]));
return redirect()->route('rules.index'); return redirect()->route('rules.index');
} }
@ -123,13 +127,13 @@ class ExecutionController extends Controller
* *
* @param RuleGroup $ruleGroup * @param RuleGroup $ruleGroup
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function selectTransactions(RuleGroup $ruleGroup) public function selectTransactions(RuleGroup $ruleGroup)
{ {
$first = session('first')->format('Y-m-d'); $first = session('first')->format('Y-m-d');
$today = Carbon::now()->format('Y-m-d'); $today = Carbon::now()->format('Y-m-d');
$subTitle = (string)trans('firefly.apply_rule_group_selection', ['title' => $ruleGroup->title]); $subTitle = (string) trans('firefly.apply_rule_group_selection', ['title' => $ruleGroup->title]);
return view('rules.rule-group.select-transactions', compact('first', 'today', 'ruleGroup', 'subTitle')); return view('rules.rule-group.select-transactions', compact('first', 'today', 'ruleGroup', 'subTitle'));
} }

View File

@ -23,8 +23,10 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers; namespace FireflyIII\Http\Controllers;
use FireflyIII\Support\Search\SearchInterface; use FireflyIII\Support\Search\SearchInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\View\View;
use Log; use Log;
use Throwable; use Throwable;
@ -43,7 +45,7 @@ class SearchController extends Controller
$this->middleware( $this->middleware(
static function ($request, $next) { static function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-search'); app('view')->share('mainTitleIcon', 'fa-search');
app('view')->share('title', (string)trans('firefly.search')); app('view')->share('title', (string) trans('firefly.search'));
return $next($request); return $next($request);
} }
@ -56,19 +58,19 @@ class SearchController extends Controller
* @param Request $request * @param Request $request
* @param SearchInterface $searcher * @param SearchInterface $searcher
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index(Request $request, SearchInterface $searcher) public function index(Request $request, SearchInterface $searcher)
{ {
$fullQuery = (string)$request->get('search'); $fullQuery = (string) $request->get('search');
$page = 0 === (int)$request->get('page') ? 1 : (int)$request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
// parse search terms: // parse search terms:
$searcher->parseQuery($fullQuery); $searcher->parseQuery($fullQuery);
$query = $searcher->getWordsAsString(); $query = $searcher->getWordsAsString();
$modifiers = $searcher->getModifiers(); $modifiers = $searcher->getModifiers();
$subTitle = (string)trans('breadcrumbs.search_result', ['query' => $query]); $subTitle = (string) trans('breadcrumbs.search_result', ['query' => $query]);
return view('search.index', compact('query', 'modifiers', 'page','fullQuery', 'subTitle')); return view('search.index', compact('query', 'modifiers', 'page', 'fullQuery', 'subTitle'));
} }
/** /**
@ -77,16 +79,16 @@ class SearchController extends Controller
* @param Request $request * @param Request $request
* @param SearchInterface $searcher * @param SearchInterface $searcher
* *
* @return \Illuminate\Http\JsonResponse * @return JsonResponse
*/ */
public function search(Request $request, SearchInterface $searcher): JsonResponse public function search(Request $request, SearchInterface $searcher): JsonResponse
{ {
$fullQuery = (string)$request->get('query'); $fullQuery = (string) $request->get('query');
$page = 0 === (int)$request->get('page') ? 1 : (int)$request->get('page'); $page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
$searcher->parseQuery($fullQuery); $searcher->parseQuery($fullQuery);
$searcher->setPage($page); $searcher->setPage($page);
$searcher->setLimit((int)config('firefly.search_result_limit')); $searcher->setLimit((int) config('firefly.search_result_limit'));
$groups = $searcher->searchTransactions(); $groups = $searcher->searchTransactions();
$hasPages = $groups->hasPages(); $hasPages = $groups->hasPages();
$searchTime = round($searcher->searchTime(), 3); // in seconds $searchTime = round($searcher->searchTime(), 3); // in seconds

View File

@ -31,7 +31,9 @@ use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Support\Facades\Preferences; use FireflyIII\Support\Facades\Preferences;
use FireflyIII\Support\Http\Controllers\GetConfigurationData; use FireflyIII\Support\Http\Controllers\GetConfigurationData;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Log; use Log;
@ -113,15 +115,15 @@ class InstallController extends Controller
/** /**
* Show index. * Show index.
* *
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @return RedirectResponse|Redirector
*/ */
public function index() public function index()
{ {
// index will set FF3 version. // index will set FF3 version.
app('fireflyconfig')->set('ff3_version', (string)config('firefly.version')); app('fireflyconfig')->set('ff3_version', (string) config('firefly.version'));
// set new DB version. // set new DB version.
app('fireflyconfig')->set('db_version', (int)config('firefly.db_version')); app('fireflyconfig')->set('db_version', (int) config('firefly.db_version'));
return view('install.index'); return view('install.index');
} }
@ -154,7 +156,7 @@ class InstallController extends Controller
*/ */
public function runCommand(Request $request): JsonResponse public function runCommand(Request $request): JsonResponse
{ {
$requestIndex = (int)$request->get('index'); $requestIndex = (int) $request->get('index');
$response = [ $response = [
'hasNextCommand' => false, 'hasNextCommand' => false,
'done' => true, 'done' => true,

View File

@ -29,8 +29,10 @@ use FireflyIII\Http\Requests\TagFormRequest;
use FireflyIII\Models\Tag; use FireflyIII\Models\Tag;
use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface;
use FireflyIII\Support\Http\Controllers\PeriodOverview; use FireflyIII\Support\Http\Controllers\PeriodOverview;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\View\View;
use Log; use Log;
/** /**
@ -54,7 +56,7 @@ class TagController extends Controller
$this->middleware( $this->middleware(
function ($request, $next) { function ($request, $next) {
$this->repository = app(TagRepositoryInterface::class); $this->repository = app(TagRepositoryInterface::class);
app('view')->share('title', (string)trans('firefly.tags')); app('view')->share('title', (string) trans('firefly.tags'));
app('view')->share('mainTitleIcon', 'fa-tags'); app('view')->share('mainTitleIcon', 'fa-tags');
return $next($request); return $next($request);
@ -62,39 +64,14 @@ class TagController extends Controller
); );
} }
/**
*
*/
public function massDestroy(Request $request)
{
$tags = $request->get('tags');
if (null === $tags || !is_array($tags)) {
session()->flash('info', (string)trans('firefly.select_tags_to_delete'));
return redirect(route('tags.index'));
}
$count = 0;
foreach ($tags as $tagId) {
$tagId = (int)$tagId;
$tag = $this->repository->findNull($tagId);
if (null !== $tag) {
$this->repository->destroy($tag);
$count++;
}
}
session()->flash('success', (string)trans('firefly.deleted_x_tags', ['count' => $count]));
return redirect(route('tags.index'));
}
/** /**
* Create a new tag. * Create a new tag.
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function create(Request $request) public function create(Request $request)
{ {
$subTitle = (string)trans('firefly.new_tag'); $subTitle = (string) trans('firefly.new_tag');
$subTitleIcon = 'fa-tag'; $subTitleIcon = 'fa-tag';
// location info: // location info:
@ -122,11 +99,11 @@ class TagController extends Controller
* *
* @param Tag $tag * @param Tag $tag
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function delete(Tag $tag) public function delete(Tag $tag)
{ {
$subTitle = (string)trans('breadcrumbs.delete_tag', ['tag' => $tag->tag]); $subTitle = (string) trans('breadcrumbs.delete_tag', ['tag' => $tag->tag]);
// put previous url in session // put previous url in session
$this->rememberPreviousUri('tags.delete.uri'); $this->rememberPreviousUri('tags.delete.uri');
@ -146,7 +123,7 @@ class TagController extends Controller
$tagName = $tag->tag; $tagName = $tag->tag;
$this->repository->destroy($tag); $this->repository->destroy($tag);
session()->flash('success', (string)trans('firefly.deleted_tag', ['tag' => $tagName])); session()->flash('success', (string) trans('firefly.deleted_tag', ['tag' => $tagName]));
app('preferences')->mark(); app('preferences')->mark();
return redirect($this->getPreviousUri('tags.delete.uri')); return redirect($this->getPreviousUri('tags.delete.uri'));
@ -157,19 +134,19 @@ class TagController extends Controller
* *
* @param Tag $tag * @param Tag $tag
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function edit(Tag $tag) public function edit(Tag $tag)
{ {
$subTitle = (string)trans('firefly.edit_tag', ['tag' => $tag->tag]); $subTitle = (string) trans('firefly.edit_tag', ['tag' => $tag->tag]);
$subTitleIcon = 'fa-tag'; $subTitleIcon = 'fa-tag';
$location = $this->repository->getLocation($tag); $location = $this->repository->getLocation($tag);
$latitude = $location ? $location->latitude : config('firefly.default_location.latitude'); $latitude = $location ? $location->latitude : config('firefly.default_location.latitude');
$longitude = $location ? $location->longitude : config('firefly.default_location.longitude'); $longitude = $location ? $location->longitude : config('firefly.default_location.longitude');
$zoomLevel = $location ? $location->zoom_level : config('firefly.default_location.zoom_level'); $zoomLevel = $location ? $location->zoom_level : config('firefly.default_location.zoom_level');
$hasLocation = null !== $location; $hasLocation = null !== $location;
$locations = [ $locations = [
'location' => [ 'location' => [
'latitude' => old('location_latitude') ?? $latitude, 'latitude' => old('location_latitude') ?? $latitude,
'longitude' => old('location_longitude') ?? $longitude, 'longitude' => old('location_longitude') ?? $longitude,
@ -184,7 +161,7 @@ class TagController extends Controller
} }
session()->forget('tags.edit.fromUpdate'); session()->forget('tags.edit.fromUpdate');
return view('tags.edit', compact('tag', 'subTitle', 'subTitleIcon','locations')); return view('tags.edit', compact('tag', 'subTitle', 'subTitleIcon', 'locations'));
} }
/** /**
@ -192,7 +169,7 @@ class TagController extends Controller
* *
* @param TagRepositoryInterface $repository * @param TagRepositoryInterface $repository
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
*/ */
public function index(TagRepositoryInterface $repository) public function index(TagRepositoryInterface $repository)
{ {
@ -205,7 +182,7 @@ class TagController extends Controller
$tags['no-date'] = $repository->getTagsInYear(null); $tags['no-date'] = $repository->getTagsInYear(null);
while ($newestTagDate > $oldestTagDate) { while ($newestTagDate > $oldestTagDate) {
$year = $newestTagDate->year; $year = $newestTagDate->year;
$tags[$year] = $repository->getTagsInYear($year); $tags[$year] = $repository->getTagsInYear($year);
$newestTagDate->subYear(); $newestTagDate->subYear();
} }
@ -214,36 +191,62 @@ class TagController extends Controller
return view('tags.index', compact('tags', 'count')); return view('tags.index', compact('tags', 'count'));
} }
/**
*
*/
public function massDestroy(Request $request)
{
$tags = $request->get('tags');
if (null === $tags || !is_array($tags)) {
session()->flash('info', (string) trans('firefly.select_tags_to_delete'));
return redirect(route('tags.index'));
}
$count = 0;
foreach ($tags as $tagId) {
$tagId = (int) $tagId;
$tag = $this->repository->findNull($tagId);
if (null !== $tag) {
$this->repository->destroy($tag);
$count++;
}
}
session()->flash('success', (string) trans('firefly.deleted_x_tags', ['count' => $count]));
return redirect(route('tags.index'));
}
/** /**
* Show a single tag. * Show a single tag.
* *
* @param Request $request * @param Request $request
* @param Tag $tag * @param Tag $tag
* @param Carbon|null $start * @param Carbon|null $start
* @param Carbon|null $end * @param Carbon|null $end
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
* *
*/ */
public function show(Request $request, Tag $tag, Carbon $start = null, Carbon $end = null) public function show(Request $request, Tag $tag, Carbon $start = null, Carbon $end = null)
{ {
// default values: // default values:
$subTitleIcon = 'fa-tag'; $subTitleIcon = 'fa-tag';
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$start = $start ?? session('start'); $start = $start ?? session('start');
$end = $end ?? session('end'); $end = $end ?? session('end');
$location = $this->repository->getLocation($tag); $location = $this->repository->getLocation($tag);
$subTitle = trans( $subTitle = trans(
'firefly.journals_in_period_for_tag', ['tag' => $tag->tag, 'start' => $start->formatLocalized($this->monthAndDayFormat), 'firefly.journals_in_period_for_tag',
'end' => $end->formatLocalized($this->monthAndDayFormat),] ['tag' => $tag->tag, 'start' => $start->formatLocalized($this->monthAndDayFormat),
'end' => $end->formatLocalized($this->monthAndDayFormat),]
); );
$startPeriod = $this->repository->firstUseDate($tag); $startPeriod = $this->repository->firstUseDate($tag);
$startPeriod = $startPeriod ?? new Carbon; $startPeriod = $startPeriod ?? new Carbon;
$endPeriod = clone $end; $endPeriod = clone $end;
$periods = $this->getTagPeriodOverview($tag, $startPeriod, $endPeriod); $periods = $this->getTagPeriodOverview($tag, $startPeriod, $endPeriod);
$path = route('tags.show', [$tag->id, $start->format('Y-m-d'), $end->format('Y-m-d')]); $path = route('tags.show', [$tag->id, $start->format('Y-m-d'), $end->format('Y-m-d')]);
/** @var GroupCollectorInterface $collector */ /** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class); $collector = app(GroupCollectorInterface::class);
@ -261,19 +264,19 @@ class TagController extends Controller
* Show a single tag over all time. * Show a single tag over all time.
* *
* @param Request $request * @param Request $request
* @param Tag $tag * @param Tag $tag
* *
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @return Factory|View
* *
*/ */
public function showAll(Request $request, Tag $tag) public function showAll(Request $request, Tag $tag)
{ {
// default values: // default values:
$subTitleIcon = 'fa-tag'; $subTitleIcon = 'fa-tag';
$page = (int)$request->get('page'); $page = (int) $request->get('page');
$pageSize = (int)app('preferences')->get('listPageSize', 50)->data; $pageSize = (int) app('preferences')->get('listPageSize', 50)->data;
$periods = []; $periods = [];
$subTitle = (string)trans('firefly.all_journals_for_tag', ['tag' => $tag->tag]); $subTitle = (string) trans('firefly.all_journals_for_tag', ['tag' => $tag->tag]);
$start = $this->repository->firstUseDate($tag) ?? new Carbon; $start = $this->repository->firstUseDate($tag) ?? new Carbon;
$end = new Carbon; $end = new Carbon;
$path = route('tags.show', [$tag->id, 'all']); $path = route('tags.show', [$tag->id, 'all']);
@ -304,11 +307,11 @@ class TagController extends Controller
$result = $this->repository->store($data); $result = $this->repository->store($data);
Log::debug('Data after storage', $result->toArray()); Log::debug('Data after storage', $result->toArray());
session()->flash('success', (string)trans('firefly.created_tag', ['tag' => $data['tag']])); session()->flash('success', (string) trans('firefly.created_tag', ['tag' => $data['tag']]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('tags.create.uri')); $redirect = redirect($this->getPreviousUri('tags.create.uri'));
if (1 === (int)$request->get('create_another')) { if (1 === (int) $request->get('create_another')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
session()->put('tags.create.fromStore', true); session()->put('tags.create.fromStore', true);
@ -317,14 +320,13 @@ class TagController extends Controller
} }
return $redirect; return $redirect;
} }
/** /**
* Update a tag. * Update a tag.
* *
* @param TagFormRequest $request * @param TagFormRequest $request
* @param Tag $tag * @param Tag $tag
* *
* @return RedirectResponse * @return RedirectResponse
*/ */
@ -333,11 +335,11 @@ class TagController extends Controller
$data = $request->collectTagData(); $data = $request->collectTagData();
$this->repository->update($tag, $data); $this->repository->update($tag, $data);
session()->flash('success', (string)trans('firefly.updated_tag', ['tag' => $data['tag']])); session()->flash('success', (string) trans('firefly.updated_tag', ['tag' => $data['tag']]));
app('preferences')->mark(); app('preferences')->mark();
$redirect = redirect($this->getPreviousUri('tags.edit.uri')); $redirect = redirect($this->getPreviousUri('tags.edit.uri'));
if (1 === (int)$request->get('return_to_edit')) { if (1 === (int) $request->get('return_to_edit')) {
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
session()->put('tags.edit.fromUpdate', true); session()->put('tags.edit.fromUpdate', true);
@ -348,6 +350,4 @@ class TagController extends Controller
// redirect to previous URL. // redirect to previous URL.
return $redirect; return $redirect;
} }
} }

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