Skip to content

Commit d3a8410

Browse files
committed
feat: improve monarchy holiday code
1 parent e782c68 commit d3a8410

21 files changed

Lines changed: 235 additions & 83 deletions

src/Yasumi/Provider/Australia.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ class Australia extends AbstractProvider
3535
*/
3636
public const ID = 'AU';
3737

38+
protected const MONARCHY_CHANGE_YEAR = 2023;
39+
3840
public string $timezone = 'Australia/Melbourne';
3941

4042
/**
@@ -234,6 +236,35 @@ protected function calculateNationalDayOfMourning(): void
234236
));
235237
}
236238

239+
/**
240+
* Monarch's Birthday.
241+
*
242+
* @throws \Exception
243+
*/
244+
protected function addMonarchsBirthdayHoliday(\DateTimeInterface $date): void
245+
{
246+
$name = $this->year >= self::MONARCHY_CHANGE_YEAR ? 'King’s Birthday' : 'Queen’s Birthday';
247+
248+
$holiday = new Holiday(
249+
'monarchsBirthday',
250+
['en' => $name],
251+
$date,
252+
$this->locale,
253+
Holiday::TYPE_OFFICIAL
254+
);
255+
256+
$this->addHoliday($holiday);
257+
258+
// Deprecated alias retained for downstream consumers using the former holiday key.
259+
$this->addHoliday(new Holiday(
260+
'queensBirthday',
261+
['en' => $name],
262+
$date,
263+
$this->locale,
264+
Holiday::TYPE_OFFICIAL
265+
));
266+
}
267+
237268
/**
238269
* Christmas Day / Boxing Day.
239270
*

src/Yasumi/Provider/Australia/AustralianCapitalTerritory.php

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -179,15 +179,9 @@ protected function easterSaturday(
179179
*/
180180
protected function calculateMonarchsBirthday(): void
181181
{
182-
$name = $this->year >= 2023 ? 'King’s Birthday' : 'Queen’s Birthday';
183-
184-
$this->addHoliday(new Holiday(
185-
'monarchsBirthday',
186-
['en' => $name],
187-
new \DateTime("second monday of june {$this->year}", DateTimeZoneFactory::getDateTimeZone($this->timezone)),
188-
$this->locale,
189-
Holiday::TYPE_OFFICIAL
190-
));
182+
$this->addMonarchsBirthdayHoliday(
183+
new \DateTime("second monday of june {$this->year}", DateTimeZoneFactory::getDateTimeZone($this->timezone))
184+
);
191185
}
192186

193187
/**

src/Yasumi/Provider/Australia/NewSouthWales.php

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,9 @@ protected function easterSaturday(
146146
*/
147147
protected function calculateMonarchsBirthday(): void
148148
{
149-
$name = $this->year >= 2023 ? 'King’s Birthday' : 'Queen’s Birthday';
150-
151-
$this->addHoliday(new Holiday(
152-
'monarchsBirthday',
153-
['en' => $name],
154-
new \DateTime("second monday of june {$this->year}", DateTimeZoneFactory::getDateTimeZone($this->timezone)),
155-
$this->locale,
156-
Holiday::TYPE_OFFICIAL
157-
));
149+
$this->addMonarchsBirthdayHoliday(
150+
new \DateTime("second monday of june {$this->year}", DateTimeZoneFactory::getDateTimeZone($this->timezone))
151+
);
158152
}
159153

160154
/**

src/Yasumi/Provider/Australia/NorthernTerritory.php

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -169,15 +169,9 @@ protected function calculateAnzacDayMonday(): void
169169
*/
170170
protected function calculateMonarchsBirthday(): void
171171
{
172-
$name = $this->year >= 2023 ? 'King’s Birthday' : 'Queen’s Birthday';
173-
174-
$this->addHoliday(new Holiday(
175-
'monarchsBirthday',
176-
['en' => $name],
177-
new \DateTime("second monday of june {$this->year}", DateTimeZoneFactory::getDateTimeZone($this->timezone)),
178-
$this->locale,
179-
Holiday::TYPE_OFFICIAL
180-
));
172+
$this->addMonarchsBirthdayHoliday(
173+
new \DateTime("second monday of june {$this->year}", DateTimeZoneFactory::getDateTimeZone($this->timezone))
174+
);
181175
}
182176

183177
/**

src/Yasumi/Provider/Australia/Queensland.php

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -150,15 +150,9 @@ protected function calculateMonarchsBirthday(): void
150150
$birthDay = "second monday of june {$this->year}";
151151
}
152152

153-
$name = $this->year >= 2023 ? 'King’s Birthday' : 'Queen’s Birthday';
154-
155-
$this->addHoliday(new Holiday(
156-
'monarchsBirthday',
157-
['en' => $name],
158-
new \DateTime($birthDay, DateTimeZoneFactory::getDateTimeZone($this->timezone)),
159-
$this->locale,
160-
Holiday::TYPE_OFFICIAL
161-
));
153+
$this->addMonarchsBirthdayHoliday(
154+
new \DateTime($birthDay, DateTimeZoneFactory::getDateTimeZone($this->timezone))
155+
);
162156
}
163157

164158
/**

src/Yasumi/Provider/Australia/SouthAustralia.php

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Yasumi\Holiday;
2222
use Yasumi\Provider\Australia;
2323
use Yasumi\Provider\DateTimeZoneFactory;
24+
use Yasumi\SubstituteHoliday;
2425

2526
/**
2627
* Provider for all holidays in South Australia (Australia).
@@ -33,6 +34,10 @@ class SouthAustralia extends Australia
3334
*/
3435
public const ID = 'AU-SA';
3536

37+
private const EASTER_SUNDAY_ESTABLISHMENT_YEAR = 2024;
38+
39+
private const PROCLAMATION_DAY_SUBSTITUTE_YEAR = 2024;
40+
3641
public string $timezone = 'Australia/Adelaide';
3742

3843
/**
@@ -48,7 +53,7 @@ public function initialize(): void
4853

4954
$this->addHoliday($this->easterSaturday($this->year, $this->timezone, $this->locale));
5055

51-
if ($this->year >= 2024) {
56+
if ($this->year >= self::EASTER_SUNDAY_ESTABLISHMENT_YEAR) {
5257
$this->addHoliday($this->easterSunday($this->year, $this->timezone, $this->locale));
5358
}
5459

@@ -155,15 +160,9 @@ protected function easterSunday(
155160
*/
156161
protected function calculateMonarchsBirthday(): void
157162
{
158-
$name = $this->year >= 2023 ? 'King’s Birthday' : 'Queen’s Birthday';
159-
160-
$this->addHoliday(new Holiday(
161-
'monarchsBirthday',
162-
['en' => $name],
163-
new \DateTime("second monday of june {$this->year}", DateTimeZoneFactory::getDateTimeZone($this->timezone)),
164-
$this->locale,
165-
Holiday::TYPE_OFFICIAL
166-
));
163+
$this->addMonarchsBirthdayHoliday(
164+
new \DateTime("second monday of june {$this->year}", DateTimeZoneFactory::getDateTimeZone($this->timezone))
165+
);
167166
}
168167

169168
/**
@@ -213,6 +212,7 @@ protected function calculateAdelaideCupDay(): void
213212
protected function calculateProclamationDay(): void
214213
{
215214
$christmasDay = new \DateTime("{$this->year}-12-25", DateTimeZoneFactory::getDateTimeZone($this->timezone));
215+
$proclamationDay = new \DateTime("{$this->year}-12-26", DateTimeZoneFactory::getDateTimeZone($this->timezone));
216216

217217
$this->addHoliday(new Holiday(
218218
'christmasDay',
@@ -222,6 +222,29 @@ protected function calculateProclamationDay(): void
222222
Holiday::TYPE_OFFICIAL
223223
));
224224

225+
if ($this->year >= self::PROCLAMATION_DAY_SUBSTITUTE_YEAR && 5 === (int) $christmasDay->format('w')) {
226+
$holiday = new Holiday(
227+
'proclamationDay',
228+
['en' => 'Proclamation Day'],
229+
$proclamationDay,
230+
$this->locale,
231+
Holiday::TYPE_OFFICIAL
232+
);
233+
234+
$this->addHoliday($holiday);
235+
236+
$proclamationDay->add(new \DateInterval('P2D'));
237+
$this->addHoliday(new SubstituteHoliday(
238+
$holiday,
239+
[],
240+
$proclamationDay,
241+
$this->locale,
242+
Holiday::TYPE_OFFICIAL
243+
));
244+
245+
return;
246+
}
247+
225248
switch ($christmasDay->format('w')) {
226249
case 0: // sunday
227250
$christmasDay->add(new \DateInterval('P1D'));

src/Yasumi/Provider/Australia/Tasmania.php

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,9 @@ protected function calculateEightHoursDay(): void
8080
*/
8181
protected function calculateMonarchsBirthday(): void
8282
{
83-
$name = $this->year >= 2023 ? 'King’s Birthday' : 'Queen’s Birthday';
84-
85-
$this->addHoliday(new Holiday(
86-
'monarchsBirthday',
87-
['en' => $name],
88-
new \DateTime("second monday of june {$this->year}", DateTimeZoneFactory::getDateTimeZone($this->timezone)),
89-
$this->locale,
90-
Holiday::TYPE_OFFICIAL
91-
));
83+
$this->addMonarchsBirthdayHoliday(
84+
new \DateTime("second monday of june {$this->year}", DateTimeZoneFactory::getDateTimeZone($this->timezone))
85+
);
9286
}
9387

9488
/**

src/Yasumi/Provider/Australia/Victoria.php

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -153,15 +153,9 @@ protected function calculateLabourDay(): void
153153
*/
154154
protected function calculateMonarchsBirthday(): void
155155
{
156-
$name = $this->year >= 2023 ? 'King’s Birthday' : 'Queen’s Birthday';
157-
158-
$this->addHoliday(new Holiday(
159-
'monarchsBirthday',
160-
['en' => $name],
161-
new \DateTime("second monday of june {$this->year}", DateTimeZoneFactory::getDateTimeZone($this->timezone)),
162-
$this->locale,
163-
Holiday::TYPE_OFFICIAL
164-
));
156+
$this->addMonarchsBirthdayHoliday(
157+
new \DateTime("second monday of june {$this->year}", DateTimeZoneFactory::getDateTimeZone($this->timezone))
158+
);
165159
}
166160

167161
/**

src/Yasumi/Provider/Australia/WesternAustralia.php

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -156,15 +156,9 @@ protected function calculateMonarchsBirthday(): void
156156
$birthDay = '2024-09-23';
157157
}
158158

159-
$name = $this->year >= 2023 ? 'King’s Birthday' : 'Queen’s Birthday';
160-
161-
$this->addHoliday(new Holiday(
162-
'monarchsBirthday',
163-
['en' => $name],
164-
new \DateTime($birthDay, DateTimeZoneFactory::getDateTimeZone($this->timezone)),
165-
$this->locale,
166-
Holiday::TYPE_OFFICIAL
167-
));
159+
$this->addMonarchsBirthdayHoliday(
160+
new \DateTime($birthDay, DateTimeZoneFactory::getDateTimeZone($this->timezone))
161+
);
168162
}
169163

170164
/**

tests/Australia/AustralianCapitalTerritory/QueensBirthdayTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@
1818
namespace Yasumi\tests\Australia\AustralianCapitalTerritory;
1919

2020
use Yasumi\Holiday;
21+
use Yasumi\tests\Australia\MonarchsBirthdayTransitionTestTrait;
2122
use Yasumi\tests\HolidayTestCase;
2223

2324
/**
2425
* Class for testing Monarch's Birthday in Australian Capital Territory (Australia)..
2526
*/
2627
class QueensBirthdayTest extends AustralianCapitalTerritoryBaseTestCase implements HolidayTestCase
2728
{
29+
use MonarchsBirthdayTransitionTestTrait;
30+
2831
/**
2932
* The name of the holiday.
3033
*/
@@ -57,7 +60,7 @@ public function testHoliday(int $year, string $expected): void
5760
/**
5861
* Returns a list of test dates.
5962
*
60-
* @return array<array> list of test dates for the holiday defined in this test
63+
* @return array<int, array{int, string}> list of test dates for the holiday defined in this test
6164
*/
6265
public static function HolidayDataProvider(): array
6366
{

0 commit comments

Comments
 (0)