136 lines
4.8 KiB
PHP
136 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace OCA\Gestion\Helpers;
|
|
|
|
use DateTime;
|
|
use DateTimeZone;
|
|
use Exception;
|
|
use IntlDateFormatter;
|
|
|
|
class DateHelpers
|
|
{
|
|
public static function isWeekend(string $dateString): bool
|
|
{
|
|
try {
|
|
$date = new DateTime($dateString);
|
|
$dayOfWeek = $date->format('N');
|
|
return in_array($dayOfWeek, [6, 7]);
|
|
} catch (Exception $e) {
|
|
// Handle invalid date strings
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function getPublicHolidayText($isPublicHoliday){
|
|
return $isPublicHoliday ? "Ferie" : "J";
|
|
}
|
|
|
|
public static function isPublicHoliday(string $dateString): bool
|
|
{
|
|
try {
|
|
$date = new DateTime($dateString);
|
|
$dayOfWeek = $date->format('N');
|
|
return $dayOfWeek == 7;
|
|
} catch (Exception $e) {
|
|
// Handle invalid date strings
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function GetMonthPlainString($month){
|
|
$formatter = new IntlDateFormatter(
|
|
'fr_FR',
|
|
IntlDateFormatter::FULL,
|
|
IntlDateFormatter::NONE,
|
|
null,
|
|
null,
|
|
'MMMM'
|
|
);
|
|
|
|
$date = DateTime::createFromFormat('!m', $month);
|
|
$monthString = strtoupper($formatter->format($date));
|
|
$normalizedMonth = mb_convert_case($monthString, MB_CASE_UPPER, "UTF-8");
|
|
|
|
return $normalizedMonth;
|
|
}
|
|
|
|
public static function GetDateWithFormatDayAndMonthPlainString(string $date){
|
|
$dateTime = new DateTime($date);
|
|
$formattedDate = $dateTime->format('d F');
|
|
$formattedDate = str_replace(
|
|
array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'),
|
|
array('JANVIER', 'FEVRIER', 'MARS', 'AVRIL', 'MAI', 'JUIN', 'JUILLET', 'AOUT', 'SEPTEMBRE', 'OCTOBRE', 'NOVEMBRE', 'DECEMBRE'),
|
|
$formattedDate
|
|
);
|
|
|
|
return $formattedDate;
|
|
}
|
|
|
|
public static function GetFullFactureOrDevisNumberByDate($date,$devisNumber,$prefix){
|
|
$year = $date->format('y');
|
|
$month = $date->format('m');
|
|
$devisNumber = str_pad($devisNumber, 2, '0', STR_PAD_LEFT);
|
|
$devisNumber = $prefix . $year . $month . $devisNumber;
|
|
return $devisNumber;
|
|
}
|
|
|
|
public static function GetLastDayOfTheMonthOfADate($datetime){
|
|
$datetime->modify('last day of this month');
|
|
$lastDay = $datetime;
|
|
return $lastDay;
|
|
}
|
|
|
|
public static function getDatesOfMonth($year, $month) {
|
|
$dates = [];
|
|
$daysInMonth = self::getDaysCountInAMonthAndYear($month, $year);
|
|
|
|
for ($day = 1; $day <= $daysInMonth; $day++) {
|
|
$dateString = sprintf("%04d-%02d-%02d", $year, $month, $day);
|
|
$dates[] = new DateTime($dateString);
|
|
}
|
|
|
|
return $dates;
|
|
}
|
|
|
|
public static function getDaysCountInAMonthAndYear($month,$year){
|
|
return $month == 2 ? ($year % 4 ? 28 : ($year % 100 ? 29 : ($year % 400 ? 28 : 29))) : (($month - 1) % 7 % 2 ? 30 : 31);
|
|
}
|
|
|
|
public static function getHoursBetweenTwoDatetime($datetimeEnd,$datetimeStart){
|
|
if($datetimeEnd == null || $datetimeStart == null){
|
|
return 0;
|
|
}
|
|
$interval = $datetimeStart->diff($datetimeEnd);
|
|
$hours = $interval->h + ($interval->days * 24) + ($interval->i / 60);
|
|
return $hours;
|
|
}
|
|
|
|
public static function GetWorkingHoursBetweenDatetimeEndAndDatetimeStart(Datetime|null $datetimeEnd,Datetime|null $datetimeStart){
|
|
if($datetimeEnd == null || $datetimeStart == null){
|
|
return 0;
|
|
}
|
|
$workingStartAM = new DateTime($datetimeStart->format('Y-m-d') . ' 08:30',$datetimeStart->getTimezone());
|
|
$workingEndAM = new DateTime($datetimeStart->format('Y-m-d') . ' 12:30',$datetimeStart->getTimezone());
|
|
$workingStartPM = new DateTime($datetimeStart->format('Y-m-d') . ' 13:30',$datetimeStart->getTimezone());
|
|
$workingEndPM = new DateTime($datetimeStart->format('Y-m-d') . ' 17:30',$datetimeStart->getTimezone());
|
|
$totalHours = 0;
|
|
if ($datetimeStart->format('N') < 7) {
|
|
$dayStartAM = max($datetimeStart, $workingStartAM);
|
|
$dayEndAM = min($datetimeEnd, $workingEndAM);
|
|
if ($dayStartAM < $dayEndAM) {
|
|
$totalHours += ($dayEndAM->getTimestamp() - $dayStartAM->getTimestamp()) / 3600;
|
|
}
|
|
$dayStartPM = max($datetimeStart, $workingStartPM);
|
|
$dayEndPM = min($datetimeEnd, $workingEndPM);
|
|
if ($dayStartPM < $dayEndPM) {
|
|
$totalHours += ($dayEndPM->getTimestamp() - $dayStartPM->getTimestamp()) / 3600;
|
|
}
|
|
}
|
|
else{
|
|
$totalHours = ($datetimeEnd->getTimestamp() - $datetimeStart->getTimestamp()) / 3600;
|
|
}
|
|
return $totalHours;
|
|
}
|
|
|
|
}
|