Skip to content

Commit

Permalink
handle lunar holidays that can happen twice a year
Browse files Browse the repository at this point in the history
  • Loading branch information
Nielsvanpach committed Mar 11, 2024
1 parent df81e49 commit e003bf4
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 18 deletions.
11 changes: 10 additions & 1 deletion lang/turkey/tr/holidays.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,14 @@
"Democracy and National Unity Day": "Demokrasi ve Millî Birlik Günü",
"Victory Day": "Zafer Bayramı",
"Republic Day Eve": "Cumhuriyet Bayramı Arifesi",
"Republic Day": "Cumhuriyet Bayramı"
"Republic Day": "Cumhuriyet Bayramı",
"2. Eid al-Fitr Eve": "2. Ramazan Bayramı Arifesi",
"2. Eid al-Fitr": "2. Ramazan Bayramı 1. Gün",
"2. Eid al-Fitr Day 2": "2. Ramazan Bayramı 2. Gün",
"2. Eid al-Fitr Day 3": "2. Ramazan Bayramı 3. Gün",
"2. Eid al-Adha Eve": "2. Kurban Bayramı Arifesi",
"2. Eid al-Adha": "2. Kurban Bayramı 1. Gün",
"2. Eid al-Adha Day 2": "2. Kurban Bayramı 2. Gün",
"2. Eid al-Adha Day 3": "2. Kurban Bayramı 3. Gün",
"2. Eid al-Adha Day 4": "2. Kurban Bayramı 4. Gün"
}
50 changes: 40 additions & 10 deletions src/Calendars/IslamicCalendar.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,61 @@
/** @mixin Country */
trait IslamicCalendar
{
public function eidAlFitr(int $year, int $totalDays = 3): CarbonPeriod
/** @return CarbonPeriod|array<CarbonPeriod> */
public function eidAlFitr(int $year, int $totalDays = 3): CarbonPeriod|array
{
try {
$date = self::eidAlFitr[$year];
} catch (RuntimeException) {
} catch (\Exception) {
throw InvalidYear::range($this->countryCode(), 1970, 2037);
}

$start = CarbonImmutable::createFromFormat('Y-m-d', "{$year}-{$date}")->startOfDay();
$end = $start->addDays($totalDays - 1)->startOfDay();
if (! is_array($date)) {
$start = CarbonImmutable::createFromFormat('Y-m-d', "{$year}-{$date}")->startOfDay();
$end = $start->addDays($totalDays - 1)->startOfDay();

return CarbonPeriod::create($start, '1 day', $end);
return CarbonPeriod::create($start, '1 day', $end);
}

// Twice a year
$periods = [];
$dates = $date;

foreach ($dates as $date) {
$start = CarbonImmutable::createFromFormat('Y-m-d', "{$year}-{$date}")->startOfDay();
$end = $start->addDays($totalDays-1)->startOfDay();
$periods[] = CarbonPeriod::create($start, '1 day', $end);
}

return $periods;
}

public function eidAlAdha(int $year, int $totalDays = 4): CarbonPeriod
/** @return CarbonPeriod|array<CarbonPeriod> */
public function eidAlAdha(int $year, int $totalDays = 4): CarbonPeriod|array
{
try {
$date = self::eidAlAdha[$year];
} catch (RuntimeException) {
} catch (\Exception) {
throw InvalidYear::range($this->countryCode(), 1970, 2037);
}

$start = CarbonImmutable::createFromFormat('Y-m-d', "{$year}-{$date}")->startOfDay();
$end = $start->addDays($totalDays - 1)->startOfDay();
if (! is_array($date)) {
$start = CarbonImmutable::createFromFormat('Y-m-d', "{$year}-{$date}")->startOfDay();
$end = $start->addDays($totalDays - 1)->startOfDay();

return CarbonPeriod::create($start, '1 day', $end);
}

// Twice a year
$periods = [];
$dates = $date;

foreach ($dates as $date) {
$start = CarbonImmutable::createFromFormat('Y-m-d', "{$year}-{$date}")->startOfDay();
$end = $start->addDays($totalDays-1)->startOfDay();
$periods[] = CarbonPeriod::create($start, '1 day', $end);
}

return CarbonPeriod::create($start, '1 day', $end);
return $periods;
}
}
2 changes: 1 addition & 1 deletion src/Contracts/Islamic.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ interface Islamic
{
public function islamicHolidays(int $year): array;

public function eidAlFitr(int $year): CarbonPeriod;
public function eidAlFitr(int $year): CarbonPeriod|array;
}
39 changes: 33 additions & 6 deletions src/Countries/Turkey.php
Original file line number Diff line number Diff line change
Expand Up @@ -212,12 +212,39 @@ public function islamicHolidays(int $year): array
$eidAlFitr = $this->eidAlFitr($year);
$eidAlAdha = $this->eidAlAdha($year);

$holidays = [
'Eid al-Fitr Eve' => $eidAlFitr->first()?->subDay()->toImmutable(),
'Eid al-Fitr' => $this->eidAlFitr($year),
'Eid al-Adha Eve' => $eidAlAdha->first()?->subDay()->toImmutable(),
'Eid al-Adha' => $this->eidAlAdha($year),
];
if (is_array($eidAlAdha)) {
$holidays = [
'Eid al-Adha Eve' => $eidAlAdha[0]->first()?->subDay()->toImmutable(),
'Eid al-Adha' => $eidAlAdha[0],
];

$holidays = array_merge($holidays, [
'2. Eid al-Adha Eve' => $eidAlAdha[1]->first()?->subDay()->toImmutable(),
'2. Eid al-Adha' => $eidAlAdha[1],
]);
} else {
$holidays = [
'Eid al-Adha Eve' => $eidAlAdha->first()?->subDay()->toImmutable(),
'Eid al-Adha' => $eidAlAdha,
];
}

if (is_array($eidAlFitr)) {
$holidays = array_merge($holidays, [
'Eid al-Fitr Eve' => $eidAlFitr[0]->first()?->subDay()->toImmutable(),
'Eid al-Fitr' => $eidAlFitr[0],
]);

$holidays = array_merge($holidays, [
'Eid al-Fitr Eve' => $eidAlFitr[1]->first()?->subDay()->toImmutable(),
'Eid al-Fitr' => $eidAlFitr[1],
]);
} else {
$holidays = array_merge($holidays, [
'Eid al-Fitr Eve' => $eidAlFitr->first()?->subDay()->toImmutable(),
'Eid al-Fitr' => $eidAlFitr,
]);
}

return $this->convertPeriods($holidays);
}
Expand Down
2 changes: 2 additions & 0 deletions tests/HolidaysTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@
});

it('default when the locale file is missing', function () {
CarbonImmutable::setTestNow('2024-01-01');

// so we don't need to have a translation file for the language in the Country class
$holidays = Holidays::for(country: 'be', locale: 'en')->get();

Expand Down

0 comments on commit e003bf4

Please sign in to comment.