Repository Analysis

firefly-iii/firefly-iii

Firefly III: a personal finances manager

1.4 Likely human-written View on GitHub
1.4
Adjusted Score
1.4
Raw Score
100%
Time Factor
2026-05-30
Last Push
23,447
Stars
PHP
Language
327,752
Lines of Code
1849
Files
404
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 3HIGH 1MEDIUM 11LOW 389

Pattern Findings

404 matches across 9 categories. Click a row to expand file-level details.

Hyper-Verbose Identifiers303 hits · 312 pts
SeverityFileLineSnippet
LOWapp/User.php343 public function routeNotificationForPushover(): PushoverReceiver
LOWapp/User.php354 public function routeNotificationForSlack(Notification $notification): ?string
LOWapp/User.php405 public function sendPasswordResetNotification(#[SensitiveParameter] $token): void
LOWapp/TransactionRules/Actions/SetDestinationAccount.php144 private function findWithdrawalDestinationAccount(string $accountName): Account
LOWapp/TransactionRules/Engine/SearchRuleEngine.php485 private function hasSpecificJournalTrigger(array $array): bool
LOWapp/TransactionRules/Engine/SearchRuleEngine.php576 private function processTransactionJournal(Rule $rule, array $transaction): void
LOWapp/TransactionRules/Engine/SearchRuleEngine.php593 private function setDateFromJournalTrigger(array $array): Carbon
LOWapp/Repositories/Journal/JournalRepositoryInterface.php78 public function getAllUncompletedJournals(): Collection;
LOWapp/Repositories/Journal/JournalRepositoryInterface.php120 public function searchJournalDescriptions(string $search, int $limit): Collection;
LOWapp/Repositories/Journal/JournalRepository.php138 public function getAllUncompletedJournals(): Collection
LOWapp/Repositories/Journal/JournalRepository.php256 public function searchJournalDescriptions(string $search, int $limit): Collection
LOWapp/Repositories/UserGroup/UserGroupRepository.php158 public function getMembershipsFromGroupId(int $groupId): Collection
LOW…epositories/UserGroup/UserGroupRepositoryInterface.php53 public function getMembershipsFromGroupId(int $groupId): Collection;
LOW…epositories/Category/OperationsRepositoryInterface.php83 public function sumCollectedTransactionsByCategory(array $expenses, Category $category, string $method, bool $conver
LOWapp/Repositories/Category/OperationsRepository.php397 public function sumCollectedTransactionsByCategory(array $expenses, Category $category, string $method, bool $conver
LOWapp/Repositories/Rule/RuleRepository.php115 public function getHighestOrderInRuleGroup(RuleGroup $ruleGroup): int
LOWapp/Repositories/Rule/RuleRepositoryInterface.php63 public function getHighestOrderInRuleGroup(RuleGroup $ruleGroup): int;
LOW…epositories/PiggyBank/PiggyBankRepositoryInterface.php81 public function getCurrentPrimaryCurrencyAmount(PiggyBank $piggyBank, ?Account $account = null): string;
LOWapp/Repositories/PiggyBank/PiggyBankRepository.php160 public function getCurrentPrimaryCurrencyAmount(PiggyBank $piggyBank, ?Account $account = null): string
LOW…tories/TransactionGroup/TransactionGroupRepository.php448 private function getFormattedForeignAmount(TransactionJournal $journal): string
LOWapp/Repositories/RuleGroup/RuleGroupRepository.php167 public function getAllRuleGroupsWithRules(?string $filter): Collection
LOW…epositories/RuleGroup/RuleGroupRepositoryInterface.php79 public function getAllRuleGroupsWithRules(?string $filter): Collection;
LOWapp/Repositories/Account/AccountRepositoryInterface.php94 public function getCreditTransactionGroup(Account $account): ?TransactionGroup;
LOWapp/Repositories/Account/AccountRepositoryInterface.php96 public function getInactiveAccountsByType(array $types): Collection;
LOWapp/Repositories/Account/AccountRepositoryInterface.php159 public function searchAccountIncludingInactive(string $query, array $types, int $limit): Collection;
LOWapp/Repositories/Account/AccountTasker.php175 private function groupExpenseByDestination(array $array): array
LOWapp/Repositories/Account/AccountRepository.php305 public function getCreditTransactionGroup(Account $account): ?TransactionGroup
LOWapp/Repositories/Account/AccountRepository.php316 public function getInactiveAccountsByType(array $types): Collection
LOWapp/Repositories/Account/AccountRepository.php667 public function searchAccountIncludingInactive(string $query, array $types, int $limit): Collection
LOW…PeriodStatistic/PeriodStatisticRepositoryInterface.php41 public function deleteStatisticsForCollection(Collection $set): void;
LOW…PeriodStatistic/PeriodStatisticRepositoryInterface.php45 public function deleteStatisticsForPrefix(string $prefix, Collection $dates): void;
LOW…sitories/PeriodStatistic/PeriodStatisticRepository.php65 public function deleteStatisticsForCollection(Collection $set): void
LOW…sitories/PeriodStatistic/PeriodStatisticRepository.php99 public function deleteStatisticsForPrefix(string $prefix, Collection $dates): void
LOW…Repositories/Budget/BudgetLimitRepositoryInterface.php72 public function getAllBudgetLimitsByCurrency(TransactionCurrency $currency, ?Carbon $start = null, ?Carbon $end = nu
LOWapp/Repositories/Budget/BudgetRepository.php138 public function budgetedInPeriodForBudget(Budget $budget, Carbon $start, Carbon $end): array
LOW…sitories/Budget/AvailableBudgetRepositoryInterface.php81 public function getAvailableBudgetsByCurrency(TransactionCurrency $currency): Collection;
LOW…sitories/Budget/AvailableBudgetRepositoryInterface.php86 public function getAvailableBudgetsByDate(?Carbon $start, ?Carbon $end): Collection;
LOW…sitories/Budget/AvailableBudgetRepositoryInterface.php88 public function getAvailableBudgetsByExactDate(Carbon $start, Carbon $end): Collection;
LOW…sitories/Budget/AvailableBudgetRepositoryInterface.php90 public function getAvailableBudgetWithCurrency(Carbon $start, Carbon $end): array;
LOW…/Repositories/Budget/OperationsRepositoryInterface.php81 public function sumCollectedExpensesByBudget(array $expenses, Budget $budget, bool $convertToPrimary = false): array
LOWapp/Repositories/Budget/BudgetRepositoryInterface.php56 public function budgetedInPeriodForBudget(Budget $budget, Carbon $start, Carbon $end): array;
LOWapp/Repositories/Budget/OperationsRepository.php291 public function sumCollectedExpensesByBudget(array $expenses, Budget $budget, bool $convertToPrimary = false): array
LOWapp/Repositories/Budget/AvailableBudgetRepository.php177 public function getAvailableBudgetsByCurrency(TransactionCurrency $currency): Collection
LOWapp/Repositories/Budget/AvailableBudgetRepository.php185 public function getAvailableBudgetsByDate(?Carbon $start, ?Carbon $end): Collection
LOWapp/Repositories/Budget/AvailableBudgetRepository.php202 public function getAvailableBudgetsByExactDate(Carbon $start, Carbon $end): Collection
LOWapp/Repositories/Budget/AvailableBudgetRepository.php207 public function getAvailableBudgetWithCurrency(Carbon $start, Carbon $end): array
LOWapp/Repositories/Budget/BudgetLimitRepository.php201 public function getAllBudgetLimitsByCurrency(TransactionCurrency $currency, ?Carbon $start = null, ?Carbon $end = nu
LOWapp/Models/RecurrenceTransaction.php70 public function recurrenceTransactionMeta(): HasMany
LOWapp/Models/PiggyBankRepetition.php49 public function setCurrentAmountAttribute($value): void
LOWapp/Models/Account.php134 public function setVirtualBalanceAttribute(mixed $value): void
LOWapp/Models/Webhook.php74 public static function getDeliveriesForValidation(): array
LOWapp/Models/Webhook.php97 public static function getResponsesForValidation(): array
LOWapp/Transformers/TransactionGroupTransformer.php183 private function getDestinationTransaction(TransactionJournal $journal): Transaction
LOWapp/Support/Steam.php72 public function accountsBalancesOptimized(
LOWapp/Support/Steam.php423 public function finalAccountBalanceInRange(Account $account, Carbon $start, Carbon $end, bool $convertToPrimary): ar
LOWapp/Support/Amount.php226 public function getAmountFromJournalObject(TransactionJournal $journal): string
LOWapp/Support/Amount.php294 public function getPrimaryCurrencyByUserGroup(UserGroup $userGroup): TransactionCurrency
LOWapp/Support/Amount.php320 public function getTransactionCurrencyByCode(string $code): TransactionCurrency
LOWapp/Support/Amount.php342 public function getTransactionCurrencyById(int $currencyId): TransactionCurrency
LOWapp/Support/Navigation.php565 public function preferredCarbonFormatByPeriod(string $period): string
243 more matches not shown…
Over-Commented Block81 hits · 74 pts
SeverityFileLineSnippet
LOWapp/Providers/RouteServiceProvider.php41 #[Override]
LOWapp/Providers/EventServiceProvider.php41 // UpdatedTransactionGroup::class => ['FireflyIII\Handlers\Events\UpdatedGroupEventHandler@ru
LOW…sitories/PeriodStatistic/PeriodStatisticRepository.php61 ;
LOW…sitories/PeriodStatistic/PeriodStatisticRepository.php81 // $this->deleteStatisticsForPrefix('no_category', $dates);
LOWapp/Repositories/Budget/BudgetRepository.php701 // start1 = $start
LOWapp/Support/Search/OperatorQuerySearch.php401 }
LOWapp/Http/Middleware/Authenticate.php101 // foreach ($guards as $guard) {
LOWapp/Api/V1/Controllers/Summary/BasicController.php421 // // $days
LOWapp/Notifications/ReturnsAvailableChannels.php61
LOWapp/Notifications/ReturnsAvailableChannels.php101 }
LOWapp/Notifications/Test/OwnerTestNotificationNtfy.php41 * @SuppressWarnings("PHPMD.UnusedFormalParameter")
LOWapp/Notifications/Test/UserTestNotificationNtfy.php41 * @SuppressWarnings("PHPMD.UnusedFormalParameter")
LOWapp/Notifications/Admin/VersionCheckResult.php61 ->markdown('emails.new-version', ['message' => $this->message])
LOWapp/Notifications/Admin/UserRegistration.php81 // /**
LOWapp/Notifications/Admin/UnknownUserLoginAttempt.php81 //
LOWapp/Notifications/Admin/UserInvitation.php81 // /**
LOW…p/Console/Commands/Correction/CorrectsUnevenAmount.php161 $destination->saveQuietly();
LOW.ci/phpstan.sh1#!/usr/bin/env bash
LOW.ci/phpcs.sh1#!/usr/bin/env bash
LOW.ci/rector.sh1#!/usr/bin/env bash
LOW.ci/all.sh1#!/usr/bin/env bash
LOW.ci/firefly-iii-standard.yml161
LOW.ci/phpmd.sh1#!/usr/bin/env bash
LOWconfig/translations.php121 'account_role_sharedAsset',
LOWpublic/v1/js/lib/vue.js1941 // However, it has subtle problems when state is changed right before repaint
LOWpublic/v1/js/lib/moment/en_US.js1// default
LOWpublic/v1/lib/fc/fullcalendar.js10301 return {
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js1901// @property pointer: Boolean
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js3041 options: {
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js3061
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js3081 // or `L.Canvas` by default depending on browser support.
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js3101 // Whether markers animate their zoom with the zoom animation, if disabled
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js3561 this._enforcingBounds = false;
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js4021 var projectedPoint = this.project(toLatLng(latlng))._round();
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js4141 },
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js4161
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js4301 this._targets = {};
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js4321 // Fired when the user pushes the right mouse button on the map, prevents
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js5761 return this;
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js7441 // @option riseOffset: Number = 250
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js7781 // @section
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js9081 options: {
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js9721 // Max width of the popup, in pixels.
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js9761 // @option autoClose: Boolean = true
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js10221
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js10721 // @aka GridLayer options
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js10761
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js11601 // @aka TileLayer options
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js13221// @section Handlers
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js13241Map.mergeOptions({
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js13261
LOWpublic/v1/lib/leaflet/leaflet-src.esm.js13641// @section Interaction Options
LOWpublic/v1/lib/leaflet/leaflet-src.js1561 //
LOWpublic/v1/lib/leaflet/leaflet-src.js3061
LOWpublic/v1/lib/leaflet/leaflet-src.js3081 // outside the view. To set the restriction dynamically, use
LOWpublic/v1/lib/leaflet/leaflet-src.js3101 // @option fadeAnimation: Boolean = true
LOWpublic/v1/lib/leaflet/leaflet-src.js3121 // right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom.
LOWpublic/v1/lib/leaflet/leaflet-src.js3641
LOWpublic/v1/lib/leaflet/leaflet-src.js4041 // @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds
LOWpublic/v1/lib/leaflet/leaflet-src.js4161 //
21 more matches not shown…
Hallucination Indicators3 hits · 30 pts
SeverityFileLineSnippet
CRITICAL…s/v1/src/components/transactions/CreateTransaction.vue570 response.data.data.attributes.transactions = response.data.data.attributes.transactions.reverse();
CRITICAL…ets/v1/src/components/transactions/EditTransaction.vue894 let transactions = response.data.data.attributes.transactions.reverse();
CRITICALpublic/v1/js/lib/jquery-ui.min.js6(t=>{"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(V){V.ui=V.ui||{};V.ui.version="1.14
Self-Referential Comments6 hits · 18 pts
SeverityFileLineSnippet
MEDIUM.ci/phpstan.sh7# This file is part of Firefly III (https://github.com/firefly-iii).
MEDIUM.ci/phpcs.sh7# This file is part of Firefly III (https://github.com/firefly-iii).
MEDIUM.ci/rector.sh7# This file is part of Firefly III (https://github.com/firefly-iii).
MEDIUM.ci/all.sh7# This file is part of Firefly III (https://github.com/firefly-iii).
MEDIUM.ci/phpmd.sh7# This file is part of Firefly III (https://github.com/firefly-iii).
MEDIUM.github/workflows/release.yml387 # Create a production release.
AI Slop Vocabulary4 hits · 10 pts
SeverityFileLineSnippet
LOWapp/Services/Internal/Support/JournalServiceTrait.php248 Log::debug(sprintf('Was given %s account #%d ("%s") so will simply return that.', $account->accountType->typ
MEDIUMpublic/v1/js/lib/bootstrap-sortable.js249 // If there is one more row in header, delve deeper
MEDIUMpublic/v1/lib/leaflet/leaflet-src.esm.js11632 // If `true` and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom
MEDIUMpublic/v1/lib/leaflet/leaflet-src.js11638 // If `true` and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom
Slop Phrases4 hits · 9 pts
SeverityFileLineSnippet
LOWapp/Api/V1/Controllers/Summary/BasicController.php185 // don't forget to add it to newExpenses and newIncome
LOWconfig/firefly.php783 // if you add fields to this array, don't forget to update the export routine (ExportDataGenerator).
MEDIUMpublic/v1/lib/leaflet/leaflet-src.esm.js7479 * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPop
MEDIUMpublic/v1/lib/leaflet/leaflet-src.js7485 * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPop
Synthetic Comment Markers1 hit · 8 pts
SeverityFileLineSnippet
HIGH.github/security.md6## AI-generated security advisories
Fake / Example Data1 hit · 1 pts
SeverityFileLineSnippet
LOWconfig/mail.php45 'username' => env_default_when_empty(env('MAIL_USERNAME'), 'user@example.com'),
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippet
LOWpublic/v1/js/lib/vue.js4755 function getData (data, vm) {