Kimai is the #1 open-source time-tracking application. From freelancers to companies and organisations - everyone can manage timesheets, generate reports, create invoices and so much more... Web-based multi-user application, available as On-Premise or SaaS version: https://www.kimai.org
This report summarizes scanner evidence for kimai/kimai, a PHP project with 5,067 GitHub stars. SynthScan examined 202,565 lines of code across 1978 source files, recording 1837 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 10.1 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 1705 finding(s).
Are imports declared and package/API names verified? 96 finding(s).
Are wrappers, guards, and repeated structures necessary? 1673 finding(s).
Which changes need focused human review? 1837 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1837 distinct pattern matches across 8 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/TranslationsTest.php | 19 | public function testForWrongFileExtension(): void | CODE |
| LOW | tests/TranslationsTest.php | 52 | public function testReplacerWereNotTranslated(): void | CODE |
| LOW | tests/TranslationsTest.php | 107 | public function testEnabledLocalesAreLimitedToTranslatedLocales(): void | CODE |
| LOW | tests/Reporting/ReportingServiceTest.php | 46 | public function testGetAvailableReportsWithPermission(): void | CODE |
| LOW | tests/Configuration/MailConfigurationTest.php | 25 | public function testGetFromAddressWithEmptyAddressReturnsNull(): void | CODE |
| LOW | tests/Configuration/LocaleServiceTest.php | 115 | public function testInvalidLocaleWithGivenLocale(): void | CODE |
| LOW | tests/Configuration/LocaleServiceTest.php | 150 | public function testGetNearestTranslationLocale(string $locale, string $expected): void | CODE |
| LOW | tests/Configuration/LocaleServiceTest.php | 160 | public static function getNearestTranslationLocaleData(): array | CODE |
| LOW | tests/Configuration/SystemConfigurationTest.php | 156 | public function testDefaultWithMixedConfigs(): void | CODE |
| LOW | tests/Configuration/SystemConfigurationTest.php | 170 | public function testIsUserAuthChangeAllowed(): void | CODE |
| LOW | tests/Configuration/SystemConfigurationTest.php | 215 | public function testCalendarWithoutLoader(): void | CODE |
| LOW | tests/Configuration/SystemConfigurationTest.php | 240 | public function testFormDefaultWithoutLoader(): void | CODE |
| LOW | tests/Configuration/SystemConfigurationTest.php | 254 | public function testUserDefaultLocaleFallsBackToLanguage(): void | CODE |
| LOW | tests/Configuration/SystemConfigurationTest.php | 266 | public function testFormDefaultWithLoader(): void | CODE |
| LOW | tests/Configuration/SystemConfigurationTest.php | 278 | public function testUserWizardWithoutLoader(): void | CODE |
| LOW | tests/Configuration/SystemConfigurationTest.php | 290 | public function testTimesheetWithoutLoader(): void | CODE |
| LOW | tests/Repository/TeamRepositoryTest.php | 73 | private function assertMembersAreFullyHydrated(Team $team, int $expectedMembers, bool $expectPreferences): void | CODE |
| LOW | tests/Repository/TeamRepositoryTest.php | 93 | public function testFindDoesNotPreloadMembers(): void | CODE |
| LOW | tests/Repository/TeamRepositoryTest.php | 103 | public function testCreateTeamLoaderPreloadsMembersUsersAndPreferences(): void | CODE |
| LOW | tests/Repository/TeamRepositoryTest.php | 122 | public function testCreateTeamLoaderWithoutMembers(): void | CODE |
| LOW | tests/Repository/TeamRepositoryTest.php | 133 | public function testFindByIdsPreloadsMembersButNotPreferences(): void | CODE |
| LOW | tests/Repository/ProjectRepositoryTest.php | 65 | public function testLockedUntilIsStoredAsPlainDay(string $timezone, string $time): void | CODE |
| LOW | tests/Repository/InvoiceDocumentRepositoryTest.php | 85 | public function testDefaultTemplatesExists(): void | CODE |
| LOW | tests/Repository/UserRepositoryTest.php | 84 | public function testLastLoginIsWrittenOnceWithinTimeWindow(): void | CODE |
| LOW | tests/Repository/UserRepositoryTest.php | 118 | public function testLastLoginIsUpdatedWhenOutdated(): void | CODE |
| LOW | tests/Repository/TimesheetRepositoryTest.php | 33 | public function testResultTypeForQueryState(): void | CODE |
| LOW | tests/Repository/TimesheetRepositoryTest.php | 55 | public function testPaginationReturnsDistinctResultsWithIdenticalBegin(): void | CODE |
| LOW | tests/Repository/TimesheetRepositoryTest.php | 175 | public function testTimesheetResultPreloadsTeamAssignments(): void | CODE |
| LOW | tests/Repository/TimesheetRepositoryTest.php | 250 | public function testQueryDoesNotReturnTimesheetsWithForeignActivityTeam(): void | CODE |
| LOW | tests/Repository/TimesheetRepositoryTest.php | 331 | public function testFindTimesheetsByIdDoesNotReturnForeignActivityTeam(): void | CODE |
| LOW | tests/Repository/TimesheetRepositoryTest.php | 386 | public function testGetRecentActivityIdsHidesForeignTeamRestrictedActivity(): void | CODE |
| LOW | tests/Repository/Search/SearchHelperTest.php | 32 | public function testSearchTermIsNullDoesNotModifyQueryBuilder(): void | CODE |
| LOW | tests/Repository/Search/SearchHelperTest.php | 45 | public function testNoAliasThrowsException(): void | CODE |
| LOW | tests/Repository/Search/SearchHelperTest.php | 61 | public function testSupportsMetaFieldsAddsMetaFieldConditions(): void | CODE |
| LOW | tests/Repository/Search/SearchHelperTest.php | 187 | public function testSearchTermWithExcludedFieldAddsExclusionCondition(): void | CODE |
| LOW | tests/Repository/Search/SearchHelperTest.php | 203 | public static function provideMaliciousMetaFieldPayloads(): array | CODE |
| LOW | tests/Repository/Search/SearchHelperTest.php | 217 | public function testMaliciousMetaFieldNamesCannotInfluenceSubqueryDql(string $term, array $expectedMetaNames): void | CODE |
| LOW | tests/Repository/Loader/TeamLoaderTest.php | 34 | public function testLoadResultsWithEmptyResults(): void | CODE |
| LOW⚡ | tests/Repository/Loader/TeamLoaderTest.php | 72 | public function testLoadResultsDoesNotLoadUserPreferencesByDefault(): void | CODE |
| LOW⚡ | tests/Repository/Loader/TeamLoaderTest.php | 82 | public function testLoadResultsWithUserPreferences(): void | CODE |
| LOW⚡ | tests/Repository/Loader/TeamLoaderTest.php | 92 | public function testLoadResultsWithUserPreferencesAndWithoutMembers(): void | CODE |
| LOW | tests/Repository/Query/BaseQueryTest.php | 361 | public function testHasFullDateRangeWithoutDateRange(): void | CODE |
| LOW | tests/Form/ActivityEditFormTest.php | 22 | public function testWithGlobalNewActivity(): void | CODE |
| LOW | tests/Form/ActivityEditFormTest.php | 42 | public function testWithGlobalNewActivityAndOptionsBudget(): void | CODE |
| LOW | tests/Form/ActivityEditFormTest.php | 53 | public function testWithGlobalNewActivityAndOptionsTimeBudget(): void | CODE |
| LOW | tests/Form/ActivityEditFormTest.php | 64 | public function testWithGlobalNewActivityAndOptionsAllBudget(): void | CODE |
| LOW | tests/Form/ActivityEditFormTest.php | 76 | public function testWithGlobalExistingActivityAndOptions(): void | CODE |
| LOW | tests/Form/ActivityEditFormTest.php | 89 | public function testWithNonGlobalExistingActivityAndOptions(): void | CODE |
| LOW | tests/Form/UserRolesTypeTest.php | 82 | public function testHigherRoleIsPreservedWhenActorCannotAssignIt(): void | CODE |
| LOW | tests/Form/UserRolesTypeTest.php | 95 | public function testMultipleHigherRolesArePreserved(): void | CODE |
| LOW | tests/Form/UserRolesTypeTest.php | 108 | public function testAssignableRoleCanStillBeRemoved(): void | CODE |
| LOW | tests/Form/UserRolesTypeTest.php | 120 | public function testActorCanRemoveARoleTheyAreAllowedToAssign(): void | CODE |
| LOW | tests/Form/UserRolesTypeTest.php | 132 | public function testWithoutActingUserNothingIsPreserved(): void | CODE |
| LOW | tests/Form/CustomerEditFormTest.php | 61 | public function testWithBudgetAndTimeBudget(): void | CODE |
| LOW | tests/Form/CustomerEditFormTest.php | 61 | public function testWithBudgetAndTimeBudget(): void | CODE |
| LOW | tests/Form/ProjectEditFormTest.php | 62 | public function testWithBudgetAndTimeBudget(): void | CODE |
| LOW | tests/Form/ProjectEditFormTest.php | 62 | public function testWithBudgetAndTimeBudget(): void | CODE |
| LOW | tests/Form/ExportTemplateSpreadsheetFormTest.php | 42 | public function testWithGlobalNewActivity(): void | CODE |
| LOW | tests/Form/Extension/ApiFormExtensionTest.php | 79 | public function testConfigureOptionsDisablesCsrfProtection(): void | CODE |
| LOW | tests/Form/Extension/ApiFormExtensionTest.php | 87 | public function testBuildFormRemovesMetaFields(): void | CODE |
| 1577 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | phpstan.sh | 3 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | phpstan.sh | 5 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | phpstan.sh | 11 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | php-cs-fixer.sh | 3 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | php-cs-fixer.sh | 5 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | php-cs-fixer.sh | 11 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | kimai.sh | 3 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | kimai.sh | 7 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | kimai.sh | 160 | # --------------------------------------------------------- | COMMENT |
| MEDIUM | config/services.yaml | 45 | # ================================================================================ | COMMENT |
| MEDIUM | config/services.yaml | 47 | # ================================================================================ | COMMENT |
| MEDIUM | config/services.yaml | 91 | # ================================================================================ | COMMENT |
| MEDIUM | config/services.yaml | 93 | # ================================================================================ | COMMENT |
| MEDIUM | config/services.yaml | 107 | # ================================================================================ | COMMENT |
| MEDIUM | config/services.yaml | 109 | # ================================================================================ | COMMENT |
| MEDIUM⚡ | config/services.yaml | 120 | # ================================================================================ | COMMENT |
| MEDIUM⚡ | config/services.yaml | 122 | # ================================================================================ | COMMENT |
| MEDIUM⚡ | config/services.yaml | 128 | # ================================================================================ | COMMENT |
| MEDIUM⚡ | config/services.yaml | 130 | # ================================================================================ | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 1 | # --------------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 7 | # --------------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 10 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 12 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 16 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 19 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 21 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 71 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 74 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 76 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 124 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 127 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 129 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 149 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 152 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 154 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/packages/kimai.yaml | 162 | # -------------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …sts/Form/Extension/EnhancedChoiceTypeExtensionTest.php | 67 | ['value' => null, 'attr' => ['size' => 1, 'class' => 'selectpicker', 'data-width' => '50%', 'data-disable-se | CODE |
| LOW⚡ | tests/Form/Helper/ProjectHelperTest.php | 87 | $project->setComment('Lorem Ipsum'); | CODE |
| LOW⚡ | tests/Form/Helper/ProjectHelperTest.php | 89 | self::assertEquals('FOO BAR - Lorem Ipsum - Acme company - F76/123', $helper->getChoiceLabel($project)); | CODE |
| LOW⚡ | tests/Form/Helper/ActivityHelperTest.php | 58 | $activity->setComment('Lorem Ipsum'); | CODE |
| LOW⚡ | tests/Form/Helper/ActivityHelperTest.php | 59 | self::assertEquals('FOO BAR - Lorem Ipsum', $helper->getChoiceLabel($activity)); | CODE |
| LOW⚡ | tests/Form/Helper/CustomerHelperTest.php | 66 | $customer->setComment('Lorem Ipsum'); | CODE |
| LOW⚡ | tests/Form/Helper/CustomerHelperTest.php | 67 | self::assertEquals('FOO BAR - Lorem Ipsum', $helper->getChoiceLabel($customer)); | CODE |
| LOW⚡ | tests/Form/Helper/CustomerHelperTest.php | 69 | self::assertEquals('FOO BAR - Lorem Ipsum - Acme University', $helper->getChoiceLabel($customer)); | CODE |
| LOW⚡ | tests/Form/Helper/CustomerHelperTest.php | 71 | self::assertEquals('FOO BAR - Lorem Ipsum - Acme University - 2023-0815', $helper->getChoiceLabel($customer)); | CODE |
| LOW⚡ | tests/Mail/KimaiMailerTest.php | 91 | $user->method('getEmail')->willReturn('user@example.com'); | CODE |
| LOW | tests/Controller/TimesheetControllerTest.php | 637 | self::assertEquals('Lorem Ipsum', $timesheet->getDescription()); | CODE |
| LOW⚡ | tests/Controller/ProfileControllerTest.php | 49 | $this->assertHasProfileBox($client, 'John Doe'); | CODE |
| LOW | tests/Controller/ProfileControllerTest.php | 86 | $this->assertHasProfileBox($client, 'John Doe'); | CODE |
| LOW | tests/Controller/ProfileControllerTest.php | 137 | self::assertEquals('John Doe', $user->getAlias()); | CODE |
| LOW | tests/API/CustomerControllerTest.php | 340 | 'email' => 'admin@example.com', | CODE |
| LOW | tests/API/CustomerControllerTest.php | 386 | self::assertEquals('admin@example.com', $result['email']); | CODE |
| LOW⚡ | tests/Command/CreateUserCommandTest.php | 43 | $commandTester = $this->createUser('MyTestUser', 'user@example.com', 'ROLE_USER', 'foobar'); | CODE |
| LOW⚡ | tests/Command/CreateUserCommandTest.php | 51 | $commandTester = $this->createUser('MyTestUser', 'user@example.com', 'ROLE_USER', 'foobar12'); | CODE |
| LOW⚡ | tests/Command/CreateUserCommandTest.php | 97 | $this->createUser('MyTestUser', 'user@example.com', 'ROLE_USER', 'foobar123'); | CODE |
| LOW⚡ | tests/Command/CreateUserCommandTest.php | 106 | $this->createUser('MyTestUser', 'user@example.com', 'ROLE_USER', 'foobar12'); | CODE |
| LOW⚡ | tests/Command/CreateUserCommandTest.php | 107 | $commandTester = $this->createUser('MyTestUser2', 'user@example.com', 'ROLE_USER', 'foobar'); | CODE |
| LOW⚡ | tests/Command/CreateUserCommandTest.php | 123 | $this->createUser('MyTestUser', 'user@example.com', 'ROLE_USER', 'foobar123'); | CODE |
| LOW⚡ | tests/Command/CreateUserCommandTest.php | 134 | $this->createUser('MyTestUser', 'user@example.com', 'ROLE_USER', 'foobar123'); | CODE |
| LOW⚡ | tests/Command/CreateUserCommandTest.php | 135 | $commandTester = $this->createUser('MyTestUser2', 'user@example.com', 'ROLE_USER', 'foobar123', true); | CODE |
| LOW⚡ | tests/Command/CreateUserCommandTest.php | 143 | $commandTester = $this->createUser('MyTestUser', 'user@example.com', 'ROLE_USER', 'foobar123', true); | CODE |
| LOW⚡ | tests/Command/CreateUserCommandTest.php | 151 | $this->createUser('MyTestUser', 'user@example.com', 'ROLE_USER', 'foobar123'); | CODE |
| LOW | tests/Export/Spreadsheet/CustomerExporterTest.php | 47 | $customer->setComment('Lorem Ipsum'); | CODE |
| LOW | tests/Export/Spreadsheet/CustomerExporterTest.php | 98 | self::assertEquals('Lorem Ipsum', $worksheet->getCell([++$i, 2])->getValue()); // comment | CODE |
| LOW | …xport/Spreadsheet/EntityWithMetaFieldsExporterTest.php | 48 | $project->setComment('Lorem Ipsum'); | CODE |
| LOW | …xport/Spreadsheet/EntityWithMetaFieldsExporterTest.php | 77 | self::assertEquals('Lorem Ipsum', $worksheet->getCell([++$i, 2])->getValue()); | CODE |
| LOW | tests/Export/Spreadsheet/ProjectExporterTest.php | 48 | $project->setComment('Lorem Ipsum'); | CODE |
| LOW | tests/Export/Spreadsheet/ProjectExporterTest.php | 77 | self::assertEquals('Lorem Ipsum', $worksheet->getCell([++$i, 2])->getValue()); | CODE |
| LOW | tests/Export/Spreadsheet/ActivityExporterTest.php | 46 | $activity->setComment('Lorem Ipsum'); | CODE |
| LOW | tests/Export/Spreadsheet/ActivityExporterTest.php | 69 | self::assertEquals('Lorem Ipsum', $worksheet->getCell([++$i, 2])->getValue()); | CODE |
| LOW | …sts/Export/Spreadsheet/AnnotatedObjectExporterTest.php | 33 | $project->setComment('Lorem Ipsum'); | CODE |
| LOW | …sts/Export/Spreadsheet/AnnotatedObjectExporterTest.php | 60 | self::assertEquals('Lorem Ipsum', $worksheet->getCell([++$i, 2])->getValue()); | CODE |
| LOW | tests/Export/Spreadsheet/Entities/DemoFull.php | 22 | #[Exporter\Expose(name: 'fake-name', label: 'Protected-Property', type: 'boolean')] | COMMENT |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 76 | $loremIpsum = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt u | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 76 | $loremIpsum = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt u | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 77 | $loremIpsumShort = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invid | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 77 | $loremIpsumShort = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invid | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 108 | $loremIpsum = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt u | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 108 | $loremIpsum = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt u | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 116 | 'Lorem ipsum dolor sit amet, consetetur sadipscing …', | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 116 | 'Lorem ipsum dolor sit amet, consetetur sadipscing …', | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 121 | 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore e | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 121 | 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore e | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 126 | 'Lorem ipsum dolor sit amet, consetetur sadipscing …', | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 126 | 'Lorem ipsum dolor sit amet, consetetur sadipscing …', | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 131 | 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt', | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 131 | 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt', | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 132 | $sut->commentOneLiner(implode(PHP_EOL, ['Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam n | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 132 | $sut->commentOneLiner(implode(PHP_EOL, ['Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam n | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 136 | 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt …', | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 136 | 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt …', | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 137 | $sut->commentOneLiner(implode(PHP_EOL, ['Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam n | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 137 | $sut->commentOneLiner(implode(PHP_EOL, ['Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam n | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 141 | 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt', | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 141 | 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt', | CODE |
| LOW⚡ | tests/Twig/Runtime/MarkdownExtensionTest.php | 142 | $sut->commentOneLiner(implode(PHP_EOL, ['Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam n | CODE |
| 36 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | config/packages/kimai.yaml | 1 | # --------------------------------------------------------------------------------------------- | COMMENT |
| LOW | config/packages/kimai.yaml | 21 | # -------------------------------------------------------------------------------- | COMMENT |
| LOW | config/packages/kimai.yaml | 41 | # | COMMENT |
| LOW | config/packages/kimai.yaml | 61 | # days: ['saturday','sunday'] | COMMENT |
| LOW | config/packages/kimai.yaml | 121 | ROLE_TEAMLEAD: ['view_rate_own_timesheet','view_rate_other_timesheet','hourly-rate_own_profile','view_team_m | COMMENT |
| LOW | config/packages/kimai.yaml | 141 | # | COMMENT |
| LOW | tests/API/TimesheetControllerTest.php | 1861 | COMMENT | |
| LOW | src/Widget/DashboardService.php | 121 | 'DurationMonth', | COMMENT |
| LOW | src/Entity/Team.php | 21 | use Symfony\Component\Validator\Constraints as Assert; | COMMENT |
| LOW | src/Entity/Team.php | 41 | #[ORM\Column(name: 'name', type: Types::STRING, length: 100, nullable: false)] | COMMENT |
| LOW | src/Entity/UserPreference.php | 61 | #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')] | COMMENT |
| LOW | src/Entity/WorkingTime.php | 21 | #[ORM\ChangeTrackingPolicy('DEFERRED_EXPLICIT')] | COMMENT |
| LOW | src/Entity/Tag.php | 21 | #[ORM\UniqueConstraint(columns: ['name'])] | COMMENT |
| LOW | src/Entity/Tag.php | 41 | #[ORM\Column(name: 'name', type: Types::STRING, length: 100, nullable: false)] | COMMENT |
| LOW | src/Entity/User.php | 41 | #[UniqueEntity('email')] | COMMENT |
| LOW | src/Entity/User.php | 81 | */ | COMMENT |
| LOW | src/Entity/User.php | 161 | * This flag will be initialized in UserEnvironmentSubscriber. | COMMENT |
| LOW | src/Entity/User.php | 181 | #[ORM\Column(name: 'account', type: Types::STRING, length: 30, nullable: true)] | COMMENT |
| LOW | src/Entity/User.php | 221 | private array $roles = []; | COMMENT |
| LOW | src/Entity/AccessToken.php | 21 | #[ORM\ChangeTrackingPolicy('DEFERRED_EXPLICIT')] | COMMENT |
| LOW | src/Entity/Customer.php | 41 | #[ORM\Column(name: 'id', type: Types::INTEGER)] | COMMENT |
| LOW | src/Entity/Customer.php | 61 | #[Exporter\Expose(label: 'number')] | COMMENT |
| LOW | src/Entity/Customer.php | 81 | #[Assert\Length(max: 100)] | COMMENT |
| LOW | src/Entity/Customer.php | 101 | /** | COMMENT |
| LOW | src/Entity/Customer.php | 121 | #[Serializer\Groups(['Default'])] | COMMENT |
| LOW | src/Entity/Customer.php | 141 | #[Serializer\Groups(['Default'])] | COMMENT |
| LOW | src/Entity/Customer.php | 161 | #[Assert\Length(max: 100)] | COMMENT |
| LOW | src/Entity/Customer.php | 181 | * | COMMENT |
| LOW | src/Entity/Customer.php | 201 | #[Serializer\Groups(['Customer'])] | COMMENT |
| LOW | src/Entity/Customer.php | 221 | #[Serializer\Groups(['Customer_Entity', 'Customer_Details'])] | COMMENT |
| LOW | src/Entity/Customer.php | 241 | #[Exporter\Expose(label: 'city')] | COMMENT |
| LOW | src/Entity/Project.php | 21 | use JMS\Serializer\Annotation as Serializer; | COMMENT |
| LOW | src/Entity/Project.php | 41 | COMMENT | |
| LOW | src/Entity/Project.php | 61 | private ?Customer $customer = null; | COMMENT |
| LOW | src/Entity/Project.php | 121 | #[ORM\Column(name: 'locked_until', type: Types::DATE_IMMUTABLE, nullable: true)] | COMMENT |
| LOW | src/Entity/Project.php | 141 | #[Exporter\Expose(label: 'visible', type: 'boolean')] | COMMENT |
| LOW | src/Entity/ExportTemplate.php | 21 | #[ORM\Entity(repositoryClass: ExportTemplateRepository::class)] | COMMENT |
| LOW | src/Entity/Invoice.php | 21 | use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; | COMMENT |
| LOW | src/Entity/Invoice.php | 41 | public const STATUS_PAID = 'paid'; | COMMENT |
| LOW | src/Entity/Invoice.php | 61 | #[ORM\Column(name: 'comment', type: Types::TEXT, nullable: true)] | COMMENT |
| LOW | src/Entity/Invoice.php | 81 | #[Assert\NotNull] | COMMENT |
| LOW | src/Entity/Invoice.php | 101 | #[Serializer\Groups(['Default'])] | COMMENT |
| LOW | src/Entity/Invoice.php | 121 | #[Serializer\Groups(['Default'])] | COMMENT |
| LOW | src/Entity/Bookmark.php | 21 | #[ORM\ChangeTrackingPolicy('DEFERRED_EXPLICIT')] | COMMENT |
| LOW | src/Entity/Rate.php | 21 | #[ORM\Id] | COMMENT |
| LOW | src/Entity/CommentTableTypeTrait.php | 21 | #[ORM\Column(name: 'id', type: Types::INTEGER)] | COMMENT |
| LOW | src/Entity/Activity.php | 21 | use JMS\Serializer\Annotation as Serializer; | COMMENT |
| LOW | src/Entity/Activity.php | 41 | use CreatedTrait; | COMMENT |
| LOW | src/Entity/Activity.php | 61 | */ | COMMENT |
| LOW | src/Entity/Activity.php | 81 | #[ORM\Column(name: 'visible', type: Types::BOOLEAN, nullable: false, options: ['default' => true])] | COMMENT |
| LOW | src/Entity/Activity.php | 101 | #[Serializer\Type(name: 'array<App\Entity\ActivityMeta>')] | COMMENT |
| LOW | src/Entity/RolePermission.php | 21 | #[ORM\ChangeTrackingPolicy('DEFERRED_EXPLICIT')] | COMMENT |
| LOW | src/Entity/Timesheet.php | 21 | use Doctrine\ORM\Mapping as ORM; | COMMENT |
| LOW | src/Entity/Timesheet.php | 41 | #[ORM\Index(columns: ['user', 'id', 'duration'], name: 'IDX_TIMESHEET_RESULT_STATS')] | COMMENT |
| LOW | src/Entity/Timesheet.php | 101 | * Attention: Accessor MUST be used, otherwise date will be serialized in UTC. | COMMENT |
| LOW | src/Entity/Timesheet.php | 141 | private ?int $break = 0; | COMMENT |
| LOW | src/Entity/InvoiceTemplate.php | 21 | #[ORM\UniqueConstraint(columns: ['name'])] | COMMENT |
| LOW | src/Entity/InvoiceTemplate.php | 41 | private ?string $company = null; | COMMENT |
| LOW | src/Entity/InvoiceTemplate.php | 61 | #[ORM\Column(name: 'number_generator', type: Types::STRING, length: 20, nullable: false)] | COMMENT |
| LOW | src/Entity/TeamMember.php | 21 | #[ORM\ChangeTrackingPolicy('DEFERRED_EXPLICIT')] | COMMENT |
| 3 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | UPGRADING-1.md | 89 | - some representation names changed (eg. from `ActivityMetaField` to `ActivityMeta`, `TimesheetSubCollection` vs `Ti | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | phpstan.sh | 6 | # Usage: | COMMENT |
| LOW⚡ | php-cs-fixer.sh | 6 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/API/StatusController.php | 34 | #[OA\Response(response: 200, description: "A simple route that returns a 'pong', which you can use for testing the A | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/Invoice/Renderer/AbstractSpreadsheetRenderer.php | 85 | // templates can have a formula, which utilize the timesheet records content like this: | COMMENT |