diff --git a/config/packages/prod/monolog.yaml b/config/packages/prod/monolog.yaml index 27057d26..7b0c7bee 100644 --- a/config/packages/prod/monolog.yaml +++ b/config/packages/prod/monolog.yaml @@ -4,9 +4,7 @@ monolog: type: fingers_crossed action_level: error handler: nested - excluded_404s: - # regex: exclude all 404 errors from the logs - - ^/ + excluded_http_codes: [403, 404] nested: type: stream level: info diff --git a/src/Command/KimaiImporterCommand.php b/src/Command/KimaiImporterCommand.php index ae832dd8..1e60e8d2 100755 --- a/src/Command/KimaiImporterCommand.php +++ b/src/Command/KimaiImporterCommand.php @@ -942,7 +942,7 @@ final class KimaiImporterCommand extends Command $user->addPreference($newPref); } - // set default values if they were not set in the the user preferences + // set default values if they were not set in the user preferences $defaults = ['language' => $language, 'timezone' => $timezone]; foreach ($defaults as $key => $default) { if (null === $user->getPreferenceValue($key)) { diff --git a/src/Constants.php b/src/Constants.php index d82a74ac..f545c787 100644 --- a/src/Constants.php +++ b/src/Constants.php @@ -17,11 +17,11 @@ class Constants /** * The current release version */ - public const VERSION = '1.29.1'; + public const VERSION = '1.30.0'; /** * The current release: major * 10000 + minor * 100 + patch */ - public const VERSION_ID = 12901; + public const VERSION_ID = 13000; /** * The current release status, either "stable" or "dev" */ diff --git a/src/Controller/HomepageController.php b/src/Controller/HomepageController.php index f7d18a15..47c5e579 100644 --- a/src/Controller/HomepageController.php +++ b/src/Controller/HomepageController.php @@ -32,7 +32,7 @@ class HomepageController extends AbstractController { /** @var User $user */ $user = $this->getUser(); - $userRoute = $user->getPreferenceValue('login.initial_view', InitialViewType::DEFAULT_VIEW); + $userRoute = $user->getPreferenceValue('login.initial_view', InitialViewType::DEFAULT_VIEW, false); $userLanguage = $user->getLanguage(); $requestLanguage = $request->getLocale(); diff --git a/src/Controller/ProfileController.php b/src/Controller/ProfileController.php index db6e2d61..5f46ddc7 100644 --- a/src/Controller/ProfileController.php +++ b/src/Controller/ProfileController.php @@ -262,7 +262,7 @@ final class ProfileController extends AbstractController // switch locale ONLY if updated profile is the current user $locale = $request->getLocale(); if ($this->getUser()->getId() === $profile->getId()) { - $locale = $profile->getPreferenceValue('language', $locale); + $locale = $profile->getPreferenceValue('language', $locale, false); } return $this->redirectToRoute('user_profile_preferences', [ diff --git a/src/Controller/ReportingController.php b/src/Controller/ReportingController.php index a1c73e61..82d72d5a 100644 --- a/src/Controller/ReportingController.php +++ b/src/Controller/ReportingController.php @@ -32,7 +32,7 @@ final class ReportingController extends AbstractController $user = $this->getUser(); $route = null; - $defaultReport = $user->getPreferenceValue('reporting.initial_view', ReportingService::DEFAULT_VIEW); + $defaultReport = $user->getPreferenceValue('reporting.initial_view', ReportingService::DEFAULT_VIEW, false); $allReports = $reportingService->getAvailableReports($user); foreach ($allReports as $report) { @@ -43,7 +43,7 @@ final class ReportingController extends AbstractController } // fallback, if the configured report could not be found - // eg. when it was deleted or replaced by an enhanced version with a new id + // e.g. when it was deleted or replaced by an enhanced version with a new id if ($route === null && \count($allReports) > 0) { $report = $allReports[array_keys($allReports)[0]]; $route = $report->getRoute(); diff --git a/src/Controller/TimesheetAbstractController.php b/src/Controller/TimesheetAbstractController.php index 2f2a42bb..c57ce0dd 100644 --- a/src/Controller/TimesheetAbstractController.php +++ b/src/Controller/TimesheetAbstractController.php @@ -535,7 +535,7 @@ abstract class TimesheetAbstractController extends AbstractController protected function includeSummary(): bool { - return (bool) $this->getUser()->getPreferenceValue('timesheet.daily_stats', false); + return (bool) $this->getUser()->getPreferenceValue('timesheet.daily_stats', false, false); } protected function includeUserInForms(string $formName): bool diff --git a/src/Controller/TimesheetTeamController.php b/src/Controller/TimesheetTeamController.php index 26bbbbdf..7f610e9e 100644 --- a/src/Controller/TimesheetTeamController.php +++ b/src/Controller/TimesheetTeamController.php @@ -116,7 +116,7 @@ class TimesheetTeamController extends TimesheetAbstractController $tags = []; /** @var Tag $tag */ foreach ($entry->getTags() as $tag) { - $tag->removeTimesheet($entry); + $entry->addTag($tag); $tags[] = $tag; } diff --git a/src/DataFixtures/TimesheetFixtures.php b/src/DataFixtures/TimesheetFixtures.php index 7d983510..b8467d7e 100644 --- a/src/DataFixtures/TimesheetFixtures.php +++ b/src/DataFixtures/TimesheetFixtures.php @@ -210,7 +210,7 @@ class TimesheetFixtures extends Fixture implements FixtureGroupInterface { $start = $this->getRandomFirstDay(); $start = $start->modify('- ' . (rand(1, 86400)) . ' seconds'); - $start->setTimezone(new \DateTimeZone($user->getPreferenceValue(UserPreference::TIMEZONE, date_default_timezone_get()))); + $start->setTimezone(new \DateTimeZone($user->getTimezone())); $entry = new Timesheet(); $entry diff --git a/src/Entity/Timesheet.php b/src/Entity/Timesheet.php index 8dc8eeb2..868c9791 100644 --- a/src/Entity/Timesheet.php +++ b/src/Entity/Timesheet.php @@ -545,7 +545,6 @@ class Timesheet implements EntityWithMetaFields, ExportItemInterface return $this; } $this->tags->add($tag); - $tag->addTimesheet($this); return $this; } @@ -559,7 +558,6 @@ class Timesheet implements EntityWithMetaFields, ExportItemInterface return; } $this->tags->removeElement($tag); - $tag->removeTimesheet($this); } /** diff --git a/src/Entity/User.php b/src/Entity/User.php index 06043b38..5182541c 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -481,17 +481,17 @@ class User implements UserInterface, EquatableInterface, \Serializable public function is24Hour(): bool { - return (bool) $this->getPreferenceValue(UserPreference::HOUR_24, true); + return (bool) $this->getPreferenceValue(UserPreference::HOUR_24, true, false); } public function getLocale(): string { - return $this->getPreferenceValue(UserPreference::LOCALE, User::DEFAULT_LANGUAGE); + return $this->getPreferenceValue(UserPreference::LOCALE, User::DEFAULT_LANGUAGE, false); } public function getTimezone(): string { - return $this->getPreferenceValue(UserPreference::TIMEZONE, date_default_timezone_get()); + return $this->getPreferenceValue(UserPreference::TIMEZONE, date_default_timezone_get(), false); } public function getLanguage(): string @@ -514,17 +514,17 @@ class User implements UserInterface, EquatableInterface, \Serializable public function getFirstDayOfWeek(): string { - return $this->getPreferenceValue(UserPreference::FIRST_WEEKDAY, User::DEFAULT_FIRST_WEEKDAY); + return $this->getPreferenceValue(UserPreference::FIRST_WEEKDAY, User::DEFAULT_FIRST_WEEKDAY, false); } public function isSmallLayout(): bool { - return $this->getPreferenceValue('theme.layout', 'fixed') === 'boxed'; + return $this->getPreferenceValue('theme.layout', 'fixed', false) === 'boxed'; } public function isExportDecimal(): bool { - return (bool) $this->getPreferenceValue('timesheet.export_decimal', false); + return (bool) $this->getPreferenceValue('timesheet.export_decimal', false, false); } public function setTimezone(?string $timezone) @@ -538,16 +538,19 @@ class User implements UserInterface, EquatableInterface, \Serializable /** * @param string $name * @param mixed $default + * @param bool $allowNull * @return bool|int|string|null */ - public function getPreferenceValue(string $name, $default = null) + public function getPreferenceValue(string $name, $default = null, bool $allowNull = true) { $preference = $this->getPreference($name); if (null === $preference) { return $default; } - return $preference->getValue(); + $value = $preference->getValue(); + + return $allowNull ? $value : ($value ?? $default); } /** diff --git a/src/Timesheet/RateService.php b/src/Timesheet/RateService.php index 9137260e..71689e66 100644 --- a/src/Timesheet/RateService.php +++ b/src/Timesheet/RateService.php @@ -65,7 +65,7 @@ final class RateService implements RateServiceInterface if (null !== $fixedRate) { if (null === $fixedInternalRate) { - $fixedInternalRate = (float) $record->getUser()->getPreferenceValue(UserPreference::INTERNAL_RATE, $fixedRate); + $fixedInternalRate = (float) $record->getUser()->getPreferenceValue(UserPreference::INTERNAL_RATE, $fixedRate, false); } return new Rate($fixedRate, $fixedInternalRate, null, $fixedRate); @@ -73,16 +73,11 @@ final class RateService implements RateServiceInterface // user preferences => fallback if nothing else was configured if (null === $hourlyRate) { - $hourlyRate = (float) $record->getUser()->getPreferenceValue(UserPreference::HOURLY_RATE, 0.00); + $hourlyRate = (float) $record->getUser()->getPreferenceValue(UserPreference::HOURLY_RATE, 0.00, false); } if (null === $internalRate) { - $internalRate = $record->getUser()->getPreferenceValue(UserPreference::INTERNAL_RATE, 0.00); - if (null === $internalRate) { - $internalRate = $hourlyRate; - } else { - $internalRate = (float) $internalRate; - } + $internalRate = (float) $record->getUser()->getPreferenceValue(UserPreference::INTERNAL_RATE, $hourlyRate, false); } $factor = 1.00; diff --git a/tests/API/TimesheetControllerTest.php b/tests/API/TimesheetControllerTest.php index d190260c..3c017729 100644 --- a/tests/API/TimesheetControllerTest.php +++ b/tests/API/TimesheetControllerTest.php @@ -312,7 +312,6 @@ class TimesheetControllerTest extends APIControllerBaseTest $timesheet = new Timesheet(); $timesheet ->setHourlyRate(137.21) - ->setInternalRate(64.96) ->setBegin($startDate) ->setEnd($endDate) ->setExported(true) @@ -348,11 +347,11 @@ class TimesheetControllerTest extends APIControllerBaseTest 'metaFields' => [], 'hourlyRate' => 137.21, 'rate' => 1772.2958, - 'internalRate' => 0.0, + 'internalRate' => 1772.2958, ]; foreach ($expected as $key => $value) { - self::assertEquals($value, $result[$key]); + self::assertEquals($value, $result[$key], sprintf('Field %s has invalid value', $key)); } } diff --git a/tests/Entity/TagTest.php b/tests/Entity/TagTest.php index 34ac743a..504d10a0 100644 --- a/tests/Entity/TagTest.php +++ b/tests/Entity/TagTest.php @@ -10,7 +10,6 @@ namespace App\Tests\Entity; use App\Entity\Tag; -use App\Entity\Timesheet; use PHPUnit\Framework\TestCase; /** @@ -40,20 +39,4 @@ class TagTest extends TestCase $sut->setColor('#fffccc'); $this->assertEquals('#fffccc', $sut->getColor()); } - - public function testWithTimesheet() - { - $sut = new Tag(); - $timesheet = new Timesheet(); - - $this->assertEmpty($timesheet->getTags()); - - $sut->setName('bar'); - $sut->addTimesheet($timesheet); - - $this->assertSame($sut, $timesheet->getTags()[0]); - - $sut->removeTimesheet($timesheet); - $this->assertEmpty($timesheet->getTags()); - } }