Finalisation réception marchandise, ajout de composant UI et ajout de fixtures (!7)

| Numéro du ticket | Titre du ticket |
|------------------|-----------------|
|                  |                 |

## Description de la PR

## Modification du .env

## Check list

- [x] Pas de régression
- [ ] TU/TI/TF rédigée
- [x] TU/TI/TF OK
- [x] CHANGELOG modifié

Reviewed-on: https://gitea.malio.fr/MALIO-DEV/Ferme/pulls/7
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
This commit is contained in:
tristan
2026-01-30 14:10:40 +00:00
committed by Autin
parent 9ae073e69e
commit 1ce6357c1d
90 changed files with 4280 additions and 307 deletions
+168 -124
View File
@@ -7,7 +7,7 @@
@page { margin: 56px 56px; }
body{
font-family: Arial, sans-serif;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 13px;
margin:0;
color:#000;
@@ -16,19 +16,17 @@
p{ margin:0; }
em{ font-style: normal; }
.red{ color:red; }
.company-block{
font-size:13px;
font-size:14px;
text-align:left;
line-height:1.25;
line-height:1.3;
}
.box{
border:1px solid #000;
border-radius:10px;
padding:10px;
font-size:13px;
font-size:16px;
height: 80px;
}
@@ -36,56 +34,87 @@
text-align:center;
font-size: 18pt;
font-weight: 700;
margin: 0 0 4mm 0;
margin: 64px 0 20px 0;
}
.info-table {
margin-bottom: 32px;
width:100%;
border-collapse:collapse;
table-layout:fixed;
}
.info-table th {
font-size: 16px;
}
table{
width:100%;
border-collapse: collapse;
}
table{ width:100%; border-collapse: collapse; }
th, td{
border:1px solid #333;
padding:4px 6px;
vertical-align: top;
font-size: 9pt;
font-size: 12px;
}
th{ text-align:center; font-weight:700; }
/* tables de layout (sans bordures) */
.layout, .layout td{ border:none !important; padding:0; }
/* GRAND TABLEAU : verrouillage dompdf */
.bigtable{ table-layout: fixed; }
/* ligne “filler” pour forcer la hauteur comme l'exemple */
.fill td{
border-top:none;
height: 75mm; /* ajuste si besoin */
.bigtable-wrap{
border: 1px solid #000;
height: 425px;
margin-bottom: 10px;
}
/* Bloc IDTF comme lexemple */
table.idtf{
width: 350px; /* ou 100% si tu préfères */
.bigtable{
width: 100%;
height: 100%;
border: none;
border-collapse: collapse;
border: 1px solid #333 !important; /* bordure extérieure */
margin-top: 12px; /* ~3mm */
font-size: 8.5pt;
table-layout: fixed;
}
/* IMPORTANT: on cible td DANS table.idtf et on force */
table.idtf td{
border: 1px solid #333 !important;
padding: 3px 5px;
vertical-align: top;
.bigtable th,
.bigtable td{
font-size: 16px;
border: 1px solid #333;
}
/* Largeurs en % (pas de mm) */
table.idtf td.n{ width: 8%; text-align:center; }
table.idtf td.prod{ width: 52%; }
table.idtf td.net{ width: 20%; }
table.idtf td.date{ width: 20%; }
.bigtable thead th{ border-top: 0; }
.bigtable tbody tr:last-child td{ border-bottom: 0; }
.signature-title{ font-size:9pt; margin-bottom:2mm; }
.signature-box{ height: 22mm; margin-bottom: 4mm; }
.meta{ font-size: 9pt; line-height: 1.35; }
.bigtable tr th:first-child,
.bigtable tr td:first-child{ border-left: 0; }
.bigtable tr th:last-child,
.bigtable tr td:last-child{ border-right: 0; }
.bigtable thead th{ border-bottom: 0; }
.bigtable tbody tr:first-child td{ border-top: 1px solid #333; }
.bigtable-notes{
font-size: 14px;
line-height: 1.25;
}
.border-bottom {
border-bottom: 1px solid #000;
}
.footer-block{ page-break-inside: avoid; }
.signature-box {
height: 22mm;
margin-bottom: 4mm;
border: 0.5px solid #000;
padding: 6px 10px;
}
.meta{ font-size: 16px; line-height: 1.35; }
</style>
</head>
@@ -95,33 +124,26 @@
<table class="layout" style="width:100%;">
<tr>
<td style="width:70%; vertical-align:top;">
<!-- table imbriquée : 1 ligne logo, 1 ligne texte (dompdf-friendly) -->
<table class="layout" style="width:100%;">
<tr>
<td style="padding:0; border:none;">
<img src="https://static.mixsuite.fr/liot/logo.png"
style="width:110px; display:block; margin:0 0 4mm 0;">
</td>
</tr>
<tr>
<td class="company-block" style="padding:0; border:none;">
<strong>SA LIOT Châtellerault</strong><br>
Site de <b>Châtellerault</b><br>
<strong>SCEA LES NAUDS</strong><br>
14 Allée dArgenson<br>
Z.I Nord Secteur Est<br>
86100 CHATELLERAULT<br>
TEL : 05 49 20 09 10 Fax : 05 49 85 37 82<br>
Tel. : 05 49 20 09 10<br>
Email : lpc.contacts@lpc-liot.fr<br>
RCS Châtellerault B 339 505 612
RCS Châtellerault B 444 262 455
</td>
</tr>
</table>
</td>
<td style="width:30%; text-align:left; vertical-align:top;">
<div class="box" style="display:inline-block; width:75mm;">
<strong class="red">Nom de l'entreprise</strong><br><br><br>
<span class="red">Adresse de l'entreprise</span>
<td style="width:30%; text-align:right; vertical-align:top; font-size: 14px;">
<div style="display:inline-block; width:75mm; line-height:1.3;">
<strong>{{ reception.supplier.name }}</strong><br>
<span>{{ reception.address.street }}</span><br>
<span>{{ reception.address.postalCode }} {{ reception.address.city }}</span>
</div>
</td>
</tr>
@@ -130,105 +152,127 @@
<div class="title">BON DE RECEPTION</div>
<!-- INFOS (code/date/num) -->
<table style="margin-bottom:3mm; width:100%; border-collapse:collapse; table-layout:fixed;">
<table class="info-table">
<tr>
<th style="width:60%; text-align:center;">Code fournisseur</th>
<th style="width:55%; text-align:center;">Code fournisseur</th>
<th style="width:20%; text-align:center; white-space:nowrap;">Date</th>
<th style="width:20%; text-align:center; white-space:nowrap;">N° réception</th>
<th style="width:25%; text-align:center; white-space:nowrap;">N° réception</th>
</tr>
<tr>
<td class="red" style="width:60%; text-align:center;">XXX</td>
<td style="width:55%; text-align:center;">{{ reception.supplier.name }}</td>
<td style="width:20%; text-align:center; white-space:nowrap;">
{{ reception.receptionDate|date('d/m/Y') }}
</td>
<td class="red" style="width:20%; text-align:center; white-space:nowrap;">86-BR-XXXX</td>
<td style="width:25%; text-align:center; white-space:nowrap;">{{ reception.identificationNumber }}</td>
</tr>
</table>
<!-- GRAND TABLEAU -->
<table class="bigtable" style="margin-bottom:10px; width:100%; border-collapse:collapse; table-layout:fixed;">
<thead>
<tr>
<th style="width:15%; text-align:center;">Code</th>
<th style="width:65%; text-align:center;">Désignation</th>
<th style="width:20%; text-align:right; white-space:nowrap;">Qté livrée (kg)</th>
</tr>
</thead>
<div class="bigtable-wrap">
<table class="bigtable">
<thead>
<tr>
<th style="width:75%; text-align:center;">Désignation</th>
<th style="width:25%; text-align:center; white-space:nowrap;">Qté livrée (kg)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="red" style="width:12%;">M</td>
<tbody>
<tr>
<td style="width:75%;">
<strong>{{ reception.receptionType.label }}</strong><br><br>
<td style="width:68%;">
<strong class="red">MAÏS sec</strong><br><br>
<div class="bigtable-notes">
{% set grossWeight = null %}
{% set tareWeight = null %}
<div style="font-size:8.5pt; line-height:1.25;">
{% set grossWeight = null %}
{% set tareWeight = null %}
{% for weight in reception.weights %}
{% if weight.type == 'gross' %}
{% set grossWeight = weight %}
<p>Poids à plein : {{ grossWeight.weight }}kg (pesée n°{{ grossWeight.dsd }} {{ grossWeight.weighedAt|date('d/m/Y H:i:s') }})</p>
{% elseif weight.type == 'tare' %}
{% set tareWeight = weight %}
<p>Poids à vide : {{ tareWeight.weight }}kg (pesée n°{{ tareWeight.dsd }} {{ tareWeight.weighedAt|date('d/m/Y H:i:s') }})</p>
{% endif %}
{% endfor %}
</div>
</td>
{% for weight in reception.weights %}
{% if weight.type == 'gross' %}
{% set grossWeight = weight %}
<p>Poids à plein : {{ grossWeight.weight }}kg (pesée n°{{ grossWeight.dsd }} {{ grossWeight.weighedAt|date('d/m/Y H:i:s') }})</p>
{% elseif weight.type == 'tare' %}
{% set tareWeight = weight %}
<p>Poids à vide : {{ tareWeight.weight }}kg (pesée n°{{ tareWeight.dsd }} {{ tareWeight.weighedAt|date('d/m/Y H:i:s') }})</p>
<td style="width:25%; text-align:center; white-space:nowrap;">
{% if grossWeight and tareWeight %}
{{ grossWeight.weight - tareWeight.weight }}
{% else %}
0
{% endif %}
</td>
</tr>
<tr class="border-bottom">
<td>
<strong>
{% if reception.merchandiseType %}
{{ reception.merchandiseType.label }}
{% else %}
-
{% endif %}
{% endfor %}
</div>
</td>
</strong>
<br><br>
<td class="red" style="width:20%; text-align:right; white-space:nowrap;">
{% if grossWeight and tareWeight %}
{{ grossWeight.weight - tareWeight.weight }}
{% else %}
0
{% endif %}
</td>
</tr>
<div class="bigtable-notes">
{% if reception.merchandiseType and reception.merchandiseType.code == 'AUTRES' and reception.merchandiseDetail %}
<p><strong>Précision</strong> : {{ reception.merchandiseDetail }}</p>
{% endif %}
<!-- filler : garde le grand bloc haut comme sur l'exemple -->
<tr class="fill">
<td style="width:15%;"></td>
<td style="width:65%;"></td>
<td style="width:20%;"></td>
</tr>
</tbody>
</table>
{% if reception.merchandiseType and reception.merchandiseType.code == 'GRANULE' %}
{% set pelletGroups = {} %}
{% for selection in reception.pelletBuildings %}
{% set pelletLabel = selection.pelletType.label %}
{% if pelletGroups[pelletLabel] is not defined %}
{% set pelletGroups = pelletGroups|merge({ (pelletLabel): [] }) %}
{% endif %}
{% set pelletGroups = pelletGroups|merge({
(pelletLabel): pelletGroups[pelletLabel]|merge([selection.building.label])
}) %}
{% endfor %}
{% for pelletLabel, buildingLabels in pelletGroups %}
<p><strong>{{ pelletLabel }}</strong> : {{ buildingLabels|join(', ') }}</p>
{% else %}
<p>Aucun dépôt de granulés renseigné.</p>
{% endfor %}
{% else %}
{% set buildingLabels = [] %}
{% for building in reception.buildings %}
{% set buildingLabels = buildingLabels|merge([building.label]) %}
{% endfor %}
{% if buildingLabels %}
<p><strong>Ferme</strong> : {{ buildingLabels|join(', ') }}</p>
{% else %}
<p>Aucun bâtiment renseigné.</p>
{% endif %}
{% endif %}
</div>
</td>
<td></td>
</tr>
</tbody>
</table>
</div>
<!-- BAS : meta à gauche / signatures à droite (sans float) -->
<table class="layout">
<!-- BAS : meta à gauche / signatures à droite -->
<table class="layout footer-block">
<tr>
<td style="width:60%; padding-right:8mm; vertical-align:top;">
<div class="meta red">
Transporteur : <strong class="red">Nom du transporteur</strong><br>
Mode de livraison : <strong class="red">Fond-mouvant</strong><br>
Immatriculation : <strong class="red">{{ reception.licensePlate }}</strong><br><br>
Poids annoncé : <strong class="red">XXXXX kg</strong>
<div class="meta">
Transporteur : <strong>{{ reception.carrier.name }}</strong><br>
Mode de livraison : <strong>{{ reception.truck.name }}</strong><br>
Immatriculation : <strong>{{ reception.licensePlate }}</strong><br><br>
</div>
<!-- Bloc IDTF -->
<table class="idtf">
<tr>
<td class="n">1</td>
<td class="prod red">
Produit : <span class="red">Nom du produit</span><br>
N° IDTF : <span class="red">4000XX</span>
</td>
<td class="net red">Nettoyage : <span class="red">A</span></td>
<td class="date red">Date : <span class="red">14/01/2026</span></td>
</tr>
<!-- répète le <tr> si besoin -->
</table>
</td>
<td style="width:40%; vertical-align:top;">
<div class="signature-title">Signature :</div>
<div class="box signature-box">Ets Liot :</div>
<div class="box signature-box">Transporteur :</div>
<div class="box signature-box">Signature les Nauds :</div>
<div class="box signature-box">Signature transporteur :</div>
</td>
</tr>
</table>