6f9d19bda3
Auto Tag Develop / tag (push) Successful in 7s
## Résumé Ajoute un bouton **Exporter** (admin uniquement) à droite du titre « Heures » qui génère un **PDF d'une journée**, regroupé par site, reprenant les colonnes de la vue Jour **sans la colonne « Valider »**. - Drawer : champ date (préremplit la date affichée) + cases à cocher des sites (préselectionnées sur le filtre courant). - Portée identique à l'écran : non-conducteurs, sous contrat à la date, sites cochés (lignes vides incluses). - Jour/Nuit/Total incluent le crédit d'absence et le crédit virtuel férié. ## Implémentation - Back : `WorkHourDayExport` (ApiResource) + `WorkHourDayExportProvider`, endpoint `GET /work-hours/day-export?workDate=&siteIds=` (ROLE_ADMIN). - Calcul des cellules mutualisé via `YearlyHoursExportBuilder::buildDayRowsForEmployees` (source unique de vérité). - Gabarit `templates/work-hour-day-export/print.html.twig` (A4 portrait compact). - Front : `HoursDayExportDrawer.vue` + câblage dans `pages/hours.vue`. - Docs : `doc/hours-day-export.md`, `documentation-content.ts`, `CLAUDE.md`. ## Tests - Test unitaire `YearlyHoursDayRowsTest` ajouté. - Suite complète verte : 173 tests, 359 assertions. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Reviewed-on: #24 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
68 lines
3.0 KiB
Twig
68 lines
3.0 KiB
Twig
<!doctype html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Heures - {{ dateLabel }}</title>
|
|
<style>
|
|
@page { size: A4 portrait; margin: 4mm; }
|
|
html, body { margin: 0; padding: 2mm; font-family: Helvetica, sans-serif; font-size: 10px; }
|
|
.title-bar { position: relative; margin: 0 0 3mm 0; }
|
|
h1 { text-align: center; font-size: 15px; margin: 0; }
|
|
.export-date { position: absolute; top: 0; right: 0; font-size: 9px; color: #333; padding-top: 4px; }
|
|
table { width: 100%; border-collapse: collapse; table-layout: fixed; border: 2px solid #0a0a0a; }
|
|
th, td { border: 1px solid #0a0a0a; padding: 4px 2px; vertical-align: middle; text-align: center; overflow: hidden; }
|
|
th { font-weight: 700; background: #f0f0f0; white-space: normal; }
|
|
td { white-space: nowrap; }
|
|
td.name { text-align: left; }
|
|
tr.site-title td { font-weight: bold; font-size: 11px; text-transform: uppercase; text-align: left; padding: 2px 6px; white-space: nowrap; }
|
|
tr.weekend td { background: #c0c0c0; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="title-bar">
|
|
<h1>Heures du {{ dateLabel }}</h1>
|
|
<div class="export-date">Édité le {{ exportedAt }}</div>
|
|
</div>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th style="width: 21%;">Nom</th>
|
|
<th style="width: 13%;">Statut</th>
|
|
<th style="width: 8%;">Début matin</th>
|
|
<th style="width: 8%;">Fin matin</th>
|
|
<th style="width: 8%;">Début après-midi</th>
|
|
<th style="width: 8%;">Fin après-midi</th>
|
|
<th style="width: 8%;">Début soir</th>
|
|
<th style="width: 8%;">Fin soir</th>
|
|
<th style="width: 6%;">Jour</th>
|
|
<th style="width: 6%;">Nuit</th>
|
|
<th style="width: 6%;">Total</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for group in groups %}
|
|
<tr class="site-title">
|
|
<td colspan="11" style="background: {{ group.siteColor ?: '#e8e8e8' }};">{{ group.siteName }}</td>
|
|
</tr>
|
|
{% for row in group.rows %}
|
|
<tr class="{{ row.isWeekend ? 'weekend' : '' }}">
|
|
<td class="name">{{ row.employeeName }}</td>
|
|
<td{% if row.statutColor %} style="background: {{ row.statutColor }};"{% endif %}>{{ row.statut }}</td>
|
|
<td>{{ row.morningFrom }}</td>
|
|
<td>{{ row.morningTo }}</td>
|
|
<td>{{ row.afternoonFrom }}</td>
|
|
<td>{{ row.afternoonTo }}</td>
|
|
<td>{{ row.eveningFrom }}</td>
|
|
<td>{{ row.eveningTo }}</td>
|
|
<td>{{ row.dayHours }}</td>
|
|
<td>{{ row.nightHours }}</td>
|
|
<td>{{ row.total }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</body>
|
|
</html>
|