feat(services): add monday-friday working day determiner
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services\WorkingDays\Date;
|
||||
|
||||
use App\Services\WorkingDays\WorkingDayDeterminerInterface;
|
||||
|
||||
/**
|
||||
* Determines if a given date is a working day (Monday to Friday)
|
||||
*/
|
||||
class MonToFriWorkingDayDeterminer implements WorkingDayDeterminerInterface
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
public function isWorkingDay(\DateTimeImmutable $date): bool
|
||||
{
|
||||
$weekday = $date->format('N');
|
||||
return $weekday <= 5; // Monday to Friday
|
||||
}
|
||||
|
||||
public function getWorkingDaysCount(\DateTimeImmutable $startDate, int $workingDays): int
|
||||
{
|
||||
$period = new \DatePeriod($startDate, new \DateInterval('P1D'), $startDate->add(new \DateInterval(sprintf('P%dD', $workingDays))));
|
||||
$workingDaysCount = 0;
|
||||
|
||||
foreach ($period as $date) {
|
||||
if ($this->isWorkingDay($date)) {
|
||||
$workingDaysCount++;
|
||||
}
|
||||
}
|
||||
|
||||
return $workingDaysCount;
|
||||
}
|
||||
}
|
||||
26
app/Services/WorkingDays/WorkingDayDeterminerInterface.php
Normal file
26
app/Services/WorkingDays/WorkingDayDeterminerInterface.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services\WorkingDays;
|
||||
|
||||
/**
|
||||
* Determinate if a given date is a working day.
|
||||
*/
|
||||
interface WorkingDayDeterminerInterface
|
||||
{
|
||||
/**
|
||||
* Determinate if a given date is a working day.
|
||||
* @param \DateTimeImmutable $date
|
||||
* @return bool
|
||||
*/
|
||||
public function isWorkingDay(\DateTimeImmutable $date): bool;
|
||||
|
||||
/**
|
||||
* Get working days count in a given interval.
|
||||
* @param \DateTimeImmutable $startDate
|
||||
* @param int $workingDays
|
||||
* @return int
|
||||
*/
|
||||
public function getWorkingDaysCount(\DateTimeImmutable $startDate, int $workingDays): int;
|
||||
}
|
||||
Reference in New Issue
Block a user