feat: implement global pricing model, optional equipment contribution, and bulk save for dotations

This commit is contained in:
2026-05-20 19:00:10 +02:00
parent 2a116b1e02
commit 1af0e177d5
12 changed files with 247 additions and 50 deletions
@@ -44,6 +44,12 @@
<textarea th:field="*{description}" rows="3" class="w-full border border-gray-300 rounded-lg px-4 py-2 text-sm focus:ring-2 focus:ring-blue-500 outline-none"></textarea>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">Prix de contribution (€) - Pour équipement facultatif</label>
<input type="number" step="0.01" th:field="*{prixContribution}" required class="w-full border border-gray-300 rounded-lg px-4 py-2 text-sm focus:ring-2 focus:ring-blue-500 outline-none">
<p class="text-xs text-gray-500 mt-1">Si l'équipement est facultatif, ce montant sera ajouté au tarif global de la licence s'il est commandé.</p>
</div>
<div class="flex items-center space-x-3">
<input type="checkbox" id="obligatoire" th:field="*{obligatoire}" class="w-5 h-5 text-blue-600 border-gray-300 rounded focus:ring-blue-500">
<label for="obligatoire" class="text-sm font-medium text-gray-700">
@@ -44,12 +44,13 @@
<th class="py-3 px-6 font-medium text-left">Nom de l'équipement</th>
<th class="py-3 px-6 font-medium text-left">Description</th>
<th class="py-3 px-6 font-medium text-center">Obligatoire</th>
<th class="py-3 px-6 font-medium text-center">Prix Contribution</th>
<th class="py-3 px-6 font-medium text-right">Actions</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200 text-sm">
<tr th:if="${#lists.isEmpty(equipements)}">
<td colspan="4" class="py-8 text-center text-gray-500">Aucun équipement n'est paramétré.</td>
<td colspan="5" class="py-8 text-center text-gray-500">Aucun équipement n'est paramétré.</td>
</tr>
<tr th:each="equip : ${equipements}" class="hover:bg-gray-50 transition-colors">
<td class="py-4 px-6 font-medium text-gray-900" th:text="${equip.nom}">Maillot</td>
@@ -59,6 +60,7 @@
th:classappend="${equip.obligatoire ? 'bg-red-100 text-red-800' : 'bg-gray-100 text-gray-800'}"
th:text="${equip.obligatoire ? 'Oui' : 'Non'}">Oui</span>
</td>
<td class="py-4 px-6 text-center font-medium text-gray-700" th:text="${equip.obligatoire ? 'Inclus' : (equip.prixContribution + ' €')}">30 €</td>
<td class="py-4 px-6 text-right flex justify-end space-x-3 items-center">
<a th:href="@{/equipements/{id}/edit(id=${equip.id})}" class="text-indigo-600 hover:text-indigo-900 font-medium bg-indigo-50 px-3 py-1 rounded-lg">Modifier</a>
<form th:action="@{/equipements/{id}/delete(id=${equip.id})}" method="post" onsubmit="return confirm('Supprimer cet équipement ? Cela supprimera également les dotations associées de toutes les licences.');">