Add <thead>/<th> headers to all email and PDF template tables, fix infra test snapshot data

- Add proper <thead> with <th> headers to tables in email templates:
  order_cancelled_orga, order_notification_orga, order_refunded,
  organizer_invitation, payment_failed, scan_force_notification
- Add proper <thead> with <th> headers to tables in PDF templates:
  attestation_ventes, billet, export_recap, invoice
- Fix testInfraPageWithSnapshotData: provide complete server data
  (os, uptime, cpu, ram, disk, services, ssl) required by the template

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-04-02 13:40:48 +02:00
parent 7b618a700f
commit 8eb7d74445
11 changed files with 223 additions and 10 deletions

View File

@@ -8,6 +8,13 @@
<p>La commande <strong>{{ order.orderNumber }}</strong> pour l'evenement <strong>{{ order.event.title }}</strong> a ete <strong>{{ action }}</strong>.</p>
<table style="width: 100%; border-collapse: collapse; margin: 20px 0; border: 2px solid #111827;">
<thead>
<tr style="background: #111827; color: #fff;">
<th style="padding: 10px 12px; text-align: left; font-size: 11px; font-weight: 900; text-transform: uppercase; letter-spacing: 1px; width: 140px;">Champ</th>
<th style="padding: 10px 12px; text-align: left; font-size: 11px; font-weight: 900; text-transform: uppercase; letter-spacing: 1px;">Valeur</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom: 1px solid #e5e7eb;">
<td style="padding: 10px 12px; font-weight: 900; text-transform: uppercase; font-size: 11px; color: #6b7280; width: 140px;">Commande</td>
<td style="padding: 10px 12px; font-weight: 700; font-size: 14px;">{{ order.orderNumber }}</td>
@@ -28,6 +35,7 @@
<td style="padding: 10px 12px; font-weight: 900; text-transform: uppercase; font-size: 11px; color: #6b7280;">Montant HT</td>
<td style="padding: 10px 12px; font-weight: 900; color: #4f46e5;">{{ order.totalHTDecimal|number_format(2, ',', ' ') }} &euro;</td>
</tr>
</tbody>
</table>
{{ include('email/_order_items_table.html.twig', {order: order}) }}

View File

@@ -8,6 +8,13 @@
<p>Une nouvelle commande a ete passee pour votre evenement <strong>{{ order.event.title }}</strong>.</p>
<table style="width: 100%; border-collapse: collapse; margin: 20px 0; border: 2px solid #111827;">
<thead>
<tr style="background: #111827; color: #fff;">
<th style="padding: 10px 12px; text-align: left; font-size: 11px; font-weight: 900; text-transform: uppercase; letter-spacing: 1px; width: 140px;">Champ</th>
<th style="padding: 10px 12px; text-align: left; font-size: 11px; font-weight: 900; text-transform: uppercase; letter-spacing: 1px;">Valeur</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom: 1px solid #e5e7eb;">
<td style="padding: 10px 12px; font-weight: 900; text-transform: uppercase; font-size: 11px; color: #6b7280; width: 140px;">Commande</td>
<td style="padding: 10px 12px; font-weight: 700; font-size: 14px;">{{ order.orderNumber }}</td>
@@ -24,6 +31,7 @@
<td style="padding: 10px 12px; font-weight: 900; text-transform: uppercase; font-size: 11px; color: #6b7280;">Date</td>
<td style="padding: 10px 12px;">{{ order.paidAt|date('d/m/Y H:i') }}</td>
</tr>
</tbody>
</table>
{{ include('email/_order_items_table.html.twig', {order: order, show_total: true}) }}

View File

@@ -14,6 +14,13 @@
{% endif %}
<table style="width: 100%; border-collapse: collapse; margin: 20px 0; border: 2px solid #111827;">
<thead>
<tr style="background: #111827; color: #fff;">
<th style="padding: 10px 12px; text-align: left; font-size: 11px; font-weight: 900; text-transform: uppercase; letter-spacing: 1px; width: 140px;">Champ</th>
<th style="padding: 10px 12px; text-align: left; font-size: 11px; font-weight: 900; text-transform: uppercase; letter-spacing: 1px;">Valeur</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom: 1px solid #e5e7eb;">
<td style="padding: 10px 12px; font-weight: 900; text-transform: uppercase; font-size: 11px; color: #6b7280; width: 140px;">Commande</td>
<td style="padding: 10px 12px; font-weight: 700;">{{ order.orderNumber }}</td>
@@ -28,6 +35,7 @@
<td style="padding: 10px 12px; font-weight: 700;">{{ order.totalHTDecimal|number_format(2, ',', ' ') }} &euro;</td>
</tr>
{% endif %}
</tbody>
</table>
<p>Le remboursement sera visible sur votre releve bancaire sous 5 a 10 jours ouvrables.

View File

@@ -43,6 +43,13 @@
<p style="margin: 0 0 12px; font-size: 16px; font-weight: 900; text-transform: uppercase; letter-spacing: 2px; color: #fabf04;">Decouvrir E-Ticket by E-Cosplay</p>
<p style="margin: 0 0 8px; font-size: 14px; font-weight: 700; color: #e5e7eb;">La plateforme de billetterie en ligne qui vous permet de :</p>
<table style="width: 100%; margin-top: 12px;">
<thead>
<tr>
<th style="padding: 8px 0; font-size: 11px; font-weight: 900; text-transform: uppercase; letter-spacing: 1px; color: #fabf04; text-align: left; width: 24px;"></th>
<th style="padding: 8px 0; font-size: 11px; font-weight: 900; text-transform: uppercase; letter-spacing: 1px; color: #fabf04; text-align: left;">Fonctionnalite</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 8px 0; font-size: 13px; font-weight: 700; color: #fabf04; vertical-align: top; width: 24px;">&#10003;</td>
<td style="padding: 8px 0; font-size: 13px; font-weight: 700; color: #fff;">Creer et gerer vos evenements</td>
@@ -63,6 +70,7 @@
<td style="padding: 8px 0; font-size: 13px; font-weight: 700; color: #fabf04; vertical-align: top;">&#10003;</td>
<td style="padding: 8px 0; font-size: 13px; font-weight: 700; color: #fff;">Envoyer des invitations et gerer vos reservations</td>
</tr>
</tbody>
</table>
</div>

View File

@@ -8,6 +8,13 @@
<p>Votre paiement pour la commande <strong>{{ order.orderNumber }}</strong> (evenement <strong>{{ order.event.title }}</strong>) n'a pas pu aboutir.</p>
<table style="width: 100%; border-collapse: collapse; margin: 20px 0; border: 2px solid #dc2626;">
<thead>
<tr style="background: #dc2626; color: #fff;">
<th style="padding: 10px 12px; text-align: left; font-size: 11px; font-weight: 900; text-transform: uppercase; letter-spacing: 1px; width: 140px;">Champ</th>
<th style="padding: 10px 12px; text-align: left; font-size: 11px; font-weight: 900; text-transform: uppercase; letter-spacing: 1px;">Valeur</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom: 1px solid #e5e7eb;">
<td style="padding: 10px 12px; font-weight: 900; text-transform: uppercase; font-size: 11px; color: #6b7280; width: 140px;">Commande</td>
<td style="padding: 10px 12px; font-weight: 700;">{{ order.orderNumber }}</td>
@@ -20,6 +27,7 @@
<td style="padding: 10px 12px; font-weight: 900; text-transform: uppercase; font-size: 11px; color: #6b7280;">Motif</td>
<td style="padding: 10px 12px; font-weight: 700; color: #dc2626;">{{ errorMessage }}</td>
</tr>
</tbody>
</table>
<p>Votre commande a ete annulee. Vous pouvez retenter votre achat depuis la page de l'evenement.</p>

View File

@@ -7,11 +7,13 @@
<p>Un billet a ete <strong>force lors du scan</strong> sur votre evenement. Voici les details :</p>
<table style="width: 100%; border-spacing: 0; margin: 20px 0; border: 2px solid #111827;">
<tr style="background-color: #111827;">
<td colspan="2" style="padding: 12px 16px; color: #ffffff; font-size: 12px; font-weight: 900; text-transform: uppercase; letter-spacing: 0.1em;">
Details du billet
</td>
</tr>
<thead>
<tr style="background-color: #111827;">
<th style="padding: 12px 16px; color: #ffffff; font-size: 12px; font-weight: 900; text-transform: uppercase; letter-spacing: 0.1em; text-align: left; width: 140px;">Champ</th>
<th style="padding: 12px 16px; color: #ffffff; font-size: 12px; font-weight: 900; text-transform: uppercase; letter-spacing: 0.1em; text-align: left;">Valeur</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 10px 16px; font-size: 13px; font-weight: 700; color: #6b7280; border-bottom: 1px solid #e5e7eb; width: 140px;">Evenement</td>
<td style="padding: 10px 16px; font-size: 13px; font-weight: 800; border-bottom: 1px solid #e5e7eb;">{{ event_title }}</td>
@@ -34,15 +36,23 @@
<span style="display: inline-block; padding: 2px 10px; background: #dc2626; color: #fff; font-size: 11px; font-weight: 900; text-transform: uppercase; letter-spacing: 0.05em;">{{ previous_state }}</span>
</td>
</tr>
</tbody>
</table>
<table style="width: 100%; border-spacing: 0; margin: 20px 0; border: 2px solid #eab308; background: #fefce8;">
<thead>
<tr>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none;">Force par</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 16px;">
<p style="margin: 0 0 4px; font-size: 12px; font-weight: 900; text-transform: uppercase; letter-spacing: 0.1em; color: #92400e;">Force par</p>
<p style="margin: 0; font-size: 14px; font-weight: 800; color: #111827;">{{ forced_by_name }} ({{ forced_by_email }})</p>
</td>
</tr>
</tbody>
</table>
<p style="font-size: 13px; color: #6b7280;">Si cette action n'etait pas prevue, nous vous recommandons de verifier la situation.</p>

View File

@@ -196,6 +196,13 @@
<h2>Organisateur</h2>
<table class="info-table">
<thead>
<tr>
<th style="padding: 5px 8px; font-size: 8px; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; color: #999; text-align: left; width: 50%;">Identite</th>
<th style="padding: 5px 8px; font-size: 8px; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; color: #999; text-align: left;">Contact</th>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 50%;">
<div class="info-label">Raison sociale</div>
@@ -220,10 +227,18 @@
</td>
{% endif %}
</tr>
</tbody>
</table>
<h2>Evenement</h2>
<table class="info-table">
<thead>
<tr>
<th style="padding: 5px 8px; font-size: 8px; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; color: #999; text-align: left; width: 50%;">Information</th>
<th style="padding: 5px 8px; font-size: 8px; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; color: #999; text-align: left;">Detail</th>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 50%;">
<div class="info-label">Nom</div>
@@ -246,6 +261,7 @@
{% endif %}
</td>
</tr>
</tbody>
</table>
{% if not isSimple %}
@@ -301,16 +317,31 @@
<div class="summary-box">
<table class="summary-table">
<thead>
<tr>
<th style="padding: 5px 0; font-size: 10px; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; color: #666; text-align: left;">Indicateur</th>
<th style="padding: 5px 0; font-size: 10px; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; color: #666; text-align: right;">Total</th>
</tr>
</thead>
<tbody>
<tr>
<td class="label">Total billets emis</td>
<td class="value">{{ totalSold }}</td>
</tr>
</tbody>
</table>
</div>
{% endif %}
<div style="margin-top: 20px; border: 2px solid #e5e7eb; padding: 16px; overflow: hidden;">
<table style="width: 100%; border-collapse: collapse; table-layout: fixed;">
<thead>
<tr>
<th style="width: 170px; padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left;">QR Code</th>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left;">Verification</th>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 170px; vertical-align: top; padding-right: 16px;">
{% if qrBase64 is defined and qrBase64 %}
@@ -328,15 +359,24 @@
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="footer">
<table class="footer-table">
<thead>
<tr>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left;">Plateforme</th>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: right;">Reference</th>
</tr>
</thead>
<tbody>
<tr>
<td>E-Ticket — Plateforme de billetterie par E-Cosplay — ticket.e-cosplay.fr</td>
<td style="text-align: right;">{{ attestationRef }}</td>
</tr>
</tbody>
</table>
</div>
</body>

View File

@@ -279,26 +279,48 @@
<!-- HEADER -->
<div class="header">
<table class="header-table">
<thead>
<tr>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left;">Titre</th>
</tr>
</thead>
<tbody>
<tr>
<td>
{% set header_label = is_staff ? 'STAFF' : (is_exposant ? 'EXPOSANT' : (is_inv ? 'Invitation' : 'Billet Entree')) %}
<span class="header-org">{{ header_label }}{{ event.title }}{{ ticket.billetName }}</span>
</td>
</tr>
</tbody>
</table>
</div>
<!-- CONTENT -->
<table class="content-table">
<thead>
<tr>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left; width: 62%;">Details</th>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left; width: 38%;">Affiche</th>
</tr>
</thead>
<tbody>
<tr>
<td class="content-left">
<div class="event-title">{{ event.title }}</div>
<table class="info-table">
<thead>
<tr>
<th class="lbl" style="text-align: left; padding: 0; font-size: 0; line-height: 0; height: 0; border: none;">Champ</th>
<th class="val" style="text-align: left; padding: 0; font-size: 0; line-height: 0; height: 0; border: none;">Valeur</th>
</tr>
</thead>
<tbody>
<tr><td class="lbl">Date</td><td class="val">{{ event.startAt|date('d/m/Y') }}</td></tr>
<tr><td class="lbl">Horaires</td><td class="val">{{ event.startAt|date('H:i') }}{{ event.endAt|date('H:i') }}</td></tr>
<tr><td class="lbl">Lieu</td><td class="val">{{ event.address }}</td></tr>
<tr><td class="lbl">Ville</td><td class="val">{{ event.zipcode }} {{ event.city }}</td></tr>
</tbody>
</table>
<div class="sep"></div>
@@ -307,6 +329,13 @@
<div class="billet-price">{{ ticket.unitPriceHTDecimal|number_format(2, ',', ' ') }} &euro; HT</div>
<table class="meta-table">
<thead>
<tr>
<th style="padding: 2px 6px 2px 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left;">Information 1</th>
<th style="padding: 2px 6px 2px 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left;">Information 2</th>
</tr>
</thead>
<tbody>
<tr>
<td><div class="meta-lbl">Categorie</div><div class="meta-val">{{ ticket.billet.category.name }}</div></td>
<td><div class="meta-lbl">Date d'achat</div><div class="meta-val">{{ order.paidAt ? order.paidAt|date('d/m/Y H:i') : order.createdAt|date('d/m/Y H:i') }}</div></td>
@@ -315,6 +344,7 @@
<td><div class="meta-lbl">Acheteur</div><div class="meta-val">{{ order.firstName }} {{ order.lastName }}</div></td>
<td><div class="meta-lbl">E-mail</div><div class="meta-val">{{ order.email }}</div></td>
</tr>
</tbody>
</table>
<div style="margin-top: 8px;">
@@ -336,6 +366,13 @@
<div class="qr-section">
<table class="qr-table">
<thead>
<tr>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left; width: 140px;">QR Code</th>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: right;">References</th>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 140px;">
<img src="{{ qrBase64 }}" alt="QR" class="qr-img">
@@ -352,6 +389,7 @@
<div class="ref-val" style="letter-spacing: 2px;">{{ ticket.securityKey }}</div>
</td>
</tr>
</tbody>
</table>
</div>
</td>
@@ -361,10 +399,18 @@
{% endif %}
</td>
</tr>
</tbody>
</table>
<!-- BLOC ORGA + DESCRIPTION -->
<table style="width: 100%; border-collapse: collapse; border-top: 3px solid {{ ac }};">
<thead>
<tr>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left; width: 50%;">Organisateur</th>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left; width: 50%;">Evenement</th>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 50%; padding: 14px 15px 14px 30px; vertical-align: top; border-right: 1px solid #eee;">
<div style="font-size: 8px; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; color: #999; margin-bottom: 6px;">Organisateur</div>
@@ -394,6 +440,13 @@
<div style="font-size: 9px; color: #444; line-height: 1.4; max-height: 60px; overflow: hidden;">{{ event.description|striptags }}</div>
{% endif %}
<table style="margin-top: 8px; border-collapse: collapse;">
<thead>
<tr>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left;">QR</th>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left;">Lien</th>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: middle; padding-right: 8px;">
<img src="{{ eventQrBase64 }}" alt="QR" style="width: 50px; height: 50px;">
@@ -403,14 +456,23 @@
<div style="font-size: 8px; color: {{ ac }}; word-break: break-all;">{{ eventUrl }}</div>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<!-- INFORMATIONS PRATIQUES + CONDITIONS -->
<div style="padding: 12px 30px; border-top: 1px solid #eee; background: #fafafa;">
<table style="width: 100%; border-collapse: collapse;">
<thead>
<tr>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left; width: 50%;">Informations pratiques</th>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left; width: 50%;">Conditions generales</th>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 50%; vertical-align: top; padding-right: 15px;">
<div style="font-size: 10px; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; color: #999; margin-bottom: 4px;">Informations pratiques</div>
@@ -431,9 +493,16 @@
</div>
</td>
</tr>
</tbody>
</table>
{% if order.paymentMethod %}
<table style="width: 100%; border-collapse: collapse; margin-top: 8px; border-top: 1px solid #eee; padding-top: 6px;">
<thead>
<tr>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left;">Paiement</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding-top: 6px;">
<div style="font-size: 10px; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; color: #999; margin-bottom: 4px;">Details du paiement</div>
@@ -450,6 +519,7 @@
</div>
</td>
</tr>
</tbody>
</table>
{% endif %}
</div>
@@ -457,6 +527,14 @@
<!-- FOOTER -->
<div class="footer">
<table class="footer-table">
<thead>
<tr>
{% if logoBase64 %}<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left; width: 54px;">Logo</th>{% endif %}
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left;">Organisateur</th>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: right;">Plateforme</th>
</tr>
</thead>
<tbody>
<tr>
{% if logoBase64 %}
<td class="footer-logo" style="width: 54px; padding-right: 12px;">
@@ -477,6 +555,7 @@
</td>
<td class="footer-powered">E-Ticket<br>by E-Cosplay</td>
</tr>
</tbody>
</table>
</div>
</body>

View File

@@ -27,6 +27,16 @@
</div>
<table class="stats">
<thead>
<tr>
<th style="padding: 8px 16px; border: 2px solid #111827; font-size: 8px; text-transform: uppercase; letter-spacing: 1px; color: #666; text-align: center;">Commandes</th>
<th style="padding: 8px 16px; border: 2px solid #111827; font-size: 8px; text-transform: uppercase; letter-spacing: 1px; color: #666; text-align: center;">Total HT</th>
<th style="padding: 8px 16px; border: 2px solid #111827; font-size: 8px; text-transform: uppercase; letter-spacing: 1px; color: #666; text-align: center;">Commission E-Ticket</th>
<th style="padding: 8px 16px; border: 2px solid #111827; font-size: 8px; text-transform: uppercase; letter-spacing: 1px; color: #666; text-align: center;">Commission Stripe</th>
<th style="padding: 8px 16px; border: 2px solid #111827; font-size: 8px; text-transform: uppercase; letter-spacing: 1px; color: #666; text-align: center;">Net</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="label">Commandes</div>
@@ -56,6 +66,7 @@
</td>
{% endif %}
</tr>
</tbody>
</table>
<table class="orders">

View File

@@ -49,6 +49,13 @@
<div class="page">
<!-- HEADER -->
<table class="header-table">
<thead>
<tr>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left; width: 120px;">Logo</th>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: right;">Facture</th>
</tr>
</thead>
<tbody>
<tr>
<td class="logo">
{% if logoBase64 %}
@@ -63,10 +70,18 @@
<div class="subtitle">Date : {{ order.paidAt ? order.paidAt|date('d/m/Y') : order.createdAt|date('d/m/Y') }}</div>
</td>
</tr>
</tbody>
</table>
<!-- INFOS -->
<table class="info-table">
<thead>
<tr>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left; width: 50%;">Vendeur</th>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left; width: 50%;">Acheteur</th>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 50%; padding-right: 8px;">
<div class="info-block">
@@ -102,6 +117,7 @@
</div>
</td>
</tr>
</tbody>
</table>
<!-- ITEMS -->
@@ -128,6 +144,13 @@
<!-- TOTALS -->
<table class="total-table">
<thead>
<tr>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: left;">Libelle</th>
<th style="padding: 0; font-size: 0; line-height: 0; height: 0; border: none; text-align: right;">Montant</th>
</tr>
</thead>
<tbody>
<tr>
<td>Total HT</td>
<td style="text-align: right; font-weight: bold;">{{ order.totalHTDecimal|number_format(2, ',', ' ') }} &euro;</td>
@@ -140,6 +163,7 @@
<td>Total TTC</td>
<td style="text-align: right;">{{ order.totalHTDecimal|number_format(2, ',', ' ') }} &euro;</td>
</tr>
</tbody>
</table>
<!-- PAYMENT -->

View File

@@ -865,13 +865,22 @@ class AdminControllerTest extends WebTestCase
$originalContent = $existed ? file_get_contents($path) : null;
file_put_contents($path, json_encode([
'server' => ['hostname' => 'test'],
'server' => [
'hostname' => 'test', 'os' => 'Linux', 'uptime' => '1d',
'cpu_model' => 'Test CPU', 'cpu_cores' => '4',
'load_1m' => '0.5', 'load_5m' => '0.3', 'load_15m' => '0.1', 'load_percent' => '12',
'ram_total' => '8G', 'ram_used' => '4G', 'ram_free' => '4G', 'ram_percent' => '50',
'disk_total' => '100G', 'disk_used' => '50G', 'disk_free' => '50G', 'disk_percent' => '50',
'caddy' => ['status' => 'ok', 'info' => 'running'],
'docker' => ['status' => 'ok', 'info' => 'running'],
'ssl' => ['domain' => 'test.fr', 'issuer' => 'LE', 'valid_until' => '2027-01-01', 'days_left' => '270', 'status' => 'ok'],
],
'containers' => [],
'redis_global' => ['connected' => true],
'redis_global' => ['connected' => false, 'error' => 'Test'],
'redis_dbs' => [],
'postgres' => ['connected' => true],
'pgbouncer' => ['connected' => true],
'generated_at' => '2026-04-01',
'postgres' => ['connected' => false, 'error' => 'Test'],
'pgbouncer' => ['connected' => false, 'error' => 'Test'],
'generated_at' => '2026-04-01 10:00:00',
]));
$client->loginUser($admin);