From 78bb9e6f095cf678018fdf73ba2c1a04cff936b2 Mon Sep 17 00:00:00 2001 From: Ondrej Vlach Date: Wed, 7 Aug 2024 12:58:58 +0200 Subject: [PATCH] feat(services): add public holidays states infra --- .../PublicHolidaysStateDeterminer.php | 43 +++++++++++++++++++ ...PublicHolidaysStateDeterminerInterface.php | 28 ++++++++++++ .../PublicHolidaysStateFactory.php | 35 +++++++++++++++ .../PublicHolidaysStateDeterminerTest.php | 30 +++++++++++++ .../PublicHolidaysStateFactoryTest.php | 24 +++++++++++ 5 files changed, 160 insertions(+) create mode 100644 app/Services/WorkingDays/PublicHolidays/PublicHolidaysStateDeterminer.php create mode 100644 app/Services/WorkingDays/PublicHolidays/PublicHolidaysStateDeterminerInterface.php create mode 100644 app/Services/WorkingDays/PublicHolidays/PublicHolidaysStateFactory.php create mode 100644 tests/Unit/Services/WorkingDays/PublicHolidays/PublicHolidaysStateDeterminerTest.php create mode 100644 tests/Unit/Services/WorkingDays/PublicHolidaysStateFactoryTest.php diff --git a/app/Services/WorkingDays/PublicHolidays/PublicHolidaysStateDeterminer.php b/app/Services/WorkingDays/PublicHolidays/PublicHolidaysStateDeterminer.php new file mode 100644 index 0000000..c33dc18 --- /dev/null +++ b/app/Services/WorkingDays/PublicHolidays/PublicHolidaysStateDeterminer.php @@ -0,0 +1,43 @@ +publicHolidaysStorage->isPublicHoliday($this->country, $publicHolidayDate); + } + + public function storePublicHoliday(\DateTimeImmutable $publicHolidayDate): ?NonWorkingDays + { + return $this->publicHolidaysStorage->storePublicHoliday($this->country, $publicHolidayDate); + } + + public function isWorkingDay(\DateTimeImmutable $date): bool + { + return !$this->isPublicHoliday($date); + } + + public function getPublicHolidaysInInterval(\DateTimeImmutable $startDate, \DateTimeImmutable $endDate): array + { + return $this->publicHolidaysStorage->getPublicHolidaysInInterval($this->country, $startDate, $endDate); + } + + public function getWorkingDaysCount(\DateTimeImmutable $startDate, int $workingDays): int + { + return $workingDays - $this->publicHolidaysStorage->countPublicHolidaysInInterval($this->country, $startDate, $startDate->add(new \DateInterval(sprintf('P%dD', $workingDays)))); + } +} diff --git a/app/Services/WorkingDays/PublicHolidays/PublicHolidaysStateDeterminerInterface.php b/app/Services/WorkingDays/PublicHolidays/PublicHolidaysStateDeterminerInterface.php new file mode 100644 index 0000000..cbacd3b --- /dev/null +++ b/app/Services/WorkingDays/PublicHolidays/PublicHolidaysStateDeterminerInterface.php @@ -0,0 +1,28 @@ + + */ + public function getPublicHolidaysInInterval(\DateTimeImmutable $startDate, \DateTimeImmutable $endDate): array; +} diff --git a/app/Services/WorkingDays/PublicHolidays/PublicHolidaysStateFactory.php b/app/Services/WorkingDays/PublicHolidays/PublicHolidaysStateFactory.php new file mode 100644 index 0000000..63518b2 --- /dev/null +++ b/app/Services/WorkingDays/PublicHolidays/PublicHolidaysStateFactory.php @@ -0,0 +1,35 @@ +getStateImpl($countryCode); + } + + public function createDeterminerForCountry(string $countryCode): PublicHolidaysStateDeterminerInterface&WorkingDayDeterminerInterface + { + return $this->getStateImpl($countryCode); + } + + /** + * @param string $countryCode + * @return PublicHolidaysStateDeterminer + */ + protected function getStateImpl(string $countryCode): PublicHolidaysStateDeterminer + { + return new PublicHolidaysStateDeterminer($this->holidaysStorage, $countryCode); + } +} diff --git a/tests/Unit/Services/WorkingDays/PublicHolidays/PublicHolidaysStateDeterminerTest.php b/tests/Unit/Services/WorkingDays/PublicHolidays/PublicHolidaysStateDeterminerTest.php new file mode 100644 index 0000000..f86206a --- /dev/null +++ b/tests/Unit/Services/WorkingDays/PublicHolidays/PublicHolidaysStateDeterminerTest.php @@ -0,0 +1,30 @@ +createMock(PublicHolidaysStorageInterface::class); + $storage->expects($this->once())->method('isPublicHoliday')->with('CZ', $date); + $determiner = new PublicHolidaysStateDeterminer($storage, 'CZ'); + $determiner->isPublicHoliday($date); + } + + public function testStorageCalledWhenStorePublicHoliday(): void + { + $date = new \DateTimeImmutable('2024-01-01'); + $storage = $this->createMock(PublicHolidaysStorageInterface::class); + $storage->expects($this->once())->method('storePublicHoliday')->with('CZ', $date); + $determiner = new PublicHolidaysStateDeterminer($storage, 'CZ'); + $determiner->storePublicHoliday($date); + } +} diff --git a/tests/Unit/Services/WorkingDays/PublicHolidaysStateFactoryTest.php b/tests/Unit/Services/WorkingDays/PublicHolidaysStateFactoryTest.php new file mode 100644 index 0000000..f2d3efe --- /dev/null +++ b/tests/Unit/Services/WorkingDays/PublicHolidaysStateFactoryTest.php @@ -0,0 +1,24 @@ +createMock(PublicHolidaysStorageInterface::class); + $factory = new PublicHolidaysStateFactory($storage); + $store = $factory->createStoreForCountry('CZ'); + $determiner = $factory->createDeterminerForCountry('CZ'); + $this->assertInstanceOf(PublicHolidaysStateStorageInterface::class, $store); + $this->assertInstanceOf(PublicHolidaysStateDeterminer::class, $determiner); + } +}