mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-02-25 18:45:27 -06:00
Code quality update.
This commit is contained in:
parent
cbe47a9dcc
commit
e78a59a8a8
@ -55,6 +55,7 @@ class AvailableBudgetRequest extends Request
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO must also accept currency code.
|
||||
* The rules that the incoming request must be matched against.
|
||||
*
|
||||
* @return array
|
||||
|
@ -68,7 +68,7 @@ class CurrencyRequest extends Request
|
||||
'code' => 'required|between:3,3|unique:transaction_currencies,code',
|
||||
'symbol' => 'required|between:1,5|unique:transaction_currencies,symbol',
|
||||
'decimal_places' => 'required|between:0,20|numeric|min:0|max:20',
|
||||
'default' => 'in:true,false',
|
||||
'default' => 'boolean',
|
||||
];
|
||||
|
||||
switch ($this->method()) {
|
||||
|
@ -57,6 +57,9 @@ class JournalLinkRequest extends Request
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO include link-type name as optional parameter.
|
||||
* TODO be consistent and remove notes from this object.
|
||||
*
|
||||
* The rules that the incoming request must be matched against.
|
||||
*
|
||||
* @return array
|
||||
|
@ -38,18 +38,18 @@ use Symfony\Component\HttpFoundation\File\UploadedFile;
|
||||
*/
|
||||
class AttachmentHelper implements AttachmentHelperInterface
|
||||
{
|
||||
/** @var Collection */
|
||||
/** @var Collection All attachments */
|
||||
public $attachments;
|
||||
/** @var MessageBag */
|
||||
/** @var MessageBag All errors */
|
||||
public $errors;
|
||||
/** @var MessageBag */
|
||||
/** @var MessageBag All messages */
|
||||
public $messages;
|
||||
/** @var array */
|
||||
/** @var array Allowed mimes */
|
||||
protected $allowedMimes = [];
|
||||
/** @var int */
|
||||
/** @var int Max upload size. */
|
||||
protected $maxUploadSize = 0;
|
||||
|
||||
/** @var \Illuminate\Contracts\Filesystem\Filesystem */
|
||||
/** @var \Illuminate\Contracts\Filesystem\Filesystem The disk where attachments are stored. */
|
||||
protected $uploadDisk;
|
||||
|
||||
|
||||
@ -67,6 +67,8 @@ class AttachmentHelper implements AttachmentHelperInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the content of an attachment.
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
*
|
||||
* @param Attachment $attachment
|
||||
@ -75,18 +77,19 @@ class AttachmentHelper implements AttachmentHelperInterface
|
||||
*/
|
||||
public function getAttachmentContent(Attachment $attachment): string
|
||||
{
|
||||
$content = '';
|
||||
try {
|
||||
$content = Crypt::decrypt($this->uploadDisk->get(sprintf('at-%d.data', $attachment->id)));
|
||||
} catch (DecryptException|FileNotFoundException $e) {
|
||||
Log::error(sprintf('Could not decrypt data of attachment #%d', $attachment->id));
|
||||
|
||||
return '';
|
||||
Log::error(sprintf('Could not decrypt data of attachment #%d: %s', $attachment->id, $e->getMessage()));
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the file location for an attachment,
|
||||
*
|
||||
* @param Attachment $attachment
|
||||
*
|
||||
* @return string
|
||||
@ -99,6 +102,8 @@ class AttachmentHelper implements AttachmentHelperInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all attachments.
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
public function getAttachments(): Collection
|
||||
@ -107,6 +112,8 @@ class AttachmentHelper implements AttachmentHelperInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all errors.
|
||||
*
|
||||
* @return MessageBag
|
||||
*/
|
||||
public function getErrors(): MessageBag
|
||||
@ -115,6 +122,8 @@ class AttachmentHelper implements AttachmentHelperInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all messages.
|
||||
*
|
||||
* @return MessageBag
|
||||
*/
|
||||
public function getMessages(): MessageBag
|
||||
@ -122,6 +131,7 @@ class AttachmentHelper implements AttachmentHelperInterface
|
||||
return $this->messages;
|
||||
}
|
||||
|
||||
/** @noinspection MultipleReturnStatementsInspection */
|
||||
/**
|
||||
* Uploads a file as a string.
|
||||
*
|
||||
@ -163,6 +173,8 @@ class AttachmentHelper implements AttachmentHelperInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* Save attachments that get uploaded with models, through the app.
|
||||
*
|
||||
* @param Model $model
|
||||
* @param array|null $files
|
||||
*
|
||||
@ -180,15 +192,17 @@ class AttachmentHelper implements AttachmentHelperInterface
|
||||
}
|
||||
}
|
||||
Log::debug('Done processing uploads.');
|
||||
|
||||
return true;
|
||||
}
|
||||
Log::debug('Array of files is not an array. Probably nothing uploaded. Will not store attachments.');
|
||||
if (!\is_array($files) || (\is_array($files) && 0 === \count($files))) {
|
||||
Log::debug('Array of files is not an array. Probably nothing uploaded. Will not store attachments.');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a model already has this file attached.
|
||||
*
|
||||
* @param UploadedFile $file
|
||||
* @param Model $model
|
||||
*
|
||||
@ -199,67 +213,70 @@ class AttachmentHelper implements AttachmentHelperInterface
|
||||
$md5 = md5_file($file->getRealPath());
|
||||
$name = $file->getClientOriginalName();
|
||||
$class = \get_class($model);
|
||||
$count = $model->user->attachments()->where('md5', $md5)->where('attachable_id', $model->id)->where('attachable_type', $class)->count();
|
||||
|
||||
/** @noinspection PhpUndefinedFieldInspection */
|
||||
$count = $model->user->attachments()->where('md5', $md5)->where('attachable_id', $model->id)->where('attachable_type', $class)->count();
|
||||
$result = false;
|
||||
if ($count > 0) {
|
||||
$msg = (string)trans('validation.file_already_attached', ['name' => $name]);
|
||||
$this->errors->add('attachments', $msg);
|
||||
Log::error($msg);
|
||||
|
||||
return true;
|
||||
$result = true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process the upload of a file.
|
||||
*
|
||||
* @param UploadedFile $file
|
||||
* @param Model $model
|
||||
*
|
||||
* @return Attachment
|
||||
* @return Attachment|null
|
||||
* @throws \Illuminate\Contracts\Encryption\EncryptException
|
||||
*/
|
||||
protected function processFile(UploadedFile $file, Model $model): Attachment
|
||||
protected function processFile(UploadedFile $file, Model $model): ?Attachment
|
||||
{
|
||||
Log::debug('Now in processFile()');
|
||||
$validation = $this->validateUpload($file, $model);
|
||||
if (false === $validation) {
|
||||
return new Attachment;
|
||||
$attachment = null;
|
||||
if (false !== $validation) {
|
||||
$attachment = new Attachment; // create Attachment object.
|
||||
/** @noinspection PhpUndefinedFieldInspection */
|
||||
$attachment->user()->associate($model->user);
|
||||
$attachment->attachable()->associate($model);
|
||||
$attachment->md5 = md5_file($file->getRealPath());
|
||||
$attachment->filename = $file->getClientOriginalName();
|
||||
$attachment->mime = $file->getMimeType();
|
||||
$attachment->size = $file->getSize();
|
||||
$attachment->uploaded = 0;
|
||||
$attachment->save();
|
||||
Log::debug('Created attachment:', $attachment->toArray());
|
||||
|
||||
$fileObject = $file->openFile('r');
|
||||
$fileObject->rewind();
|
||||
$content = $fileObject->fread($file->getSize());
|
||||
$encrypted = Crypt::encrypt($content);
|
||||
Log::debug(sprintf('Full file length is %d and upload size is %d.', \strlen($content), $file->getSize()));
|
||||
Log::debug(sprintf('Encrypted content is %d', \strlen($encrypted)));
|
||||
|
||||
// store it:
|
||||
$this->uploadDisk->put($attachment->fileName(), $encrypted);
|
||||
$attachment->uploaded = 1; // update attachment
|
||||
$attachment->save();
|
||||
$this->attachments->push($attachment);
|
||||
|
||||
$name = e($file->getClientOriginalName()); // add message:
|
||||
$msg = (string)trans('validation.file_attached', ['name' => $name]);
|
||||
$this->messages->add('attachments', $msg);
|
||||
}
|
||||
|
||||
$attachment = new Attachment; // create Attachment object.
|
||||
$attachment->user()->associate($model->user);
|
||||
$attachment->attachable()->associate($model);
|
||||
$attachment->md5 = md5_file($file->getRealPath());
|
||||
$attachment->filename = $file->getClientOriginalName();
|
||||
$attachment->mime = $file->getMimeType();
|
||||
$attachment->size = $file->getSize();
|
||||
$attachment->uploaded = 0;
|
||||
$attachment->save();
|
||||
Log::debug('Created attachment:', $attachment->toArray());
|
||||
|
||||
$fileObject = $file->openFile('r');
|
||||
$fileObject->rewind();
|
||||
$content = $fileObject->fread($file->getSize());
|
||||
$encrypted = Crypt::encrypt($content);
|
||||
Log::debug(sprintf('Full file length is %d and upload size is %d.', \strlen($content), $file->getSize()));
|
||||
Log::debug(sprintf('Encrypted content is %d', \strlen($encrypted)));
|
||||
|
||||
// store it:
|
||||
$this->uploadDisk->put($attachment->fileName(), $encrypted);
|
||||
$attachment->uploaded = 1; // update attachment
|
||||
$attachment->save();
|
||||
$this->attachments->push($attachment);
|
||||
|
||||
$name = e($file->getClientOriginalName()); // add message:
|
||||
$msg = (string)trans('validation.file_attached', ['name' => $name]);
|
||||
$this->messages->add('attachments', $msg);
|
||||
|
||||
// return it.
|
||||
return $attachment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if the mime of a file is valid.
|
||||
*
|
||||
* @param UploadedFile $file
|
||||
*
|
||||
* @return bool
|
||||
@ -271,19 +288,22 @@ class AttachmentHelper implements AttachmentHelperInterface
|
||||
$name = e($file->getClientOriginalName());
|
||||
Log::debug(sprintf('Name is %s, and mime is %s', $name, $mime));
|
||||
Log::debug('Valid mimes are', $this->allowedMimes);
|
||||
$result = true;
|
||||
|
||||
if (!\in_array($mime, $this->allowedMimes, true)) {
|
||||
$msg = (string)trans('validation.file_invalid_mime', ['name' => $name, 'mime' => $mime]);
|
||||
$this->errors->add('attachments', $msg);
|
||||
Log::error($msg);
|
||||
|
||||
return false;
|
||||
$result = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if the size of a file is valid.
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
*
|
||||
* @param UploadedFile $file
|
||||
@ -292,20 +312,23 @@ class AttachmentHelper implements AttachmentHelperInterface
|
||||
*/
|
||||
protected function validSize(UploadedFile $file): bool
|
||||
{
|
||||
$size = $file->getSize();
|
||||
$name = e($file->getClientOriginalName());
|
||||
$size = $file->getSize();
|
||||
$name = e($file->getClientOriginalName());
|
||||
$result = true;
|
||||
if ($size > $this->maxUploadSize) {
|
||||
$msg = (string)trans('validation.file_too_large', ['name' => $name]);
|
||||
$this->errors->add('attachments', $msg);
|
||||
Log::error($msg);
|
||||
|
||||
return false;
|
||||
$result = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if the file was uploaded correctly.
|
||||
*
|
||||
* @param UploadedFile $file
|
||||
* @param Model $model
|
||||
*
|
||||
@ -314,16 +337,17 @@ class AttachmentHelper implements AttachmentHelperInterface
|
||||
protected function validateUpload(UploadedFile $file, Model $model): bool
|
||||
{
|
||||
Log::debug('Now in validateUpload()');
|
||||
$result = true;
|
||||
if (!$this->validMime($file)) {
|
||||
return false;
|
||||
$result = false;
|
||||
}
|
||||
if (!$this->validSize($file)) {
|
||||
return false; // @codeCoverageIgnore
|
||||
if (true === $result && !$this->validSize($file)) {
|
||||
$result = false;
|
||||
}
|
||||
if ($this->hasFile($file, $model)) {
|
||||
return false;
|
||||
if (true === $result && $this->hasFile($file, $model)) {
|
||||
$result = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
@ -33,6 +33,8 @@ use Illuminate\Support\MessageBag;
|
||||
interface AttachmentHelperInterface
|
||||
{
|
||||
/**
|
||||
* Get content of an attachment.
|
||||
*
|
||||
* @param Attachment $attachment
|
||||
*
|
||||
* @return string
|
||||
@ -40,6 +42,8 @@ interface AttachmentHelperInterface
|
||||
public function getAttachmentContent(Attachment $attachment): string;
|
||||
|
||||
/**
|
||||
* Get the location of an attachment.
|
||||
*
|
||||
* @param Attachment $attachment
|
||||
*
|
||||
* @return string
|
||||
@ -47,16 +51,22 @@ interface AttachmentHelperInterface
|
||||
public function getAttachmentLocation(Attachment $attachment): string;
|
||||
|
||||
/**
|
||||
* Get all attachments.
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
public function getAttachments(): Collection;
|
||||
|
||||
/**
|
||||
* Get all errors.
|
||||
*
|
||||
* @return MessageBag
|
||||
*/
|
||||
public function getErrors(): MessageBag;
|
||||
|
||||
/**
|
||||
* Get all messages/
|
||||
*
|
||||
* @return MessageBag
|
||||
*/
|
||||
public function getMessages(): MessageBag;
|
||||
@ -72,6 +82,8 @@ interface AttachmentHelperInterface
|
||||
public function saveAttachmentFromApi(Attachment $attachment, string $content): bool;
|
||||
|
||||
/**
|
||||
* Save attachments that got uploaded.
|
||||
*
|
||||
* @param Model $model
|
||||
* @param null|array $files
|
||||
*
|
||||
|
@ -18,6 +18,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Helpers\Chart;
|
||||
@ -44,6 +45,14 @@ use Steam;
|
||||
*/
|
||||
class MetaPieChart implements MetaPieChartInterface
|
||||
{
|
||||
/** @var array */
|
||||
static protected $grouping
|
||||
= [
|
||||
'account' => ['opposing_account_id'],
|
||||
'budget' => ['transaction_journal_budget_id', 'transaction_budget_id'],
|
||||
'category' => ['transaction_journal_category_id', 'transaction_category_id'],
|
||||
'tag' => [],
|
||||
];
|
||||
/** @var Collection */
|
||||
protected $accounts;
|
||||
/** @var Collection */
|
||||
@ -55,14 +64,6 @@ class MetaPieChart implements MetaPieChartInterface
|
||||
/** @var Carbon */
|
||||
protected $end;
|
||||
/** @var array */
|
||||
protected $grouping
|
||||
= [
|
||||
'account' => ['opposing_account_id'],
|
||||
'budget' => ['transaction_journal_budget_id', 'transaction_budget_id'],
|
||||
'category' => ['transaction_journal_category_id', 'transaction_category_id'],
|
||||
'tag' => [],
|
||||
];
|
||||
/** @var array */
|
||||
protected $repositories
|
||||
= [
|
||||
'account' => AccountRepositoryInterface::class,
|
||||
@ -95,13 +96,12 @@ class MetaPieChart implements MetaPieChartInterface
|
||||
* @param string $group
|
||||
*
|
||||
* @return array
|
||||
*
|
||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||
*/
|
||||
public function generate(string $direction, string $group): array
|
||||
{
|
||||
$transactions = $this->getTransactions($direction);
|
||||
$grouped = $this->groupByFields($transactions, $this->grouping[$group]);
|
||||
$grouped = $this->groupByFields($transactions, self::$grouping[$group]);
|
||||
$chartData = $this->organizeByType($group, $grouped);
|
||||
$key = (string)trans('firefly.everything_else');
|
||||
|
||||
@ -295,24 +295,28 @@ class MetaPieChart implements MetaPieChartInterface
|
||||
* @return array
|
||||
*
|
||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||
*
|
||||
*/
|
||||
protected function groupByFields(Collection $set, array $fields): array
|
||||
{
|
||||
$grouped = [];
|
||||
if (0 === \count($fields) && $this->tags->count() > 0) {
|
||||
// do a special group on tags:
|
||||
return $this->groupByTag($set); // @codeCoverageIgnore
|
||||
$grouped = $this->groupByTag($set); // @codeCoverageIgnore
|
||||
}
|
||||
|
||||
$grouped = [];
|
||||
/** @var Transaction $transaction */
|
||||
foreach ($set as $transaction) {
|
||||
$values = [];
|
||||
foreach ($fields as $field) {
|
||||
$values[] = (int)$transaction->$field;
|
||||
if (0 !== \count($fields) || $this->tags->count() <= 0) {
|
||||
$grouped = [];
|
||||
/** @var Transaction $transaction */
|
||||
foreach ($set as $transaction) {
|
||||
$values = [];
|
||||
foreach ($fields as $field) {
|
||||
$values[] = (int)$transaction->$field;
|
||||
}
|
||||
$value = max($values);
|
||||
$grouped[$value] = $grouped[$value] ?? '0';
|
||||
$grouped[$value] = bcadd($transaction->transaction_amount, $grouped[$value]);
|
||||
}
|
||||
$value = max($values);
|
||||
$grouped[$value] = $grouped[$value] ?? '0';
|
||||
$grouped[$value] = bcadd($transaction->transaction_amount, $grouped[$value]);
|
||||
}
|
||||
|
||||
return $grouped;
|
||||
|
@ -46,7 +46,7 @@ class Balance
|
||||
/**
|
||||
* @param BalanceLine $line
|
||||
*/
|
||||
public function addBalanceLine(BalanceLine $line)
|
||||
public function addBalanceLine(BalanceLine $line): void
|
||||
{
|
||||
$this->balanceLines->push($line);
|
||||
}
|
||||
@ -62,7 +62,7 @@ class Balance
|
||||
/**
|
||||
* @param BalanceHeader $balanceHeader
|
||||
*/
|
||||
public function setBalanceHeader(BalanceHeader $balanceHeader)
|
||||
public function setBalanceHeader(BalanceHeader $balanceHeader): void
|
||||
{
|
||||
$this->balanceHeader = $balanceHeader;
|
||||
}
|
||||
@ -78,7 +78,7 @@ class Balance
|
||||
/**
|
||||
* @param Collection $balanceLines
|
||||
*/
|
||||
public function setBalanceLines(Collection $balanceLines)
|
||||
public function setBalanceLines(Collection $balanceLines): void
|
||||
{
|
||||
$this->balanceLines = $balanceLines;
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ class BalanceEntry
|
||||
/**
|
||||
* @param AccountModel $account
|
||||
*/
|
||||
public function setAccount(AccountModel $account)
|
||||
public function setAccount(AccountModel $account): void
|
||||
{
|
||||
$this->account = $account;
|
||||
}
|
||||
@ -63,7 +63,7 @@ class BalanceEntry
|
||||
/**
|
||||
* @param string $left
|
||||
*/
|
||||
public function setLeft(string $left)
|
||||
public function setLeft(string $left): void
|
||||
{
|
||||
$this->left = $left;
|
||||
}
|
||||
@ -79,7 +79,7 @@ class BalanceEntry
|
||||
/**
|
||||
* @param string $spent
|
||||
*/
|
||||
public function setSpent(string $spent)
|
||||
public function setSpent(string $spent): void
|
||||
{
|
||||
$this->spent = $spent;
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ class BalanceHeader
|
||||
/**
|
||||
* @param AccountModel $account
|
||||
*/
|
||||
public function addAccount(AccountModel $account)
|
||||
public function addAccount(AccountModel $account): void
|
||||
{
|
||||
$this->accounts->push($account);
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ class BalanceLine
|
||||
/**
|
||||
* @param BalanceEntry $balanceEntry
|
||||
*/
|
||||
public function addBalanceEntry(BalanceEntry $balanceEntry)
|
||||
public function addBalanceEntry(BalanceEntry $balanceEntry): void
|
||||
{
|
||||
$this->balanceEntries->push($balanceEntry);
|
||||
}
|
||||
@ -78,7 +78,7 @@ class BalanceLine
|
||||
/**
|
||||
* @param Collection $balanceEntries
|
||||
*/
|
||||
public function setBalanceEntries(Collection $balanceEntries)
|
||||
public function setBalanceEntries(Collection $balanceEntries): void
|
||||
{
|
||||
$this->balanceEntries = $balanceEntries;
|
||||
}
|
||||
@ -94,7 +94,7 @@ class BalanceLine
|
||||
/**
|
||||
* @param BudgetModel $budget
|
||||
*/
|
||||
public function setBudget(BudgetModel $budget)
|
||||
public function setBudget(BudgetModel $budget): void
|
||||
{
|
||||
$this->budget = $budget;
|
||||
}
|
||||
@ -110,7 +110,7 @@ class BalanceLine
|
||||
/**
|
||||
* @param BudgetLimit $budgetLimit
|
||||
*/
|
||||
public function setBudgetLimit(BudgetLimit $budgetLimit)
|
||||
public function setBudgetLimit(BudgetLimit $budgetLimit): void
|
||||
{
|
||||
$this->budgetLimit = $budgetLimit;
|
||||
}
|
||||
@ -118,7 +118,7 @@ class BalanceLine
|
||||
/**
|
||||
* @return Carbon
|
||||
*/
|
||||
public function getEndDate()
|
||||
public function getEndDate(): Carbon
|
||||
{
|
||||
return $this->budgetLimit->end_date ?? new Carbon;
|
||||
}
|
||||
@ -134,7 +134,7 @@ class BalanceLine
|
||||
/**
|
||||
* @param int $role
|
||||
*/
|
||||
public function setRole(int $role)
|
||||
public function setRole(int $role): void
|
||||
{
|
||||
$this->role = $role;
|
||||
}
|
||||
@ -142,29 +142,28 @@ class BalanceLine
|
||||
/**
|
||||
* @return Carbon
|
||||
*/
|
||||
public function getStartDate()
|
||||
public function getStartDate(): Carbon
|
||||
{
|
||||
return $this->budgetLimit->start_date ?? new Carbon;
|
||||
}
|
||||
|
||||
/**
|
||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTitle(): string
|
||||
{
|
||||
$title = '';
|
||||
if ($this->getBudget() instanceof BudgetModel && null !== $this->getBudget()->id) {
|
||||
return $this->getBudget()->name;
|
||||
$title = $this->getBudget()->name;
|
||||
}
|
||||
if (self::ROLE_DEFAULTROLE === $this->getRole()) {
|
||||
return (string)trans('firefly.no_budget');
|
||||
if ('' === $title && self::ROLE_DEFAULTROLE === $this->getRole()) {
|
||||
$title = (string)trans('firefly.no_budget');
|
||||
}
|
||||
if (self::ROLE_TAGROLE === $this->getRole()) {
|
||||
return (string)trans('firefly.coveredWithTags');
|
||||
if ('' === $title && self::ROLE_TAGROLE === $this->getRole()) {
|
||||
$title = (string)trans('firefly.coveredWithTags');
|
||||
}
|
||||
|
||||
return '';
|
||||
return $title;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -52,7 +52,7 @@ class Bill
|
||||
/**
|
||||
* @param BillLine $bill
|
||||
*/
|
||||
public function addBill(BillLine $bill)
|
||||
public function addBill(BillLine $bill): void
|
||||
{
|
||||
$this->bills->push($bill);
|
||||
}
|
||||
@ -60,7 +60,7 @@ class Bill
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function filterBills()
|
||||
public function filterBills(): void
|
||||
{
|
||||
Log::debug('Now in filterBills()');
|
||||
/** @var BillRepositoryInterface $repository */
|
||||
@ -114,7 +114,7 @@ class Bill
|
||||
/**
|
||||
* @param Carbon $endDate
|
||||
*/
|
||||
public function setEndDate(Carbon $endDate)
|
||||
public function setEndDate(Carbon $endDate): void
|
||||
{
|
||||
$this->endDate = $endDate;
|
||||
}
|
||||
@ -122,7 +122,7 @@ class Bill
|
||||
/**
|
||||
* @param Carbon $startDate
|
||||
*/
|
||||
public function setStartDate(Carbon $startDate)
|
||||
public function setStartDate(Carbon $startDate): void
|
||||
{
|
||||
$this->startDate = $startDate;
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ class BillLine
|
||||
/**
|
||||
* @param string $amount
|
||||
*/
|
||||
public function setAmount(string $amount)
|
||||
public function setAmount(string $amount): void
|
||||
{
|
||||
$this->amount = $amount;
|
||||
}
|
||||
@ -84,7 +84,7 @@ class BillLine
|
||||
/**
|
||||
* @param BillModel $bill
|
||||
*/
|
||||
public function setBill(BillModel $bill)
|
||||
public function setBill(BillModel $bill): void
|
||||
{
|
||||
$this->bill = $bill;
|
||||
}
|
||||
@ -116,7 +116,7 @@ class BillLine
|
||||
/**
|
||||
* @param Carbon $lastHitDate
|
||||
*/
|
||||
public function setLastHitDate(Carbon $lastHitDate)
|
||||
public function setLastHitDate(Carbon $lastHitDate): void
|
||||
{
|
||||
$this->lastHitDate = $lastHitDate;
|
||||
}
|
||||
@ -132,7 +132,7 @@ class BillLine
|
||||
/**
|
||||
* @param string $max
|
||||
*/
|
||||
public function setMax(string $max)
|
||||
public function setMax(string $max): void
|
||||
{
|
||||
$this->max = $max;
|
||||
}
|
||||
@ -148,7 +148,7 @@ class BillLine
|
||||
/**
|
||||
* @param string $min
|
||||
*/
|
||||
public function setMin(string $min)
|
||||
public function setMin(string $min): void
|
||||
{
|
||||
$this->min = $min;
|
||||
}
|
||||
@ -180,7 +180,7 @@ class BillLine
|
||||
/**
|
||||
* @param int $transactionJournalId
|
||||
*/
|
||||
public function setTransactionJournalId(int $transactionJournalId)
|
||||
public function setTransactionJournalId(int $transactionJournalId): void
|
||||
{
|
||||
$this->transactionJournalId = $transactionJournalId;
|
||||
}
|
||||
@ -204,7 +204,7 @@ class BillLine
|
||||
/**
|
||||
* @param bool $hit
|
||||
*/
|
||||
public function setHit(bool $hit)
|
||||
public function setHit(bool $hit): void
|
||||
{
|
||||
$this->hit = $hit;
|
||||
}
|
||||
|
@ -46,19 +46,19 @@ class Category
|
||||
/**
|
||||
* @param CategoryModel $category
|
||||
*/
|
||||
public function addCategory(CategoryModel $category)
|
||||
public function addCategory(CategoryModel $category): void
|
||||
{
|
||||
// spent is minus zero for an expense report:
|
||||
if ($category->spent < 0) {
|
||||
$this->categories->push($category);
|
||||
$this->addTotal($category->spent);
|
||||
$this->addTotal((string)$category->spent);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $add
|
||||
*/
|
||||
public function addTotal(string $add)
|
||||
public function addTotal(string $add): void
|
||||
{
|
||||
$this->total = bcadd($this->total, $add);
|
||||
}
|
||||
|
@ -18,6 +18,8 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
/** @noinspection PhpDynamicAsStaticMethodCallInspection */
|
||||
/** @noinspection PropertyCanBeStaticInspection */
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Helpers\Collector;
|
||||
@ -50,14 +52,14 @@ use Log;
|
||||
use Steam;
|
||||
|
||||
/**
|
||||
* TODO rename references to journals to transactions
|
||||
* Maybe this is a good idea after all...
|
||||
*
|
||||
* Class JournalCollector
|
||||
*
|
||||
*
|
||||
* @SuppressWarnings(PHPMD.TooManyPublicMethods)
|
||||
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
|
||||
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
||||
* @SuppressWarnings(PHPMD.TooManyPublicMethods)
|
||||
*
|
||||
*/
|
||||
class JournalCollector implements JournalCollectorInterface
|
||||
{
|
||||
@ -66,6 +68,7 @@ class JournalCollector implements JournalCollectorInterface
|
||||
private $accountIds = [];
|
||||
/** @var int */
|
||||
private $count = 0;
|
||||
|
||||
/** @var array */
|
||||
private $fields
|
||||
= [
|
||||
@ -139,7 +142,7 @@ class JournalCollector implements JournalCollectorInterface
|
||||
public function addFilter(string $filter): JournalCollectorInterface
|
||||
{
|
||||
$interfaces = class_implements($filter);
|
||||
if (\in_array(FilterInterface::class, $interfaces) && !\in_array($filter, $this->filters)) {
|
||||
if (\in_array(FilterInterface::class, $interfaces, true) && !\in_array($filter, $this->filters, true)) {
|
||||
Log::debug(sprintf('Enabled filter %s', $filter));
|
||||
$this->filters[] = $filter;
|
||||
}
|
||||
@ -245,8 +248,11 @@ class JournalCollector implements JournalCollectorInterface
|
||||
return $this->count;
|
||||
}
|
||||
|
||||
/** @noinspection MultipleReturnStatementsInspection */
|
||||
/**
|
||||
* @return Collection
|
||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
||||
*/
|
||||
public function getJournals(): Collection
|
||||
{
|
||||
@ -266,9 +272,6 @@ class JournalCollector implements JournalCollectorInterface
|
||||
return $cache->get(); // @codeCoverageIgnore
|
||||
|
||||
}
|
||||
if (true === $this->ignoreCache) {
|
||||
Log::debug('Ignore cache in journal collector.');
|
||||
}
|
||||
/** @var Collection $set */
|
||||
$set = $this->query->get(array_values($this->fields));
|
||||
|
||||
@ -468,18 +471,17 @@ class JournalCollector implements JournalCollectorInterface
|
||||
public function setBudgets(Collection $budgets): JournalCollectorInterface
|
||||
{
|
||||
$budgetIds = $budgets->pluck('id')->toArray();
|
||||
if (0 === \count($budgetIds)) {
|
||||
return $this;
|
||||
}
|
||||
$this->joinBudgetTables();
|
||||
Log::debug('Journal collector will filter for budgets', $budgetIds);
|
||||
if (0 !== \count($budgetIds)) {
|
||||
$this->joinBudgetTables();
|
||||
Log::debug('Journal collector will filter for budgets', $budgetIds);
|
||||
|
||||
$this->query->where(
|
||||
function (EloquentBuilder $q) use ($budgetIds) {
|
||||
$q->whereIn('budget_transaction.budget_id', $budgetIds);
|
||||
$q->orWhereIn('budget_transaction_journal.budget_id', $budgetIds);
|
||||
}
|
||||
);
|
||||
$this->query->where(
|
||||
function (EloquentBuilder $q) use ($budgetIds) {
|
||||
$q->whereIn('budget_transaction.budget_id', $budgetIds);
|
||||
$q->orWhereIn('budget_transaction_journal.budget_id', $budgetIds);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
@ -492,17 +494,16 @@ class JournalCollector implements JournalCollectorInterface
|
||||
public function setCategories(Collection $categories): JournalCollectorInterface
|
||||
{
|
||||
$categoryIds = $categories->pluck('id')->toArray();
|
||||
if (0 === \count($categoryIds)) {
|
||||
return $this;
|
||||
}
|
||||
$this->joinCategoryTables();
|
||||
if (0 !== \count($categoryIds)) {
|
||||
$this->joinCategoryTables();
|
||||
|
||||
$this->query->where(
|
||||
function (EloquentBuilder $q) use ($categoryIds) {
|
||||
$q->whereIn('category_transaction.category_id', $categoryIds);
|
||||
$q->orWhereIn('category_transaction_journal.category_id', $categoryIds);
|
||||
}
|
||||
);
|
||||
$this->query->where(
|
||||
function (EloquentBuilder $q) use ($categoryIds) {
|
||||
$q->whereIn('category_transaction.category_id', $categoryIds);
|
||||
$q->orWhereIn('category_transaction_journal.category_id', $categoryIds);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
@ -606,10 +607,7 @@ class JournalCollector implements JournalCollectorInterface
|
||||
$this->offset = $offset;
|
||||
$this->query->skip($offset);
|
||||
Log::debug(sprintf('Changed offset to %d', $offset));
|
||||
|
||||
return $this;
|
||||
}
|
||||
Log::debug('The limit is zero, cannot set the page.');
|
||||
|
||||
return $this;
|
||||
}
|
||||
@ -688,7 +686,7 @@ class JournalCollector implements JournalCollectorInterface
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function startQuery()
|
||||
public function startQuery(): void
|
||||
{
|
||||
Log::debug('journalCollector::startQuery');
|
||||
/** @var EloquentBuilder $query */
|
||||
@ -798,6 +796,7 @@ class JournalCollector implements JournalCollectorInterface
|
||||
foreach ($this->filters as $enabled) {
|
||||
if (isset($filters[$enabled])) {
|
||||
Log::debug(sprintf('Before filter %s: %d', $enabled, $set->count()));
|
||||
/** @var Collection $set */
|
||||
$set = $filters[$enabled]->filter($set);
|
||||
Log::debug(sprintf('After filter %s: %d', $enabled, $set->count()));
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ class InternalTransferFilter implements FilterInterface
|
||||
return $transaction;
|
||||
}
|
||||
// both id's in $parameters?
|
||||
if (\in_array($transaction->account_id, $this->accounts) && \in_array($transaction->opposing_account_id, $this->accounts)) {
|
||||
if (\in_array($transaction->account_id, $this->accounts, true) && \in_array($transaction->opposing_account_id, $this->accounts, true)) {
|
||||
Log::debug(
|
||||
sprintf(
|
||||
'Transaction #%d has #%d and #%d in set, so removed',
|
||||
|
@ -58,7 +58,7 @@ class OpposingAccountFilter implements FilterInterface
|
||||
function (Transaction $transaction) {
|
||||
$opposing = $transaction->opposing_account_id;
|
||||
// remove internal transfer
|
||||
if (\in_array($opposing, $this->accounts)) {
|
||||
if (\in_array($opposing, $this->accounts, true)) {
|
||||
Log::debug(sprintf('Filtered #%d because its opposite is in accounts.', $transaction->id), $this->accounts);
|
||||
|
||||
return null;
|
||||
|
@ -40,7 +40,7 @@ class TransactionViewFilter implements FilterInterface
|
||||
{
|
||||
/**
|
||||
* @param Collection $set
|
||||
*
|
||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||
* @return Collection
|
||||
*/
|
||||
public function filter(Collection $set): Collection
|
||||
|
@ -54,10 +54,10 @@ class FiscalHelper implements FiscalHelperInterface
|
||||
// add 1 year and sub 1 day
|
||||
$endDate->addYear();
|
||||
$endDate->subDay();
|
||||
|
||||
return $endDate;
|
||||
}
|
||||
$endDate->endOfYear();
|
||||
if (false === $this->useCustomFiscalYear) {
|
||||
$endDate->endOfYear();
|
||||
}
|
||||
|
||||
return $endDate;
|
||||
}
|
||||
@ -80,10 +80,10 @@ class FiscalHelper implements FiscalHelperInterface
|
||||
if ($startDate > $date) {
|
||||
$startDate->subYear();
|
||||
}
|
||||
|
||||
return $startDate;
|
||||
}
|
||||
$startDate->startOfYear();
|
||||
if (false === $this->useCustomFiscalYear) {
|
||||
$startDate->startOfYear();
|
||||
}
|
||||
|
||||
return $startDate;
|
||||
}
|
||||
|
@ -65,22 +65,19 @@ class Help implements HelpInterface
|
||||
{
|
||||
$uri = sprintf('https://raw.githubusercontent.com/firefly-iii/help/master/%s/%s.md', $language, $route);
|
||||
Log::debug(sprintf('Trying to get %s...', $uri));
|
||||
$opt = ['headers' => ['User-Agent' => $this->userAgent]];
|
||||
$content = '';
|
||||
$opt = ['headers' => ['User-Agent' => $this->userAgent]];
|
||||
$content = '';
|
||||
$statusCode = 500;
|
||||
$client = new Client;
|
||||
try {
|
||||
$client = new Client;
|
||||
$res = $client->request('GET', $uri, $opt);
|
||||
$res = $client->request('GET', $uri, $opt);
|
||||
$statusCode = $res->getStatusCode();
|
||||
$content = trim($res->getBody()->getContents());
|
||||
} catch (GuzzleException|Exception $e) {
|
||||
Log::error($e);
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
Log::debug(sprintf('Status code is %d', $res->getStatusCode()));
|
||||
|
||||
if (200 === $res->getStatusCode()) {
|
||||
$content = trim($res->getBody()->getContents());
|
||||
}
|
||||
Log::debug(sprintf('Status code is %d', $statusCode));
|
||||
|
||||
if (\strlen($content) > 0) {
|
||||
Log::debug('Content is longer than zero. Expect something.');
|
||||
@ -126,7 +123,7 @@ class Help implements HelpInterface
|
||||
* @param string $language
|
||||
* @param string $content
|
||||
*/
|
||||
public function putInCache(string $route, string $language, string $content)
|
||||
public function putInCache(string $route, string $language, string $content): void
|
||||
{
|
||||
$key = sprintf(self::CACHEKEY, $route, $language);
|
||||
if (\strlen($content) > 0) {
|
||||
|
@ -34,8 +34,6 @@ use Log;
|
||||
|
||||
/**
|
||||
* Class BalanceReportHelper.
|
||||
*
|
||||
* @SuppressWarnings(PHPMD.CouplingBetweenObjects) // I can't really help it.
|
||||
*/
|
||||
class BalanceReportHelper implements BalanceReportHelperInterface
|
||||
{
|
||||
@ -145,8 +143,8 @@ class BalanceReportHelper implements BalanceReportHelperInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||
* @param Balance $balance
|
||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's exactly 5.
|
||||
*
|
||||
* @return Balance
|
||||
*/
|
||||
@ -157,6 +155,7 @@ class BalanceReportHelper implements BalanceReportHelperInterface
|
||||
foreach ($set as $entry) {
|
||||
if (null !== $entry->getBudget()->id) {
|
||||
$sum = '0';
|
||||
/** @var BalanceEntry $balanceEntry */
|
||||
foreach ($entry->getBalanceEntries() as $balanceEntry) {
|
||||
$sum = bcadd($sum, $balanceEntry->getSpent());
|
||||
}
|
||||
|
@ -47,9 +47,8 @@ class BudgetReportHelper implements BudgetReportHelperInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's exactly 5.
|
||||
* @SuppressWarnings(PHPMD.ExcessiveMethodLength) // all the arrays make it long.
|
||||
*
|
||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
* @param Collection $accounts
|
||||
|
@ -119,6 +119,10 @@ class PopupReport implements PopupReportInterface
|
||||
*/
|
||||
public function byExpenses(Account $account, array $attributes): Collection
|
||||
{
|
||||
/** @var JournalRepositoryInterface $repository */
|
||||
$repository = app(JournalRepositoryInterface::class);
|
||||
$repository->setUser($account->user);
|
||||
|
||||
/** @var JournalCollectorInterface $collector */
|
||||
$collector = app(JournalCollectorInterface::class);
|
||||
|
||||
@ -130,9 +134,9 @@ class PopupReport implements PopupReportInterface
|
||||
|
||||
// filter for transfers and withdrawals TO the given $account
|
||||
$journals = $journals->filter(
|
||||
function (Transaction $transaction) use ($report) {
|
||||
function (Transaction $transaction) use ($report, $repository) {
|
||||
// get the destinations:
|
||||
$sources = $transaction->transactionJournal->sourceAccountList()->pluck('id')->toArray();
|
||||
$sources = $repository->getJournalSourceAccounts($transaction->transactionJournal)->pluck('id')->toArray();
|
||||
|
||||
// do these intersect with the current list?
|
||||
return !empty(array_intersect($report, $sources));
|
||||
|
@ -56,10 +56,11 @@ class ReportHelper implements ReportHelperInterface
|
||||
* This method generates a full report for the given period on all
|
||||
* the users bills and their payments.
|
||||
*
|
||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's exactly 5.
|
||||
*
|
||||
* Excludes bills which have not had a payment on the mentioned accounts.
|
||||
*
|
||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
||||
*
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
* @param Collection $accounts
|
||||
@ -82,6 +83,7 @@ class ReportHelper implements ReportHelperInterface
|
||||
foreach ($expectedDates as $payDate) {
|
||||
$endOfPayPeriod = app('navigation')->endOfX($payDate, $bill->repeat_freq, null);
|
||||
|
||||
/** @var JournalCollectorInterface $collector */
|
||||
$collector = app(JournalCollectorInterface::class);
|
||||
$collector->setAccounts($accounts)->setRange($payDate, $endOfPayPeriod)->setBills($bills);
|
||||
$journals = $collector->getJournals();
|
||||
|
@ -34,6 +34,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
*
|
||||
* @property string $name
|
||||
* @property int $id
|
||||
* @property float $spent // used in category reports
|
||||
*/
|
||||
class Category extends Model
|
||||
{
|
||||
|
@ -83,8 +83,11 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
* @property TransactionCurrency $transactionCurrency
|
||||
* @property int $transaction_journal_id
|
||||
* @property TransactionCurrency $foreignCurrency
|
||||
* @property string $before // used in audit reports.
|
||||
* @property string $after // used in audit reports.
|
||||
* @property string $before // used in audit reports.
|
||||
* @property string $after // used in audit reports.
|
||||
* @property int $opposing_id // ID of the opposing transaction, used in collector
|
||||
* @property bool $encrypted // is the journal encrypted
|
||||
* @property $bill_name_encrypted
|
||||
*/
|
||||
class Transaction extends Model
|
||||
{
|
||||
|
@ -28,6 +28,10 @@ use FireflyIII\Models\LinkType;
|
||||
use League\Fractal\TransformerAbstract;
|
||||
use Symfony\Component\HttpFoundation\ParameterBag;
|
||||
|
||||
/**
|
||||
*
|
||||
* Class LinkTypeTransformer
|
||||
*/
|
||||
class LinkTypeTransformer extends TransformerAbstract
|
||||
{
|
||||
|
||||
@ -75,7 +79,7 @@ class LinkTypeTransformer extends TransformerAbstract
|
||||
'name' => $linkType->name,
|
||||
'inward' => $linkType->inward,
|
||||
'outward' => $linkType->outward,
|
||||
'editable' => (int)$linkType->editable,
|
||||
'editable' => 1 === (int)$linkType->editable,
|
||||
'links' => [
|
||||
[
|
||||
'rel' => 'self',
|
||||
|
Loading…
Reference in New Issue
Block a user