feat : modification des exports PDF et affichage du type de contrat sur l'écran des heures
Some checks failed
Auto Tag Develop / tag (push) Has been cancelled
Some checks failed
Auto Tag Develop / tag (push) Has been cancelled
This commit is contained in:
@@ -9,6 +9,8 @@ use ApiPlatform\State\ProviderInterface;
|
||||
use App\Dto\WorkHours\WorkMetrics;
|
||||
use App\Entity\Employee;
|
||||
use App\Entity\WorkHour;
|
||||
use App\Enum\ContractNature;
|
||||
use App\Enum\ContractType;
|
||||
use App\Enum\TrackingMode;
|
||||
use App\Repository\AbsenceRepository;
|
||||
use App\Repository\EmployeeRepository;
|
||||
@@ -62,8 +64,22 @@ class EmployeeYearlyHoursPrintProvider implements ProviderInterface
|
||||
}
|
||||
$year = (int) $yearRaw;
|
||||
|
||||
$from = new DateTimeImmutable("{$year}-01-01");
|
||||
$to = new DateTimeImmutable("{$year}-12-31");
|
||||
$monthRaw = (string) $request->query->get('month', '');
|
||||
$month = null;
|
||||
if ('' !== $monthRaw) {
|
||||
if (!preg_match('/^(?:0?[1-9]|1[0-2])$/', $monthRaw)) {
|
||||
throw new UnprocessableEntityHttpException('month must be between 1 and 12.');
|
||||
}
|
||||
$month = (int) $monthRaw;
|
||||
}
|
||||
|
||||
if (null !== $month) {
|
||||
$from = new DateTimeImmutable(sprintf('%d-%02d-01', $year, $month));
|
||||
$to = $from->modify('last day of this month');
|
||||
} else {
|
||||
$from = new DateTimeImmutable("{$year}-01-01");
|
||||
$to = new DateTimeImmutable("{$year}-12-31");
|
||||
}
|
||||
$days = $this->buildDays($from, $to);
|
||||
|
||||
$workHours = $this->workHourRepository->findByDateRangeAndEmployees($from, $to, [$employee]);
|
||||
@@ -83,28 +99,39 @@ class EmployeeYearlyHoursPrintProvider implements ProviderInterface
|
||||
$absenceData,
|
||||
);
|
||||
|
||||
$employeeName = trim(($employee->getLastName() ?? '').' '.($employee->getFirstName() ?? ''));
|
||||
$employeeName = trim(($employee->getLastName() ?? '').' '.($employee->getFirstName() ?? ''));
|
||||
$contractLabel = $this->buildContractLabel($employee);
|
||||
|
||||
$options = new Options();
|
||||
$options->set('isRemoteEnabled', true);
|
||||
|
||||
$dompdf = new Dompdf($options);
|
||||
$html = $this->twig->render('employee-yearly-hours/print.html.twig', [
|
||||
'employeeName' => $employeeName,
|
||||
'year' => $year,
|
||||
'segments' => $segments,
|
||||
'employeeName' => $employeeName,
|
||||
'contractLabel' => $contractLabel,
|
||||
'year' => $year,
|
||||
'month' => $month,
|
||||
'segments' => $segments,
|
||||
]);
|
||||
|
||||
$dompdf->loadHtml($html);
|
||||
$dompdf->setPaper('A4', 'portrait');
|
||||
$dompdf->render();
|
||||
|
||||
$filename = sprintf(
|
||||
'%s_%s_%d.pdf',
|
||||
$this->sanitizeFilename($employee->getLastName() ?? ''),
|
||||
$this->sanitizeFilename($employee->getFirstName() ?? ''),
|
||||
$year,
|
||||
);
|
||||
$filename = null !== $month
|
||||
? sprintf(
|
||||
'%s_%s_%d-%02d.pdf',
|
||||
$this->sanitizeFilename($employee->getLastName() ?? ''),
|
||||
$this->sanitizeFilename($employee->getFirstName() ?? ''),
|
||||
$year,
|
||||
$month,
|
||||
)
|
||||
: sprintf(
|
||||
'%s_%s_%d.pdf',
|
||||
$this->sanitizeFilename($employee->getLastName() ?? ''),
|
||||
$this->sanitizeFilename($employee->getFirstName() ?? ''),
|
||||
$year,
|
||||
);
|
||||
|
||||
return new Response($dompdf->output(), Response::HTTP_OK, [
|
||||
'Content-Type' => 'application/pdf',
|
||||
@@ -112,6 +139,36 @@ class EmployeeYearlyHoursPrintProvider implements ProviderInterface
|
||||
]);
|
||||
}
|
||||
|
||||
private function buildContractLabel(Employee $employee): ?string
|
||||
{
|
||||
$contract = $employee->getContract();
|
||||
if (null === $contract) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$natureRaw = $employee->getCurrentContractNature();
|
||||
$nature = ContractNature::tryFrom($natureRaw) ?? ContractNature::CDI;
|
||||
$natureLabel = match ($nature) {
|
||||
ContractNature::CDI => 'CDI',
|
||||
ContractNature::CDD => 'CDD',
|
||||
ContractNature::INTERIM => 'Intérim',
|
||||
};
|
||||
|
||||
$contractType = $contract->getType();
|
||||
if (ContractType::FORFAIT === $contractType) {
|
||||
return $natureLabel.' Forfait';
|
||||
}
|
||||
|
||||
$weeklyHours = $contract->getWeeklyHours();
|
||||
if (null !== $weeklyHours && $weeklyHours > 0) {
|
||||
return sprintf('%s %d heures', $natureLabel, $weeklyHours);
|
||||
}
|
||||
|
||||
$name = $contract->getName();
|
||||
|
||||
return null !== $name && '' !== $name ? $natureLabel.' '.$name : $natureLabel;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list<string>
|
||||
*/
|
||||
@@ -211,13 +268,44 @@ class EmployeeYearlyHoursPrintProvider implements ProviderInterface
|
||||
$currentRows = [];
|
||||
$currentName = null;
|
||||
|
||||
// Crop the output window to [first data day, today] to avoid padding the
|
||||
// export with empty rows (notably weekends before the first saisie or after today).
|
||||
$firstDataDate = null;
|
||||
foreach ($days as $date) {
|
||||
$contract = $contractsByDate[$date] ?? null;
|
||||
$isDriver = $driverByDate[$date] ?? false;
|
||||
$wh = $workHoursByDate[$date] ?? null;
|
||||
$hasData = null !== $wh || ($absenceData['hasDayAbsence'][$date] ?? false);
|
||||
$hasRow = null !== ($workHoursByDate[$date] ?? null)
|
||||
|| ($absenceData['hasDayAbsence'][$date] ?? false);
|
||||
if ($hasRow) {
|
||||
$firstDataDate = $date;
|
||||
|
||||
if (!$hasData) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (null === $firstDataDate) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$todayYmd = new DateTimeImmutable('today')->format('Y-m-d');
|
||||
|
||||
foreach ($days as $date) {
|
||||
if ($date < $firstDataDate || $date > $todayYmd) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$contract = $contractsByDate[$date] ?? null;
|
||||
$isDriver = $driverByDate[$date] ?? false;
|
||||
$wh = $workHoursByDate[$date] ?? null;
|
||||
$hasData = null !== $wh || ($absenceData['hasDayAbsence'][$date] ?? false);
|
||||
$isoDay = (int) new DateTimeImmutable($date)->format('N');
|
||||
$isWeekend = $isoDay >= 6;
|
||||
|
||||
// Keep weekend rows even when empty so the reader can distinguish
|
||||
// worked vs non-worked Saturdays/Sundays at a glance.
|
||||
if (!$hasData && !$isWeekend) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!$hasData && null === $contract) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -244,6 +332,7 @@ class EmployeeYearlyHoursPrintProvider implements ProviderInterface
|
||||
$row = [
|
||||
'date' => new DateTimeImmutable($date)->format('d/m/Y'),
|
||||
'absenceLabel' => $absenceLabel,
|
||||
'isWeekend' => $isWeekend,
|
||||
];
|
||||
|
||||
if ('presence' === $mode) {
|
||||
|
||||
Reference in New Issue
Block a user