```
✨ feat(doc): Ajoute la page de documents et les AGs au sitemap. ♻️ refactor(.env): Met à jour l'URL de développement Ngrok. ✨ feat(SitemapSubscriber): Ajoute les URLs contact et doc au sitemap. ✨ feat(AgGenerator): Ajoute l'option de largeur à la signature PDF. ✨ feat(Ag/Main): Ajoute le champ de signature de l'adhésion à l'AG. ✨ feat(AgTypeEdit): Crée le formulaire d'édition du type d'AG. 🌐 i18n: Ajoute des traductions chinoises pour la page documents. ✨ feat(Mailer): Ajoute le contenu texte aux e-mails. ✨ feat(DocumentController): Ajoute le contrôleur de documents. ✨ feat(txt-mails): Ajoute les templates de mails en texte. ✨ feat(AdController): Ajoute le contrôleur d'adhésion. ✨ feat(Service/Pdf): Crée le service PDF pour l'adhésion à l'AG. ✨ feat(AdminController): Ajoute la gestion de l'AG à l'admin. 🌐 i18n: Ajoute les traductions françaises pour la page documents. ✨ feat(Members): Ajoute la relation avec la signature de l'AG. ```
This commit is contained in:
132
templates/adh.twig
Normal file
132
templates/adh.twig
Normal file
@@ -0,0 +1,132 @@
|
||||
{% extends 'base.twig' %}
|
||||
|
||||
{# --- METADATA & SCHEMA (Already using trans) --- #}
|
||||
{% block title %}{{'adh_age.title'|trans}}{% endblock %}
|
||||
{% block meta_description %}{{'adh_age.description'|trans}}{% endblock %}
|
||||
|
||||
{% block canonical_url %}<link rel="canonical" href="{{ url('app_adh',{id:main.id}) }}" />{% endblock %}
|
||||
{% block breadcrumb_schema %}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "{{ 'breadcrumb.home'|trans }}",
|
||||
"item": "{{ app.request.schemeAndHttpHost }}"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "{{ 'adh_page.breadcrumb'|trans }}",
|
||||
"item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{# --- BODY with Tailwind Styling and full i18n --- #}
|
||||
{% block body %}
|
||||
<div class="max-w-4xl mx-auto p-4 sm:p-6 lg:p-8">
|
||||
|
||||
<!-- Titre principal de la page -->
|
||||
<h1 class="text-3xl font-extrabold text-gray-900 mb-8 text-center">
|
||||
{{ 'adh_age.title'|trans }}
|
||||
</h1>
|
||||
|
||||
<!-- Carte d'information de l'AG -->
|
||||
<div class="bg-white shadow-xl rounded-2xl p-6 md:p-10 border border-gray-100">
|
||||
<h2 class="text-2xl font-bold text-indigo-700 mb-6 border-b pb-2">
|
||||
{{ 'ag.info.title'|trans }}
|
||||
</h2>
|
||||
|
||||
<div class="space-y-4">
|
||||
|
||||
<!-- Ligne 1: Date & Heure -->
|
||||
<div class="flex flex-col sm:flex-row sm:items-center">
|
||||
<span class="font-semibold text-gray-600 w-full sm:w-1/4">
|
||||
{{ 'ag.info.date_time'|trans }} :
|
||||
</span>
|
||||
<span class="text-lg font-medium text-gray-900 mt-1 sm:mt-0 sm:w-3/4">
|
||||
{{ main.agDateAt | date('d/m/Y') }} {{ 'global.at'|trans }} {{ main.agDateAt | date('H:i') }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Ligne 2: Lieu -->
|
||||
<div class="flex flex-col sm:flex-row sm:items-center">
|
||||
<span class="font-semibold text-gray-600 w-full sm:w-1/4">
|
||||
{{ 'ag.info.location'|trans }} :
|
||||
</span>
|
||||
<span class="text-gray-800 mt-1 sm:mt-0 sm:w-3/4">
|
||||
{{ main.locate }} {{ main.locateZipcode }} {{ main.locateCity }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Ligne 3: Nature de l'AG -->
|
||||
<div class="flex flex-col sm:flex-row sm:items-center">
|
||||
<span class="font-semibold text-gray-600 w-full sm:w-1/4">
|
||||
{{ 'ag.info.type'|trans }} :
|
||||
</span>
|
||||
<span class="text-gray-800 mt-1 sm:mt-0 sm:w-3/4">
|
||||
{{ main.type }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Espace pour le contenu spécifique aux adhérents : Liste des Signatures -->
|
||||
<div class="mt-12">
|
||||
<h2 class="text-xl font-semibold text-gray-900 border-b pb-2 mb-4">
|
||||
{{ 'ag.content.signatures_list'|trans({'%count%': signed|length}) }}
|
||||
</h2>
|
||||
|
||||
<div class="overflow-x-auto shadow-md rounded-lg">
|
||||
<table class="min-w-full divide-y divide-gray-200">
|
||||
<!-- En-tête du tableau -->
|
||||
<thead class="bg-indigo-50">
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider w-1/4">
|
||||
{{ 'member.civility'|trans }}
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider w-1/2">
|
||||
{{ 'member.name_surname'|trans }}
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider w-1/4">
|
||||
{{ 'member.signature'|trans }}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<!-- Corps du tableau -->
|
||||
<tbody class="bg-white divide-y divide-gray-200">
|
||||
{% for sign in signed %}
|
||||
<tr>
|
||||
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
|
||||
{{ sign.members.civ }}
|
||||
</td>
|
||||
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
|
||||
{{ sign.members.name }} {{ sign.members.surname }}
|
||||
</td>
|
||||
<td class="px-6 py-4 whitespace-nowrap text-center text-sm font-medium">
|
||||
<a href="{{ sign.sign }}" target="_blank" class="text-indigo-600 hover:text-indigo-900 font-bold hover:underline transition duration-150">
|
||||
{{ 'global.signed_link'|trans }}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% else %}
|
||||
<tr>
|
||||
<td colspan="3" class="px-6 py-4 text-center text-sm text-gray-500 italic">
|
||||
{{ 'ag.content.no_signatures_yet'|trans }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
54
templates/adh_validate.twig
Normal file
54
templates/adh_validate.twig
Normal file
@@ -0,0 +1,54 @@
|
||||
{% extends 'base.twig' %}
|
||||
|
||||
{# --- METADATA & SCHEMA (Already using trans) --- #}
|
||||
{% block title %}{{'adh_page_validate.title'|trans}}{% endblock %}
|
||||
{% block meta_description %}{{'adh_page_validate.description'|trans}}{% endblock %}
|
||||
|
||||
{% block canonical_url %}<link rel="canonical" href="{{ url('app_adh',{id:main.id,validateResult:1}) }}" />{% endblock %}
|
||||
{% block breadcrumb_schema %}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "{{ 'breadcrumb.home'|trans }}",
|
||||
"item": "{{ app.request.schemeAndHttpHost }}"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "{{ 'adh_page_validate.breadcrumb'|trans }}",
|
||||
"item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{# --- BODY with Tailwind Styling and full i18n --- #}
|
||||
{% block body %}
|
||||
<div class="max-w-xl mx-auto p-4 sm:p-6 lg:p-8">
|
||||
<div class="bg-white shadow-2xl rounded-2xl p-8 md:p-12 text-center border-t-4 border-green-500">
|
||||
<!-- Icone de succès -->
|
||||
<svg class="mx-auto h-16 w-16 text-green-500" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
|
||||
<h1 class="mt-4 text-3xl font-extrabold text-gray-900">
|
||||
{{ 'adh_page_validate.title'|trans }}
|
||||
</h1>
|
||||
|
||||
<p class="mt-4 text-lg text-gray-600">
|
||||
{{ 'adh_page_validate.success_message'|trans }}
|
||||
</p>
|
||||
|
||||
<p class="mt-6 text-xl font-semibold text-indigo-600">
|
||||
{{ 'adh_page_validate.thanks'|trans }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -18,62 +18,85 @@
|
||||
{% for ag in ags %}
|
||||
<div class="mb-6 p-4 border rounded-lg shadow-md bg-gray-50 dark:bg-gray-700 dark:border-gray-600 hover:shadow-lg transition duration-300">
|
||||
|
||||
<div class="flex justify-between items-start mb-2">
|
||||
<p class="text-lg font-semibold text-indigo-600 dark:text-indigo-400">
|
||||
{{ ag.agDateAt|date('d/m/Y H:i') }}
|
||||
<span class="ml-2 px-3 py-1 text-xs font-medium rounded-full
|
||||
{% if ag.type == 'Extraordinaire' %}
|
||||
bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300
|
||||
{% else %}
|
||||
bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300
|
||||
{% endif %}">
|
||||
{{ ag.type }}
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p class="text-sm">
|
||||
<strong>Président:</strong> {{ ag.president.pseudo }} /
|
||||
<strong>Secrétaire:</strong> {{ ag.secretaire.pseudo }}
|
||||
</p>
|
||||
|
||||
<div class="mt-2 text-sm text-gray-600 dark:text-gray-300">
|
||||
<strong>Lieu:</strong> {{ ag.locate }}
|
||||
{{ ag.locateZipcode }} {{ ag.locateCity }}
|
||||
</div>
|
||||
|
||||
<div class="mt-3 pt-3 border-t border-gray-200 dark:border-gray-600 text-sm">
|
||||
<p>
|
||||
<strong>Membres principaux:</strong> <span class="font-medium">{{ ag.mainMembers.count }}</span>
|
||||
</p>
|
||||
<p>
|
||||
<strong>Ordres du jour:</strong> <span class="font-medium">{{ ag.orders.count }}</span>
|
||||
</p>
|
||||
{# NOUVEAU CONTENEUR FLEX POUR DISPOSITION LATÉRALE #}
|
||||
<div class="flex justify-between items-start">
|
||||
|
||||
{# BLOC GAUCHE: Détails de l'AG #}
|
||||
<div class="flex-grow pr-4">
|
||||
<div class="flex justify-between items-start mb-2">
|
||||
<p class="text-lg font-semibold text-indigo-600 dark:text-indigo-400">
|
||||
{{ ag.agDateAt|date('d/m/Y H:i') }}
|
||||
<span class="ml-2 px-3 py-1 text-xs font-medium rounded-full
|
||||
{% if ag.type == 'Extraordinaire' %}
|
||||
bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300
|
||||
{% else %}
|
||||
bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300
|
||||
{% endif %}">
|
||||
{{ ag.type }}
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p class="text-sm">
|
||||
<strong>Président:</strong> {{ ag.president.pseudo }} /
|
||||
<strong>Secrétaire:</strong> {{ ag.secretaire.pseudo }}
|
||||
</p>
|
||||
|
||||
<div class="mt-2 text-sm text-gray-600 dark:text-gray-300">
|
||||
<strong>Lieu:</strong> {{ ag.locate }}
|
||||
{{ ag.locateZipcode }} {{ ag.locateCity }}
|
||||
</div>
|
||||
|
||||
<div class="mt-3 pt-3 border-t border-gray-200 dark:border-gray-600 text-sm">
|
||||
<p>
|
||||
<strong>Membres principaux:</strong> <span class="font-medium">{{ ag.mainMembers.count }}</span>
|
||||
</p>
|
||||
<p>
|
||||
<strong>Ordres du jour:</strong> <span class="font-medium">{{ ag.orders.count }}</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{# FIN BLOC GAUCHE #}
|
||||
|
||||
{# BLOC DROIT: QR CODE #}
|
||||
<div class="flex-shrink-0 pt-1">
|
||||
<p class="text-xs text-gray-500 dark:text-gray-400 text-center mb-1">Détails AG</p>
|
||||
|
||||
<img src="{{ path('admin_ag',{idQrCode:ag.id}) }}" alt="QR Code pour {{ ag.type }} du {{ ag.agDateAt|date('d/m/Y') }}" class="w-54 h-54 border border-gray-300 dark:border-gray-600 rounded-md p-1"/>
|
||||
</div>
|
||||
{# FIN BLOC DROIT #}
|
||||
|
||||
</div>
|
||||
|
||||
{# BLOC ACTIONS (GARDÉ EN DESSOUS DES DÉTAILS) #}
|
||||
{% if ag.closed == false or ag.closed == null %}
|
||||
{# Bloc Actions: SUPPRIMER / MODIFIER #}
|
||||
<div class="mt-4 pt-4 border-t border-gray-200 dark:border-gray-600 flex space-x-3">
|
||||
<a href="{{ path('admin_ag', {'idGenerate': ag.id}) }}"
|
||||
class="inline-flex items-center px-3 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-cyan-600 hover:bg-cyan-700 dark:bg-cyan-500 dark:hover:bg-cyan-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
|
||||
Générer le pdf
|
||||
</a>
|
||||
{# Bouton Modifier #}
|
||||
<a href="{{ path('admin_ag_edit', {'id': ag.id}) }}"
|
||||
class="inline-flex items-center px-3 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-indigo-600 hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
|
||||
Modifier
|
||||
</a>
|
||||
<div class="mt-4 pt-4 border-t border-gray-200 dark:border-gray-600 flex space-x-3">
|
||||
<a href="{{ path('admin_ag', {'idGenerate': ag.id}) }}"
|
||||
class="inline-flex items-center px-3 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-cyan-600 hover:bg-cyan-700 dark:bg-cyan-500 dark:hover:bg-cyan-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
|
||||
Générer le pdf
|
||||
</a>
|
||||
{% if ag.attestation == null or ag.attestation == false %}
|
||||
<a href="{{ path('admin_ag', {'idConvocation': ag.id}) }}"
|
||||
class="inline-flex items-center px-3 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-purple-600 hover:bg-purple-700 dark:bg-purple-500 dark:hover:bg-purple-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
|
||||
Envoyée les Convocation
|
||||
</a>
|
||||
{% endif %}
|
||||
{# Bouton Modifier #}
|
||||
<a href="{{ path('admin_ag_edit', {'id': ag.id}) }}"
|
||||
class="inline-flex items-center px-3 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-indigo-600 hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
|
||||
Modifier
|
||||
</a>
|
||||
|
||||
{# Bouton Supprimer #}
|
||||
<form method="POST" action="{{ path('admin_ag_delete', {'id': ag.id}) }}" onsubmit="return confirm('Êtes-vous sûr de vouloir supprimer cette Assemblée Générale ?');">
|
||||
<input type="hidden" name="_method" value="DELETE">
|
||||
{# Bouton Supprimer #}
|
||||
<form method="POST" action="{{ path('admin_ag_delete', {'id': ag.id}) }}" onsubmit="return confirm('Êtes-vous sûr de vouloir supprimer cette Assemblée Générale ?');">
|
||||
<input type="hidden" name="_method" value="DELETE">
|
||||
|
||||
<button type="submit"
|
||||
class="inline-flex items-center px-3 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-red-600 hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500">
|
||||
Supprimer
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
<button type="submit"
|
||||
class="inline-flex items-center px-3 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-red-600 hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500">
|
||||
Supprimer
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
{% else %}
|
||||
{% if ag.isSigned == true %}
|
||||
<div class="mt-4 pt-4 border-t border-gray-200 dark:border-gray-600 flex space-x-3">
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
<h2 class="col-span-full text-lg font-semibold text-gray-700 dark:text-gray-200 mb-2">Détails de l'AG</h2>
|
||||
|
||||
{{ form_row(ag.agDateAt) }}
|
||||
{{ form_row(ag.closedAt) }}
|
||||
{{ form_row(ag.type) }}
|
||||
{# Ce champ est seul sur la deuxième colonne pour l'exemple #}
|
||||
<div class="md:col-span-1"></div>
|
||||
|
||||
@@ -125,6 +125,7 @@
|
||||
{ 'name': 'Nos membres'|trans, 'route': 'app_members' },
|
||||
{ 'name': 'Nos événements'|trans, 'route': 'app_events' },
|
||||
{ 'name': 'Boutiques'|trans, 'route': 'app_shop' },
|
||||
{ 'name': 'Documents'|trans, 'route': 'app_doc' },
|
||||
{ 'name': 'Dons'|trans, 'route': 'app_dons' },
|
||||
{ 'name': 'Contact'|trans, 'route': 'app_contact' }
|
||||
] %}
|
||||
|
||||
115
templates/doc.twig
Normal file
115
templates/doc.twig
Normal file
@@ -0,0 +1,115 @@
|
||||
{% extends 'base.twig' %}
|
||||
|
||||
{# --- METADATA & SCHEMA (Already using trans) --- #}
|
||||
{% block title %}{{'doc_page.title'|trans}}{% endblock %}
|
||||
{% block meta_description %}{{'doc_page.description'|trans}}{% endblock %}
|
||||
|
||||
{% block canonical_url %}<link rel="canonical" href="{{ url('app_doc') }}" />{% endblock %}
|
||||
{% block breadcrumb_schema %}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "{{ 'breadcrumb.home'|trans }}",
|
||||
"item": "{{ app.request.schemeAndHttpHost }}"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "{{ 'doc_page.breadcrumb'|trans }}",
|
||||
"item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{# --- BODY with Tailwind Styling and full i18n --- #}
|
||||
{% block body %}
|
||||
<div class="container mx-auto p-4 md:p-8">
|
||||
{# Main Title #}
|
||||
<h1 class="text-3xl font-bold text-gray-800 mb-6 border-b pb-2">
|
||||
{{ 'doc_list.title'|trans }}
|
||||
</h1>
|
||||
|
||||
{# --- Ordinary General Assembly (AG Ordinaire) --- #}
|
||||
<section class="mb-10">
|
||||
<h2 class="text-2xl font-semibold text-indigo-600 mb-4">
|
||||
{{ 'doc_list.ag_ordinaire_title'|trans }}
|
||||
</h2>
|
||||
<div class="space-y-4">
|
||||
{% for ag in ag_ordinaire %}
|
||||
<div class="bg-white shadow-lg rounded-lg p-5 border border-gray-200 hover:shadow-xl transition duration-300">
|
||||
<div class="flex flex-wrap justify-between items-center mb-2 border-b pb-2">
|
||||
<span class="text-xl font-bold text-gray-700">
|
||||
{{ 'ag.date_at_prefix'|trans }} {{ ag.agDateAt|date('d/m/Y') }}
|
||||
</span>
|
||||
<span class="text-sm font-medium text-gray-500">
|
||||
{{ 'ag.main_members_label'|trans }} : <span class="font-semibold text-gray-700">{{ ag.mainMembers.count }}</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 text-sm text-gray-600 mb-4">
|
||||
<div>
|
||||
<strong class="text-gray-800">{{ 'ag.president_label'|trans }} :</strong>
|
||||
{{ ag.president.civ }} {{ ag.president.name }} {{ ag.president.surname }}
|
||||
</div>
|
||||
<div>
|
||||
<strong class="text-gray-800">{{ 'ag.secretary_label'|trans }} :</strong>
|
||||
{{ ag.secretaire.civ }} {{ ag.secretaire.name }} {{ ag.secretaire.surname }}
|
||||
</div>
|
||||
</div>
|
||||
<a
|
||||
download="ag_normal_ecosplay_{{ ag.agDateAt|date('d-m-Y') }}.pdf"
|
||||
href="{{ vich_uploader_asset(ag,'ag') }}"
|
||||
class="inline-block mt-2 px-4 py-2 bg-indigo-500 text-white font-semibold rounded-lg shadow-md hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 transition ease-in-out duration-150"
|
||||
>
|
||||
<i class="fas fa-file-download mr-2"></i> {{ 'ag.view_document_link'|trans }}
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{# --- Extraordinary General Assembly (AG Extraordinaire) --- #}
|
||||
<section>
|
||||
<h2 class="text-2xl font-semibold text-red-600 mb-4">
|
||||
{{ 'doc_list.ag_extraordinaire_title'|trans }}
|
||||
</h2>
|
||||
<div class="space-y-4">
|
||||
{% for ag in ag_extraordinaire %}
|
||||
<div class="bg-white shadow-lg rounded-lg p-5 border border-gray-200 hover:shadow-xl transition duration-300">
|
||||
<div class="flex flex-wrap justify-between items-center mb-2 border-b pb-2">
|
||||
<span class="text-xl font-bold text-gray-700">
|
||||
{{ 'ag.date_at_prefix'|trans }} {{ ag.agDateAt|date('d/m/Y') }}
|
||||
</span>
|
||||
<span class="text-sm font-medium text-gray-500">
|
||||
{{ 'ag.main_members_label'|trans }} : <span class="font-semibold text-gray-700">{{ ag.mainMembers.count }}</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 text-sm text-gray-600 mb-4">
|
||||
<div>
|
||||
<strong class="text-gray-800">{{ 'ag.president_label'|trans }} :</strong>
|
||||
{{ ag.president.civ }} {{ ag.president.name }} {{ ag.president.surname }}
|
||||
</div>
|
||||
<div>
|
||||
<strong class="text-gray-800">{{ 'ag.secretary_label'|trans }} :</strong>
|
||||
{{ ag.secretaire.civ }} {{ ag.secretaire.name }} {{ ag.secretaire.surname }}
|
||||
</div>
|
||||
</div>
|
||||
<a
|
||||
download="ag_normal_ecosplay_{{ ag.agDateAt|date('d-m-Y') }}.pdf"
|
||||
href="{{ vich_uploader_asset(ag,'ag') }}"
|
||||
class="inline-block mt-2 px-4 py-2 bg-red-500 text-white font-semibold rounded-lg shadow-md hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2 transition ease-in-out duration-150"
|
||||
>
|
||||
<i class="fas fa-file-download mr-2"></i> {{ 'ag.view_document_link'|trans }}
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
{% endblock %}
|
||||
111
templates/mails/ag_convocation.twig
Normal file
111
templates/mails/ag_convocation.twig
Normal file
@@ -0,0 +1,111 @@
|
||||
{% extends 'mails/base.twig' %}
|
||||
|
||||
{% block subject %}
|
||||
Convocation à l'Assemblée Générale {{ datas.main.type|default('Ordinaire ou Extraordinaire') }} du {{ datas.main.ag_date_at_dmy|default('Date non spécifiée') }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<mj-section background-color="#ffffff">
|
||||
<mj-column width="100%">
|
||||
{# 1. En-tête (Logo et Titre) #}
|
||||
<mj-text font-size="20px" font-weight="bold" align="center" padding-bottom="0">
|
||||
CONVOCATION À L'ASSEMBLÉE GÉNÉRALE
|
||||
</mj-text>
|
||||
<mj-text font-size="14px" color="#555555" align="center" padding-top="5px">
|
||||
E-Cosplay Association
|
||||
</mj-text>
|
||||
<mj-divider border-color="#e0e0e0" border-width="1px" padding="10px 0"></mj-divider>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
{# 2. Bloc Destinataire (Style Courrier) #}
|
||||
<mj-section background-color="#ffffff" padding-top="10px">
|
||||
<mj-column width="60%"></mj-column>
|
||||
<mj-column width="40%" border="1px solid #e0e0e0" padding="10px">
|
||||
<mj-text font-size="12px" line-height="16px" padding="0">
|
||||
À l'attention de :<br>
|
||||
<span style="font-weight: bold;">{{ datas.member.civ|default('') }} {{ datas.member.name|default('') }} {{ datas.member.surname|default('Cher Membre') }}</span><br>
|
||||
{# Ajout de l'adresse pour une référence complète (bien que ce soit un email) #}
|
||||
{{ datas.member.locate|default('') }}<br>
|
||||
{{ datas.member.locateZipcode|default('') }} {{ datas.member.locateCity|default('') }}
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
{# 3. Introduction et Contexte #}
|
||||
<mj-section background-color="#ffffff" padding-top="20px">
|
||||
<mj-column>
|
||||
<mj-text font-size="14px" line-height="22px">
|
||||
Cher(e) membre de l'Association E-Cosplay,
|
||||
</mj-text>
|
||||
<mj-text font-size="14px" line-height="22px" padding-top="10px">
|
||||
Vous êtes cordialement convoqué(e) à l'Assemblée Générale ({{ datas.main.type|default('Type non défini') }}) de notre association.
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
{# 4. Bloc des Détails de l'AG (Mise en évidence) #}
|
||||
<mj-section background-color="#f7f7f7" border-radius="5px" padding="20px">
|
||||
<mj-column width="100%">
|
||||
<mj-text font-size="16px" font-weight="bold" color="#333333" align="center" padding-bottom="10px">
|
||||
DÉTAILS DE L'ASSEMBLÉE
|
||||
</mj-text>
|
||||
<mj-table>
|
||||
<tr>
|
||||
<td style="width: 40%; font-weight: bold; padding: 5px 0; color: #555555;">Date :</td>
|
||||
<td style="width: 60%; padding: 5px 0;">{{ datas.main.agDateAt|date('d/m/Y') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="width: 40%; font-weight: bold; padding: 5px 0; color: #555555;">Heure de début :</td>
|
||||
<td style="width: 60%; padding: 5px 0;">{{ datas.main.agDateAt|date('H:i') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="width: 40%; font-weight: bold; padding: 5px 0; color: #555555;">Lieu :</td>
|
||||
<td style="width: 60%; padding: 5px 0;">{{ datas.main.locate }}, {{ datas.main.locateZipCode }} {{ datas.main.locateCity }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="width: 40%; font-weight: bold; padding: 5px 0; color: #555555;">Nature de l'AG :</td>
|
||||
<td style="width: 60%; padding: 5px 0;">{{ datas.main.type|default('Non spécifiée') }}</td>
|
||||
</tr>
|
||||
</mj-table>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
{# 5. Avertissement sur les Droits de Vote (Nouveau bloc en rouge) #}
|
||||
<mj-section background-color="#ffffff" padding-top="15px" padding-bottom="15px">
|
||||
<mj-column>
|
||||
<mj-text font-size="14px" font-weight="bold" color="#FF0000" align="center" padding="0">
|
||||
ATTENTION : Seuls les membres à jour de leurs adhésions pourront voter.
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
{# 6. Clôture et Signature #}
|
||||
<mj-section background-color="#ffffff" padding-top="0">
|
||||
<mj-column>
|
||||
<mj-text font-size="14px" line-height="22px">
|
||||
Nous vous rappelons que votre présence est essentielle pour la vie démocratique de l'association. En cas d'impossibilité, vous pouvez vous faire représenter par un autre membre de votre choix via procuration.
|
||||
</mj-text>
|
||||
<mj-text font-size="14px" line-height="22px" padding-top="10px">
|
||||
Dans l'attente de vous accueillir, veuillez agréer, cher(e) membre, l'expression de nos salutations distinguées.
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section background-color="#ffffff" padding-top="20px">
|
||||
<mj-column width="40%"></mj-column>
|
||||
<mj-column width="60%">
|
||||
<mj-text font-size="14px" align="right" padding="0">
|
||||
Fait à {{ datas.main.locate_city|default('Lieu non défini') }}, le {{ datas.main.ag_date_at_dmy|default('Date non définie') }}
|
||||
</mj-text>
|
||||
<mj-spacer height="30px" />
|
||||
<mj-text font-size="14px" align="right" padding="0">
|
||||
Le {{ (datas.main.president.civ|default('M.') == 'Mme') ? 'Présidente' : 'Président' }} de l'Association,
|
||||
</mj-text>
|
||||
<mj-text font-size="14px" font-weight="bold" align="right" padding="0">
|
||||
{{ datas.main.president.civ|default('M.') }} {{ datas.main.president.name|default('Nom') }} {{ datas.main.president.surname|default('Prénom') }}
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
{% endblock %}
|
||||
43
templates/txt-mails/ag_convocation.twig
Normal file
43
templates/txt-mails/ag_convocation.twig
Normal file
@@ -0,0 +1,43 @@
|
||||
{% extends 'txt-mails/base.twig' %}
|
||||
|
||||
{% block subject %}
|
||||
Convocation à l'Assemblée Générale {{ datas.main.type|default('Ordinaire ou Extraordinaire') }} du {{ datas.main.ag_date_at_dmy|default('Date non spécifiée') }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
CONVOCATION À L'ASSEMBLÉE GÉNÉRALE
|
||||
===================================
|
||||
E-Cosplay Association
|
||||
|
||||
--- Destinataire ---
|
||||
À l'attention de :
|
||||
{{ datas.member.civ|default('') }} {{ datas.member.name|default('') }} {{ datas.member.surname|default('Cher Membre') }}
|
||||
{{ datas.member.locate|default('') }}
|
||||
{{ datas.member.locateZipcode|default('') }} {{ datas.member.locateCity|default('') }}
|
||||
--------------------
|
||||
|
||||
Cher(e) membre de l'Association E-Cosplay,
|
||||
|
||||
Vous êtes cordialement convoqué(e) à l'Assemblée Générale ({{ datas.main.type|default('Type non défini') }}) de notre association.
|
||||
|
||||
===================================
|
||||
DÉTAILS DE L'ASSEMBLÉE
|
||||
===================================
|
||||
Nature de l'AG : {{ datas.main.type|default('Non spécifiée') }}
|
||||
Date : {{ datas.main.agDateAt|date('d/m/Y') }}
|
||||
Heure de début : {{ datas.main.agDateAt|date('H:i') }}
|
||||
Lieu : {{ datas.main.locate }}, {{ datas.main.locateZipCode }} {{ datas.main.locateCity }}
|
||||
===================================
|
||||
|
||||
ATTENTION : Seuls les membres à jour de leurs adhésions pourront voter.
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Nous vous rappelons que votre présence est essentielle pour la vie démocratique de l'association. En cas d'impossibilité, vous pouvez vous faire représenter par un autre membre de votre choix via procuration.
|
||||
|
||||
Dans l'attente de vous accueillir, veuillez agréer, cher(e) membre, l'expression de nos salutations distinguées.
|
||||
|
||||
Fait à {{ datas.main.locate_city|default('Lieu non défini') }}, le {{ datas.main.ag_date_at_dmy|default('Date non définie') }}
|
||||
|
||||
Le {{ (datas.main.president.civ|default('M.') == 'Mme') ? 'Présidente' : 'Président' }} de l'Association,
|
||||
{{ datas.main.president.civ|default('M.') }} {{ datas.main.president.name|default('Nom') }} {{ datas.main.president.surname|default('Prénom') }}
|
||||
{% endblock %}
|
||||
20
templates/txt-mails/base.twig
Normal file
20
templates/txt-mails/base.twig
Normal file
@@ -0,0 +1,20 @@
|
||||
[E-Cosplay] - {{ system.subject }}
|
||||
|
||||
==================================================
|
||||
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
|
||||
==================================================
|
||||
|
||||
Si vous ne parvenez pas à cliquer sur un lien dans cet e-mail, veuillez copier et coller l'URL dans la barre d'adresse de votre navigateur.
|
||||
|
||||
---
|
||||
© {{ "now"|date("Y") }} E-COSPLAY. Tous droits réservés.
|
||||
|
||||
E-COSPLAY, 42 rue de saint-quentin, 02800 Beautor, France
|
||||
Association loi 1901 à but non lucratif. - RNA N°W022006988
|
||||
|
||||
Retrouvez-nous sur :
|
||||
Facebook : https://www.facebook.com/assocationecosplay/
|
||||
Instagram : https://www.instagram.com/asso_ecosplay/
|
||||
26
templates/txt-mails/contact.twig
Normal file
26
templates/txt-mails/contact.twig
Normal file
@@ -0,0 +1,26 @@
|
||||
{% extends 'txt-mails/base.twig' %}
|
||||
|
||||
{% block content %}
|
||||
Nouveau Message de Contact
|
||||
=========================
|
||||
Vous avez reçu un nouveau message via le formulaire de contact du site.
|
||||
|
||||
--- DÉTAILS DE L'EXPÉDITEUR ---
|
||||
|
||||
Expéditeur : {{ datas.dto.surname }} {{ datas.dto.name }}
|
||||
E-mail : {{ datas.dto.email }}
|
||||
{% if datas.dto.tel is not empty %}Tél : {{ datas.dto.tel }}{% endif %}
|
||||
|
||||
--------------------------------
|
||||
|
||||
Objet du Message : {{ datas.dto.subject }}
|
||||
|
||||
Contenu du Message :
|
||||
--------------------------------------------------
|
||||
{{ datas.dto.message | raw }}
|
||||
--------------------------------------------------
|
||||
|
||||
Pour répondre à l'expéditeur, utilisez l'adresse e-mail ci-dessous :
|
||||
Répondre à : mailto:{{ datas.dto.email }}
|
||||
|
||||
{% endblock %}
|
||||
24
templates/txt-mails/cota_validation.twig
Normal file
24
templates/txt-mails/cota_validation.twig
Normal file
@@ -0,0 +1,24 @@
|
||||
{% extends 'txt-mails/base.twig' %}
|
||||
|
||||
{% block content %}
|
||||
✅ Paiement Confirmé
|
||||
====================
|
||||
|
||||
Bonjour {{ datas.pseudo }},
|
||||
|
||||
Nous vous confirmons la bonne réception de votre paiement de cotisation. Merci beaucoup pour votre soutien ! Votre adhésion est maintenant active.
|
||||
|
||||
--- DÉTAILS DE VOTRE ADHÉSION ---
|
||||
|
||||
Période d'Adhésion : Du {{ datas.start_at|date('d/m/Y') }} au {{ datas.end_at|date('d/m/Y') }}
|
||||
|
||||
Montant Payé : {{ datas.amount|format_currency('EUR', locale='fr') }}
|
||||
|
||||
---------------------------------
|
||||
|
||||
Une question ? N'hésitez pas à nous contacter.
|
||||
|
||||
---
|
||||
|
||||
Cet e-mail est envoyé automatiquement.
|
||||
{% endblock %}
|
||||
30
templates/txt-mails/coti_payment.twig
Normal file
30
templates/txt-mails/coti_payment.twig
Normal file
@@ -0,0 +1,30 @@
|
||||
{% extends 'txt-mails/base.twig' %}
|
||||
|
||||
{% block content %}
|
||||
Votre Cotisation Annuelle
|
||||
=========================
|
||||
|
||||
Bonjour {{ datas.pseudo }},
|
||||
|
||||
Nous vous remercions de votre engagement. Veuillez trouver ci-dessous les détails de votre cotisation pour la période à venir.
|
||||
|
||||
--- DÉTAILS DE LA COTISATION ---
|
||||
|
||||
Période : Du {{ datas.start_at|date('d/m/Y') }} au {{ datas.end_at|date('d/m/Y') }}
|
||||
|
||||
Montant total : {{ datas.amount|format_currency('EUR', locale='fr') }}
|
||||
|
||||
---------------------------------
|
||||
|
||||
Pour renouveler votre adhésion, veuillez procéder au paiement sécurisé en utilisant le lien ci-dessous :
|
||||
|
||||
Procéder au Paiement Sécurisé :
|
||||
{{ datas.link }}
|
||||
|
||||
Si le lien ci-dessus ne fonctionne pas, veuillez copier-coller l'adresse suivante dans votre navigateur :
|
||||
{{ datas.link }}
|
||||
|
||||
---
|
||||
|
||||
Cet e-mail est envoyé automatiquement. Merci de ne pas y répondre.
|
||||
{% endblock %}
|
||||
39
templates/txt-mails/dons.twig
Normal file
39
templates/txt-mails/dons.twig
Normal file
@@ -0,0 +1,39 @@
|
||||
{% extends 'txt-mails/base.twig' %}
|
||||
|
||||
{% block content %}
|
||||
Confirmation de votre Don
|
||||
Un immense merci pour votre générosité !
|
||||
|
||||
==================================================
|
||||
|
||||
Nous avons bien reçu votre soutien d'un montant de :
|
||||
|
||||
>>> {{ datas.don.amount|format_currency('EUR', locale='fr') }} <<<
|
||||
|
||||
Bonjour {% if datas.don.name %}{{ datas.don.name }}{% else %}Cher Donateur{% endif %},
|
||||
|
||||
Votre don a été confirmé avec succès. Votre contribution est essentielle pour l'organisation de nos événements, l'achat de matériel et le maintien de nos activités.
|
||||
|
||||
--- DÉTAILS DE VOTRE TRANSACTION ---
|
||||
|
||||
Nom/Pseudo : {% if datas.don.name %}{{ datas.don.name }}{% else %}Anonyme{% endif %}
|
||||
Montant : {{ datas.don.amount|format_currency('EUR', locale='fr') }}
|
||||
|
||||
{% if datas.don.message %}
|
||||
Message :
|
||||
"{{ datas.don.message }}"
|
||||
{% endif %}
|
||||
--------------------------------------------------
|
||||
|
||||
==================================================
|
||||
|
||||
Votre reçu fiscal se trouve en pièce jointe de cet e-mail.
|
||||
|
||||
NOTE IMPORTANTE : Notre association ne vous permet pas de bénéficier d'une réduction d'impôt.
|
||||
|
||||
Si vous avez des questions, n'hésitez pas à nous contacter.
|
||||
|
||||
Cordialement,
|
||||
|
||||
L'équipe E-Cosplay
|
||||
{% endblock %}
|
||||
23
templates/txt-mails/dons_new.twig
Normal file
23
templates/txt-mails/dons_new.twig
Normal file
@@ -0,0 +1,23 @@
|
||||
{% extends 'txt-mails/base.twig' %}
|
||||
|
||||
{% block content %}
|
||||
==================================================
|
||||
🚨 NOUVEAU DON ARRIVÉ ! 🚨
|
||||
==================================================
|
||||
|
||||
Un nouvel acte de générosité a été enregistré. Voici les détails :
|
||||
|
||||
Montant du Don : {{ datas.don.amount|format_currency('EUR', locale='fr') }}
|
||||
|
||||
--- DÉTAILS DU DONATEUR ---
|
||||
Donateur : {% if datas.don.name %}{{ datas.don.name }}{% else %}Anonyme / Non spécifié{% endif %}
|
||||
E-mail : {{ datas.don.email }}
|
||||
---------------------------
|
||||
|
||||
{% if datas.don.message %}
|
||||
Message laissé par le donateur :
|
||||
--------------------------------------------------
|
||||
"{{ datas.don.message }}"
|
||||
--------------------------------------------------
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
25
templates/txt-mails/new_admin.twig
Normal file
25
templates/txt-mails/new_admin.twig
Normal file
@@ -0,0 +1,25 @@
|
||||
{% extends 'txt-mails/base.twig' %}
|
||||
|
||||
{% block content %}
|
||||
Bonjour,
|
||||
|
||||
Nous avons le plaisir de vous informer que votre compte administrateur a été créé.
|
||||
|
||||
Voici vos identifiants de connexion temporaires :
|
||||
--------------------------------------------------
|
||||
Nom d'utilisateur : {{ datas.username }}
|
||||
Mot de passe : {{ datas.password }}
|
||||
--------------------------------------------------
|
||||
|
||||
Pour des raisons de sécurité, nous vous demandons de bien vouloir modifier votre mot de passe lors de votre première connexion.
|
||||
|
||||
Vous pouvez vous connecter à votre compte en utilisant le lien ci-dessous :
|
||||
|
||||
Lien de connexion : {{ system.path }}{{ datas.url }}
|
||||
|
||||
Si vous avez des questions ou rencontrez des difficultés, n'hésitez pas à nous contacter.
|
||||
|
||||
Cordialement,
|
||||
|
||||
L'équipe E-Cosplay
|
||||
{% endblock %}
|
||||
27
templates/txt-mails/reset.twig
Normal file
27
templates/txt-mails/reset.twig
Normal file
@@ -0,0 +1,27 @@
|
||||
{% extends 'txt-mails/base.twig' %}
|
||||
|
||||
{% block content %}
|
||||
Bonjour,
|
||||
|
||||
{% if 'ROLE_CUSTOMER' in datas.account.roles %}
|
||||
Nous avons reçu une demande de réinitialisation de mot de passe pour votre espace client.
|
||||
{% else %}
|
||||
Nous avons reçu une demande de réinitialisation de mot de passe pour votre compte E-Cosplay.
|
||||
{% endif %}
|
||||
|
||||
Pour réinitialiser votre mot de passe, veuillez cliquer sur le lien ci-dessous. Ce lien est valable pour une durée limitée.
|
||||
|
||||
--------------------------------------------------
|
||||
Réinitialiser mon mot de passe :
|
||||
{{ datas.resetLink }}
|
||||
--------------------------------------------------
|
||||
|
||||
Ce lien expirera le {{ datas.request.expiresAt|date('d/m/Y à H:i') }}.
|
||||
Veuillez l'utiliser avant cette date et heure.
|
||||
|
||||
Si vous n'avez pas demandé cette réinitialisation de mot de passe, veuillez ignorer cet e-mail. Votre mot de passe actuel restera inchangé.
|
||||
|
||||
Cordialement,
|
||||
|
||||
L'équipe E-Cosplay
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user