Classes

Bubble size = executable lines. Hover for details, click to navigate.

0% 20% 40% 60% 80% 100% 0 10 20 30 Line Coverage (%) Cyclomatic Complexity App\Identity\Domain\User — Coverage: 100.0% | Lines: 52 | Complexity: 26 App\Shared\Infrastructure\Persistence\Doctrine\Schema\ForeignKeyConstraintListener — Coverage: 100.0% | Lines: 49 | Complexity: 1 App\Trip\Domain\Trip — Coverage: 100.0% | Lines: 46 | Complexity: 23 App\Identity\Infrastructure\Security\GoogleTokenInfoVerifier — Coverage: 100.0% | Lines: 37 | Complexity: 18 App\Trip\Application\Query\GetTripMembersHandler — Coverage: 100.0% | Lines: 35 | Complexity: 10 App\Trip\Application\TripAccess — Coverage: 100.0% | Lines: 31 | Complexity: 20 App\Expense\Domain\Expense — Coverage: 100.0% | Lines: 29 | Complexity: 14 App\Trip\Application\Query\TripView — Coverage: 100.0% | Lines: 27 | Complexity: 3 App\Expense\Domain\CategorySetting — Coverage: 100.0% | Lines: 26 | Complexity: 14 App\Identity\Application\Query\CurrentUserView — Coverage: 100.0% | Lines: 26 | Complexity: 3 App\Identity\Infrastructure\Console\GrantAdminCommand — Coverage: 92.3% | Lines: 26 | Complexity: 8 App\Shared\Infrastructure\Storage\ImageStorage — Coverage: 95.8% | Lines: 24 | Complexity: 15 App\Expense\Application\Query\ExpenseView — Coverage: 100.0% | Lines: 23 | Complexity: 3 App\Identity\Application\Command\AdminUpdateUserHandler — Coverage: 100.0% | Lines: 23 | Complexity: 10 App\Identity\Application\Query\AdminUserView — Coverage: 100.0% | Lines: 23 | Complexity: 3 App\Identity\Infrastructure\Controllers\Admin\UpdateUserController — Coverage: 95.7% | Lines: 23 | Complexity: 7 App\Currency\Infrastructure\ExchangeRate\FrankfurterExchangeRateProvider — Coverage: 100.0% | Lines: 22 | Complexity: 8 App\Shared\Infrastructure\Console\PruneMediaCommand — Coverage: 90.9% | Lines: 22 | Complexity: 8 App\Trip\Infrastructure\Controllers\ChangeMemberRoleController — Coverage: 86.4% | Lines: 22 | Complexity: 9 App\Expense\Infrastructure\Controllers\RecordExpenseController — Coverage: 100.0% | Lines: 21 | Complexity: 6 App\Expense\Infrastructure\Controllers\UpdateExpenseController — Coverage: 95.2% | Lines: 21 | Complexity: 7 App\Trip\Infrastructure\Controllers\UpdateTripController — Coverage: 100.0% | Lines: 21 | Complexity: 6 App\Identity\Application\Command\SignInWithGoogleHandler — Coverage: 100.0% | Lines: 20 | Complexity: 5 App\Trip\Application\Command\InviteMemberHandler — Coverage: 100.0% | Lines: 20 | Complexity: 7 App\Trip\Infrastructure\Controllers\InviteMemberController — Coverage: 95.0% | Lines: 20 | Complexity: 7 App\Expense\Application\Command\RecordExpenseHandler — Coverage: 100.0% | Lines: 19 | Complexity: 2 App\Identity\Infrastructure\Trip\MemberDirectoryAdapter — Coverage: 100.0% | Lines: 19 | Complexity: 8 App\Trip\Application\Query\ListMyInvitationsHandler — Coverage: 100.0% | Lines: 19 | Complexity: 5 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository — Coverage: 100.0% | Lines: 19 | Complexity: 7 App\Expense\Domain\Category — Coverage: 100.0% | Lines: 18 | Complexity: 18 App\Identity\Infrastructure\Controllers\UpdateUserController — Coverage: 100.0% | Lines: 18 | Complexity: 5 App\Identity\Infrastructure\Security\SecurityUser — Coverage: 100.0% | Lines: 18 | Complexity: 11 App\Trip\Infrastructure\Controllers\RemoveMemberController — Coverage: 100.0% | Lines: 18 | Complexity: 8 App\Expense\Application\Command\UpdateExpenseHandler — Coverage: 100.0% | Lines: 16 | Complexity: 2 App\Identity\Application\Command\RegisterUserHandler — Coverage: 100.0% | Lines: 16 | Complexity: 3 App\Trip\Application\Command\AcceptInvitationHandler — Coverage: 100.0% | Lines: 16 | Complexity: 6 App\Currency\Application\Query\ListCurrenciesHandler — Coverage: 100.0% | Lines: 15 | Complexity: 3 App\Identity\Infrastructure\Controllers\RegisterUserController — Coverage: 100.0% | Lines: 15 | Complexity: 4 App\Shared\Infrastructure\Controllers\FileController — Coverage: 100.0% | Lines: 15 | Complexity: 4 App\Trip\Infrastructure\Controllers\CreateTripController — Coverage: 100.0% | Lines: 15 | Complexity: 3 App\Trip\Infrastructure\Controllers\SetTripImageController — Coverage: 100.0% | Lines: 15 | Complexity: 7 App\Expense\Infrastructure\Controllers\Admin\UpdateCategoryController — Coverage: 100.0% | Lines: 14 | Complexity: 4 App\Identity\Application\Command\UpdateUserHandler — Coverage: 100.0% | Lines: 14 | Complexity: 4 App\Identity\Infrastructure\Security\GoogleAuthenticator — Coverage: 100.0% | Lines: 14 | Complexity: 9 App\Identity\Infrastructure\Security\SymfonyValidatorPasswordPolicy — Coverage: 100.0% | Lines: 14 | Complexity: 4 App\Shared\Infrastructure\Persistence\Doctrine\Type\UuidType — Coverage: 100.0% | Lines: 14 | Complexity: 6 App\Trip\Domain\TripInvitation — Coverage: 100.0% | Lines: 14 | Complexity: 13 App\Trip\Infrastructure\Controllers\CancelInvitationController — Coverage: 100.0% | Lines: 14 | Complexity: 6 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository — Coverage: 100.0% | Lines: 14 | Complexity: 7 App\Shared\Infrastructure\Http\ReadsJsonPayload — Coverage: 92.9% | Lines: 14 | Complexity: 8 App\Identity\Domain\ValueObject\BirthDate — Coverage: 100.0% | Lines: 13 | Complexity: 10 App\Identity\Infrastructure\Controllers\ChangePasswordController — Coverage: 100.0% | Lines: 13 | Complexity: 4 App\Shared\Infrastructure\Persistence\Doctrine\Type\CurrencyType — Coverage: 100.0% | Lines: 13 | Complexity: 6 App\Trip\Application\Command\CreateTripHandler — Coverage: 100.0% | Lines: 13 | Complexity: 2 App\Trip\Application\OwnershipTransferOnUserDeletion — Coverage: 100.0% | Lines: 13 | Complexity: 7 App\Expense\Infrastructure\Persistence\Doctrine\Type\CategoryType — Coverage: 100.0% | Lines: 12 | Complexity: 6 App\Health\Application\Query\HealthCheckHandler — Coverage: 100.0% | Lines: 12 | Complexity: 4 App\Identity\Application\Query\ListUsersHandler — Coverage: 100.0% | Lines: 12 | Complexity: 2 App\Identity\Infrastructure\Controllers\Admin\DeleteUserController — Coverage: 91.7% | Lines: 12 | Complexity: 5 App\Identity\Infrastructure\Persistence\Doctrine\Type\EmailType — Coverage: 100.0% | Lines: 12 | Complexity: 6 App\Identity\Infrastructure\Persistence\Doctrine\Type\HashedPasswordType — Coverage: 100.0% | Lines: 12 | Complexity: 6 App\Identity\Infrastructure\Persistence\Doctrine\Type\UserStatusType — Coverage: 50.0% | Lines: 12 | Complexity: 6 App\Identity\Infrastructure\Security\UserProvider — Coverage: 100.0% | Lines: 12 | Complexity: 8 App\Trip\Application\Command\RemoveMemberHandler — Coverage: 100.0% | Lines: 12 | Complexity: 6 App\Trip\Infrastructure\Persistence\Doctrine\Type\InvitationStatusType — Coverage: 100.0% | Lines: 12 | Complexity: 6 App\Trip\Infrastructure\Persistence\Doctrine\Type\TripRoleType — Coverage: 100.0% | Lines: 12 | Complexity: 6 App\Currency\Infrastructure\Controllers\GetRateController — Coverage: 100.0% | Lines: 11 | Complexity: 4 App\Expense\Application\OwnedExpenseFinder — Coverage: 100.0% | Lines: 11 | Complexity: 7 App\Identity\Infrastructure\Controllers\SetMyAvatarController — Coverage: 100.0% | Lines: 11 | Complexity: 5 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository — Coverage: 100.0% | Lines: 11 | Complexity: 8 App\Currency\Application\Query\GetRateHandler — Coverage: 100.0% | Lines: 10 | Complexity: 3 App\Expense\Application\Query\ExpenseViewFactory — Coverage: 100.0% | Lines: 10 | Complexity: 4 App\Expense\Infrastructure\Controllers\DeleteExpenseController — Coverage: 80.0% | Lines: 10 | Complexity: 6 App\Expense\Infrastructure\Controllers\GetExpenseController — Coverage: 100.0% | Lines: 10 | Complexity: 5 App\Expense\Infrastructure\Controllers\ListExpensesController — Coverage: 100.0% | Lines: 10 | Complexity: 4 App\Trip\Application\Command\CancelInvitationHandler — Coverage: 100.0% | Lines: 10 | Complexity: 5 App\Trip\Application\Command\UpdateTripHandler — Coverage: 100.0% | Lines: 10 | Complexity: 2 App\Trip\Infrastructure\Controllers\ArchiveTripController — Coverage: 50.0% | Lines: 10 | Complexity: 5 App\Trip\Infrastructure\Controllers\DeleteTripController — Coverage: 100.0% | Lines: 10 | Complexity: 5 App\Trip\Infrastructure\Controllers\DeleteTripImageController — Coverage: 100.0% | Lines: 10 | Complexity: 5 App\Identity\Application\Port\GoogleIdentity — Coverage: 100.0% | Lines: 9 | Complexity: 7 App\Trip\Application\Command\ChangeMemberRoleHandler — Coverage: 100.0% | Lines: 9 | Complexity: 4 App\Trip\Application\Command\DeclineInvitationHandler — Coverage: 100.0% | Lines: 9 | Complexity: 5 App\Trip\Domain\TripMember — Coverage: 77.8% | Lines: 9 | Complexity: 8 App\Expense\Application\Query\ListCategoriesHandler — Coverage: 100.0% | Lines: 8 | Complexity: 5 App\Expense\Infrastructure\Persistence\Doctrine\DoctrineCategorySettingRepository — Coverage: 100.0% | Lines: 8 | Complexity: 5 App\Expense\Infrastructure\Persistence\Doctrine\DoctrineExpenseRepository — Coverage: 100.0% | Lines: 8 | Complexity: 5 App\Identity\Application\Command\ChangePasswordHandler — Coverage: 100.0% | Lines: 8 | Complexity: 4 App\Shared\Domain\ValueObject\Money — Coverage: 100.0% | Lines: 8 | Complexity: 8 App\Shared\Infrastructure\Storage\SignedImageUrl — Coverage: 100.0% | Lines: 8 | Complexity: 3 App\Trip\Infrastructure\Controllers\AcceptInvitationController — Coverage: 100.0% | Lines: 8 | Complexity: 4 App\Trip\Infrastructure\Controllers\DeclineInvitationController — Coverage: 87.5% | Lines: 8 | Complexity: 4 App\Trip\Infrastructure\Controllers\GetTripController — Coverage: 100.0% | Lines: 8 | Complexity: 4 App\Trip\Infrastructure\Controllers\ListTripMembersController — Coverage: 87.5% | Lines: 8 | Complexity: 4 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripRepository — Coverage: 100.0% | Lines: 8 | Complexity: 5 App\Expense\Application\Command\DeleteExpenseHandler — Coverage: 100.0% | Lines: 7 | Complexity: 2 App\Expense\Application\Command\UpdateCategoryHandler — Coverage: 100.0% | Lines: 7 | Complexity: 2 App\Expense\Application\Query\CategoryView — Coverage: 100.0% | Lines: 7 | Complexity: 1 App\Expense\Application\Query\GetExpenseHandler — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Expense\Application\Query\ListExpensesHandler — Coverage: 100.0% | Lines: 7 | Complexity: 2 App\Identity\Application\Command\ChangeMyAvatarHandler — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Identity\Application\Command\DeleteUserByAdminHandler — Coverage: 100.0% | Lines: 7 | Complexity: 4 App\Trip\Application\Command\ChangeTripImageHandler — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Identity\Domain\UserIdentity — Coverage: 100.0% | Lines: 6 | Complexity: 6 App\Identity\Infrastructure\Controllers\DeleteMyAvatarController — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Identity\Infrastructure\Controllers\DeleteUserController — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Identity\Infrastructure\Controllers\MeController — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Identity\Infrastructure\Security\SymfonyPasswordHasher — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Shared\Domain\ValueObject\Currency — Coverage: 100.0% | Lines: 6 | Complexity: 7 App\Shared\Domain\ValueObject\DateRange — Coverage: 100.0% | Lines: 6 | Complexity: 7 App\Shared\Domain\ValueObject\Uuid — Coverage: 100.0% | Lines: 6 | Complexity: 7 App\Health\Infrastructure\Controllers\HealthCheckController — Coverage: 100.0% | Lines: 5 | Complexity: 3 App\Identity\Application\AuthenticatedUserFinder — Coverage: 100.0% | Lines: 5 | Complexity: 3 App\Identity\Application\Command\DeleteUserHandler — Coverage: 100.0% | Lines: 5 | Complexity: 3 App\Identity\Application\Query\GetCurrentUserHandler — Coverage: 100.0% | Lines: 5 | Complexity: 3 App\Identity\Domain\ValueObject\Email — Coverage: 100.0% | Lines: 5 | Complexity: 5 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserIdentityRepository — Coverage: 100.0% | Lines: 5 | Complexity: 3 App\Shared\Domain\ValueObject\IsoDate — Coverage: 100.0% | Lines: 5 | Complexity: 5 App\Trip\Application\Command\DeleteTripHandler — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Trip\Application\Query\GetTripHandler — Coverage: 100.0% | Lines: 5 | Complexity: 4 App\Trip\Application\Query\ListTripsHandler — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Trip\Application\Query\TripMembersView — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Identity\Domain\ValueObject\HashedPassword — Coverage: 100.0% | Lines: 4 | Complexity: 4 App\Identity\Infrastructure\Controllers\Admin\ListUsersController — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Trip\Application\Command\ArchiveTripHandler — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Trip\Infrastructure\Controllers\ListMyInvitationsController — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Trip\Infrastructure\Controllers\ListTripsController — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Identity\Application\AvatarCleanupOnUserDeletion — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Identity\Domain\Exceptions\AdminSelfAction — Coverage: 100.0% | Lines: 3 | Complexity: 3 App\Identity\Infrastructure\Security\UserChecker — Coverage: 100.0% | Lines: 3 | Complexity: 4 App\Trip\Domain\ValueObject\TripRole — Coverage: 100.0% | Lines: 3 | Complexity: 5 App\Expense\Infrastructure\Http\ValidatesExpenseId — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Identity\Infrastructure\Http\ResolvesAuthenticatedUser — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Identity\Infrastructure\Http\ValidatesUserId — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Trip\Infrastructure\Http\ValidatesInvitationId — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Trip\Infrastructure\Http\ValidatesTripId — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Currency\Infrastructure\Controllers\ListCurrenciesController — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Expense\Infrastructure\Controllers\Admin\ListAdminCategoriesController — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Expense\Infrastructure\Controllers\ListCategoriesController — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Identity\Infrastructure\Controllers\GoogleSignInConfigController — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Trip\Domain\Exceptions\TripAccessDenied — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Currency\Application\Query\GetRateQuery — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Command\DeleteExpenseCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Command\RecordExpenseCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Command\UpdateCategoryCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Command\UpdateExpenseCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Query\GetExpenseQuery — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Query\ListCategoriesQuery — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Query\ListExpensesQuery — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Exceptions\CategoryNotFound — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Exceptions\ExpenseNotFound — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Persistence\Doctrine\Type\ExpenseIdType — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Persistence\Doctrine\Type\ExpenseTripIdType — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\AdminUpdateUserCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\ChangeMyAvatarCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\ChangePasswordCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\DeleteUserByAdminCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\DeleteUserCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\RegisterUserCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\SignInWithGoogleCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\UpdateUserCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Query\GetCurrentUserQuery — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Query\ListUsersQuery — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\Exceptions\EmailAlreadyInUse — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\Exceptions\InvalidCurrentPassword — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\Exceptions\UserNotFound — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\Exceptions\WeakPassword — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\Type\UserIdType — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\AcceptInvitationCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\ArchiveTripCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\CancelInvitationCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\ChangeMemberRoleCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\ChangeTripImageCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\CreateTripCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\DeclineInvitationCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\DeleteTripCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\InviteMemberCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\RemoveMemberCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\UpdateTripCommand — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Port\MemberSummary — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\GetTripMembersQuery — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\GetTripQuery — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\ListMyInvitationsQuery — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\ListTripsQuery — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Exceptions\AlreadyMemberOrInvited — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Exceptions\InvitationNotFound — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Exceptions\InviteeNotFound — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Exceptions\MemberNotFound — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Exceptions\TripNotFound — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\Type\InvitationIdType — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\Type\MemberIdType — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\Type\OwnerIdType — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\Type\TripIdType — Coverage: 100.0% | Lines: 1 | Complexity: 1

 

Sorted by descending CRAP (Change Risk Anti-Patterns) index.

Class CRAP Coverage
App\Identity\Domain\User26100.0%
App\Trip\Domain\Trip23100.0%
App\Trip\Application\TripAccess20100.0%
App\Expense\Domain\Category18100.0%
App\Identity\Infrastructure\Security\GoogleTokenInfoVerifier18100.0%
App\Shared\Infrastructure\Storage\ImageStorage1595.8%
App\Expense\Domain\CategorySetting14100.0%
App\Expense\Domain\Expense14100.0%
App\Trip\Domain\TripInvitation13100.0%
App\Identity\Infrastructure\Security\SecurityUser11100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\UserStatusType10.5050.0%
App\Identity\Application\Command\AdminUpdateUserHandler10100.0%
App\Identity\Domain\ValueObject\BirthDate10100.0%
App\Trip\Application\Query\GetTripMembersHandler10100.0%
App\Trip\Infrastructure\Controllers\ChangeMemberRoleController9.2186.4%
App\Identity\Infrastructure\Security\GoogleAuthenticator9100.0%
App\Trip\Domain\TripMember8.7077.8%
App\Trip\Infrastructure\Controllers\ArchiveTripController8.1250.0%
App\Shared\Infrastructure\Console\PruneMediaCommand8.0590.9%
App\Identity\Infrastructure\Console\GrantAdminCommand8.0392.3%
App\Shared\Infrastructure\Http\ReadsJsonPayload8.0292.9%
App\Currency\Infrastructure\ExchangeRate\FrankfurterExchangeRateProvider8100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository8100.0%
App\Identity\Infrastructure\Security\UserProvider8100.0%
App\Identity\Infrastructure\Trip\MemberDirectoryAdapter8100.0%
App\Shared\Domain\ValueObject\Money8100.0%
App\Trip\Infrastructure\Controllers\RemoveMemberController8100.0%
App\Expense\Application\OwnedExpenseFinder7100.0%
App\Expense\Infrastructure\Controllers\UpdateExpenseController795.2%
App\Identity\Application\Port\GoogleIdentity7100.0%
App\Identity\Infrastructure\Controllers\Admin\UpdateUserController795.7%
App\Shared\Domain\ValueObject\Currency7100.0%
App\Shared\Domain\ValueObject\DateRange7100.0%
App\Shared\Domain\ValueObject\Uuid7100.0%
App\Trip\Application\Command\InviteMemberHandler7100.0%
App\Trip\Application\OwnershipTransferOnUserDeletion7100.0%
App\Trip\Infrastructure\Controllers\InviteMemberController795.0%
App\Trip\Infrastructure\Controllers\SetTripImageController7100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository7100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository7100.0%
App\Expense\Infrastructure\Controllers\DeleteExpenseController6.2980.0%
App\Expense\Infrastructure\Controllers\RecordExpenseController6100.0%
App\Expense\Infrastructure\Persistence\Doctrine\Type\CategoryType6100.0%
App\Identity\Domain\UserIdentity6100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\EmailType6100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\HashedPasswordType6100.0%
App\Shared\Infrastructure\Persistence\Doctrine\Type\CurrencyType6100.0%
App\Shared\Infrastructure\Persistence\Doctrine\Type\UuidType6100.0%
App\Trip\Application\Command\AcceptInvitationHandler6100.0%
App\Trip\Application\Command\RemoveMemberHandler6100.0%
App\Trip\Infrastructure\Controllers\CancelInvitationController6100.0%
App\Trip\Infrastructure\Controllers\UpdateTripController6100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\InvitationStatusType6100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\TripRoleType6100.0%
App\Identity\Infrastructure\Controllers\Admin\DeleteUserController5.0191.7%
App\Expense\Application\Query\ListCategoriesHandler5100.0%
App\Expense\Infrastructure\Controllers\GetExpenseController5100.0%
App\Expense\Infrastructure\Persistence\Doctrine\DoctrineCategorySettingRepository5100.0%
App\Expense\Infrastructure\Persistence\Doctrine\DoctrineExpenseRepository5100.0%
App\Identity\Application\Command\SignInWithGoogleHandler5100.0%
App\Identity\Domain\ValueObject\Email5100.0%
App\Identity\Infrastructure\Controllers\SetMyAvatarController5100.0%
App\Identity\Infrastructure\Controllers\UpdateUserController5100.0%
App\Shared\Domain\ValueObject\IsoDate5100.0%
App\Trip\Application\Command\CancelInvitationHandler5100.0%
App\Trip\Application\Command\DeclineInvitationHandler5100.0%
App\Trip\Application\Query\ListMyInvitationsHandler5100.0%
App\Trip\Domain\ValueObject\TripRole5100.0%
App\Trip\Infrastructure\Controllers\DeleteTripController5100.0%
App\Trip\Infrastructure\Controllers\DeleteTripImageController5100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripRepository5100.0%
App\Trip\Infrastructure\Controllers\DeclineInvitationController4.0387.5%
App\Trip\Infrastructure\Controllers\ListTripMembersController4.0387.5%
App\Currency\Infrastructure\Controllers\GetRateController4100.0%
App\Expense\Application\Query\ExpenseViewFactory4100.0%
App\Expense\Infrastructure\Controllers\Admin\UpdateCategoryController4100.0%
App\Expense\Infrastructure\Controllers\ListExpensesController4100.0%
App\Health\Application\Query\HealthCheckHandler4100.0%
App\Identity\Application\Command\ChangePasswordHandler4100.0%
App\Identity\Application\Command\DeleteUserByAdminHandler4100.0%
App\Identity\Application\Command\UpdateUserHandler4100.0%
App\Identity\Domain\ValueObject\HashedPassword4100.0%
App\Identity\Infrastructure\Controllers\ChangePasswordController4100.0%
App\Identity\Infrastructure\Controllers\RegisterUserController4100.0%
App\Identity\Infrastructure\Security\SymfonyValidatorPasswordPolicy4100.0%
App\Identity\Infrastructure\Security\UserChecker4100.0%
App\Shared\Infrastructure\Controllers\FileController4100.0%
App\Trip\Application\Command\ChangeMemberRoleHandler4100.0%
App\Trip\Application\Query\GetTripHandler4100.0%
App\Trip\Infrastructure\Controllers\AcceptInvitationController4100.0%
App\Trip\Infrastructure\Controllers\GetTripController4100.0%
App\Currency\Application\Query\GetRateHandler3100.0%
App\Currency\Application\Query\ListCurrenciesHandler3100.0%
App\Expense\Application\Query\ExpenseView3100.0%
App\Expense\Application\Query\GetExpenseHandler3100.0%
App\Health\Infrastructure\Controllers\HealthCheckController3100.0%
App\Identity\Application\AuthenticatedUserFinder3100.0%
App\Identity\Application\Command\ChangeMyAvatarHandler3100.0%
App\Identity\Application\Command\DeleteUserHandler3100.0%
App\Identity\Application\Command\RegisterUserHandler3100.0%
App\Identity\Application\Query\AdminUserView3100.0%
App\Identity\Application\Query\CurrentUserView3100.0%
App\Identity\Application\Query\GetCurrentUserHandler3100.0%
App\Identity\Domain\Exceptions\AdminSelfAction3100.0%
App\Identity\Infrastructure\Controllers\DeleteMyAvatarController3100.0%
App\Identity\Infrastructure\Controllers\DeleteUserController3100.0%
App\Identity\Infrastructure\Controllers\MeController3100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserIdentityRepository3100.0%
App\Identity\Infrastructure\Security\SymfonyPasswordHasher3100.0%
App\Shared\Infrastructure\Storage\SignedImageUrl3100.0%
App\Trip\Application\Command\ChangeTripImageHandler3100.0%
App\Trip\Application\Query\TripView3100.0%
App\Trip\Infrastructure\Controllers\CreateTripController3100.0%
App\Currency\Infrastructure\Controllers\ListCurrenciesController2100.0%
App\Expense\Application\Command\DeleteExpenseHandler2100.0%
App\Expense\Application\Command\RecordExpenseHandler2100.0%
App\Expense\Application\Command\UpdateCategoryHandler2100.0%
App\Expense\Application\Command\UpdateExpenseHandler2100.0%
App\Expense\Application\Query\ListExpensesHandler2100.0%
App\Expense\Infrastructure\Controllers\Admin\ListAdminCategoriesController2100.0%
App\Expense\Infrastructure\Controllers\ListCategoriesController2100.0%
App\Identity\Application\AvatarCleanupOnUserDeletion2100.0%
App\Identity\Application\Query\ListUsersHandler2100.0%
App\Identity\Infrastructure\Controllers\Admin\ListUsersController2100.0%
App\Identity\Infrastructure\Controllers\GoogleSignInConfigController2100.0%
App\Trip\Application\Command\ArchiveTripHandler2100.0%
App\Trip\Application\Command\CreateTripHandler2100.0%
App\Trip\Application\Command\DeleteTripHandler2100.0%
App\Trip\Application\Command\UpdateTripHandler2100.0%
App\Trip\Application\Query\ListTripsHandler2100.0%
App\Trip\Application\Query\TripMembersView2100.0%
App\Trip\Domain\Exceptions\TripAccessDenied2100.0%
App\Trip\Infrastructure\Controllers\ListMyInvitationsController2100.0%
App\Trip\Infrastructure\Controllers\ListTripsController2100.0%
App\Expense\Infrastructure\Http\ValidatesExpenseId2100.0%
App\Identity\Infrastructure\Http\ValidatesUserId2100.0%
App\Trip\Infrastructure\Http\ValidatesInvitationId2100.0%
App\Trip\Infrastructure\Http\ValidatesTripId2100.0%
App\Currency\Application\Query\GetRateQuery1100.0%
App\Expense\Application\Command\DeleteExpenseCommand1100.0%
App\Expense\Application\Command\RecordExpenseCommand1100.0%
App\Expense\Application\Command\UpdateCategoryCommand1100.0%
App\Expense\Application\Command\UpdateExpenseCommand1100.0%
App\Expense\Application\Query\CategoryView1100.0%
App\Expense\Application\Query\GetExpenseQuery1100.0%
App\Expense\Application\Query\ListCategoriesQuery1100.0%
App\Expense\Application\Query\ListExpensesQuery1100.0%
App\Expense\Domain\Exceptions\CategoryNotFound1100.0%
App\Expense\Domain\Exceptions\ExpenseNotFound1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\Type\ExpenseIdType1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\Type\ExpenseTripIdType1100.0%
App\Identity\Application\Command\AdminUpdateUserCommand1100.0%
App\Identity\Application\Command\ChangeMyAvatarCommand1100.0%
App\Identity\Application\Command\ChangePasswordCommand1100.0%
App\Identity\Application\Command\DeleteUserByAdminCommand1100.0%
App\Identity\Application\Command\DeleteUserCommand1100.0%
App\Identity\Application\Command\RegisterUserCommand1100.0%
App\Identity\Application\Command\SignInWithGoogleCommand1100.0%
App\Identity\Application\Command\UpdateUserCommand1100.0%
App\Identity\Application\Query\GetCurrentUserQuery1100.0%
App\Identity\Application\Query\ListUsersQuery1100.0%
App\Identity\Domain\Exceptions\EmailAlreadyInUse1100.0%
App\Identity\Domain\Exceptions\InvalidCurrentPassword1100.0%
App\Identity\Domain\Exceptions\UserNotFound1100.0%
App\Identity\Domain\Exceptions\WeakPassword1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\UserIdType1100.0%
App\Shared\Infrastructure\Persistence\Doctrine\Schema\ForeignKeyConstraintListener1100.0%
App\Trip\Application\Command\AcceptInvitationCommand1100.0%
App\Trip\Application\Command\ArchiveTripCommand1100.0%
App\Trip\Application\Command\CancelInvitationCommand1100.0%
App\Trip\Application\Command\ChangeMemberRoleCommand1100.0%
App\Trip\Application\Command\ChangeTripImageCommand1100.0%
App\Trip\Application\Command\CreateTripCommand1100.0%
App\Trip\Application\Command\DeclineInvitationCommand1100.0%
App\Trip\Application\Command\DeleteTripCommand1100.0%
App\Trip\Application\Command\InviteMemberCommand1100.0%
App\Trip\Application\Command\RemoveMemberCommand1100.0%
App\Trip\Application\Command\UpdateTripCommand1100.0%
App\Trip\Application\Port\MemberSummary1100.0%
App\Trip\Application\Query\GetTripMembersQuery1100.0%
App\Trip\Application\Query\GetTripQuery1100.0%
App\Trip\Application\Query\ListMyInvitationsQuery1100.0%
App\Trip\Application\Query\ListTripsQuery1100.0%
App\Trip\Domain\Exceptions\AlreadyMemberOrInvited1100.0%
App\Trip\Domain\Exceptions\InvitationNotFound1100.0%
App\Trip\Domain\Exceptions\InviteeNotFound1100.0%
App\Trip\Domain\Exceptions\MemberNotFound1100.0%
App\Trip\Domain\Exceptions\TripNotFound1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\InvitationIdType1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\MemberIdType1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\OwnerIdType1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\TripIdType1100.0%
App\Identity\Infrastructure\Http\ResolvesAuthenticatedUser1100.0%
App\Currency\Application\Query\ListCurrenciesQuery0100.0%
App\Expense\Domain\ValueObject\ExpenseId0100.0%
App\Expense\Domain\ValueObject\TripId0100.0%
App\Health\Application\Query\HealthCheckQuery0100.0%
App\Identity\Domain\ValueObject\IdentityProvider0100.0%
App\Identity\Domain\ValueObject\UserId0100.0%
App\Identity\Domain\ValueObject\UserStatus0100.0%
App\Identity\Infrastructure\Security\RefreshToken0100.0%
App\Kernel0100.0%
App\Trip\Domain\ValueObject\InvitationId0100.0%
App\Trip\Domain\ValueObject\InvitationStatus0100.0%
App\Trip\Domain\ValueObject\MemberId0100.0%
App\Trip\Domain\ValueObject\OwnerId0100.0%
App\Trip\Domain\ValueObject\TripId0100.0%

Methods

Bubble size = executable lines. Hover for details, click to navigate.

0% 20% 40% 60% 80% 100% 0 5 10 15 20 Line Coverage (%) Cyclomatic Complexity App\Shared\Infrastructure\Persistence\Doctrine\Schema\ForeignKeyConstraintListener::postGenerateSchema — Coverage: 100.0% | Lines: 49 | Complexity: 1 App\Identity\Infrastructure\Security\GoogleTokenInfoVerifier::verify — Coverage: 100.0% | Lines: 34 | Complexity: 15 App\Trip\Application\Query\GetTripMembersHandler::handle — Coverage: 100.0% | Lines: 26 | Complexity: 8 App\Identity\Application\Command\AdminUpdateUserHandler::handle — Coverage: 100.0% | Lines: 22 | Complexity: 9 App\Identity\Infrastructure\Console\GrantAdminCommand::execute — Coverage: 90.9% | Lines: 22 | Complexity: 6 App\Identity\Infrastructure\Controllers\Admin\UpdateUserController::update — Coverage: 95.5% | Lines: 22 | Complexity: 6 App\Expense\Infrastructure\Controllers\RecordExpenseController::record — Coverage: 100.0% | Lines: 20 | Complexity: 5 App\Expense\Infrastructure\Controllers\UpdateExpenseController::update — Coverage: 95.0% | Lines: 20 | Complexity: 6 App\Trip\Infrastructure\Controllers\UpdateTripController::update — Coverage: 100.0% | Lines: 20 | Complexity: 5 App\Identity\Application\Command\SignInWithGoogleHandler::handle — Coverage: 100.0% | Lines: 19 | Complexity: 4 App\Trip\Application\Command\InviteMemberHandler::handle — Coverage: 100.0% | Lines: 19 | Complexity: 6 App\Trip\Infrastructure\Controllers\InviteMemberController::invite — Coverage: 94.7% | Lines: 19 | Complexity: 6 App\Expense\Application\Command\RecordExpenseHandler::handle — Coverage: 100.0% | Lines: 18 | Complexity: 1 App\Trip\Application\Query\ListMyInvitationsHandler::handle — Coverage: 100.0% | Lines: 18 | Complexity: 4 App\Identity\Infrastructure\Controllers\UpdateUserController::update — Coverage: 100.0% | Lines: 17 | Complexity: 4 App\Trip\Infrastructure\Controllers\ChangeMemberRoleController::change — Coverage: 94.1% | Lines: 17 | Complexity: 6 App\Currency\Application\Query\ListCurrenciesHandler::handle — Coverage: 100.0% | Lines: 15 | Complexity: 3 App\Expense\Application\Command\UpdateExpenseHandler::handle — Coverage: 100.0% | Lines: 15 | Complexity: 1 App\Identity\Application\Command\RegisterUserHandler::handle — Coverage: 100.0% | Lines: 15 | Complexity: 2 App\Currency\Infrastructure\ExchangeRate\FrankfurterExchangeRateProvider::lookup — Coverage: 100.0% | Lines: 14 | Complexity: 4 App\Identity\Infrastructure\Controllers\RegisterUserController::register — Coverage: 100.0% | Lines: 14 | Complexity: 3 App\Shared\Infrastructure\Controllers\FileController::show — Coverage: 100.0% | Lines: 14 | Complexity: 3 App\Trip\Infrastructure\Controllers\CreateTripController::create — Coverage: 100.0% | Lines: 14 | Complexity: 2 App\Trip\Infrastructure\Controllers\SetTripImageController::set — Coverage: 100.0% | Lines: 14 | Complexity: 6 App\Expense\Infrastructure\Controllers\Admin\UpdateCategoryController::update — Coverage: 100.0% | Lines: 13 | Complexity: 3 App\Identity\Application\Command\UpdateUserHandler::handle — Coverage: 100.0% | Lines: 13 | Complexity: 3 App\Identity\Application\Query\CurrentUserView::fromUser — Coverage: 100.0% | Lines: 13 | Complexity: 1 App\Identity\Infrastructure\Security\SymfonyValidatorPasswordPolicy::assert — Coverage: 100.0% | Lines: 13 | Complexity: 3 App\Shared\Infrastructure\Console\PruneMediaCommand::execute — Coverage: 84.6% | Lines: 13 | Complexity: 4 App\Shared\Infrastructure\Storage\ImageStorage::store — Coverage: 100.0% | Lines: 13 | Complexity: 7 App\Trip\Application\Query\TripView::fromTrip — Coverage: 100.0% | Lines: 13 | Complexity: 1 App\Trip\Application\Query\TripView::toArray — Coverage: 100.0% | Lines: 13 | Complexity: 1 App\Trip\Domain\Trip::create — Coverage: 100.0% | Lines: 13 | Complexity: 1 App\Trip\Infrastructure\Controllers\CancelInvitationController::cancel — Coverage: 100.0% | Lines: 13 | Complexity: 5 App\Trip\Infrastructure\Controllers\RemoveMemberController::remove — Coverage: 100.0% | Lines: 13 | Complexity: 5 App\Identity\Application\Query\CurrentUserView::toArray — Coverage: 100.0% | Lines: 12 | Complexity: 1 App\Identity\Infrastructure\Controllers\ChangePasswordController::changePassword — Coverage: 100.0% | Lines: 12 | Complexity: 3 App\Identity\Infrastructure\Trip\MemberDirectoryAdapter::summariesOf — Coverage: 100.0% | Lines: 12 | Complexity: 3 App\Trip\Application\Command\CreateTripHandler::handle — Coverage: 100.0% | Lines: 12 | Complexity: 1 App\Expense\Application\Query\ExpenseView::fromExpense — Coverage: 100.0% | Lines: 11 | Complexity: 1 App\Expense\Application\Query\ExpenseView::toArray — Coverage: 100.0% | Lines: 11 | Complexity: 1 App\Expense\Domain\Expense::record — Coverage: 100.0% | Lines: 11 | Complexity: 1 App\Health\Application\Query\HealthCheckHandler::handle — Coverage: 100.0% | Lines: 11 | Complexity: 3 App\Identity\Application\Query\AdminUserView::fromUser — Coverage: 100.0% | Lines: 11 | Complexity: 1 App\Identity\Application\Query\AdminUserView::toArray — Coverage: 100.0% | Lines: 11 | Complexity: 1 App\Identity\Application\Query\ListUsersHandler::handle — Coverage: 100.0% | Lines: 11 | Complexity: 1 App\Identity\Domain\User::register — Coverage: 100.0% | Lines: 11 | Complexity: 1 App\Identity\Domain\User::registerWithoutPassword — Coverage: 100.0% | Lines: 11 | Complexity: 1 App\Identity\Infrastructure\Controllers\Admin\DeleteUserController::delete — Coverage: 90.9% | Lines: 11 | Complexity: 4 App\Trip\Application\Command\RemoveMemberHandler::handle — Coverage: 100.0% | Lines: 11 | Complexity: 5 App\Currency\Infrastructure\Controllers\GetRateController::get — Coverage: 100.0% | Lines: 10 | Complexity: 3 App\Identity\Infrastructure\Controllers\SetMyAvatarController::set — Coverage: 100.0% | Lines: 10 | Complexity: 4 App\Identity\Infrastructure\Security\GoogleAuthenticator::authenticate — Coverage: 100.0% | Lines: 10 | Complexity: 4 App\Currency\Application\Query\GetRateHandler::handle — Coverage: 100.0% | Lines: 9 | Complexity: 2 App\Expense\Application\Query\ExpenseViewFactory::create — Coverage: 100.0% | Lines: 9 | Complexity: 3 App\Expense\Infrastructure\Controllers\DeleteExpenseController::delete — Coverage: 77.8% | Lines: 9 | Complexity: 5 App\Expense\Infrastructure\Controllers\GetExpenseController::get — Coverage: 100.0% | Lines: 9 | Complexity: 4 App\Expense\Infrastructure\Controllers\ListExpensesController::list — Coverage: 100.0% | Lines: 9 | Complexity: 3 App\Trip\Application\Command\CancelInvitationHandler::handle — Coverage: 100.0% | Lines: 9 | Complexity: 4 App\Trip\Application\Command\UpdateTripHandler::handle — Coverage: 100.0% | Lines: 9 | Complexity: 1 App\Trip\Infrastructure\Controllers\ArchiveTripController::archive — Coverage: 44.4% | Lines: 9 | Complexity: 4 App\Trip\Infrastructure\Controllers\DeleteTripController::delete — Coverage: 100.0% | Lines: 9 | Complexity: 4 App\Trip\Infrastructure\Controllers\DeleteTripImageController::delete — Coverage: 100.0% | Lines: 9 | Complexity: 4 App\Identity\Application\Port\GoogleIdentity::nameParts — Coverage: 100.0% | Lines: 8 | Complexity: 6 App\Identity\Infrastructure\Security\SecurityUser::fromDomain — Coverage: 100.0% | Lines: 8 | Complexity: 1 App\Trip\Application\Command\AcceptInvitationHandler::handle — Coverage: 100.0% | Lines: 8 | Complexity: 1 App\Trip\Application\Command\ChangeMemberRoleHandler::handle — Coverage: 100.0% | Lines: 8 | Complexity: 3 App\Trip\Application\Command\DeclineInvitationHandler::handle — Coverage: 100.0% | Lines: 8 | Complexity: 4 App\Trip\Application\OwnershipTransferOnUserDeletion::onUserDeletion — Coverage: 100.0% | Lines: 8 | Complexity: 3 App\Trip\Application\Query\GetTripMembersHandler::memberEntry — Coverage: 100.0% | Lines: 8 | Complexity: 1 App\Trip\Application\TripAccess::accessibleTrips — Coverage: 100.0% | Lines: 8 | Complexity: 4 App\Currency\Infrastructure\ExchangeRate\FrankfurterExchangeRateProvider::rate — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Expense\Application\Query\CategoryView::of — Coverage: 100.0% | Lines: 7 | Complexity: 1 App\Expense\Application\Query\ListCategoriesHandler::handle — Coverage: 100.0% | Lines: 7 | Complexity: 4 App\Expense\Domain\CategorySetting::change — Coverage: 100.0% | Lines: 7 | Complexity: 1 App\Identity\Application\Command\ChangePasswordHandler::handle — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Identity\Domain\ValueObject\BirthDate::__construct — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Identity\Infrastructure\Security\UserProvider::loadUserByIdentifier — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Shared\Infrastructure\Console\PruneMediaCommand::referencedNames — Coverage: 100.0% | Lines: 7 | Complexity: 2 App\Shared\Infrastructure\Storage\SignedImageUrl::for — Coverage: 100.0% | Lines: 7 | Complexity: 2 App\Trip\Application\Command\AcceptInvitationHandler::pendingForMe — Coverage: 100.0% | Lines: 7 | Complexity: 4 App\Trip\Domain\Trip::update — Coverage: 100.0% | Lines: 7 | Complexity: 1 App\Trip\Domain\Trip::sanitizeText — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Trip\Infrastructure\Controllers\AcceptInvitationController::accept — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Trip\Infrastructure\Controllers\DeclineInvitationController::decline — Coverage: 85.7% | Lines: 7 | Complexity: 3 App\Trip\Infrastructure\Controllers\GetTripController::get — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Trip\Infrastructure\Controllers\ListTripMembersController::list — Coverage: 85.7% | Lines: 7 | Complexity: 3 App\Expense\Application\Command\DeleteExpenseHandler::handle — Coverage: 100.0% | Lines: 6 | Complexity: 1 App\Expense\Application\Command\UpdateCategoryHandler::handle — Coverage: 100.0% | Lines: 6 | Complexity: 1 App\Expense\Application\Query\GetExpenseHandler::handle — Coverage: 100.0% | Lines: 6 | Complexity: 2 App\Expense\Application\Query\ListExpensesHandler::handle — Coverage: 100.0% | Lines: 6 | Complexity: 1 App\Expense\Domain\Category::label — Coverage: 100.0% | Lines: 6 | Complexity: 6 App\Expense\Domain\Category::icon — Coverage: 100.0% | Lines: 6 | Complexity: 6 App\Expense\Domain\Category::color — Coverage: 100.0% | Lines: 6 | Complexity: 6 App\Expense\Domain\CategorySetting::normalizeLabel — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Expense\Domain\CategorySetting::normalize — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Expense\Infrastructure\Persistence\Doctrine\Type\CategoryType::convertToDatabaseValue — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Identity\Application\Command\ChangeMyAvatarHandler::handle — Coverage: 100.0% | Lines: 6 | Complexity: 2 App\Identity\Application\Command\DeleteUserByAdminHandler::handle — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Identity\Domain\User::update — Coverage: 100.0% | Lines: 6 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\Type\EmailType::convertToDatabaseValue — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Identity\Infrastructure\Persistence\Doctrine\Type\HashedPasswordType::convertToDatabaseValue — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Identity\Infrastructure\Persistence\Doctrine\Type\UserStatusType::convertToDatabaseValue — Coverage: 50.0% | Lines: 6 | Complexity: 3 App\Identity\Infrastructure\Trip\MemberDirectoryAdapter::findIdByEmail — Coverage: 100.0% | Lines: 6 | Complexity: 4 App\Shared\Infrastructure\Persistence\Doctrine\Type\CurrencyType::convertToDatabaseValue — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Shared\Infrastructure\Persistence\Doctrine\Type\UuidType::convertToDatabaseValue — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Trip\Application\Command\ChangeTripImageHandler::handle — Coverage: 100.0% | Lines: 6 | Complexity: 2 App\Trip\Application\TripAccess::getForExpenseWrite — Coverage: 100.0% | Lines: 6 | Complexity: 4 App\Trip\Application\TripAccess::getForManage — Coverage: 100.0% | Lines: 6 | Complexity: 4 App\Trip\Infrastructure\Persistence\Doctrine\Type\InvitationStatusType::convertToDatabaseValue — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Trip\Infrastructure\Persistence\Doctrine\Type\TripRoleType::convertToDatabaseValue — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Expense\Domain\Expense::update — Coverage: 100.0% | Lines: 5 | Complexity: 1 App\Identity\Domain\User::sanitizeName — Coverage: 100.0% | Lines: 5 | Complexity: 3 App\Identity\Infrastructure\Controllers\DeleteMyAvatarController::delete — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Identity\Infrastructure\Controllers\DeleteUserController::delete — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Identity\Infrastructure\Controllers\MeController::me — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Shared\Domain\ValueObject\IsoDate::parse — Coverage: 100.0% | Lines: 5 | Complexity: 5 App\Shared\Infrastructure\Persistence\Doctrine\Type\UuidType::convertToPHPValue — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Shared\Infrastructure\Storage\ImageStorage::delete — Coverage: 100.0% | Lines: 5 | Complexity: 3 App\Trip\Application\TripAccess::readableWithRole — Coverage: 100.0% | Lines: 5 | Complexity: 3 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::pendingFor — Coverage: 100.0% | Lines: 5 | Complexity: 1 App\Expense\Application\OwnedExpenseFinder::expenseOnTrip — Coverage: 100.0% | Lines: 4 | Complexity: 3 App\Expense\Domain\Expense::assertAmount — Coverage: 100.0% | Lines: 4 | Complexity: 3 App\Expense\Infrastructure\Persistence\Doctrine\DoctrineCategorySettingRepository::all — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Expense\Infrastructure\Persistence\Doctrine\Type\CategoryType::convertToPHPValue — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Health\Infrastructure\Controllers\HealthCheckController::check — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Identity\Application\AuthenticatedUserFinder::getOrFail — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Identity\Application\Command\DeleteUserHandler::handle — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Identity\Application\Query\GetCurrentUserHandler::handle — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Identity\Infrastructure\Persistence\Doctrine\Type\EmailType::convertToPHPValue — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Identity\Infrastructure\Persistence\Doctrine\Type\HashedPasswordType::convertToPHPValue — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Identity\Infrastructure\Persistence\Doctrine\Type\UserStatusType::convertToPHPValue — Coverage: 75.0% | Lines: 4 | Complexity: 2 App\Shared\Infrastructure\Persistence\Doctrine\Type\CurrencyType::convertToPHPValue — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Shared\Infrastructure\Storage\ImageStorage::storedNames — Coverage: 75.0% | Lines: 4 | Complexity: 3 App\Trip\Application\Command\DeleteTripHandler::handle — Coverage: 100.0% | Lines: 4 | Complexity: 1 App\Trip\Application\OwnershipTransferOnUserDeletion::pickHeir — Coverage: 100.0% | Lines: 4 | Complexity: 3 App\Trip\Application\Query\GetTripHandler::handle — Coverage: 100.0% | Lines: 4 | Complexity: 3 App\Trip\Application\Query\ListTripsHandler::handle — Coverage: 100.0% | Lines: 4 | Complexity: 1 App\Trip\Application\Query\TripMembersView::toArray — Coverage: 100.0% | Lines: 4 | Complexity: 1 App\Trip\Domain\Trip::assertBudget — Coverage: 100.0% | Lines: 4 | Complexity: 3 App\Trip\Infrastructure\Controllers\ChangeMemberRoleController::isUuid — Coverage: 50.0% | Lines: 4 | Complexity: 2 App\Trip\Infrastructure\Controllers\RemoveMemberController::isUuid — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::pendingOfTrip — Coverage: 100.0% | Lines: 4 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::pendingOfInvitee — Coverage: 100.0% | Lines: 4 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\Type\InvitationStatusType::convertToPHPValue — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Trip\Infrastructure\Persistence\Doctrine\Type\TripRoleType::convertToPHPValue — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Shared\Infrastructure\Http\ReadsJsonPayload::decodeJsonBody — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Shared\Infrastructure\Http\ReadsJsonPayload::boolField — Coverage: 75.0% | Lines: 4 | Complexity: 2 App\Shared\Infrastructure\Http\ReadsJsonPayload::intField — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Expense\Application\OwnedExpenseFinder::findReadable — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Expense\Application\OwnedExpenseFinder::getForWrite — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Identity\Infrastructure\Console\GrantAdminCommand::configure — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Identity\Infrastructure\Controllers\Admin\ListUsersController::list — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Identity\Infrastructure\Security\SymfonyPasswordHasher::verify — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Identity\Infrastructure\Security\UserProvider::refreshUser — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Shared\Infrastructure\Persistence\Doctrine\Type\CurrencyType::getSQLDeclaration — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Shared\Infrastructure\Persistence\Doctrine\Type\UuidType::getSQLDeclaration — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Trip\Application\Command\ArchiveTripHandler::handle — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Trip\Application\TripAccess::roleFor — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Trip\Domain\TripInvitation::__construct — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Trip\Domain\TripMember::changeRole — Coverage: 66.7% | Lines: 3 | Complexity: 2 App\Trip\Infrastructure\Controllers\ListMyInvitationsController::list — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Trip\Infrastructure\Controllers\ListTripsController::list — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::roleOf — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Expense\Infrastructure\Http\ValidatesExpenseId::parseExpenseId — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Identity\Infrastructure\Http\ResolvesAuthenticatedUser::securityUser — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Identity\Infrastructure\Http\ValidatesUserId::parseUserId — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Trip\Infrastructure\Http\ValidatesInvitationId::parseInvitationId — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Trip\Infrastructure\Http\ValidatesTripId::parseTripId — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Expense\Infrastructure\Persistence\Doctrine\DoctrineCategorySettingRepository::save — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Expense\Infrastructure\Persistence\Doctrine\DoctrineExpenseRepository::save — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Expense\Infrastructure\Persistence\Doctrine\DoctrineExpenseRepository::remove — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Expense\Infrastructure\Persistence\Doctrine\DoctrineExpenseRepository::ofTrip — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Expense\Infrastructure\Persistence\Doctrine\Type\CategoryType::getSQLDeclaration — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Identity\Application\AvatarCleanupOnUserDeletion::onUserDeletion — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Identity\Domain\UserIdentity::__construct — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Identity\Domain\ValueObject\BirthDate::age — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Identity\Domain\ValueObject\Email::__construct — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Identity\Domain\ValueObject\HashedPassword::__construct — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserIdentityRepository::save — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserIdentityRepository::ofProviderSubject — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::save — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::remove — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::paginate — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\Type\EmailType::getSQLDeclaration — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\Type\HashedPasswordType::getSQLDeclaration — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\Type\UserStatusType::getSQLDeclaration — Coverage: 0.0% | Lines: 2 | Complexity: 1 App\Identity\Infrastructure\Security\GoogleTokenInfoVerifier::claim — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Identity\Infrastructure\Security\SecurityUser::getUserIdentifier — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Identity\Infrastructure\Security\SymfonyPasswordHasher::hash — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Identity\Infrastructure\Security\UserChecker::checkPreAuth — Coverage: 100.0% | Lines: 2 | Complexity: 3 App\Shared\Domain\ValueObject\Currency::__construct — Coverage: 100.0% | Lines: 2 | Complexity: 3 App\Shared\Domain\ValueObject\DateRange::__construct — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Shared\Domain\ValueObject\Money::add — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Shared\Domain\ValueObject\Money::assertSameCurrency — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Shared\Domain\ValueObject\Uuid::__construct — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Trip\Domain\TripMember::__construct — Coverage: 50.0% | Lines: 2 | Complexity: 2 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::save — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::remove — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::save — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::remove — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::find — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::ofTrip — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::ofUser — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripRepository::save — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripRepository::remove — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripRepository::ofOwner — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\Type\InvitationStatusType::getSQLDeclaration — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\Type\TripRoleType::getSQLDeclaration — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Shared\Infrastructure\Http\ReadsJsonPayload::stringField — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Currency\Application\Query\GetRateHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Currency\Application\Query\GetRateQuery::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Currency\Infrastructure\Controllers\GetRateController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Currency\Infrastructure\Controllers\ListCurrenciesController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Currency\Infrastructure\Controllers\ListCurrenciesController::list — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Currency\Infrastructure\ExchangeRate\FrankfurterExchangeRateProvider::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Command\DeleteExpenseCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Command\DeleteExpenseHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Command\RecordExpenseCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Command\RecordExpenseHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Command\UpdateCategoryCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Command\UpdateCategoryHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Command\UpdateExpenseCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Command\UpdateExpenseHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\OwnedExpenseFinder::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Query\ExpenseView::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Query\ExpenseViewFactory::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Query\GetExpenseHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Query\GetExpenseQuery::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Query\ListCategoriesHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Query\ListCategoriesQuery::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Query\ListExpensesHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Application\Query\ListExpensesQuery::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\CategorySetting::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\CategorySetting::for — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\CategorySetting::category — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\CategorySetting::label — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\CategorySetting::icon — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\CategorySetting::color — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\CategorySetting::isActive — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Exceptions\CategoryNotFound::withValue — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Exceptions\ExpenseNotFound::withId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Expense::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Expense::belongsToTrip — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Expense::id — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Expense::tripId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Expense::money — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Expense::category — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Expense::description — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Expense::spentAt — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Domain\Expense::createdAt — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Controllers\Admin\ListAdminCategoriesController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Controllers\Admin\ListAdminCategoriesController::list — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Controllers\Admin\UpdateCategoryController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Controllers\DeleteExpenseController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Controllers\GetExpenseController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Controllers\ListCategoriesController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Controllers\ListCategoriesController::list — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Controllers\ListExpensesController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Controllers\RecordExpenseController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Controllers\UpdateExpenseController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Persistence\Doctrine\DoctrineCategorySettingRepository::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Persistence\Doctrine\DoctrineCategorySettingRepository::ofCategory — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Persistence\Doctrine\DoctrineExpenseRepository::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Persistence\Doctrine\DoctrineExpenseRepository::ofId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Persistence\Doctrine\Type\ExpenseIdType::className — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Expense\Infrastructure\Persistence\Doctrine\Type\ExpenseTripIdType::className — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Health\Application\Query\HealthCheckHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Health\Infrastructure\Controllers\HealthCheckController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\AuthenticatedUserFinder::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\AvatarCleanupOnUserDeletion::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\AdminUpdateUserCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\AdminUpdateUserHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\ChangeMyAvatarCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\ChangeMyAvatarHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\ChangePasswordCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\ChangePasswordHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\DeleteUserByAdminCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\DeleteUserByAdminHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\DeleteUserCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\DeleteUserHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\RegisterUserCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\RegisterUserHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\SignInWithGoogleCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\SignInWithGoogleHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\UpdateUserCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Command\UpdateUserHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Port\GoogleIdentity::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Query\AdminUserView::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Query\CurrentUserView::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Query\GetCurrentUserHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Query\GetCurrentUserQuery::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Query\ListUsersHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Application\Query\ListUsersQuery::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\Exceptions\AdminSelfAction::cannotRevokeSelf — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\Exceptions\AdminSelfAction::cannotDeleteSelf — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\Exceptions\AdminSelfAction::cannotSuspendSelf — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\Exceptions\EmailAlreadyInUse::of — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\Exceptions\InvalidCurrentPassword::create — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\Exceptions\UserNotFound::of — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\Exceptions\WeakPassword::of — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::changePassword — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::grantAdmin — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::revokeAdmin — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::isAdmin — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::suspend — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::activate — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::status — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::id — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::email — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::password — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::hasPassword — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::preferredCurrency — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::name — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::surnames — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::birthDate — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Identity\Domain\User::createdAt — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::avatarName — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\User::changeAvatar — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\UserIdentity::provider — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\UserIdentity::subject — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\UserIdentity::userId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\UserIdentity::createdAt — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\ValueObject\BirthDate::fromDate — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\ValueObject\BirthDate::fromNullable — Coverage: 100.0% | Lines: 1 | Complexity: 3 App\Identity\Domain\ValueObject\BirthDate::toDateTimeImmutable — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\ValueObject\BirthDate::value — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\ValueObject\Email::__toString — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\ValueObject\Email::value — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\ValueObject\Email::equals — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\ValueObject\HashedPassword::__toString — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Domain\ValueObject\HashedPassword::value — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Console\GrantAdminCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Controllers\Admin\DeleteUserController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Controllers\Admin\ListUsersController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Controllers\Admin\UpdateUserController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Controllers\ChangePasswordController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Controllers\DeleteMyAvatarController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Controllers\DeleteUserController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Controllers\GoogleSignInConfigController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Controllers\GoogleSignInConfigController::config — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Controllers\MeController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Controllers\RegisterUserController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Controllers\SetMyAvatarController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Controllers\UpdateUserController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserIdentityRepository::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::ofId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::ofEmail — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::existsByEmail — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::count — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Persistence\Doctrine\Type\UserIdType::className — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\GoogleAuthenticator::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\GoogleAuthenticator::supports — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Identity\Infrastructure\Security\GoogleAuthenticator::onAuthenticationSuccess — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\GoogleAuthenticator::onAuthenticationFailure — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\GoogleTokenInfoVerifier::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\SecurityUser::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\SecurityUser::userId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\SecurityUser::preferredCurrency — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\SecurityUser::getPassword — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\SecurityUser::isAdmin — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\SecurityUser::isSuspended — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\SecurityUser::getRoles — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Identity\Infrastructure\Security\SecurityUser::eraseCredentials — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\SymfonyPasswordHasher::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\SymfonyValidatorPasswordPolicy::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\UserChecker::checkPostAuth — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\UserProvider::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Identity\Infrastructure\Security\UserProvider::supportsClass — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Identity\Infrastructure\Trip\MemberDirectoryAdapter::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\Currency::__toString — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\Currency::code — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\Currency::minorUnits — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\Currency::equals — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\DateRange::fromIso — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\DateRange::start — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\DateRange::end — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\DateRange::equals — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Shared\Domain\ValueObject\Money::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\Money::amount — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\Money::currency — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\Money::equals — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Shared\Domain\ValueObject\Uuid::__toString — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\Uuid::generate — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\Uuid::value — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Domain\ValueObject\Uuid::equals — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Shared\Infrastructure\Console\PruneMediaCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Infrastructure\Console\PruneMediaCommand::configure — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Infrastructure\Controllers\FileController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Infrastructure\Storage\ImageStorage::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Infrastructure\Storage\ImageStorage::absolutePath — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Shared\Infrastructure\Storage\SignedImageUrl::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\AcceptInvitationCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\AcceptInvitationHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\ArchiveTripCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\ArchiveTripHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\CancelInvitationCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\CancelInvitationHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\ChangeMemberRoleCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\ChangeMemberRoleHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\ChangeTripImageCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\ChangeTripImageHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\CreateTripCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\CreateTripHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\DeclineInvitationCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\DeclineInvitationHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\DeleteTripCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\DeleteTripHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\InviteMemberCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\InviteMemberHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\RemoveMemberCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\RemoveMemberHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\UpdateTripCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Command\UpdateTripHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\OwnershipTransferOnUserDeletion::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Port\MemberSummary::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\GetTripHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\GetTripMembersHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\GetTripMembersQuery::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\GetTripQuery::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\ListMyInvitationsHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\ListMyInvitationsQuery::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\ListTripsHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\ListTripsQuery::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\TripMembersView::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\Query\TripView::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\TripAccess::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\TripAccess::findReadable — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Application\TripAccess::getReadable — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Exceptions\AlreadyMemberOrInvited::create — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Exceptions\InvitationNotFound::withId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Exceptions\InviteeNotFound::withEmail — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Exceptions\MemberNotFound::withId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Exceptions\TripAccessDenied::cannotWriteExpense — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Exceptions\TripAccessDenied::cannotManageTrip — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Exceptions\TripNotFound::withId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::transferOwnershipTo — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::id — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::ownerId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::isOwnedBy — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::name — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::destination — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::dateRange — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::currency — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::budget — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::createdAt — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::imageName — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::changeImage — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::archive — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\Trip::isArchived — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripInvitation::invite — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripInvitation::accept — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripInvitation::decline — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripInvitation::id — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripInvitation::tripId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripInvitation::inviteeId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripInvitation::inviterId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripInvitation::role — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripInvitation::status — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripInvitation::isPending — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripInvitation::createdAt — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripMember::tripId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripMember::userId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripMember::role — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\TripMember::createdAt — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\ValueObject\TripRole::canWriteExpense — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Trip\Domain\ValueObject\TripRole::canManageTrip — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Domain\ValueObject\TripRole::isStorableMembership — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Trip\Infrastructure\Controllers\AcceptInvitationController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\ArchiveTripController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\CancelInvitationController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\ChangeMemberRoleController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\CreateTripController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\DeclineInvitationController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\DeleteTripController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\DeleteTripImageController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\GetTripController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\InviteMemberController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\ListMyInvitationsController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\ListTripMembersController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\ListTripsController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\RemoveMemberController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\SetTripImageController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Controllers\UpdateTripController::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::ofId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripRepository::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripRepository::ofId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\Type\InvitationIdType::className — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\Type\MemberIdType::className — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\Type\OwnerIdType::className — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Trip\Infrastructure\Persistence\Doctrine\Type\TripIdType::className — Coverage: 100.0% | Lines: 1 | Complexity: 1

 

Sorted by descending CRAP (Change Risk Anti-Patterns) index.

Method CRAP Coverage
App\Identity\Infrastructure\Security\GoogleTokenInfoVerifier::verify15100.0%
App\Identity\Application\Command\AdminUpdateUserHandler::handle9100.0%
App\Trip\Application\Query\GetTripMembersHandler::handle8100.0%
App\Shared\Infrastructure\Storage\ImageStorage::store7100.0%
App\Trip\Infrastructure\Controllers\ArchiveTripController::archive6.7444.4%
App\Identity\Infrastructure\Console\GrantAdminCommand::execute6.0390.9%
App\Trip\Infrastructure\Controllers\ChangeMemberRoleController::change6.0194.1%
App\Trip\Infrastructure\Controllers\InviteMemberController::invite6.0194.7%
App\Expense\Domain\Category::label6100.0%
App\Expense\Domain\Category::icon6100.0%
App\Expense\Domain\Category::color6100.0%
App\Expense\Infrastructure\Controllers\UpdateExpenseController::update695.0%
App\Identity\Application\Port\GoogleIdentity::nameParts6100.0%
App\Identity\Infrastructure\Controllers\Admin\UpdateUserController::update695.5%
App\Trip\Application\Command\InviteMemberHandler::handle6100.0%
App\Trip\Infrastructure\Controllers\SetTripImageController::set6100.0%
App\Expense\Infrastructure\Controllers\DeleteExpenseController::delete5.2777.8%
App\Expense\Infrastructure\Controllers\RecordExpenseController::record5100.0%
App\Shared\Domain\ValueObject\IsoDate::parse5100.0%
App\Trip\Application\Command\RemoveMemberHandler::handle5100.0%
App\Trip\Infrastructure\Controllers\CancelInvitationController::cancel5100.0%
App\Trip\Infrastructure\Controllers\RemoveMemberController::remove5100.0%
App\Trip\Infrastructure\Controllers\UpdateTripController::update5100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\UserStatusType::convertToDatabaseValue4.1250.0%
App\Shared\Infrastructure\Console\PruneMediaCommand::execute4.0684.6%
App\Identity\Infrastructure\Controllers\Admin\DeleteUserController::delete4.0190.9%
App\Currency\Infrastructure\ExchangeRate\FrankfurterExchangeRateProvider::lookup4100.0%
App\Expense\Application\Query\ListCategoriesHandler::handle4100.0%
App\Expense\Infrastructure\Controllers\GetExpenseController::get4100.0%
App\Identity\Application\Command\SignInWithGoogleHandler::handle4100.0%
App\Identity\Infrastructure\Controllers\SetMyAvatarController::set4100.0%
App\Identity\Infrastructure\Controllers\UpdateUserController::update4100.0%
App\Identity\Infrastructure\Security\GoogleAuthenticator::authenticate4100.0%
App\Identity\Infrastructure\Trip\MemberDirectoryAdapter::findIdByEmail4100.0%
App\Trip\Application\Command\AcceptInvitationHandler::pendingForMe4100.0%
App\Trip\Application\Command\CancelInvitationHandler::handle4100.0%
App\Trip\Application\Command\DeclineInvitationHandler::handle4100.0%
App\Trip\Application\Query\ListMyInvitationsHandler::handle4100.0%
App\Trip\Application\TripAccess::getForExpenseWrite4100.0%
App\Trip\Application\TripAccess::getForManage4100.0%
App\Trip\Application\TripAccess::accessibleTrips4100.0%
App\Trip\Infrastructure\Controllers\DeleteTripController::delete4100.0%
App\Trip\Infrastructure\Controllers\DeleteTripImageController::delete4100.0%
App\Shared\Infrastructure\Storage\ImageStorage::storedNames3.1475.0%
App\Trip\Infrastructure\Controllers\DeclineInvitationController::decline3.0385.7%
App\Trip\Infrastructure\Controllers\ListTripMembersController::list3.0385.7%
App\Currency\Application\Query\ListCurrenciesHandler::handle3100.0%
App\Currency\Infrastructure\Controllers\GetRateController::get3100.0%
App\Currency\Infrastructure\ExchangeRate\FrankfurterExchangeRateProvider::rate3100.0%
App\Expense\Application\OwnedExpenseFinder::expenseOnTrip3100.0%
App\Expense\Application\Query\ExpenseViewFactory::create3100.0%
App\Expense\Domain\CategorySetting::normalizeLabel3100.0%
App\Expense\Domain\CategorySetting::normalize3100.0%
App\Expense\Domain\Expense::assertAmount3100.0%
App\Expense\Infrastructure\Controllers\Admin\UpdateCategoryController::update3100.0%
App\Expense\Infrastructure\Controllers\ListExpensesController::list3100.0%
App\Expense\Infrastructure\Persistence\Doctrine\Type\CategoryType::convertToDatabaseValue3100.0%
App\Health\Application\Query\HealthCheckHandler::handle3100.0%
App\Identity\Application\Command\ChangePasswordHandler::handle3100.0%
App\Identity\Application\Command\DeleteUserByAdminHandler::handle3100.0%
App\Identity\Application\Command\UpdateUserHandler::handle3100.0%
App\Identity\Domain\User::sanitizeName3100.0%
App\Identity\Domain\ValueObject\BirthDate::__construct3100.0%
App\Identity\Domain\ValueObject\BirthDate::fromNullable3100.0%
App\Identity\Infrastructure\Controllers\ChangePasswordController::changePassword3100.0%
App\Identity\Infrastructure\Controllers\RegisterUserController::register3100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\EmailType::convertToDatabaseValue3100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\HashedPasswordType::convertToDatabaseValue3100.0%
App\Identity\Infrastructure\Security\SymfonyValidatorPasswordPolicy::assert3100.0%
App\Identity\Infrastructure\Security\UserChecker::checkPreAuth3100.0%
App\Identity\Infrastructure\Security\UserProvider::loadUserByIdentifier3100.0%
App\Identity\Infrastructure\Trip\MemberDirectoryAdapter::summariesOf3100.0%
App\Shared\Domain\ValueObject\Currency::__construct3100.0%
App\Shared\Infrastructure\Controllers\FileController::show3100.0%
App\Shared\Infrastructure\Persistence\Doctrine\Type\CurrencyType::convertToDatabaseValue3100.0%
App\Shared\Infrastructure\Persistence\Doctrine\Type\UuidType::convertToDatabaseValue3100.0%
App\Shared\Infrastructure\Storage\ImageStorage::delete3100.0%
App\Trip\Application\Command\ChangeMemberRoleHandler::handle3100.0%
App\Trip\Application\OwnershipTransferOnUserDeletion::onUserDeletion3100.0%
App\Trip\Application\OwnershipTransferOnUserDeletion::pickHeir3100.0%
App\Trip\Application\Query\GetTripHandler::handle3100.0%
App\Trip\Application\TripAccess::readableWithRole3100.0%
App\Trip\Domain\Trip::sanitizeText3100.0%
App\Trip\Domain\Trip::assertBudget3100.0%
App\Trip\Infrastructure\Controllers\AcceptInvitationController::accept3100.0%
App\Trip\Infrastructure\Controllers\GetTripController::get3100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\InvitationStatusType::convertToDatabaseValue3100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\TripRoleType::convertToDatabaseValue3100.0%
App\Trip\Domain\TripMember::__construct2.5050.0%
App\Trip\Infrastructure\Controllers\ChangeMemberRoleController::isUuid2.5050.0%
App\Trip\Domain\TripMember::changeRole2.1566.7%
App\Identity\Infrastructure\Persistence\Doctrine\Type\UserStatusType::convertToPHPValue2.0675.0%
App\Shared\Infrastructure\Http\ReadsJsonPayload::boolField2.0675.0%
App\Currency\Application\Query\GetRateHandler::handle2100.0%
App\Expense\Application\OwnedExpenseFinder::findReadable2100.0%
App\Expense\Application\Query\GetExpenseHandler::handle2100.0%
App\Expense\Infrastructure\Persistence\Doctrine\DoctrineCategorySettingRepository::all2100.0%
App\Expense\Infrastructure\Persistence\Doctrine\Type\CategoryType::convertToPHPValue2100.0%
App\Health\Infrastructure\Controllers\HealthCheckController::check2100.0%
App\Identity\Application\AuthenticatedUserFinder::getOrFail2100.0%
App\Identity\Application\Command\ChangeMyAvatarHandler::handle2100.0%
App\Identity\Application\Command\DeleteUserHandler::handle2100.0%
App\Identity\Application\Command\RegisterUserHandler::handle2100.0%
App\Identity\Application\Query\GetCurrentUserHandler::handle2100.0%
App\Identity\Domain\User::birthDate2100.0%
App\Identity\Domain\UserIdentity::__construct2100.0%
App\Identity\Domain\ValueObject\Email::__construct2100.0%
App\Identity\Domain\ValueObject\HashedPassword::__construct2100.0%
App\Identity\Infrastructure\Controllers\DeleteMyAvatarController::delete2100.0%
App\Identity\Infrastructure\Controllers\DeleteUserController::delete2100.0%
App\Identity\Infrastructure\Controllers\MeController::me2100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\EmailType::convertToPHPValue2100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\HashedPasswordType::convertToPHPValue2100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\UserStatusType::getSQLDeclaration20.0%
App\Identity\Infrastructure\Security\GoogleAuthenticator::supports2100.0%
App\Identity\Infrastructure\Security\GoogleTokenInfoVerifier::claim2100.0%
App\Identity\Infrastructure\Security\SecurityUser::getRoles2100.0%
App\Identity\Infrastructure\Security\UserProvider::refreshUser2100.0%
App\Identity\Infrastructure\Security\UserProvider::supportsClass2100.0%
App\Shared\Domain\ValueObject\DateRange::__construct2100.0%
App\Shared\Domain\ValueObject\DateRange::equals2100.0%
App\Shared\Domain\ValueObject\Money::equals2100.0%
App\Shared\Domain\ValueObject\Money::assertSameCurrency2100.0%
App\Shared\Domain\ValueObject\Uuid::__construct2100.0%
App\Shared\Domain\ValueObject\Uuid::equals2100.0%
App\Shared\Infrastructure\Console\PruneMediaCommand::referencedNames2100.0%
App\Shared\Infrastructure\Persistence\Doctrine\Type\CurrencyType::convertToPHPValue2100.0%
App\Shared\Infrastructure\Persistence\Doctrine\Type\UuidType::convertToPHPValue2100.0%
App\Shared\Infrastructure\Storage\SignedImageUrl::for2100.0%
App\Trip\Application\Command\ChangeTripImageHandler::handle2100.0%
App\Trip\Application\TripAccess::roleFor2100.0%
App\Trip\Domain\TripInvitation::__construct2100.0%
App\Trip\Domain\ValueObject\TripRole::canWriteExpense2100.0%
App\Trip\Domain\ValueObject\TripRole::isStorableMembership2100.0%
App\Trip\Infrastructure\Controllers\CreateTripController::create2100.0%
App\Trip\Infrastructure\Controllers\RemoveMemberController::isUuid2100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\InvitationStatusType::convertToPHPValue2100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\TripRoleType::convertToPHPValue2100.0%
App\Expense\Infrastructure\Http\ValidatesExpenseId::parseExpenseId2100.0%
App\Identity\Infrastructure\Http\ValidatesUserId::parseUserId2100.0%
App\Shared\Infrastructure\Http\ReadsJsonPayload::decodeJsonBody2100.0%
App\Shared\Infrastructure\Http\ReadsJsonPayload::stringField2100.0%
App\Shared\Infrastructure\Http\ReadsJsonPayload::intField2100.0%
App\Trip\Infrastructure\Http\ValidatesInvitationId::parseInvitationId2100.0%
App\Trip\Infrastructure\Http\ValidatesTripId::parseTripId2100.0%
App\Currency\Application\Query\GetRateHandler::__construct1100.0%
App\Currency\Application\Query\GetRateQuery::__construct1100.0%
App\Currency\Infrastructure\Controllers\GetRateController::__construct1100.0%
App\Currency\Infrastructure\Controllers\ListCurrenciesController::__construct1100.0%
App\Currency\Infrastructure\Controllers\ListCurrenciesController::list1100.0%
App\Currency\Infrastructure\ExchangeRate\FrankfurterExchangeRateProvider::__construct1100.0%
App\Expense\Application\Command\DeleteExpenseCommand::__construct1100.0%
App\Expense\Application\Command\DeleteExpenseHandler::__construct1100.0%
App\Expense\Application\Command\DeleteExpenseHandler::handle1100.0%
App\Expense\Application\Command\RecordExpenseCommand::__construct1100.0%
App\Expense\Application\Command\RecordExpenseHandler::__construct1100.0%
App\Expense\Application\Command\RecordExpenseHandler::handle1100.0%
App\Expense\Application\Command\UpdateCategoryCommand::__construct1100.0%
App\Expense\Application\Command\UpdateCategoryHandler::__construct1100.0%
App\Expense\Application\Command\UpdateCategoryHandler::handle1100.0%
App\Expense\Application\Command\UpdateExpenseCommand::__construct1100.0%
App\Expense\Application\Command\UpdateExpenseHandler::__construct1100.0%
App\Expense\Application\Command\UpdateExpenseHandler::handle1100.0%
App\Expense\Application\OwnedExpenseFinder::__construct1100.0%
App\Expense\Application\OwnedExpenseFinder::getForWrite1100.0%
App\Expense\Application\Query\CategoryView::of1100.0%
App\Expense\Application\Query\ExpenseView::__construct1100.0%
App\Expense\Application\Query\ExpenseView::fromExpense1100.0%
App\Expense\Application\Query\ExpenseView::toArray1100.0%
App\Expense\Application\Query\ExpenseViewFactory::__construct1100.0%
App\Expense\Application\Query\GetExpenseHandler::__construct1100.0%
App\Expense\Application\Query\GetExpenseQuery::__construct1100.0%
App\Expense\Application\Query\ListCategoriesHandler::__construct1100.0%
App\Expense\Application\Query\ListCategoriesQuery::__construct1100.0%
App\Expense\Application\Query\ListExpensesHandler::__construct1100.0%
App\Expense\Application\Query\ListExpensesHandler::handle1100.0%
App\Expense\Application\Query\ListExpensesQuery::__construct1100.0%
App\Expense\Domain\CategorySetting::__construct1100.0%
App\Expense\Domain\CategorySetting::for1100.0%
App\Expense\Domain\CategorySetting::change1100.0%
App\Expense\Domain\CategorySetting::category1100.0%
App\Expense\Domain\CategorySetting::label1100.0%
App\Expense\Domain\CategorySetting::icon1100.0%
App\Expense\Domain\CategorySetting::color1100.0%
App\Expense\Domain\CategorySetting::isActive1100.0%
App\Expense\Domain\Exceptions\CategoryNotFound::withValue1100.0%
App\Expense\Domain\Exceptions\ExpenseNotFound::withId1100.0%
App\Expense\Domain\Expense::__construct1100.0%
App\Expense\Domain\Expense::record1100.0%
App\Expense\Domain\Expense::update1100.0%
App\Expense\Domain\Expense::belongsToTrip1100.0%
App\Expense\Domain\Expense::id1100.0%
App\Expense\Domain\Expense::tripId1100.0%
App\Expense\Domain\Expense::money1100.0%
App\Expense\Domain\Expense::category1100.0%
App\Expense\Domain\Expense::description1100.0%
App\Expense\Domain\Expense::spentAt1100.0%
App\Expense\Domain\Expense::createdAt1100.0%
App\Expense\Infrastructure\Controllers\Admin\ListAdminCategoriesController::__construct1100.0%
App\Expense\Infrastructure\Controllers\Admin\ListAdminCategoriesController::list1100.0%
App\Expense\Infrastructure\Controllers\Admin\UpdateCategoryController::__construct1100.0%
App\Expense\Infrastructure\Controllers\DeleteExpenseController::__construct1100.0%
App\Expense\Infrastructure\Controllers\GetExpenseController::__construct1100.0%
App\Expense\Infrastructure\Controllers\ListCategoriesController::__construct1100.0%
App\Expense\Infrastructure\Controllers\ListCategoriesController::list1100.0%
App\Expense\Infrastructure\Controllers\ListExpensesController::__construct1100.0%
App\Expense\Infrastructure\Controllers\RecordExpenseController::__construct1100.0%
App\Expense\Infrastructure\Controllers\UpdateExpenseController::__construct1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\DoctrineCategorySettingRepository::__construct1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\DoctrineCategorySettingRepository::save1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\DoctrineCategorySettingRepository::ofCategory1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\DoctrineExpenseRepository::__construct1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\DoctrineExpenseRepository::save1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\DoctrineExpenseRepository::remove1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\DoctrineExpenseRepository::ofId1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\DoctrineExpenseRepository::ofTrip1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\Type\CategoryType::getSQLDeclaration1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\Type\ExpenseIdType::className1100.0%
App\Expense\Infrastructure\Persistence\Doctrine\Type\ExpenseTripIdType::className1100.0%
App\Health\Application\Query\HealthCheckHandler::__construct1100.0%
App\Health\Infrastructure\Controllers\HealthCheckController::__construct1100.0%
App\Identity\Application\AuthenticatedUserFinder::__construct1100.0%
App\Identity\Application\AvatarCleanupOnUserDeletion::__construct1100.0%
App\Identity\Application\AvatarCleanupOnUserDeletion::onUserDeletion1100.0%
App\Identity\Application\Command\AdminUpdateUserCommand::__construct1100.0%
App\Identity\Application\Command\AdminUpdateUserHandler::__construct1100.0%
App\Identity\Application\Command\ChangeMyAvatarCommand::__construct1100.0%
App\Identity\Application\Command\ChangeMyAvatarHandler::__construct1100.0%
App\Identity\Application\Command\ChangePasswordCommand::__construct1100.0%
App\Identity\Application\Command\ChangePasswordHandler::__construct1100.0%
App\Identity\Application\Command\DeleteUserByAdminCommand::__construct1100.0%
App\Identity\Application\Command\DeleteUserByAdminHandler::__construct1100.0%
App\Identity\Application\Command\DeleteUserCommand::__construct1100.0%
App\Identity\Application\Command\DeleteUserHandler::__construct1100.0%
App\Identity\Application\Command\RegisterUserCommand::__construct1100.0%
App\Identity\Application\Command\RegisterUserHandler::__construct1100.0%
App\Identity\Application\Command\SignInWithGoogleCommand::__construct1100.0%
App\Identity\Application\Command\SignInWithGoogleHandler::__construct1100.0%
App\Identity\Application\Command\UpdateUserCommand::__construct1100.0%
App\Identity\Application\Command\UpdateUserHandler::__construct1100.0%
App\Identity\Application\Port\GoogleIdentity::__construct1100.0%
App\Identity\Application\Query\AdminUserView::__construct1100.0%
App\Identity\Application\Query\AdminUserView::fromUser1100.0%
App\Identity\Application\Query\AdminUserView::toArray1100.0%
App\Identity\Application\Query\CurrentUserView::__construct1100.0%
App\Identity\Application\Query\CurrentUserView::fromUser1100.0%
App\Identity\Application\Query\CurrentUserView::toArray1100.0%
App\Identity\Application\Query\GetCurrentUserHandler::__construct1100.0%
App\Identity\Application\Query\GetCurrentUserQuery::__construct1100.0%
App\Identity\Application\Query\ListUsersHandler::__construct1100.0%
App\Identity\Application\Query\ListUsersHandler::handle1100.0%
App\Identity\Application\Query\ListUsersQuery::__construct1100.0%
App\Identity\Domain\Exceptions\AdminSelfAction::cannotRevokeSelf1100.0%
App\Identity\Domain\Exceptions\AdminSelfAction::cannotDeleteSelf1100.0%
App\Identity\Domain\Exceptions\AdminSelfAction::cannotSuspendSelf1100.0%
App\Identity\Domain\Exceptions\EmailAlreadyInUse::of1100.0%
App\Identity\Domain\Exceptions\InvalidCurrentPassword::create1100.0%
App\Identity\Domain\Exceptions\UserNotFound::of1100.0%
App\Identity\Domain\Exceptions\WeakPassword::of1100.0%
App\Identity\Domain\User::__construct1100.0%
App\Identity\Domain\User::register1100.0%
App\Identity\Domain\User::registerWithoutPassword1100.0%
App\Identity\Domain\User::update1100.0%
App\Identity\Domain\User::changePassword1100.0%
App\Identity\Domain\User::grantAdmin1100.0%
App\Identity\Domain\User::revokeAdmin1100.0%
App\Identity\Domain\User::isAdmin1100.0%
App\Identity\Domain\User::suspend1100.0%
App\Identity\Domain\User::activate1100.0%
App\Identity\Domain\User::status1100.0%
App\Identity\Domain\User::id1100.0%
App\Identity\Domain\User::email1100.0%
App\Identity\Domain\User::password1100.0%
App\Identity\Domain\User::hasPassword1100.0%
App\Identity\Domain\User::preferredCurrency1100.0%
App\Identity\Domain\User::name1100.0%
App\Identity\Domain\User::surnames1100.0%
App\Identity\Domain\User::createdAt1100.0%
App\Identity\Domain\User::avatarName1100.0%
App\Identity\Domain\User::changeAvatar1100.0%
App\Identity\Domain\UserIdentity::provider1100.0%
App\Identity\Domain\UserIdentity::subject1100.0%
App\Identity\Domain\UserIdentity::userId1100.0%
App\Identity\Domain\UserIdentity::createdAt1100.0%
App\Identity\Domain\ValueObject\BirthDate::fromDate1100.0%
App\Identity\Domain\ValueObject\BirthDate::age1100.0%
App\Identity\Domain\ValueObject\BirthDate::toDateTimeImmutable1100.0%
App\Identity\Domain\ValueObject\BirthDate::value1100.0%
App\Identity\Domain\ValueObject\Email::__toString1100.0%
App\Identity\Domain\ValueObject\Email::value1100.0%
App\Identity\Domain\ValueObject\Email::equals1100.0%
App\Identity\Domain\ValueObject\HashedPassword::__toString1100.0%
App\Identity\Domain\ValueObject\HashedPassword::value1100.0%
App\Identity\Infrastructure\Console\GrantAdminCommand::__construct1100.0%
App\Identity\Infrastructure\Console\GrantAdminCommand::configure1100.0%
App\Identity\Infrastructure\Controllers\Admin\DeleteUserController::__construct1100.0%
App\Identity\Infrastructure\Controllers\Admin\ListUsersController::__construct1100.0%
App\Identity\Infrastructure\Controllers\Admin\ListUsersController::list1100.0%
App\Identity\Infrastructure\Controllers\Admin\UpdateUserController::__construct1100.0%
App\Identity\Infrastructure\Controllers\ChangePasswordController::__construct1100.0%
App\Identity\Infrastructure\Controllers\DeleteMyAvatarController::__construct1100.0%
App\Identity\Infrastructure\Controllers\DeleteUserController::__construct1100.0%
App\Identity\Infrastructure\Controllers\GoogleSignInConfigController::__construct1100.0%
App\Identity\Infrastructure\Controllers\GoogleSignInConfigController::config1100.0%
App\Identity\Infrastructure\Controllers\MeController::__construct1100.0%
App\Identity\Infrastructure\Controllers\RegisterUserController::__construct1100.0%
App\Identity\Infrastructure\Controllers\SetMyAvatarController::__construct1100.0%
App\Identity\Infrastructure\Controllers\UpdateUserController::__construct1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserIdentityRepository::__construct1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserIdentityRepository::save1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserIdentityRepository::ofProviderSubject1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::__construct1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::save1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::remove1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::ofId1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::ofEmail1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::existsByEmail1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::paginate1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\DoctrineUserRepository::count1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\EmailType::getSQLDeclaration1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\HashedPasswordType::getSQLDeclaration1100.0%
App\Identity\Infrastructure\Persistence\Doctrine\Type\UserIdType::className1100.0%
App\Identity\Infrastructure\Security\GoogleAuthenticator::__construct1100.0%
App\Identity\Infrastructure\Security\GoogleAuthenticator::onAuthenticationSuccess1100.0%
App\Identity\Infrastructure\Security\GoogleAuthenticator::onAuthenticationFailure1100.0%
App\Identity\Infrastructure\Security\GoogleTokenInfoVerifier::__construct1100.0%
App\Identity\Infrastructure\Security\SecurityUser::__construct1100.0%
App\Identity\Infrastructure\Security\SecurityUser::fromDomain1100.0%
App\Identity\Infrastructure\Security\SecurityUser::userId1100.0%
App\Identity\Infrastructure\Security\SecurityUser::preferredCurrency1100.0%
App\Identity\Infrastructure\Security\SecurityUser::getUserIdentifier1100.0%
App\Identity\Infrastructure\Security\SecurityUser::getPassword1100.0%
App\Identity\Infrastructure\Security\SecurityUser::isAdmin1100.0%
App\Identity\Infrastructure\Security\SecurityUser::isSuspended1100.0%
App\Identity\Infrastructure\Security\SecurityUser::eraseCredentials1100.0%
App\Identity\Infrastructure\Security\SymfonyPasswordHasher::__construct1100.0%
App\Identity\Infrastructure\Security\SymfonyPasswordHasher::hash1100.0%
App\Identity\Infrastructure\Security\SymfonyPasswordHasher::verify1100.0%
App\Identity\Infrastructure\Security\SymfonyValidatorPasswordPolicy::__construct1100.0%
App\Identity\Infrastructure\Security\UserChecker::checkPostAuth1100.0%
App\Identity\Infrastructure\Security\UserProvider::__construct1100.0%
App\Identity\Infrastructure\Trip\MemberDirectoryAdapter::__construct1100.0%
App\Shared\Domain\ValueObject\Currency::__toString1100.0%
App\Shared\Domain\ValueObject\Currency::code1100.0%
App\Shared\Domain\ValueObject\Currency::minorUnits1100.0%
App\Shared\Domain\ValueObject\Currency::equals1100.0%
App\Shared\Domain\ValueObject\DateRange::fromIso1100.0%
App\Shared\Domain\ValueObject\DateRange::start1100.0%
App\Shared\Domain\ValueObject\DateRange::end1100.0%
App\Shared\Domain\ValueObject\Money::__construct1100.0%
App\Shared\Domain\ValueObject\Money::amount1100.0%
App\Shared\Domain\ValueObject\Money::currency1100.0%
App\Shared\Domain\ValueObject\Money::add1100.0%
App\Shared\Domain\ValueObject\Uuid::__toString1100.0%
App\Shared\Domain\ValueObject\Uuid::generate1100.0%
App\Shared\Domain\ValueObject\Uuid::value1100.0%
App\Shared\Infrastructure\Console\PruneMediaCommand::__construct1100.0%
App\Shared\Infrastructure\Console\PruneMediaCommand::configure1100.0%
App\Shared\Infrastructure\Controllers\FileController::__construct1100.0%
App\Shared\Infrastructure\Persistence\Doctrine\Schema\ForeignKeyConstraintListener::postGenerateSchema1100.0%
App\Shared\Infrastructure\Persistence\Doctrine\Type\CurrencyType::getSQLDeclaration1100.0%
App\Shared\Infrastructure\Persistence\Doctrine\Type\UuidType::getSQLDeclaration1100.0%
App\Shared\Infrastructure\Storage\ImageStorage::__construct1100.0%
App\Shared\Infrastructure\Storage\ImageStorage::absolutePath1100.0%
App\Shared\Infrastructure\Storage\SignedImageUrl::__construct1100.0%
App\Trip\Application\Command\AcceptInvitationCommand::__construct1100.0%
App\Trip\Application\Command\AcceptInvitationHandler::__construct1100.0%
App\Trip\Application\Command\AcceptInvitationHandler::handle1100.0%
App\Trip\Application\Command\ArchiveTripCommand::__construct1100.0%
App\Trip\Application\Command\ArchiveTripHandler::__construct1100.0%
App\Trip\Application\Command\ArchiveTripHandler::handle1100.0%
App\Trip\Application\Command\CancelInvitationCommand::__construct1100.0%
App\Trip\Application\Command\CancelInvitationHandler::__construct1100.0%
App\Trip\Application\Command\ChangeMemberRoleCommand::__construct1100.0%
App\Trip\Application\Command\ChangeMemberRoleHandler::__construct1100.0%
App\Trip\Application\Command\ChangeTripImageCommand::__construct1100.0%
App\Trip\Application\Command\ChangeTripImageHandler::__construct1100.0%
App\Trip\Application\Command\CreateTripCommand::__construct1100.0%
App\Trip\Application\Command\CreateTripHandler::__construct1100.0%
App\Trip\Application\Command\CreateTripHandler::handle1100.0%
App\Trip\Application\Command\DeclineInvitationCommand::__construct1100.0%
App\Trip\Application\Command\DeclineInvitationHandler::__construct1100.0%
App\Trip\Application\Command\DeleteTripCommand::__construct1100.0%
App\Trip\Application\Command\DeleteTripHandler::__construct1100.0%
App\Trip\Application\Command\DeleteTripHandler::handle1100.0%
App\Trip\Application\Command\InviteMemberCommand::__construct1100.0%
App\Trip\Application\Command\InviteMemberHandler::__construct1100.0%
App\Trip\Application\Command\RemoveMemberCommand::__construct1100.0%
App\Trip\Application\Command\RemoveMemberHandler::__construct1100.0%
App\Trip\Application\Command\UpdateTripCommand::__construct1100.0%
App\Trip\Application\Command\UpdateTripHandler::__construct1100.0%
App\Trip\Application\Command\UpdateTripHandler::handle1100.0%
App\Trip\Application\OwnershipTransferOnUserDeletion::__construct1100.0%
App\Trip\Application\Port\MemberSummary::__construct1100.0%
App\Trip\Application\Query\GetTripHandler::__construct1100.0%
App\Trip\Application\Query\GetTripMembersHandler::__construct1100.0%
App\Trip\Application\Query\GetTripMembersHandler::memberEntry1100.0%
App\Trip\Application\Query\GetTripMembersQuery::__construct1100.0%
App\Trip\Application\Query\GetTripQuery::__construct1100.0%
App\Trip\Application\Query\ListMyInvitationsHandler::__construct1100.0%
App\Trip\Application\Query\ListMyInvitationsQuery::__construct1100.0%
App\Trip\Application\Query\ListTripsHandler::__construct1100.0%
App\Trip\Application\Query\ListTripsHandler::handle1100.0%
App\Trip\Application\Query\ListTripsQuery::__construct1100.0%
App\Trip\Application\Query\TripMembersView::__construct1100.0%
App\Trip\Application\Query\TripMembersView::toArray1100.0%
App\Trip\Application\Query\TripView::__construct1100.0%
App\Trip\Application\Query\TripView::fromTrip1100.0%
App\Trip\Application\Query\TripView::toArray1100.0%
App\Trip\Application\TripAccess::__construct1100.0%
App\Trip\Application\TripAccess::findReadable1100.0%
App\Trip\Application\TripAccess::getReadable1100.0%
App\Trip\Domain\Exceptions\AlreadyMemberOrInvited::create1100.0%
App\Trip\Domain\Exceptions\InvitationNotFound::withId1100.0%
App\Trip\Domain\Exceptions\InviteeNotFound::withEmail1100.0%
App\Trip\Domain\Exceptions\MemberNotFound::withId1100.0%
App\Trip\Domain\Exceptions\TripAccessDenied::cannotWriteExpense1100.0%
App\Trip\Domain\Exceptions\TripAccessDenied::cannotManageTrip1100.0%
App\Trip\Domain\Exceptions\TripNotFound::withId1100.0%
App\Trip\Domain\Trip::__construct1100.0%
App\Trip\Domain\Trip::create1100.0%
App\Trip\Domain\Trip::update1100.0%
App\Trip\Domain\Trip::transferOwnershipTo1100.0%
App\Trip\Domain\Trip::id1100.0%
App\Trip\Domain\Trip::ownerId1100.0%
App\Trip\Domain\Trip::isOwnedBy1100.0%
App\Trip\Domain\Trip::name1100.0%
App\Trip\Domain\Trip::destination1100.0%
App\Trip\Domain\Trip::dateRange1100.0%
App\Trip\Domain\Trip::currency1100.0%
App\Trip\Domain\Trip::budget1100.0%
App\Trip\Domain\Trip::createdAt1100.0%
App\Trip\Domain\Trip::imageName1100.0%
App\Trip\Domain\Trip::changeImage1100.0%
App\Trip\Domain\Trip::archive1100.0%
App\Trip\Domain\Trip::isArchived1100.0%
App\Trip\Domain\TripInvitation::invite1100.0%
App\Trip\Domain\TripInvitation::accept1100.0%
App\Trip\Domain\TripInvitation::decline1100.0%
App\Trip\Domain\TripInvitation::id1100.0%
App\Trip\Domain\TripInvitation::tripId1100.0%
App\Trip\Domain\TripInvitation::inviteeId1100.0%
App\Trip\Domain\TripInvitation::inviterId1100.0%
App\Trip\Domain\TripInvitation::role1100.0%
App\Trip\Domain\TripInvitation::status1100.0%
App\Trip\Domain\TripInvitation::isPending1100.0%
App\Trip\Domain\TripInvitation::createdAt1100.0%
App\Trip\Domain\TripMember::tripId1100.0%
App\Trip\Domain\TripMember::userId1100.0%
App\Trip\Domain\TripMember::role1100.0%
App\Trip\Domain\TripMember::createdAt1100.0%
App\Trip\Domain\ValueObject\TripRole::canManageTrip1100.0%
App\Trip\Infrastructure\Controllers\AcceptInvitationController::__construct1100.0%
App\Trip\Infrastructure\Controllers\ArchiveTripController::__construct1100.0%
App\Trip\Infrastructure\Controllers\CancelInvitationController::__construct1100.0%
App\Trip\Infrastructure\Controllers\ChangeMemberRoleController::__construct1100.0%
App\Trip\Infrastructure\Controllers\CreateTripController::__construct1100.0%
App\Trip\Infrastructure\Controllers\DeclineInvitationController::__construct1100.0%
App\Trip\Infrastructure\Controllers\DeleteTripController::__construct1100.0%
App\Trip\Infrastructure\Controllers\DeleteTripImageController::__construct1100.0%
App\Trip\Infrastructure\Controllers\GetTripController::__construct1100.0%
App\Trip\Infrastructure\Controllers\InviteMemberController::__construct1100.0%
App\Trip\Infrastructure\Controllers\ListMyInvitationsController::__construct1100.0%
App\Trip\Infrastructure\Controllers\ListMyInvitationsController::list1100.0%
App\Trip\Infrastructure\Controllers\ListTripMembersController::__construct1100.0%
App\Trip\Infrastructure\Controllers\ListTripsController::__construct1100.0%
App\Trip\Infrastructure\Controllers\ListTripsController::list1100.0%
App\Trip\Infrastructure\Controllers\RemoveMemberController::__construct1100.0%
App\Trip\Infrastructure\Controllers\SetTripImageController::__construct1100.0%
App\Trip\Infrastructure\Controllers\UpdateTripController::__construct1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::__construct1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::save1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::remove1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::ofId1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::pendingFor1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::pendingOfTrip1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripInvitationRepository::pendingOfInvitee1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::__construct1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::save1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::remove1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::roleOf1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::find1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::ofTrip1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripMemberRepository::ofUser1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripRepository::__construct1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripRepository::save1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripRepository::remove1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripRepository::ofId1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\DoctrineTripRepository::ofOwner1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\InvitationIdType::className1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\InvitationStatusType::getSQLDeclaration1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\MemberIdType::className1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\OwnerIdType::className1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\TripIdType::className1100.0%
App\Trip\Infrastructure\Persistence\Doctrine\Type\TripRoleType::getSQLDeclaration1100.0%
App\Identity\Infrastructure\Http\ResolvesAuthenticatedUser::securityUser1100.0%
App\Shared\Infrastructure\Persistence\Doctrine\Type\UuidType::className0100.0%