Migrate all remaining inline styles to CSS classes for CSP compliance

- Remove ALL inline style= attributes from 22 templates (except email/pdf)
- Add admin CSS classes in admin.scss (admin-card, admin-table, admin-btn, admin-badge, admin-tab, admin-form, admin-nav, admin-pagination)
- Add .bg-instagram, .detail-table, .section-header to app.scss
- Templates migrated: base, account/index, account/edit_subaccount, security/register, security/change_password, home/tarifs, home/index, all 7 legal pages, all 8 admin pages
- Total: ~1000 inline style= replaced with CSS classes and Tailwind utilities
- Fixes Content Security Policy violations blocking inline styles in production

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-03-20 15:38:02 +01:00
parent bd51f42da7
commit 0959edb024
22 changed files with 965 additions and 864 deletions

View File

@@ -1,2 +1,81 @@
@import "tailwindcss";
@source "../templates";
/* ===== Admin Layout ===== */
.admin-body { background: #fbfbfb; color: #111827; }
.admin-header { border-bottom: 4px solid #111827; }
.admin-badge { border: 2px solid #111827; box-shadow: 3px 3px 0 rgba(0,0,0,1); background: #fabf04; }
.admin-main { max-width: 70rem; margin: 0 auto; padding: 2rem 1rem; width: 100%; }
/* ===== Admin Nav ===== */
.admin-nav-active { background: #fabf04; border: 2px solid #111827; box-shadow: 2px 2px 0 rgba(0,0,0,1); }
.admin-nav-link { border: 2px solid #111827; }
.admin-nav-dark { border: 2px solid #111827; background: #111827; }
/* ===== Admin Cards ===== */
.admin-card { border: 4px solid #111827; box-shadow: 6px 6px 0 rgba(0,0,0,1); background: white; padding: 1.5rem; }
.admin-card-yellow { border: 4px solid #111827; box-shadow: 6px 6px 0 rgba(0,0,0,1); background: #fabf04; padding: 1.5rem; }
.admin-card-reject { border: 4px solid #991b1b; box-shadow: 6px 6px 0 rgba(0,0,0,1); background: white; padding: 1.5rem; }
/* ===== Admin Stats ===== */
.admin-stat-label { font-size: 10px; letter-spacing: 0.1em; }
/* ===== Admin Tables ===== */
.admin-table { width: 100%; border-collapse: collapse; }
.admin-table thead tr { background: #111827; }
.admin-table thead th { padding: 0.75rem 1.5rem; text-align: left; }
.admin-table thead th.text-center { text-align: center; }
.admin-table thead th.text-right { text-align: right; }
.admin-table tbody tr { border-bottom: 1px solid #e5e7eb; }
.admin-table tbody td { padding: 0.75rem 1.5rem; }
/* ===== Admin Detail Tables ===== */
.admin-detail-table { width: 100%; border-collapse: collapse; }
.admin-detail-table thead tr { border-bottom: 2px solid #e5e7eb; }
.admin-detail-table thead th { padding: 0.5rem 0; text-align: left; }
.admin-detail-table tbody tr { border-bottom: 1px solid #e5e7eb; }
.admin-detail-table tbody tr:last-child { border-bottom: none; }
.admin-detail-table tbody td { padding: 0.5rem 0; }
/* ===== Admin Forms ===== */
.admin-form-label { font-size: 10px; letter-spacing: 0.1em; display: block; margin-bottom: 0.25rem; }
.admin-form-label-lg { font-size: 10px; letter-spacing: 0.1em; display: block; margin-bottom: 0.5rem; }
.admin-form-input { width: 100%; padding: 0.5rem 0.75rem; border: 2px solid #111827; font-weight: 700; outline: none; }
.admin-form-input-lg { width: 100%; padding: 0.75rem 1rem; border: 3px solid #111827; font-weight: 700; outline: none; }
.admin-form-select { width: 100%; padding: 0.5rem 0.75rem; border: 3px solid #111827; font-weight: 700; outline: none; cursor: pointer; background: white; }
.admin-form-textarea { width: 100%; padding: 0.75rem 1rem; border: 3px solid #111827; font-weight: 700; outline: none; resize: vertical; }
.admin-form-checkbox { width: 1.25rem; height: 1.25rem; border: 2px solid #111827; cursor: pointer; }
/* ===== Admin Buttons ===== */
.admin-btn { padding: 0.5rem 1rem; border: 3px solid #111827; box-shadow: 4px 4px 0 rgba(0,0,0,1); background: #fabf04; cursor: pointer; }
.admin-btn-sm { padding: 0.4rem 0.75rem; border: 2px solid #111827; cursor: pointer; }
.admin-btn-sm-yellow { padding: 0.4rem 0.75rem; border: 2px solid #111827; background: #fabf04; cursor: pointer; }
.admin-btn-sm-white { padding: 0.4rem 0.75rem; border: 2px solid #111827; background: white; cursor: pointer; }
.admin-btn-sm-danger { padding: 0.4rem 0.75rem; border: 2px solid #991b1b; background: #dc2626; color: white; cursor: pointer; }
.admin-btn-danger { padding: 0.5rem 1rem; border: 3px solid #991b1b; box-shadow: 4px 4px 0 rgba(0,0,0,1); background: #dc2626; color: white; cursor: pointer; }
.admin-btn-outline { padding: 0.5rem 1rem; border: 3px solid #111827; background: white; cursor: pointer; }
.admin-btn-search { padding: 0.5rem 1rem; border: 2px solid #111827; background: #fabf04; cursor: pointer; white-space: nowrap; }
.admin-btn-clear { padding: 0.5rem 1rem; border: 2px solid #111827; background: white; white-space: nowrap; }
.admin-btn-lg { padding: 0.75rem 1.5rem; border: 3px solid #111827; box-shadow: 4px 4px 0 rgba(0,0,0,1); background: #fabf04; cursor: pointer; }
.admin-btn-lg-outline { padding: 0.75rem 1.5rem; border: 3px solid #111827; }
/* ===== Admin Badges ===== */
.admin-badge-green { background: #d1fae5; border: 2px solid #111827; padding: 0.15rem 0.5rem; }
.admin-badge-red { background: #fee2e2; border: 2px solid #111827; padding: 0.15rem 0.5rem; }
.admin-badge-blue { background: #dbeafe; border: 2px solid #111827; padding: 0.15rem 0.75rem; }
.admin-badge-yellow { background: #fef3c7; border: 2px solid #111827; padding: 0.15rem 0.75rem; }
.admin-badge-indigo { background: #e0e7ff; border: 2px solid #111827; padding: 0.15rem 0.5rem; }
.admin-badge-indigo-lg { background: #e0e7ff; border: 2px solid #111827; padding: 0.15rem 0.75rem; }
/* ===== Admin Tabs ===== */
.admin-tab { flex: 1; text-align: center; padding: 0.75rem; border: 3px solid #111827; }
.admin-tab-active { background: #fabf04; }
.admin-tab-inactive { background: white; }
.admin-tab-first { border-right: none; }
/* ===== Admin Pagination ===== */
.admin-page-active { border: 2px solid #111827; padding: 0.4rem 0.75rem; background: #fabf04; }
.admin-page-link { border: 2px solid #111827; padding: 0.4rem 0.75rem; background: white; }
/* ===== Admin Download Link ===== */
.admin-download { border: 2px solid #111827; padding: 0.15rem 0.5rem; background: #fabf04; display: inline-block; }

View File

@@ -3,55 +3,53 @@
{% block title %}Modifier sous-compte - E-Ticket{% endblock %}
{% block body %}
<div style="max-width:36rem;margin:0 auto;padding:3rem 1rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:0.5rem;">Modifier le sous-compte</h1>
<p class="font-bold text-gray-500 italic" style="margin-bottom:2rem;">{{ subAccount.firstName }} {{ subAccount.lastName }}</p>
<div class="page-container-sm">
<h1 class="heading-page text-3xl font-black uppercase tracking-tighter italic">Modifier le sous-compte</h1>
<p class="font-bold text-gray-500 italic mb-8">{{ subAccount.firstName }} {{ subAccount.lastName }}</p>
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;">
<form method="post" action="{{ path('app_account_edit_subaccount', {id: subAccount.id}) }}" style="display:flex;flex-direction:column;gap:1.5rem;">
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;">
<div style="flex:1;min-width:150px;">
<label for="edit_sub_last" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Nom</label>
<div class="card-brutal">
<form method="post" action="{{ path('app_account_edit_subaccount', {id: subAccount.id}) }}" class="form-col">
<div class="form-row">
<div class="form-group min-w-[150px]">
<label for="edit_sub_last" class="form-label text-[10px] tracking-[0.1em] font-black uppercase text-gray-400">Nom</label>
<input type="text" id="edit_sub_last" name="last_name" value="{{ subAccount.lastName }}" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;">
class="form-input">
</div>
<div style="flex:1;min-width:150px;">
<label for="edit_sub_first" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Prenom</label>
<div class="form-group min-w-[150px]">
<label for="edit_sub_first" class="form-label text-[10px] tracking-[0.1em] font-black uppercase text-gray-400">Prenom</label>
<input type="text" id="edit_sub_first" name="first_name" value="{{ subAccount.firstName }}" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;">
class="form-input">
</div>
</div>
<div>
<label for="edit_sub_email" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Email</label>
<label for="edit_sub_email" class="form-label text-[10px] tracking-[0.1em] font-black uppercase text-gray-400">Email</label>
<input type="email" id="edit_sub_email" name="email" value="{{ subAccount.email }}" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;">
class="form-input">
</div>
<div>
<p style="font-size:10px;letter-spacing:0.1em;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Permissions</p>
<div style="display:flex;flex-direction:column;gap:0.75rem;">
<label style="display:flex;align-items:center;gap:0.5rem;cursor:pointer;" class="text-sm font-bold">
<input type="checkbox" name="permissions[]" value="scanner" {{ subAccount.hasPermission('scanner') ? 'checked' : '' }} style="width:1.25rem;height:1.25rem;"> Scanner (valider les billets)
<p class="form-label text-[10px] tracking-[0.1em] font-black uppercase text-gray-400">Permissions</p>
<div class="flex flex-col gap-3">
<label class="flex items-center gap-2 cursor-pointer text-sm font-bold">
<input type="checkbox" name="permissions[]" value="scanner" {{ subAccount.hasPermission('scanner') ? 'checked' : '' }} class="w-5 h-5"> Scanner (valider les billets)
</label>
<label style="display:flex;align-items:center;gap:0.5rem;cursor:pointer;" class="text-sm font-bold">
<input type="checkbox" name="permissions[]" value="events" {{ subAccount.hasPermission('events') ? 'checked' : '' }} style="width:1.25rem;height:1.25rem;"> Evenements (creer, modifier, supprimer)
<label class="flex items-center gap-2 cursor-pointer text-sm font-bold">
<input type="checkbox" name="permissions[]" value="events" {{ subAccount.hasPermission('events') ? 'checked' : '' }} class="w-5 h-5"> Evenements (creer, modifier, supprimer)
</label>
<label style="display:flex;align-items:center;gap:0.5rem;cursor:pointer;" class="text-sm font-bold">
<input type="checkbox" name="permissions[]" value="tickets" {{ subAccount.hasPermission('tickets') ? 'checked' : '' }} style="width:1.25rem;height:1.25rem;"> Billets (invitations gratuites)
<label class="flex items-center gap-2 cursor-pointer text-sm font-bold">
<input type="checkbox" name="permissions[]" value="tickets" {{ subAccount.hasPermission('tickets') ? 'checked' : '' }} class="w-5 h-5"> Billets (invitations gratuites)
</label>
</div>
</div>
<div style="display:flex;gap:0.75rem;">
<div class="flex gap-3">
<button type="submit"
style="padding:0.75rem 1.5rem;border:3px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#fabf04;cursor:pointer;"
class="font-black uppercase text-sm tracking-widest hover:bg-green-500 hover:text-black transition-all">
class="btn-brutal font-black uppercase text-sm tracking-widest hover:bg-green-500 hover:text-black transition-all">
Enregistrer
</button>
<a href="{{ path('app_account', {tab: 'subaccounts'}) }}"
style="padding:0.75rem 1.5rem;border:3px solid #111827;display:inline-flex;align-items:center;"
class="font-black uppercase text-sm tracking-widest bg-white hover:bg-gray-100 transition-all">
class="inline-flex items-center px-6 py-3 border-3 border-gray-900 font-black uppercase text-sm tracking-widest bg-white hover:bg-gray-100 transition-all">
Annuler
</a>
</div>

View File

@@ -3,215 +3,215 @@
{% block title %}Mon compte - E-Ticket{% endblock %}
{% block body %}
<div style="max-width:60rem;margin:0 auto;padding:3rem 1rem;">
<div style="margin-bottom:2rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:0.5rem;">Mon compte</h1>
<div class="page-container-lg">
<div class="mb-8">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page">Mon compte</h1>
<p class="font-bold text-gray-500 italic">Bonjour {{ app.user.firstName }}, bienvenue sur votre espace.</p>
</div>
{% for message in app.flashes('success') %}
<div style="border:4px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#d1fae5;padding:1rem 1.5rem;margin-bottom:1.5rem;">
<div class="flash-success">
<p class="font-black text-sm">{{ message }}</p>
</div>
{% endfor %}
{% for message in app.flashes('error') %}
<div style="border:4px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#fee2e2;padding:1rem 1.5rem;margin-bottom:1.5rem;">
<div class="flash-error">
<p class="font-black text-sm">{{ message }}</p>
</div>
{% endfor %}
{% if isOrganizer and not app.user.approved %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:#fef3c7;padding:2rem;text-align:center;">
<div style="font-size:2rem;margin-bottom:1rem;">&#9203;</div>
<h2 class="text-xl font-black uppercase tracking-tighter italic" style="margin-bottom:0.5rem;">Compte en cours de validation</h2>
<div class="card-brutal-warn p-8 text-center">
<div class="text-4xl mb-4">&#9203;</div>
<h2 class="text-xl font-black uppercase tracking-tighter italic mb-2">Compte en cours de validation</h2>
<p class="font-bold text-gray-700 text-sm">Votre compte organisateur est en cours de validation par l'equipe E-Ticket. Vous recevrez un email une fois votre compte approuve.</p>
<p class="text-gray-500 text-xs font-bold" style="margin-top:1rem;">Contactez <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a> pour toute question.</p>
<p class="text-gray-500 text-xs font-bold mt-4">Contactez <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a> pour toute question.</p>
</div>
{% else %}
{% if isOrganizer %}
{% if not app.user.stripeAccountId %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:#fef3c7;padding:1.5rem;margin-bottom:2rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:0.5rem;">Configuration Stripe requise
<span style="background:white;border:2px solid #111827;padding:0.1rem 0.4rem;font-size:10px;margin-left:0.5rem;">Statut : non configure</span>
<div class="card-brutal-warn mb-8">
<h2 class="text-sm font-black uppercase tracking-widest mb-2">Configuration Stripe requise
<span class="bg-white border-2 border-gray-900 px-1.5 py-0.5 text-[10px] ml-2">Statut : non configure</span>
</h2>
<p class="text-sm font-bold text-gray-700" style="margin-bottom:1rem;">Pour creer vos evenements, vendre des billets et recevoir vos paiements, vous devez creer votre compte vendeur via Stripe.</p>
<a href="{{ path('app_account_stripe_connect') }}" style="padding:0.5rem 1rem;border:3px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#fabf04;display:inline-block;" class="font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Creer mon compte Stripe</a>
<p class="text-sm font-bold text-gray-700 mb-4">Pour creer vos evenements, vendre des billets et recevoir vos paiements, vous devez creer votre compte vendeur via Stripe.</p>
<a href="{{ path('app_account_stripe_connect') }}" class="btn-brutal font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Creer mon compte Stripe</a>
</div>
{% elseif not app.user.stripeChargesEnabled and not app.user.stripePayoutsEnabled %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:#fef3c7;padding:1.5rem;margin-bottom:2rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:0.5rem;">Verification Stripe en cours
<span style="background:white;border:2px solid #111827;padding:0.1rem 0.4rem;font-size:10px;margin-left:0.5rem;">Statut : {{ app.user.stripeStatus ?? 'en attente' }}</span>
<div class="card-brutal-warn mb-8">
<h2 class="text-sm font-black uppercase tracking-widest mb-2">Verification Stripe en cours
<span class="bg-white border-2 border-gray-900 px-1.5 py-0.5 text-[10px] ml-2">Statut : {{ app.user.stripeStatus ?? 'en attente' }}</span>
</h2>
<p class="text-sm font-bold text-gray-700" style="margin-bottom:1rem;">Votre compte Stripe est en cours de verification. Merci de patienter, vous serez notifie une fois la verification terminee.</p>
<div style="display:flex;gap:0.75rem;flex-wrap:wrap;">
<a href="{{ path('app_account_stripe_connect') }}" style="padding:0.5rem 1rem;border:3px solid #111827;background:white;display:inline-block;" class="font-black uppercase text-xs tracking-widest hover:bg-gray-100 transition-all">Completer ma verification</a>
<form method="post" action="{{ path('app_account_stripe_cancel') }}" data-confirm="Etes-vous sur de vouloir annuler la creation de votre compte Stripe ?" style="display:inline;">
<button type="submit" style="padding:0.5rem 1rem;border:3px solid #991b1b;background:#dc2626;color:white;cursor:pointer;" class="font-black uppercase text-xs tracking-widest hover:bg-red-800 transition-all">Annuler la creation</button>
<p class="text-sm font-bold text-gray-700 mb-4">Votre compte Stripe est en cours de verification. Merci de patienter, vous serez notifie une fois la verification terminee.</p>
<div class="flex gap-3 flex-wrap">
<a href="{{ path('app_account_stripe_connect') }}" class="px-4 py-2 border-3 border-gray-900 bg-white inline-block font-black uppercase text-xs tracking-widest hover:bg-gray-100 transition-all">Completer ma verification</a>
<form method="post" action="{{ path('app_account_stripe_cancel') }}" data-confirm="Etes-vous sur de vouloir annuler la creation de votre compte Stripe ?" class="inline">
<button type="submit" class="px-4 py-2 border-3 border-red-800 bg-red-600 text-white cursor-pointer font-black uppercase text-xs tracking-widest hover:bg-red-800 transition-all">Annuler la creation</button>
</form>
</div>
</div>
{% elseif app.user.stripeChargesEnabled and app.user.stripePayoutsEnabled %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:#d1fae5;padding:1rem 1.5rem;margin-bottom:2rem;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:1rem;">
<div class="card-brutal-green flex justify-between items-center flex-wrap gap-4 mb-8">
<p class="font-black text-sm">Stripe Connect actif — Paiements et virements actives.
<span style="background:white;border:2px solid #111827;padding:0.1rem 0.4rem;font-size:10px;margin-left:0.5rem;">Statut : {{ app.user.stripeStatus }}</span>
<span class="bg-white border-2 border-gray-900 px-1.5 py-0.5 text-[10px] ml-2">Statut : {{ app.user.stripeStatus }}</span>
</p>
<div style="display:flex;gap:0.5rem;flex-wrap:wrap;">
<a href="{{ path('app_account_stripe_dashboard') }}" target="_blank" style="padding:0.4rem 0.75rem;border:2px solid #111827;background:white;display:inline-block;" class="text-xs font-black uppercase tracking-widest hover:bg-gray-100 transition-all">Dashboard Stripe</a>
<form method="post" action="{{ path('app_account_stripe_cancel') }}" data-confirm="Etes-vous sur de vouloir cloturer votre compte Stripe ? Vous ne pourrez plus recevoir de paiements." style="display:inline;">
<button type="submit" style="padding:0.4rem 0.75rem;border:2px solid #991b1b;background:#dc2626;color:white;cursor:pointer;" class="text-xs font-black uppercase tracking-widest hover:bg-red-800 transition-all">Cloturer</button>
<div class="flex gap-2 flex-wrap">
<a href="{{ path('app_account_stripe_dashboard') }}" target="_blank" class="px-3 py-1.5 border-2 border-gray-900 bg-white inline-block text-xs font-black uppercase tracking-widest hover:bg-gray-100 transition-all">Dashboard Stripe</a>
<form method="post" action="{{ path('app_account_stripe_cancel') }}" data-confirm="Etes-vous sur de vouloir cloturer votre compte Stripe ? Vous ne pourrez plus recevoir de paiements." class="inline">
<button type="submit" class="px-3 py-1.5 border-2 border-red-800 bg-red-600 text-white cursor-pointer text-xs font-black uppercase tracking-widest hover:bg-red-800 transition-all">Cloturer</button>
</form>
</div>
</div>
{% else %}
<div style="border:4px solid #991b1b;box-shadow:6px 6px 0 rgba(0,0,0,1);background:#fee2e2;padding:1.5rem;margin-bottom:2rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:0.5rem;color:#991b1b;">Compte Stripe refuse
<span style="background:white;border:2px solid #991b1b;padding:0.1rem 0.4rem;font-size:10px;margin-left:0.5rem;">Statut : {{ app.user.stripeStatus ?? 'refuse' }}</span>
<div class="card-brutal-error mb-8">
<h2 class="text-sm font-black uppercase tracking-widest mb-2 text-red-800">Compte Stripe refuse
<span class="bg-white border-2 border-red-800 px-1.5 py-0.5 text-[10px] ml-2">Statut : {{ app.user.stripeStatus ?? 'refuse' }}</span>
</h2>
<p class="text-sm font-bold text-gray-700">Stripe a refuse votre compte vendeur. Vous ne pouvez pas utiliser nos services de vente pour le moment. Contactez <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a> pour plus d'informations.</p>
</div>
{% endif %}
{% endif %}
<div style="display:flex;gap:0;margin-bottom:2rem;flex-wrap:wrap;">
<div class="flex flex-wrap mb-8">
{% if isOrganizer %}
<a href="{{ path('app_account', {tab: 'events'}) }}" style="flex:1;min-width:100px;text-align:center;padding:0.75rem;border:3px solid #111827;border-right:none;{{ tab == 'events' ? 'background:#fabf04;' : 'background:white;' }}" class="font-black uppercase text-xs tracking-widest transition-all">Evenements / Brocantes</a>
<a href="{{ path('app_account', {tab: 'subaccounts'}) }}" style="flex:1;min-width:100px;text-align:center;padding:0.75rem;border:3px solid #111827;border-right:none;{{ tab == 'subaccounts' ? 'background:#fabf04;' : 'background:white;' }}" class="font-black uppercase text-xs tracking-widest transition-all">Sous-comptes</a>
<a href="{{ path('app_account', {tab: 'payouts'}) }}" style="flex:1;min-width:100px;text-align:center;padding:0.75rem;border:3px solid #111827;border-right:none;{{ tab == 'payouts' ? 'background:#fabf04;' : 'background:white;' }}" class="font-black uppercase text-xs tracking-widest transition-all">Virements</a>
<a href="{{ path('app_account', {tab: 'events'}) }}" class="flex-1 min-w-[100px] text-center py-3 border-3 border-gray-900 border-r-0 {{ tab == 'events' ? 'bg-yellow-400' : 'bg-white' }} font-black uppercase text-xs tracking-widest transition-all">Evenements / Brocantes</a>
<a href="{{ path('app_account', {tab: 'subaccounts'}) }}" class="flex-1 min-w-[100px] text-center py-3 border-3 border-gray-900 border-r-0 {{ tab == 'subaccounts' ? 'bg-yellow-400' : 'bg-white' }} font-black uppercase text-xs tracking-widest transition-all">Sous-comptes</a>
<a href="{{ path('app_account', {tab: 'payouts'}) }}" class="flex-1 min-w-[100px] text-center py-3 border-3 border-gray-900 border-r-0 {{ tab == 'payouts' ? 'bg-yellow-400' : 'bg-white' }} font-black uppercase text-xs tracking-widest transition-all">Virements</a>
{% endif %}
<a href="{{ path('app_account', {tab: 'tickets'}) }}" style="flex:1;min-width:100px;text-align:center;padding:0.75rem;border:3px solid #111827;border-right:none;{{ tab == 'tickets' ? 'background:#fabf04;' : 'background:white;' }}" class="font-black uppercase text-xs tracking-widest transition-all">Billets</a>
<a href="{{ path('app_account', {tab: 'purchases'}) }}" style="flex:1;min-width:100px;text-align:center;padding:0.75rem;border:3px solid #111827;border-right:none;{{ tab == 'purchases' ? 'background:#fabf04;' : 'background:white;' }}" class="font-black uppercase text-xs tracking-widest transition-all">Achats</a>
<a href="{{ path('app_account', {tab: 'invoices'}) }}" style="flex:1;min-width:100px;text-align:center;padding:0.75rem;border:3px solid #111827;border-right:none;{{ tab == 'invoices' ? 'background:#fabf04;' : 'background:white;' }}" class="font-black uppercase text-xs tracking-widest transition-all">Factures</a>
<a href="{{ path('app_account', {tab: 'settings'}) }}" style="flex:1;min-width:100px;text-align:center;padding:0.75rem;border:3px solid #111827;{{ tab == 'settings' ? 'background:#fabf04;' : 'background:white;' }}" class="font-black uppercase text-xs tracking-widest transition-all">Parametres</a>
<a href="{{ path('app_account', {tab: 'tickets'}) }}" class="flex-1 min-w-[100px] text-center py-3 border-3 border-gray-900 border-r-0 {{ tab == 'tickets' ? 'bg-yellow-400' : 'bg-white' }} font-black uppercase text-xs tracking-widest transition-all">Billets</a>
<a href="{{ path('app_account', {tab: 'purchases'}) }}" class="flex-1 min-w-[100px] text-center py-3 border-3 border-gray-900 border-r-0 {{ tab == 'purchases' ? 'bg-yellow-400' : 'bg-white' }} font-black uppercase text-xs tracking-widest transition-all">Achats</a>
<a href="{{ path('app_account', {tab: 'invoices'}) }}" class="flex-1 min-w-[100px] text-center py-3 border-3 border-gray-900 border-r-0 {{ tab == 'invoices' ? 'bg-yellow-400' : 'bg-white' }} font-black uppercase text-xs tracking-widest transition-all">Factures</a>
<a href="{{ path('app_account', {tab: 'settings'}) }}" class="flex-1 min-w-[100px] text-center py-3 border-3 border-gray-900 {{ tab == 'settings' ? 'bg-yellow-400' : 'bg-white' }} font-black uppercase text-xs tracking-widest transition-all">Parametres</a>
</div>
{% if tab == 'tickets' %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<div style="padding:0.75rem 1.5rem;background:#111827;">
<div class="card-brutal">
<div class="section-header">
<h2 class="text-[10px] font-black uppercase tracking-widest text-white">Mes billets</h2>
</div>
<div style="padding:3rem;text-align:center;">
<div class="p-12 text-center">
<p class="text-gray-400 font-bold text-sm">Aucun billet pour le moment.</p>
</div>
</div>
{% elseif tab == 'purchases' %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<div style="padding:0.75rem 1.5rem;background:#111827;">
<div class="card-brutal">
<div class="section-header">
<h2 class="text-[10px] font-black uppercase tracking-widest text-white">Mes achats</h2>
</div>
<div style="padding:3rem;text-align:center;">
<div class="p-12 text-center">
<p class="text-gray-400 font-bold text-sm">Aucun achat pour le moment.</p>
</div>
</div>
{% elseif tab == 'invoices' %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<div style="padding:0.75rem 1.5rem;background:#111827;">
<div class="card-brutal">
<div class="section-header">
<h2 class="text-[10px] font-black uppercase tracking-widest text-white">Mes factures</h2>
</div>
<div style="padding:3rem;text-align:center;">
<div class="p-12 text-center">
<p class="text-gray-400 font-bold text-sm">Aucune facture pour le moment.</p>
</div>
</div>
{% elseif tab == 'events' %}
<div style="margin-bottom:1.5rem;">
<a href="{{ path('app_account_create_event') }}" style="padding:0.75rem 2rem;border:3px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#fabf04;display:inline-block;cursor:pointer;" class="font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-white transition-all">
<div class="mb-6">
<a href="{{ path('app_account_create_event') }}" class="btn-brutal font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-white transition-all">
+ Creer un evenement
</a>
</div>
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<div style="padding:0.75rem 1.5rem;background:#111827;">
<div class="card-brutal">
<div class="section-header">
<h2 class="text-[10px] font-black uppercase tracking-widest text-white">Mes evenements / Brocantes / Reservations</h2>
</div>
{% if isOrganizer and (not app.user.stripeChargesEnabled or not app.user.stripePayoutsEnabled) %}
<div style="padding:1.5rem;background:#fef3c7;border-bottom:2px solid #e5e7eb;">
<div class="p-6 bg-amber-100 border-b-2 border-gray-200">
<p class="font-black text-sm">Configuration Stripe ou validation est requise !</p>
</div>
{% endif %}
<div style="padding:3rem;text-align:center;">
<div class="p-12 text-center">
<p class="text-gray-400 font-bold text-sm">Aucun evenement pour le moment.</p>
</div>
</div>
{% elseif tab == 'subaccounts' %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;margin-bottom:2rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;">Creer un sous-compte</h2>
<form method="post" action="{{ path('app_account_create_subaccount') }}" style="display:flex;flex-direction:column;gap:1rem;">
<div style="display:flex;flex-wrap:wrap;gap:1rem;">
<div style="flex:1;min-width:140px;">
<label for="sub_last_name" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Nom</label>
<input type="text" id="sub_last_name" name="last_name" required style="width:100%;padding:0.5rem 0.75rem;border:2px solid #111827;font-weight:700;outline:none;" placeholder="Dupont">
<div class="card-brutal p-6 mb-8">
<h2 class="text-sm font-black uppercase tracking-widest mb-4">Creer un sous-compte</h2>
<form method="post" action="{{ path('app_account_create_subaccount') }}" class="flex flex-col gap-4">
<div class="flex flex-wrap gap-4">
<div class="flex-1 min-w-[140px]">
<label for="sub_last_name" class="text-[10px] tracking-widest block mb-1 font-black uppercase text-gray-400">Nom</label>
<input type="text" id="sub_last_name" name="last_name" required class="w-full px-3 py-2 border-2 border-gray-900 font-bold outline-none" placeholder="Dupont">
</div>
<div style="flex:1;min-width:140px;">
<label for="sub_first_name" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Prenom</label>
<input type="text" id="sub_first_name" name="first_name" required style="width:100%;padding:0.5rem 0.75rem;border:2px solid #111827;font-weight:700;outline:none;" placeholder="Jean">
<div class="flex-1 min-w-[140px]">
<label for="sub_first_name" class="text-[10px] tracking-widest block mb-1 font-black uppercase text-gray-400">Prenom</label>
<input type="text" id="sub_first_name" name="first_name" required class="w-full px-3 py-2 border-2 border-gray-900 font-bold outline-none" placeholder="Jean">
</div>
<div style="flex:2;min-width:200px;">
<label for="sub_email" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Email</label>
<input type="email" id="sub_email" name="email" required style="width:100%;padding:0.5rem 0.75rem;border:2px solid #111827;font-weight:700;outline:none;" placeholder="collaborateur@exemple.fr">
<div class="flex-[2] min-w-[200px]">
<label for="sub_email" class="text-[10px] tracking-widest block mb-1 font-black uppercase text-gray-400">Email</label>
<input type="email" id="sub_email" name="email" required class="w-full px-3 py-2 border-2 border-gray-900 font-bold outline-none" placeholder="collaborateur@exemple.fr">
</div>
</div>
<div>
<p style="font-size:10px;letter-spacing:0.1em;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Permissions</p>
<div style="display:flex;flex-wrap:wrap;gap:1rem;">
<label style="display:flex;align-items:center;gap:0.5rem;cursor:pointer;" class="text-sm font-bold">
<input type="checkbox" name="permissions[]" value="scanner" style="width:1rem;height:1rem;"> Scanner (valider les billets)
<p class="text-[10px] tracking-widest mb-2 font-black uppercase text-gray-400">Permissions</p>
<div class="flex flex-wrap gap-4">
<label class="flex items-center gap-2 cursor-pointer text-sm font-bold">
<input type="checkbox" name="permissions[]" value="scanner" class="w-4 h-4"> Scanner (valider les billets)
</label>
<label style="display:flex;align-items:center;gap:0.5rem;cursor:pointer;" class="text-sm font-bold">
<input type="checkbox" name="permissions[]" value="events" style="width:1rem;height:1rem;"> Evenements (creer, modifier, supprimer)
<label class="flex items-center gap-2 cursor-pointer text-sm font-bold">
<input type="checkbox" name="permissions[]" value="events" class="w-4 h-4"> Evenements (creer, modifier, supprimer)
</label>
<label style="display:flex;align-items:center;gap:0.5rem;cursor:pointer;" class="text-sm font-bold">
<input type="checkbox" name="permissions[]" value="tickets" style="width:1rem;height:1rem;"> Billets (invitations gratuites)
<label class="flex items-center gap-2 cursor-pointer text-sm font-bold">
<input type="checkbox" name="permissions[]" value="tickets" class="w-4 h-4"> Billets (invitations gratuites)
</label>
</div>
</div>
<button type="submit" style="padding:0.5rem 1rem;border:2px solid #111827;background:#fabf04;cursor:pointer;align-self:flex-start;" class="font-black uppercase text-xs tracking-widest hover:bg-green-500 hover:text-black transition-all">Creer</button>
<button type="submit" class="px-4 py-2 border-2 border-gray-900 bg-yellow-400 cursor-pointer self-start font-black uppercase text-xs tracking-widest hover:bg-green-500 hover:text-black transition-all">Creer</button>
</form>
</div>
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<div style="padding:0.75rem 1.5rem;background:#111827;">
<div class="card-brutal">
<div class="section-header">
<h2 class="text-[10px] font-black uppercase tracking-widest text-white">Sous-comptes</h2>
</div>
{% if subAccounts|length > 0 %}
<table style="width:100%;border-collapse:collapse;">
<table class="detail-table">
<thead>
<tr style="border-bottom:2px solid #e5e7eb;">
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Nom</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Email</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Permissions</th>
<th style="padding:0.75rem 1.5rem;text-align:right;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Actions</th>
<tr class="border-b-2 border-gray-200">
<th class="px-6 py-3 text-left text-[10px] font-black uppercase tracking-widest text-gray-400">Nom</th>
<th class="px-6 py-3 text-left text-[10px] font-black uppercase tracking-widest text-gray-400">Email</th>
<th class="px-6 py-3 text-left text-[10px] font-black uppercase tracking-widest text-gray-400">Permissions</th>
<th class="px-6 py-3 text-right text-[10px] font-black uppercase tracking-widest text-gray-400">Actions</th>
</tr>
</thead>
<tbody>
{% for sub in subAccounts %}
<tr style="border-bottom:1px solid #e5e7eb;" class="hover:bg-gray-50 transition-all">
<td style="padding:0.75rem 1.5rem;" class="font-bold text-sm">{{ sub.firstName }} {{ sub.lastName }}</td>
<td style="padding:0.75rem 1.5rem;" class="text-sm text-gray-600">{{ sub.email }}</td>
<td style="padding:0.75rem 1.5rem;">
<tr class="border-b border-gray-200 hover:bg-gray-50 transition-all">
<td class="px-6 py-3 font-bold text-sm">{{ sub.firstName }} {{ sub.lastName }}</td>
<td class="px-6 py-3 text-sm text-gray-600">{{ sub.email }}</td>
<td class="px-6 py-3">
{% for perm in sub.subAccountPermissions ?? [] %}
{% if perm == 'scanner' %}
<span style="background:#dbeafe;border:2px solid #111827;padding:0.1rem 0.4rem;" class="text-xs font-black uppercase">Scanner</span>
<span class="bg-blue-100 border-2 border-gray-900 px-1.5 py-0.5 text-xs font-black uppercase">Scanner</span>
{% elseif perm == 'events' %}
<span style="background:#e0e7ff;border:2px solid #111827;padding:0.1rem 0.4rem;" class="text-xs font-black uppercase">Evenements</span>
<span class="bg-indigo-100 border-2 border-gray-900 px-1.5 py-0.5 text-xs font-black uppercase">Evenements</span>
{% elseif perm == 'tickets' %}
<span style="background:#fef3c7;border:2px solid #111827;padding:0.1rem 0.4rem;" class="text-xs font-black uppercase">Billets</span>
<span class="bg-amber-100 border-2 border-gray-900 px-1.5 py-0.5 text-xs font-black uppercase">Billets</span>
{% endif %}
{% endfor %}
</td>
<td style="padding:0.75rem 1.5rem;text-align:right;">
<div style="display:flex;gap:0.5rem;justify-content:flex-end;">
<a href="{{ path('app_account_edit_subaccount_page', {id: sub.id}) }}" style="border:2px solid #111827;padding:0.3rem 0.5rem;background:#fabf04;display:inline-block;" class="text-xs font-black uppercase tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Editer</a>
<form method="post" action="{{ path('app_account_delete_subaccount', {id: sub.id}) }}" data-confirm="Supprimer le sous-compte de {{ sub.firstName }} {{ sub.lastName }} ?" style="display:inline;">
<button type="submit" style="border:2px solid #991b1b;padding:0.3rem 0.5rem;background:#dc2626;color:white;cursor:pointer;" class="text-xs font-black uppercase tracking-widest hover:bg-red-800 transition-all">Supprimer</button>
<td class="px-6 py-3 text-right">
<div class="flex gap-2 justify-end">
<a href="{{ path('app_account_edit_subaccount_page', {id: sub.id}) }}" class="border-2 border-gray-900 px-2 py-1 bg-yellow-400 inline-block text-xs font-black uppercase tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Editer</a>
<form method="post" action="{{ path('app_account_delete_subaccount', {id: sub.id}) }}" data-confirm="Supprimer le sous-compte de {{ sub.firstName }} {{ sub.lastName }} ?" class="inline">
<button type="submit" class="border-2 border-red-800 px-2 py-1 bg-red-600 text-white cursor-pointer text-xs font-black uppercase tracking-widest hover:bg-red-800 transition-all">Supprimer</button>
</form>
</div>
</td>
@@ -220,55 +220,55 @@
</tbody>
</table>
{% else %}
<div style="padding:3rem;text-align:center;">
<div class="p-12 text-center">
<p class="text-gray-400 font-bold text-sm">Aucun sous-compte pour le moment.</p>
</div>
{% endif %}
</div>
{% elseif tab == 'payouts' %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<div style="padding:0.75rem 1.5rem;background:#111827;">
<div class="card-brutal">
<div class="section-header">
<h2 class="text-[10px] font-black uppercase tracking-widest text-white">Mes virements</h2>
</div>
{% if isOrganizer and (not app.user.stripeChargesEnabled or not app.user.stripePayoutsEnabled) %}
<div style="padding:1.5rem;background:#fef3c7;border-bottom:2px solid #e5e7eb;">
<div class="p-6 bg-amber-100 border-b-2 border-gray-200">
<p class="font-black text-sm">Configuration Stripe ou validation est requise !</p>
</div>
{% endif %}
{% if payouts|length > 0 %}
<table style="width:100%;border-collapse:collapse;">
<table class="detail-table">
<thead>
<tr style="border-bottom:2px solid #e5e7eb;">
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">ID</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Montant</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Statut</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Destination</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Arrivee</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Date</th>
<th style="padding:0.75rem 1.5rem;text-align:right;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Attestation</th>
<tr class="border-b-2 border-gray-200">
<th class="px-6 py-3 text-left text-[10px] font-black uppercase tracking-widest text-gray-400">ID</th>
<th class="px-6 py-3 text-left text-[10px] font-black uppercase tracking-widest text-gray-400">Montant</th>
<th class="px-6 py-3 text-left text-[10px] font-black uppercase tracking-widest text-gray-400">Statut</th>
<th class="px-6 py-3 text-left text-[10px] font-black uppercase tracking-widest text-gray-400">Destination</th>
<th class="px-6 py-3 text-left text-[10px] font-black uppercase tracking-widest text-gray-400">Arrivee</th>
<th class="px-6 py-3 text-left text-[10px] font-black uppercase tracking-widest text-gray-400">Date</th>
<th class="px-6 py-3 text-right text-[10px] font-black uppercase tracking-widest text-gray-400">Attestation</th>
</tr>
</thead>
<tbody>
{% for payout in payouts %}
<tr style="border-bottom:1px solid #e5e7eb;" class="hover:bg-gray-50 transition-all">
<td style="padding:0.75rem 1.5rem;" class="text-xs font-mono text-gray-500">{{ payout.stripePayoutId }}</td>
<td style="padding:0.75rem 1.5rem;" class="text-sm font-bold">{{ payout.amountDecimal|number_format(2, ',', ' ') }} {{ payout.currency|upper }}</td>
<td style="padding:0.75rem 1.5rem;">
<tr class="border-b border-gray-200 hover:bg-gray-50 transition-all">
<td class="px-6 py-3 text-xs font-mono text-gray-500">{{ payout.stripePayoutId }}</td>
<td class="px-6 py-3 text-sm font-bold">{{ payout.amountDecimal|number_format(2, ',', ' ') }} {{ payout.currency|upper }}</td>
<td class="px-6 py-3">
{% if payout.status == 'paid' %}
<span style="background:#d1fae5;border:2px solid #111827;padding:0.15rem 0.5rem;" class="text-xs font-black uppercase">{{ payout.status }}</span>
<span class="bg-green-100 border-2 border-gray-900 px-2 py-0.5 text-xs font-black uppercase">{{ payout.status }}</span>
{% elseif payout.status == 'failed' or payout.status == 'canceled' %}
<span style="background:#fee2e2;border:2px solid #111827;padding:0.15rem 0.5rem;" class="text-xs font-black uppercase">{{ payout.status }}</span>
<span class="bg-red-100 border-2 border-gray-900 px-2 py-0.5 text-xs font-black uppercase">{{ payout.status }}</span>
{% else %}
<span style="background:#fef3c7;border:2px solid #111827;padding:0.15rem 0.5rem;" class="text-xs font-black uppercase">{{ payout.status }}</span>
<span class="bg-amber-100 border-2 border-gray-900 px-2 py-0.5 text-xs font-black uppercase">{{ payout.status }}</span>
{% endif %}
</td>
<td style="padding:0.75rem 1.5rem;" class="text-xs font-mono text-gray-500">{{ payout.destination ?? '—' }}</td>
<td style="padding:0.75rem 1.5rem;" class="text-sm text-gray-500">{{ payout.arrivalDate ? payout.arrivalDate|date('d/m/Y') : '—' }}</td>
<td style="padding:0.75rem 1.5rem;" class="text-sm text-gray-400">{{ payout.createdAt|date('d/m/Y H:i') }}</td>
<td style="padding:0.75rem 1.5rem;text-align:right;">
<td class="px-6 py-3 text-xs font-mono text-gray-500">{{ payout.destination ?? '—' }}</td>
<td class="px-6 py-3 text-sm text-gray-500">{{ payout.arrivalDate ? payout.arrivalDate|date('d/m/Y') : '—' }}</td>
<td class="px-6 py-3 text-sm text-gray-400">{{ payout.createdAt|date('d/m/Y H:i') }}</td>
<td class="px-6 py-3 text-right">
{% if payout.status == 'paid' %}
<a href="{{ path('app_account_payout_pdf', {id: payout.id}) }}" target="_blank" style="border:2px solid #111827;padding:0.3rem 0.5rem;background:#fabf04;display:inline-block;" class="text-xs font-black uppercase tracking-widest hover:bg-indigo-600 hover:text-black transition-all">PDF</a>
<a href="{{ path('app_account_payout_pdf', {id: payout.id}) }}" target="_blank" class="border-2 border-gray-900 px-2 py-1 bg-yellow-400 inline-block text-xs font-black uppercase tracking-widest hover:bg-indigo-600 hover:text-black transition-all">PDF</a>
{% endif %}
</td>
</tr>
@@ -276,126 +276,125 @@
</tbody>
</table>
{% else %}
<div style="padding:3rem;text-align:center;">
<div class="p-12 text-center">
<p class="text-gray-400 font-bold text-sm">Aucun virement pour le moment.</p>
</div>
{% endif %}
</div>
{% elseif tab == 'settings' %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;">Parametres du compte</h2>
<form method="post" action="{{ path('app_account_settings') }}" enctype="multipart/form-data" style="display:flex;flex-direction:column;gap:1.5rem;">
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;">
<div style="flex:1;min-width:200px;">
<label for="settings_last_name" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Nom</label>
<div class="card-brutal p-6">
<h2 class="text-sm font-black uppercase tracking-widest mb-4">Parametres du compte</h2>
<form method="post" action="{{ path('app_account_settings') }}" enctype="multipart/form-data" class="form-col">
<div class="form-row">
<div class="form-group">
<label for="settings_last_name" class="text-[10px] tracking-widest block mb-2 font-black uppercase text-gray-400">Nom</label>
<input type="text" id="settings_last_name" name="last_name" value="{{ app.user.lastName }}" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;{{ isOrganizer ? 'background:#f3f4f6;' : '' }}"
class="form-input {{ isOrganizer ? 'bg-gray-100' : '' }}"
{{ isOrganizer ? 'disabled' : '' }}>
</div>
<div style="flex:1;min-width:200px;">
<label for="settings_first_name" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Prenom</label>
<div class="form-group">
<label for="settings_first_name" class="text-[10px] tracking-widest block mb-2 font-black uppercase text-gray-400">Prenom</label>
<input type="text" id="settings_first_name" name="first_name" value="{{ app.user.firstName }}" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;{{ isOrganizer ? 'background:#f3f4f6;' : '' }}"
class="form-input {{ isOrganizer ? 'bg-gray-100' : '' }}"
{{ isOrganizer ? 'disabled' : '' }}>
</div>
</div>
<div>
<label for="settings_email" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Email</label>
<label for="settings_email" class="text-[10px] tracking-widest block mb-2 font-black uppercase text-gray-400">Email</label>
<input type="email" id="settings_email" name="email" value="{{ app.user.email }}" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;">
class="form-input">
</div>
<div>
<label for="settings_phone" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Telephone</label>
<label for="settings_phone" class="text-[10px] tracking-widest block mb-2 font-black uppercase text-gray-400">Telephone</label>
<input type="tel" id="settings_phone" name="phone" value="{{ app.user.phone }}"
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;">
class="form-input">
</div>
{% if not isOrganizer %}
<div>
<label for="settings_address" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Adresse</label>
<label for="settings_address" class="text-[10px] tracking-widest block mb-2 font-black uppercase text-gray-400">Adresse</label>
<input type="text" id="settings_address" name="address" value="{{ app.user.address }}"
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;">
class="form-input">
</div>
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;">
<div style="flex:1;min-width:120px;">
<label for="settings_postal" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Code postal</label>
<div class="form-row">
<div class="flex-1 min-w-[120px]">
<label for="settings_postal" class="text-[10px] tracking-widest block mb-2 font-black uppercase text-gray-400">Code postal</label>
<input type="text" id="settings_postal" name="postal_code" value="{{ app.user.postalCode }}" maxlength="5"
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;">
class="form-input">
</div>
<div style="flex:2;min-width:200px;">
<label for="settings_city" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Ville</label>
<div class="flex-[2] min-w-[200px]">
<label for="settings_city" class="text-[10px] tracking-widest block mb-2 font-black uppercase text-gray-400">Ville</label>
<input type="text" id="settings_city" name="city" value="{{ app.user.city }}"
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;">
class="form-input">
</div>
</div>
{% endif %}
{% if isOrganizer %}
<div style="border:4px solid #111827;background:#fabf04;padding:1.5rem;">
<h3 style="font-size:10px;letter-spacing:0.1em;margin-bottom:1rem;" class="font-black uppercase">Logo de l'organisation</h3>
<div class="border-4 border-gray-900 bg-yellow-400 p-6">
<h3 class="text-[10px] tracking-widest mb-4 font-black uppercase">Logo de l'organisation</h3>
{% if app.user.logoName %}
<div style="margin-bottom:1rem;">
<img src="{{ ('/uploads/logos/' ~ app.user.logoName) | imagine_filter('organizer_logo') }}" alt="Logo" style="max-height:80px;border:2px solid #111827;">
<div class="mb-4">
<img src="{{ ('/uploads/logos/' ~ app.user.logoName) | imagine_filter('organizer_logo') }}" alt="Logo" class="max-h-20 border-2 border-gray-900">
</div>
{% endif %}
<input type="file" name="logo" accept="image/png,image/jpeg,image/webp"
style="padding:0.5rem;border:2px solid #111827;background:white;font-weight:700;width:100%;">
<p class="text-xs font-bold" style="margin-top:0.5rem;">PNG, JPEG ou WebP. Max 2 Mo.</p>
class="p-2 border-2 border-gray-900 bg-white font-bold w-full">
<p class="text-xs font-bold mt-2">PNG, JPEG ou WebP. Max 2 Mo.</p>
</div>
<div style="border:4px solid #111827;background:white;padding:1.5rem;">
<h3 style="font-size:10px;letter-spacing:0.1em;margin-bottom:1rem;" class="font-black uppercase text-gray-400">Reseaux sociaux & site internet</h3>
<div style="display:flex;flex-direction:column;gap:1rem;">
<div class="border-4 border-gray-900 bg-white p-6">
<h3 class="text-[10px] tracking-widest mb-4 font-black uppercase text-gray-400">Reseaux sociaux & site internet</h3>
<div class="flex flex-col gap-4">
<div>
<label for="settings_website" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Site internet</label>
<label for="settings_website" class="text-[10px] tracking-widest block mb-1 font-black uppercase text-gray-400">Site internet</label>
<input type="url" id="settings_website" name="website" value="{{ app.user.website ?? '' }}"
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;"
class="w-full px-3 py-2 border-3 border-gray-900 font-bold outline-none"
placeholder="https://mon-association.fr">
</div>
<div style="display:flex;flex-wrap:wrap;gap:1rem;">
<div style="flex:1;min-width:200px;">
<label for="settings_facebook" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Facebook</label>
<div class="flex flex-wrap gap-4">
<div class="flex-1 min-w-[200px]">
<label for="settings_facebook" class="text-[10px] tracking-widest block mb-1 font-black uppercase text-gray-400">Facebook</label>
<input type="url" id="settings_facebook" name="facebook" value="{{ app.user.facebook ?? '' }}"
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;"
class="w-full px-3 py-2 border-3 border-gray-900 font-bold outline-none"
placeholder="https://facebook.com/...">
</div>
<div style="flex:1;min-width:200px;">
<label for="settings_instagram" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Instagram</label>
<div class="flex-1 min-w-[200px]">
<label for="settings_instagram" class="text-[10px] tracking-widest block mb-1 font-black uppercase text-gray-400">Instagram</label>
<input type="url" id="settings_instagram" name="instagram" value="{{ app.user.instagram ?? '' }}"
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;"
class="w-full px-3 py-2 border-3 border-gray-900 font-bold outline-none"
placeholder="https://instagram.com/...">
</div>
</div>
<div style="display:flex;flex-wrap:wrap;gap:1rem;">
<div style="flex:1;min-width:200px;">
<label for="settings_twitter" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">X (Twitter)</label>
<div class="flex flex-wrap gap-4">
<div class="flex-1 min-w-[200px]">
<label for="settings_twitter" class="text-[10px] tracking-widest block mb-1 font-black uppercase text-gray-400">X (Twitter)</label>
<input type="url" id="settings_twitter" name="twitter" value="{{ app.user.twitter ?? '' }}"
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;"
class="w-full px-3 py-2 border-3 border-gray-900 font-bold outline-none"
placeholder="https://x.com/...">
</div>
<div style="flex:1;min-width:200px;">
<label for="settings_tiktok" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">TikTok</label>
<div class="flex-1 min-w-[200px]">
<label for="settings_tiktok" class="text-[10px] tracking-widest block mb-1 font-black uppercase text-gray-400">TikTok</label>
<input type="url" id="settings_tiktok" name="tiktok" value="{{ app.user.tiktok ?? '' }}"
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;"
class="w-full px-3 py-2 border-3 border-gray-900 font-bold outline-none"
placeholder="https://tiktok.com/@...">
</div>
</div>
</div>
</div>
<div style="border:4px solid #111827;background:#f9fafb;padding:1rem 1.5rem;">
<div class="border-4 border-gray-900 bg-gray-50 px-6 py-4">
<p class="text-xs font-bold text-gray-500">Les informations de votre organisation (raison sociale, SIRET, adresse) ne peuvent etre modifiees que par l'equipe E-Ticket. Contactez <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a> pour toute modification.</p>
</div>
{% endif %}
<div>
<button type="submit"
style="padding:0.75rem 2rem;border:3px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#fabf04;cursor:pointer;"
class="font-black uppercase text-sm tracking-widest hover:bg-green-500 hover:text-black transition-all">
class="btn-brutal font-black uppercase text-sm tracking-widest hover:bg-green-500 hover:text-black transition-all">
Enregistrer
</button>
</div>

View File

@@ -8,36 +8,36 @@
{{ vite_asset('admin.js') }}
{% endblock %}
</head>
<body style="background:#fbfbfb;color:#111827;" class="min-h-screen flex flex-col">
<header style="border-bottom:4px solid #111827;" class="bg-white sticky top-0 z-50">
<body class="admin-body min-h-screen flex flex-col">
<header class="admin-header bg-white sticky top-0 z-50">
<div class="flex items-center justify-between h-16 px-6">
<div class="flex items-center gap-6">
<a href="{{ path('app_admin_dashboard') }}" class="flex items-center gap-3">
<div style="border:2px solid #111827;box-shadow:3px 3px 0 rgba(0,0,0,1);background:#fabf04;" class="px-2 py-1 text-xs font-black uppercase">Admin</div>
<div class="admin-badge px-2 py-1 text-xs font-black uppercase">Admin</div>
<span class="text-xl font-black uppercase tracking-tighter italic">E-Ticket</span>
</a>
<nav class="flex items-center gap-1 ml-6">
{% set current_route = app.request.attributes.get('_route') %}
<a href="{{ path('app_admin_dashboard') }}" style="{{ current_route == 'app_admin_dashboard' ? 'background:#fabf04;border:2px solid #111827;box-shadow:2px 2px 0 rgba(0,0,0,1);' : '' }}" class="px-3 py-1.5 text-xs font-black uppercase tracking-widest {{ current_route == 'app_admin_dashboard' ? '' : 'hover:bg-gray-100' }} transition-all">Dashboard</a>
<a href="{{ path('app_admin_buyers') }}" style="{{ current_route starts with 'app_admin_buyer' ? 'background:#fabf04;border:2px solid #111827;box-shadow:2px 2px 0 rgba(0,0,0,1);' : '' }}" class="px-3 py-1.5 text-xs font-black uppercase tracking-widest {{ current_route starts with 'app_admin_buyer' ? '' : 'hover:bg-gray-100' }} transition-all">Acheteurs</a>
<a href="{{ path('app_admin_organizers') }}" style="{{ current_route starts with 'app_admin_organizer' ? 'background:#fabf04;border:2px solid #111827;box-shadow:2px 2px 0 rgba(0,0,0,1);' : '' }}" class="px-3 py-1.5 text-xs font-black uppercase tracking-widest {{ current_route starts with 'app_admin_organizer' ? '' : 'hover:bg-gray-100' }} transition-all">Organisateurs</a>
<a href="{{ path('app_admin_dashboard') }}" class="px-3 py-1.5 text-xs font-black uppercase tracking-widest transition-all {{ current_route == 'app_admin_dashboard' ? 'admin-nav-active' : 'hover:bg-gray-100' }}">Dashboard</a>
<a href="{{ path('app_admin_buyers') }}" class="px-3 py-1.5 text-xs font-black uppercase tracking-widest transition-all {{ current_route starts with 'app_admin_buyer' ? 'admin-nav-active' : 'hover:bg-gray-100' }}">Acheteurs</a>
<a href="{{ path('app_admin_organizers') }}" class="px-3 py-1.5 text-xs font-black uppercase tracking-widest transition-all {{ current_route starts with 'app_admin_organizer' ? 'admin-nav-active' : 'hover:bg-gray-100' }}">Organisateurs</a>
</nav>
</div>
<div class="flex items-center gap-3">
<a href="{{ path('app_home') }}" style="border:2px solid #111827;" class="px-3 py-1.5 text-xs font-black uppercase tracking-widest bg-white hover:bg-gray-100 transition-all">Retour au site</a>
<a href="{{ path('app_logout') }}" style="border:2px solid #111827;background:#111827;" class="px-3 py-1.5 text-xs font-black uppercase tracking-widest text-white hover:bg-red-600 transition-all">Deconnexion</a>
<a href="{{ path('app_home') }}" class="admin-nav-link px-3 py-1.5 text-xs font-black uppercase tracking-widest bg-white hover:bg-gray-100 transition-all">Retour au site</a>
<a href="{{ path('app_logout') }}" class="admin-nav-dark px-3 py-1.5 text-xs font-black uppercase tracking-widest text-white hover:bg-red-600 transition-all">Deconnexion</a>
</div>
</div>
</header>
<main class="flex-1" style="max-width:70rem;margin:0 auto;padding:2rem 1rem;width:100%;">
<main class="flex-1 admin-main">
{% for message in app.flashes('success') %}
<div style="border:4px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#d1fae5;padding:1rem 1.5rem;margin-bottom:1.5rem;">
<div class="flash-success">
<p class="font-black text-sm">{{ message }}</p>
</div>
{% endfor %}
{% for message in app.flashes('error') %}
<div style="border:4px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#fee2e2;padding:1rem 1.5rem;margin-bottom:1.5rem;">
<div class="flash-error">
<p class="font-black text-sm">{{ message }}</p>
</div>
{% endfor %}

View File

@@ -3,94 +3,94 @@
{% block title %}Acheteurs{% endblock %}
{% block body %}
<div style="margin-bottom:2rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:0.5rem;">Acheteurs</h1>
<div class="mb-8">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page">Acheteurs</h1>
<p class="font-bold text-gray-500 italic">{{ buyers.getTotalItemCount }} acheteur{{ buyers.getTotalItemCount > 1 ? 's' : '' }} enregistre{{ buyers.getTotalItemCount > 1 ? 's' : '' }}.</p>
</div>
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;margin-bottom:2rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;">Rechercher</h2>
<form method="get" action="{{ path('app_admin_buyers') }}" style="display:flex;gap:1rem;align-items:flex-end;">
<div style="flex:1;">
<div class="admin-card mb-8">
<h2 class="text-sm font-black uppercase tracking-widest mb-4">Rechercher</h2>
<form method="get" action="{{ path('app_admin_buyers') }}" class="flex gap-4 items-end">
<div class="flex-1">
<input type="text" name="q" value="{{ query }}"
style="width:100%;padding:0.5rem 0.75rem;border:2px solid #111827;font-weight:700;outline:none;"
class="admin-form-input"
placeholder="Rechercher par nom, prenom ou email...">
</div>
<button type="submit" style="padding:0.5rem 1rem;border:2px solid #111827;background:#fabf04;cursor:pointer;white-space:nowrap;" class="font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Rechercher</button>
<button type="submit" class="admin-btn-search font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Rechercher</button>
{% if query %}
<a href="{{ path('app_admin_buyers') }}" style="padding:0.5rem 1rem;border:2px solid #111827;background:white;white-space:nowrap;" class="font-black uppercase text-xs tracking-widest hover:bg-gray-100 transition-all">Effacer</a>
<a href="{{ path('app_admin_buyers') }}" class="admin-btn-clear font-black uppercase text-xs tracking-widest hover:bg-gray-100 transition-all">Effacer</a>
{% endif %}
</form>
</div>
{% if not query %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;margin-bottom:2rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;">Creer un acheteur</h2>
<form method="post" action="{{ path('app_admin_create_buyer') }}" style="display:flex;flex-wrap:wrap;gap:1rem;align-items:flex-end;">
<div style="flex:1;min-width:140px;">
<label for="create_last_name" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Nom</label>
<input type="text" id="create_last_name" name="last_name" required style="width:100%;padding:0.5rem 0.75rem;border:2px solid #111827;font-weight:700;outline:none;" placeholder="Dupont">
<div class="admin-card mb-8">
<h2 class="text-sm font-black uppercase tracking-widest mb-4">Creer un acheteur</h2>
<form method="post" action="{{ path('app_admin_create_buyer') }}" class="flex flex-wrap gap-4 items-end">
<div class="flex-1 min-w-[140px]">
<label for="create_last_name" class="admin-form-label font-black uppercase text-gray-400">Nom</label>
<input type="text" id="create_last_name" name="last_name" required class="admin-form-input" placeholder="Dupont">
</div>
<div style="flex:1;min-width:140px;">
<label for="create_first_name" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Prenom</label>
<input type="text" id="create_first_name" name="first_name" required style="width:100%;padding:0.5rem 0.75rem;border:2px solid #111827;font-weight:700;outline:none;" placeholder="Jean">
<div class="flex-1 min-w-[140px]">
<label for="create_first_name" class="admin-form-label font-black uppercase text-gray-400">Prenom</label>
<input type="text" id="create_first_name" name="first_name" required class="admin-form-input" placeholder="Jean">
</div>
<div style="flex:2;min-width:200px;">
<label for="create_email" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Email</label>
<input type="email" id="create_email" name="email" required style="width:100%;padding:0.5rem 0.75rem;border:2px solid #111827;font-weight:700;outline:none;" placeholder="jean.dupont@exemple.fr">
<div class="flex-2 min-w-[200px]">
<label for="create_email" class="admin-form-label font-black uppercase text-gray-400">Email</label>
<input type="email" id="create_email" name="email" required class="admin-form-input" placeholder="jean.dupont@exemple.fr">
</div>
<button type="submit" style="padding:0.5rem 1rem;border:2px solid #111827;background:#fabf04;cursor:pointer;white-space:nowrap;" class="font-black uppercase text-xs tracking-widest hover:bg-green-500 hover:text-black transition-all">Creer</button>
<button type="submit" class="admin-btn-search font-black uppercase text-xs tracking-widest hover:bg-green-500 hover:text-black transition-all">Creer</button>
</form>
</div>
{% endif %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<table style="width:100%;border-collapse:collapse;">
<div class="admin-card !p-0">
<table class="admin-table">
<thead>
<tr style="background:#111827;">
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-white">Nom</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-white">Email</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-white">Inscription</th>
<th style="padding:0.75rem 1.5rem;text-align:center;" class="text-[10px] font-black uppercase tracking-widest text-white">Email verifie</th>
<th style="padding:0.75rem 1.5rem;text-align:right;" class="text-[10px] font-black uppercase tracking-widest text-white">Actions</th>
<tr>
<th class="text-[10px] font-black uppercase tracking-widest text-white">Nom</th>
<th class="text-[10px] font-black uppercase tracking-widest text-white">Email</th>
<th class="text-[10px] font-black uppercase tracking-widest text-white">Inscription</th>
<th class="text-[10px] font-black uppercase tracking-widest text-white text-center">Email verifie</th>
<th class="text-[10px] font-black uppercase tracking-widest text-white text-right">Actions</th>
</tr>
</thead>
<tbody>
{% for buyer in buyers %}
<tr style="border-bottom:1px solid #e5e7eb;" class="hover:bg-gray-50 transition-all">
<td style="padding:0.75rem 1.5rem;" class="font-bold text-sm">{{ buyer.firstName }} {{ buyer.lastName }}</td>
<td style="padding:0.75rem 1.5rem;" class="text-sm text-gray-600">{{ buyer.email }}</td>
<td style="padding:0.75rem 1.5rem;" class="text-sm text-gray-400">{{ buyer.createdAt|date('d/m/Y') }}</td>
<td style="padding:0.75rem 1.5rem;text-align:center;">
<tr class="hover:bg-gray-50 transition-all">
<td class="font-bold text-sm">{{ buyer.firstName }} {{ buyer.lastName }}</td>
<td class="text-sm text-gray-600">{{ buyer.email }}</td>
<td class="text-sm text-gray-400">{{ buyer.createdAt|date('d/m/Y') }}</td>
<td class="text-center">
{% if buyer.verified %}
<span style="background:#d1fae5;border:2px solid #111827;padding:0.15rem 0.5rem;" class="text-xs font-black uppercase">Oui</span>
<span class="admin-badge-green text-xs font-black uppercase">Oui</span>
{% else %}
<span style="background:#fee2e2;border:2px solid #111827;padding:0.15rem 0.5rem;" class="text-xs font-black uppercase">Non</span>
<span class="admin-badge-red text-xs font-black uppercase">Non</span>
{% endif %}
</td>
<td style="padding:0.75rem 1.5rem;text-align:right;">
<div style="display:flex;gap:0.5rem;justify-content:flex-end;">
<td class="text-right">
<div class="flex gap-2 justify-end">
{% if not buyer.verified %}
<form method="post" action="{{ path('app_admin_resend_verification', {id: buyer.id}) }}">
<button type="submit" style="border:2px solid #111827;padding:0.4rem 0.75rem;background:white;cursor:pointer;" class="text-xs font-black uppercase tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Renvoyer</button>
<button type="submit" class="admin-btn-sm-white text-xs font-black uppercase tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Renvoyer</button>
</form>
<form method="post" action="{{ path('app_admin_force_verification', {id: buyer.id}) }}">
<button type="submit" style="border:2px solid #111827;padding:0.4rem 0.75rem;background:#fabf04;cursor:pointer;" class="text-xs font-black uppercase tracking-widest hover:bg-green-500 hover:text-black transition-all">Forcer</button>
<button type="submit" class="admin-btn-sm-yellow text-xs font-black uppercase tracking-widest hover:bg-green-500 hover:text-black transition-all">Forcer</button>
</form>
{% else %}
<form method="post" action="{{ path('app_admin_reset_password', {id: buyer.id}) }}">
<button type="submit" style="border:2px solid #111827;padding:0.4rem 0.75rem;background:white;cursor:pointer;" class="text-xs font-black uppercase tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Reset MDP</button>
<button type="submit" class="admin-btn-sm-white text-xs font-black uppercase tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Reset MDP</button>
</form>
{% endif %}
<form method="post" action="{{ path('app_admin_delete_buyer', {id: buyer.id}) }}" data-confirm="Etes-vous sur de vouloir supprimer le compte de {{ buyer.firstName }} {{ buyer.lastName }} ({{ buyer.email }}) ? Cette action est irreversible.">
<button type="submit" style="border:2px solid #991b1b;padding:0.4rem 0.75rem;background:#dc2626;color:white;cursor:pointer;" class="text-xs font-black uppercase tracking-widest hover:bg-red-800 transition-all">Supprimer</button>
<button type="submit" class="admin-btn-sm-danger text-xs font-black uppercase tracking-widest hover:bg-red-800 transition-all">Supprimer</button>
</form>
</div>
</td>
</tr>
{% else %}
<tr>
<td colspan="5" style="padding:3rem;text-align:center;" class="text-gray-400 font-bold text-sm">Aucun acheteur enregistre.</td>
<td colspan="5" class="!text-center !py-12 text-gray-400 font-bold text-sm">Aucun acheteur enregistre.</td>
</tr>
{% endfor %}
</tbody>
@@ -98,12 +98,12 @@
</div>
{% if buyers.getTotalItemCount > 10 %}
<div style="display:flex;justify-content:center;gap:0.5rem;margin-top:1.5rem;">
<div class="flex justify-center gap-2 mt-6">
{% for page in 1..buyers.getPageCount %}
{% if page == buyers.getCurrentPageNumber %}
<span style="border:2px solid #111827;padding:0.4rem 0.75rem;background:#fabf04;" class="text-xs font-black">{{ page }}</span>
<span class="admin-page-active text-xs font-black">{{ page }}</span>
{% else %}
<a href="{{ path('app_admin_buyers', {page: page}) }}" style="border:2px solid #111827;padding:0.4rem 0.75rem;background:white;" class="text-xs font-black hover:bg-gray-100 transition-all">{{ page }}</a>
<a href="{{ path('app_admin_buyers', {page: page}) }}" class="admin-page-link text-xs font-black hover:bg-gray-100 transition-all">{{ page }}</a>
{% endif %}
{% endfor %}
</div>

View File

@@ -3,51 +3,49 @@
{% block title %}Creer un acheteur{% endblock %}
{% block body %}
<div style="margin-bottom:2rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:0.5rem;">Creer un acheteur</h1>
<div class="mb-8">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page">Creer un acheteur</h1>
<p class="font-bold text-gray-500 italic">Le mot de passe sera genere aleatoirement.</p>
</div>
<div style="max-width:36rem;">
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;">
<form method="post" action="{{ path('app_admin_create_buyer') }}" style="display:flex;flex-direction:column;gap:1.5rem;">
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;">
<div style="flex:1;min-width:150px;">
<label for="buyer_last_name" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Nom</label>
<div class="max-w-[36rem]">
<div class="admin-card">
<form method="post" action="{{ path('app_admin_create_buyer') }}" class="flex flex-col gap-6">
<div class="flex flex-wrap gap-6">
<div class="flex-1 min-w-[150px]">
<label for="buyer_last_name" class="admin-form-label-lg font-black uppercase text-gray-400">Nom</label>
<input type="text" id="buyer_last_name" name="last_name" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="admin-form-input-lg"
placeholder="Dupont">
</div>
<div style="flex:1;min-width:150px;">
<label for="buyer_first_name" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Prenom</label>
<div class="flex-1 min-w-[150px]">
<label for="buyer_first_name" class="admin-form-label-lg font-black uppercase text-gray-400">Prenom</label>
<input type="text" id="buyer_first_name" name="first_name" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="admin-form-input-lg"
placeholder="Jean">
</div>
</div>
<div>
<label for="buyer_email" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Email</label>
<label for="buyer_email" class="admin-form-label-lg font-black uppercase text-gray-400">Email</label>
<input type="email" id="buyer_email" name="email" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="admin-form-input-lg"
placeholder="jean.dupont@exemple.fr">
</div>
<div style="display:flex;align-items:center;gap:0.75rem;">
<div class="flex items-center gap-3">
<input type="checkbox" id="buyer_verify" name="verify_now" value="1"
style="width:1.25rem;height:1.25rem;border:2px solid #111827;cursor:pointer;">
class="admin-form-checkbox">
<label for="buyer_verify" class="text-sm font-bold cursor-pointer">Marquer l'email comme verifie immediatement</label>
</div>
<div style="display:flex;gap:0.75rem;">
<div class="flex gap-3">
<button type="submit"
style="padding:0.75rem 1.5rem;border:3px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#fabf04;cursor:pointer;"
class="font-black uppercase text-sm tracking-widest hover:bg-green-500 hover:text-white transition-all">
class="admin-btn-lg font-black uppercase text-sm tracking-widest hover:bg-green-500 hover:text-white transition-all">
Creer l'acheteur
</button>
<a href="{{ path('app_admin_buyers') }}"
style="padding:0.75rem 1.5rem;border:3px solid #111827;display:inline-flex;align-items:center;"
class="font-black uppercase text-sm tracking-widest bg-white hover:bg-gray-100 transition-all">
class="admin-btn-lg-outline inline-flex items-center font-black uppercase text-sm tracking-widest bg-white hover:bg-gray-100 transition-all">
Annuler
</a>
</div>

View File

@@ -3,23 +3,23 @@
{% block title %}Dashboard{% endblock %}
{% block body %}
<div style="margin-bottom:2rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:0.5rem;">Dashboard</h1>
<div class="mb-8">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page">Dashboard</h1>
<p class="font-bold text-gray-500 italic">Bonjour {{ app.user.firstName }}, bienvenue sur l'administration.</p>
</div>
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:2.5rem;">
<div style="flex:1;min-width:280px;border:4px solid #111827;padding:1.5rem;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<p style="font-size:10px;letter-spacing:0.1em;" class="font-black uppercase text-gray-400">CA HT Global</p>
<p class="text-4xl font-black" style="margin-top:0.5rem;">0,00 &euro;</p>
<div class="flex flex-wrap gap-6 mb-10">
<div class="flex-1 min-w-[280px] admin-card">
<p class="admin-stat-label font-black uppercase text-gray-400">CA HT Global</p>
<p class="text-4xl font-black mt-2">0,00 &euro;</p>
</div>
<div style="flex:1;min-width:280px;border:4px solid #111827;padding:1.5rem;box-shadow:6px 6px 0 rgba(0,0,0,1);background:#fabf04;">
<p style="font-size:10px;letter-spacing:0.1em;" class="font-black uppercase">CA HT Commission</p>
<p class="text-4xl font-black" style="margin-top:0.5rem;">0,00 &euro;</p>
<div class="flex-1 min-w-[280px] admin-card-yellow">
<p class="admin-stat-label font-black uppercase">CA HT Commission</p>
<p class="text-4xl font-black mt-2">0,00 &euro;</p>
</div>
</div>
<form method="post" action="{{ path('app_admin_sync_meilisearch') }}" style="display:inline;">
<button type="submit" style="padding:0.5rem 1rem;border:3px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#fabf04;cursor:pointer;" class="font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Sync Meilisearch</button>
<form method="post" action="{{ path('app_admin_sync_meilisearch') }}" class="inline">
<button type="submit" class="admin-btn font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Sync Meilisearch</button>
</form>
{% endblock %}

View File

@@ -3,72 +3,72 @@
{% block title %}Modifier {{ user.companyName }}{% endblock %}
{% block body %}
<div style="margin-bottom:2rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:0.5rem;">Modifier l'organisateur</h1>
<div class="mb-8">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page">Modifier l'organisateur</h1>
<p class="font-bold text-gray-500 italic">{{ user.companyName }}{{ user.email }}</p>
</div>
<form method="post" action="{{ path('app_admin_edit_organizer', {id: user.id}) }}">
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:2rem;">
<div style="flex:1;min-width:300px;">
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;">Informations personnelles</h2>
<div style="display:flex;flex-direction:column;gap:1rem;">
<div style="display:flex;gap:1rem;">
<div style="flex:1;">
<label for="edit_last_name" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Nom</label>
<div class="flex flex-wrap gap-6 mb-8">
<div class="flex-1 min-w-[300px]">
<div class="admin-card">
<h2 class="text-sm font-black uppercase tracking-widest mb-4">Informations personnelles</h2>
<div class="flex flex-col gap-4">
<div class="flex gap-4">
<div class="flex-1">
<label for="edit_last_name" class="admin-form-label font-black uppercase text-gray-400">Nom</label>
<input type="text" id="edit_last_name" name="last_name" value="{{ user.lastName }}" required
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;">
class="admin-form-input-lg">
</div>
<div style="flex:1;">
<label for="edit_first_name" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Prenom</label>
<div class="flex-1">
<label for="edit_first_name" class="admin-form-label font-black uppercase text-gray-400">Prenom</label>
<input type="text" id="edit_first_name" name="first_name" value="{{ user.firstName }}" required
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;">
class="admin-form-input-lg">
</div>
</div>
<div>
<label for="edit_email" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Email</label>
<label for="edit_email" class="admin-form-label font-black uppercase text-gray-400">Email</label>
<input type="email" id="edit_email" name="email" value="{{ user.email }}" required
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;">
class="admin-form-input-lg">
</div>
<div>
<label for="edit_phone" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Telephone</label>
<label for="edit_phone" class="admin-form-label font-black uppercase text-gray-400">Telephone</label>
<input type="tel" id="edit_phone" name="phone" value="{{ user.phone }}"
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;">
class="admin-form-input-lg">
</div>
</div>
</div>
</div>
<div style="flex:1;min-width:300px;">
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;">Informations entreprise</h2>
<div style="display:flex;flex-direction:column;gap:1rem;">
<div class="flex-1 min-w-[300px]">
<div class="admin-card">
<h2 class="text-sm font-black uppercase tracking-widest mb-4">Informations entreprise</h2>
<div class="flex flex-col gap-4">
<div>
<label for="edit_company" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Raison sociale</label>
<label for="edit_company" class="admin-form-label font-black uppercase text-gray-400">Raison sociale</label>
<input type="text" id="edit_company" name="company_name" value="{{ user.companyName }}" required
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;">
class="admin-form-input-lg">
</div>
<div>
<label for="edit_siret" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">SIRET</label>
<label for="edit_siret" class="admin-form-label font-black uppercase text-gray-400">SIRET</label>
<input type="text" id="edit_siret" name="siret" value="{{ user.siret }}" maxlength="14" pattern="[0-9]{14}"
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;">
class="admin-form-input-lg">
</div>
<div>
<label for="edit_address" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Adresse</label>
<label for="edit_address" class="admin-form-label font-black uppercase text-gray-400">Adresse</label>
<input type="text" id="edit_address" name="address" value="{{ user.address }}"
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;">
class="admin-form-input-lg">
</div>
<div style="display:flex;gap:1rem;">
<div style="flex:1;">
<label for="edit_postal" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Code postal</label>
<div class="flex gap-4">
<div class="flex-1">
<label for="edit_postal" class="admin-form-label font-black uppercase text-gray-400">Code postal</label>
<input type="text" id="edit_postal" name="postal_code" value="{{ user.postalCode }}" maxlength="5" pattern="[0-9]{5}"
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;">
class="admin-form-input-lg">
</div>
<div style="flex:2;">
<label for="edit_city" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase text-gray-400">Ville</label>
<div class="flex-2">
<label for="edit_city" class="admin-form-label font-black uppercase text-gray-400">Ville</label>
<input type="text" id="edit_city" name="city" value="{{ user.city }}"
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;">
class="admin-form-input-lg">
</div>
</div>
</div>
@@ -76,38 +76,36 @@
</div>
</div>
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:2rem;">
<div style="flex:1;min-width:300px;">
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:#fabf04;padding:1.5rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;">Offre et commission</h2>
<div style="display:flex;gap:1rem;">
<div style="flex:1;">
<label for="edit_offer" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase">Offre</label>
<select id="edit_offer" name="offer" style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;cursor:pointer;background:white;">
<div class="flex flex-wrap gap-6 mb-8">
<div class="flex-1 min-w-[300px]">
<div class="admin-card-yellow">
<h2 class="text-sm font-black uppercase tracking-widest mb-4">Offre et commission</h2>
<div class="flex gap-4">
<div class="flex-1">
<label for="edit_offer" class="admin-form-label font-black uppercase">Offre</label>
<select id="edit_offer" name="offer" class="admin-form-select">
<option value="free" {{ user.offer == 'free' ? 'selected' : '' }}>Gratuit</option>
<option value="basic" {{ user.offer == 'basic' ? 'selected' : '' }}>Basique</option>
<option value="custom" {{ user.offer == 'custom' ? 'selected' : '' }}>Sur-mesure</option>
</select>
</div>
<div style="flex:1;">
<label for="edit_commission" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.25rem;" class="font-black uppercase">Taux de commission (%)</label>
<div class="flex-1">
<label for="edit_commission" class="admin-form-label font-black uppercase">Taux de commission (%)</label>
<input type="number" id="edit_commission" name="commission_rate" value="{{ user.commissionRate ?? 3 }}" step="0.1" min="0" max="100"
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;background:white;">
class="admin-form-input-lg bg-white">
</div>
</div>
</div>
</div>
</div>
<div style="display:flex;gap:0.75rem;">
<div class="flex gap-3">
<button type="submit"
style="padding:0.75rem 1.5rem;border:3px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#fabf04;cursor:pointer;"
class="font-black uppercase text-sm tracking-widest hover:bg-green-500 hover:text-black transition-all">
class="admin-btn-lg font-black uppercase text-sm tracking-widest hover:bg-green-500 hover:text-black transition-all">
Enregistrer
</button>
<a href="{{ path('app_admin_organizers', {tab: 'approved'}) }}"
style="padding:0.75rem 1.5rem;border:3px solid #111827;display:inline-flex;align-items:center;"
class="font-black uppercase text-sm tracking-widest bg-white hover:bg-gray-100 transition-all">
class="admin-btn-lg-outline inline-flex items-center font-black uppercase text-sm tracking-widest bg-white hover:bg-gray-100 transition-all">
Annuler
</a>
</div>

View File

@@ -3,77 +3,77 @@
{% block title %}Organisateurs{% endblock %}
{% block body %}
<div style="margin-bottom:2rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:0.5rem;">Organisateurs</h1>
<div class="mb-8">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page">Organisateurs</h1>
<p class="font-bold text-gray-500 italic">{{ organizers.getTotalItemCount }} organisateur{{ organizers.getTotalItemCount > 1 ? 's' : '' }}.</p>
</div>
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;margin-bottom:2rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;">Rechercher</h2>
<form method="get" action="{{ path('app_admin_organizers') }}" style="display:flex;gap:1rem;align-items:flex-end;">
<div style="flex:1;">
<div class="admin-card mb-8">
<h2 class="text-sm font-black uppercase tracking-widest mb-4">Rechercher</h2>
<form method="get" action="{{ path('app_admin_organizers') }}" class="flex gap-4 items-end">
<div class="flex-1">
<input type="text" name="q" value="{{ query }}"
style="width:100%;padding:0.5rem 0.75rem;border:2px solid #111827;font-weight:700;outline:none;"
class="admin-form-input"
placeholder="Rechercher par nom, email, raison sociale, SIRET...">
</div>
<input type="hidden" name="tab" value="{{ tab }}">
<button type="submit" style="padding:0.5rem 1rem;border:2px solid #111827;background:#fabf04;cursor:pointer;white-space:nowrap;" class="font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Rechercher</button>
<button type="submit" class="admin-btn-search font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Rechercher</button>
{% if query %}
<a href="{{ path('app_admin_organizers', {tab: tab}) }}" style="padding:0.5rem 1rem;border:2px solid #111827;background:white;white-space:nowrap;" class="font-black uppercase text-xs tracking-widest hover:bg-gray-100 transition-all">Effacer</a>
<a href="{{ path('app_admin_organizers', {tab: tab}) }}" class="admin-btn-clear font-black uppercase text-xs tracking-widest hover:bg-gray-100 transition-all">Effacer</a>
{% endif %}
</form>
</div>
{% if not query %}
<div style="display:flex;gap:0;margin-bottom:2rem;">
<a href="{{ path('app_admin_organizers', {tab: 'pending'}) }}" style="flex:1;text-align:center;padding:0.75rem;border:3px solid #111827;border-right:none;{{ tab == 'pending' ? 'background:#fabf04;' : 'background:white;' }}" class="font-black uppercase text-sm tracking-widest transition-all">En attente</a>
<a href="{{ path('app_admin_organizers', {tab: 'approved'}) }}" style="flex:1;text-align:center;padding:0.75rem;border:3px solid #111827;{{ tab == 'approved' ? 'background:#fabf04;' : 'background:white;' }}" class="font-black uppercase text-sm tracking-widest transition-all">Valides</a>
<div class="flex gap-0 mb-8">
<a href="{{ path('app_admin_organizers', {tab: 'pending'}) }}" class="admin-tab admin-tab-first {{ tab == 'pending' ? 'admin-tab-active' : 'admin-tab-inactive' }} font-black uppercase text-sm tracking-widest transition-all">En attente</a>
<a href="{{ path('app_admin_organizers', {tab: 'approved'}) }}" class="admin-tab {{ tab == 'approved' ? 'admin-tab-active' : 'admin-tab-inactive' }} font-black uppercase text-sm tracking-widest transition-all">Valides</a>
</div>
{% endif %}
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<table style="width:100%;border-collapse:collapse;">
<div class="admin-card !p-0">
<table class="admin-table">
<thead>
<tr style="background:#111827;">
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-white">Organisateur</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-white">Raison sociale</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-white">SIRET</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-white">Ville</th>
<th style="padding:0.75rem 1.5rem;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-white">Offre</th>
<th style="padding:0.75rem 1.5rem;text-align:right;" class="text-[10px] font-black uppercase tracking-widest text-white">Actions</th>
<tr>
<th class="text-[10px] font-black uppercase tracking-widest text-white">Organisateur</th>
<th class="text-[10px] font-black uppercase tracking-widest text-white">Raison sociale</th>
<th class="text-[10px] font-black uppercase tracking-widest text-white">SIRET</th>
<th class="text-[10px] font-black uppercase tracking-widest text-white">Ville</th>
<th class="text-[10px] font-black uppercase tracking-widest text-white">Offre</th>
<th class="text-[10px] font-black uppercase tracking-widest text-white text-right">Actions</th>
</tr>
</thead>
<tbody>
{% for orga in organizers %}
<tr style="border-bottom:1px solid #e5e7eb;" class="hover:bg-gray-50 transition-all">
<td style="padding:0.75rem 1.5rem;">
<tr class="hover:bg-gray-50 transition-all">
<td>
<p class="font-bold text-sm">{{ orga.firstName }} {{ orga.lastName }}</p>
<p class="text-gray-400 text-xs">{{ orga.email }}</p>
</td>
<td style="padding:0.75rem 1.5rem;" class="text-sm text-gray-600">{{ orga.companyName }}</td>
<td style="padding:0.75rem 1.5rem;" class="text-sm text-gray-600 font-mono">{{ orga.siret }}</td>
<td style="padding:0.75rem 1.5rem;" class="text-sm text-gray-600">{{ orga.postalCode }} {{ orga.city }}</td>
<td style="padding:0.75rem 1.5rem;">
<td class="text-sm text-gray-600">{{ orga.companyName }}</td>
<td class="text-sm text-gray-600 font-mono">{{ orga.siret }}</td>
<td class="text-sm text-gray-600">{{ orga.postalCode }} {{ orga.city }}</td>
<td>
{% if orga.offer %}
<span style="background:#e0e7ff;border:2px solid #111827;padding:0.15rem 0.5rem;" class="text-xs font-black uppercase">{{ orga.offer }}</span>
<span class="admin-badge-indigo text-xs font-black uppercase">{{ orga.offer }}</span>
{% else %}
<span class="text-gray-400 text-xs">—</span>
{% endif %}
</td>
<td style="padding:0.75rem 1.5rem;text-align:right;">
<td class="text-right">
{% if not orga.approved %}
<a href="{{ path('app_admin_siret_check', {id: orga.id}) }}" style="border:2px solid #111827;padding:0.4rem 0.75rem;background:#fabf04;display:inline-block;" class="text-xs font-black uppercase tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Voir la demande</a>
<a href="{{ path('app_admin_siret_check', {id: orga.id}) }}" class="admin-btn-sm-yellow inline-block text-xs font-black uppercase tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Voir la demande</a>
{% else %}
<div style="display:flex;gap:0.5rem;justify-content:flex-end;align-items:center;">
<span style="background:#d1fae5;border:2px solid #111827;padding:0.15rem 0.5rem;" class="text-xs font-black uppercase">{{ orga.offer ?? '—' }}{{ orga.commissionRate ?? '3' }}%</span>
<a href="{{ path('app_admin_edit_organizer', {id: orga.id}) }}" style="border:2px solid #111827;padding:0.4rem 0.75rem;background:white;display:inline-block;" class="text-xs font-black uppercase tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Modifier</a>
<div class="flex gap-2 justify-end items-center">
<span class="admin-badge-green text-xs font-black uppercase">{{ orga.offer ?? '—' }}{{ orga.commissionRate ?? '3' }}%</span>
<a href="{{ path('app_admin_edit_organizer', {id: orga.id}) }}" class="admin-btn-sm-white inline-block text-xs font-black uppercase tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Modifier</a>
</div>
{% endif %}
</td>
</tr>
{% else %}
<tr>
<td colspan="6" style="padding:3rem;text-align:center;" class="text-gray-400 font-bold text-sm">
<td colspan="6" class="!text-center !py-12 text-gray-400 font-bold text-sm">
{% if tab == 'pending' %}
Aucune demande en attente.
{% else %}
@@ -87,12 +87,12 @@
</div>
{% if organizers.getTotalItemCount > 10 %}
<div style="display:flex;justify-content:center;gap:0.5rem;margin-top:1.5rem;">
<div class="flex justify-center gap-2 mt-6">
{% for page in 1..organizers.getPageCount %}
{% if page == organizers.getCurrentPageNumber %}
<span style="border:2px solid #111827;padding:0.4rem 0.75rem;background:#fabf04;" class="text-xs font-black">{{ page }}</span>
<span class="admin-page-active text-xs font-black">{{ page }}</span>
{% else %}
<a href="{{ path('app_admin_organizers', {tab: tab, page: page}) }}" style="border:2px solid #111827;padding:0.4rem 0.75rem;background:white;" class="text-xs font-black hover:bg-gray-100 transition-all">{{ page }}</a>
<a href="{{ path('app_admin_organizers', {tab: tab, page: page}) }}" class="admin-page-link text-xs font-black hover:bg-gray-100 transition-all">{{ page }}</a>
{% endif %}
{% endfor %}
</div>

View File

@@ -3,84 +3,84 @@
{% block title %}Verification Entreprise / Association - {{ siret }}{% endblock %}
{% block body %}
<div style="margin-bottom:2rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:0.5rem;">Verification Entreprise / Association</h1>
<div class="mb-8">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page">Verification Entreprise / Association</h1>
<p class="font-bold text-gray-500 italic">{{ user.firstName }} {{ user.lastName }}{{ siret }}</p>
</div>
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;">
<div style="flex:1;min-width:300px;">
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;">Informations declarees</h2>
<table style="width:100%;border-collapse:collapse;">
<div class="flex flex-wrap gap-6">
<div class="flex-1 min-w-[300px]">
<div class="admin-card">
<h2 class="text-sm font-black uppercase tracking-widest mb-4">Informations declarees</h2>
<table class="admin-detail-table">
<thead>
<tr style="border-bottom:2px solid #e5e7eb;">
<th style="padding:0.5rem 0;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Champ</th>
<th style="padding:0.5rem 0;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Valeur</th>
<tr>
<th class="text-[10px] font-black uppercase tracking-widest text-gray-400">Champ</th>
<th class="text-[10px] font-black uppercase tracking-widest text-gray-400">Valeur</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Nom</td>
<td style="padding:0.5rem 0;" class="text-sm">{{ user.firstName }} {{ user.lastName }}</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Raison sociale</td>
<td style="padding:0.5rem 0;" class="text-sm">{{ user.companyName }}</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">SIRET</td>
<td style="padding:0.5rem 0;" class="text-sm font-mono">{{ user.siret }}</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Adresse</td>
<td style="padding:0.5rem 0;" class="text-sm">{{ user.address }}, {{ user.postalCode }} {{ user.city }}</td>
<tr>
<td class="font-bold text-sm text-gray-400">Nom</td>
<td class="text-sm">{{ user.firstName }} {{ user.lastName }}</td>
</tr>
<tr>
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Telephone</td>
<td style="padding:0.5rem 0;" class="text-sm">{{ user.phone }}</td>
<td class="font-bold text-sm text-gray-400">Raison sociale</td>
<td class="text-sm">{{ user.companyName }}</td>
</tr>
<tr>
<td class="font-bold text-sm text-gray-400">SIRET</td>
<td class="text-sm font-mono">{{ user.siret }}</td>
</tr>
<tr>
<td class="font-bold text-sm text-gray-400">Adresse</td>
<td class="text-sm">{{ user.address }}, {{ user.postalCode }} {{ user.city }}</td>
</tr>
<tr>
<td class="font-bold text-sm text-gray-400">Telephone</td>
<td class="text-sm">{{ user.phone }}</td>
</tr>
</tbody>
</table>
</div>
</div>
<div style="flex:1;min-width:300px;">
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;">Donnees API Gouvernement</h2>
<div class="flex-1 min-w-[300px]">
<div class="admin-card">
<h2 class="text-sm font-black uppercase tracking-widest mb-4">Donnees API Gouvernement</h2>
{% if data %}
<div style="margin-bottom:1rem;display:flex;gap:0.5rem;flex-wrap:wrap;">
<div class="mb-4 flex gap-2 flex-wrap">
{% if data.complements is defined and data.complements.est_association is defined and data.complements.est_association %}
<span style="background:#dbeafe;border:2px solid #111827;padding:0.15rem 0.75rem;" class="text-xs font-black uppercase">Association</span>
<span class="admin-badge-blue text-xs font-black uppercase">Association</span>
{% elseif data.complements is defined and data.complements.est_entrepreneur_individuel is defined and data.complements.est_entrepreneur_individuel %}
<span style="background:#fef3c7;border:2px solid #111827;padding:0.15rem 0.75rem;" class="text-xs font-black uppercase">Entrepreneur individuel</span>
<span class="admin-badge-yellow text-xs font-black uppercase">Entrepreneur individuel</span>
{% else %}
<span style="background:#e0e7ff;border:2px solid #111827;padding:0.15rem 0.75rem;" class="text-xs font-black uppercase">Entreprise</span>
<span class="admin-badge-indigo-lg text-xs font-black uppercase">Entreprise</span>
{% endif %}
{% if data.complements is defined and data.complements.est_ess is defined and data.complements.est_ess %}
<span style="background:#d1fae5;border:2px solid #111827;padding:0.15rem 0.75rem;" class="text-xs font-black uppercase">ESS</span>
<span class="admin-badge-green text-xs font-black uppercase">ESS</span>
{% endif %}
</div>
<table style="width:100%;border-collapse:collapse;">
<table class="admin-detail-table">
<thead>
<tr style="border-bottom:2px solid #e5e7eb;">
<th style="padding:0.5rem 0;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Champ</th>
<th style="padding:0.5rem 0;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Valeur</th>
<tr>
<th class="text-[10px] font-black uppercase tracking-widest text-gray-400">Champ</th>
<th class="text-[10px] font-black uppercase tracking-widest text-gray-400">Valeur</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Denomination</td>
<td style="padding:0.5rem 0;" class="text-sm">{{ data.nom_complet ?? '—' }}</td>
<tr>
<td class="font-bold text-sm text-gray-400">Denomination</td>
<td class="text-sm">{{ data.nom_complet ?? '—' }}</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">SIREN</td>
<td style="padding:0.5rem 0;" class="text-sm font-mono">{{ data.siren ?? '—' }}</td>
<tr>
<td class="font-bold text-sm text-gray-400">SIREN</td>
<td class="text-sm font-mono">{{ data.siren ?? '—' }}</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Nature juridique</td>
<td style="padding:0.5rem 0;" class="text-sm">
<tr>
<td class="font-bold text-sm text-gray-400">Nature juridique</td>
<td class="text-sm">
{% if data.nature_juridique is defined and data.nature_juridique %}
<span class="font-mono">{{ data.nature_juridique }}</span> — {{ data.libelle_nature_juridique ?? '' }}
{% else %}
@@ -88,9 +88,9 @@
{% endif %}
</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Siege</td>
<td style="padding:0.5rem 0;" class="text-sm">
<tr>
<td class="font-bold text-sm text-gray-400">Siege</td>
<td class="text-sm">
{% if data.siege is defined and data.siege %}
{{ data.siege.adresse ?? '' }}, {{ data.siege.code_postal ?? '' }} {{ data.siege.libelle_commune ?? '' }}
{% else %}
@@ -98,9 +98,9 @@
{% endif %}
</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Activite (NAF)</td>
<td style="padding:0.5rem 0;" class="text-sm">
<tr>
<td class="font-bold text-sm text-gray-400">Activite (NAF)</td>
<td class="text-sm">
{% if data.activite_principale is defined and data.activite_principale %}
<span class="font-mono">{{ data.activite_principale }}</span> — {{ data.libelle_activite_principale ?? '' }}
{% else %}
@@ -108,9 +108,9 @@
{% endif %}
</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Tranche effectif</td>
<td style="padding:0.5rem 0;" class="text-sm">
<tr>
<td class="font-bold text-sm text-gray-400">Tranche effectif</td>
<td class="text-sm">
{% set te = data.tranche_effectif_salarie ?? 'NN' %}
{% set te_labels = {
'NN': 'Non renseigne',
@@ -133,29 +133,29 @@
{{ te_labels[te] ?? te }}
</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Date creation</td>
<td style="padding:0.5rem 0;" class="text-sm">{{ data.date_creation ?? '—' }}</td>
<tr>
<td class="font-bold text-sm text-gray-400">Date creation</td>
<td class="text-sm">{{ data.date_creation ?? '—' }}</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Statut</td>
<td style="padding:0.5rem 0;">
<tr>
<td class="font-bold text-sm text-gray-400">Statut</td>
<td>
{% if data.etat_administratif is defined and data.etat_administratif == 'A' %}
<span style="background:#d1fae5;border:2px solid #111827;padding:0.15rem 0.5rem;" class="text-xs font-black uppercase">Active</span>
<span class="admin-badge-green text-xs font-black uppercase">Active</span>
{% else %}
<span style="background:#fee2e2;border:2px solid #111827;padding:0.15rem 0.5rem;" class="text-xs font-black uppercase">Fermee</span>
<span class="admin-badge-red text-xs font-black uppercase">Fermee</span>
{% endif %}
</td>
</tr>
{% if data.complements is defined and data.complements.est_association is defined and data.complements.est_association %}
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">RNA</td>
<td style="padding:0.5rem 0;" class="text-sm font-mono">{{ data.complements.identifiant_association ?? '—' }}</td>
<tr>
<td class="font-bold text-sm text-gray-400">RNA</td>
<td class="text-sm font-mono">{{ data.complements.identifiant_association ?? '—' }}</td>
</tr>
{% endif %}
<tr>
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Coordonnees</td>
<td style="padding:0.5rem 0;" class="text-sm">
<td class="font-bold text-sm text-gray-400">Coordonnees</td>
<td class="text-sm">
{% if data.siege is defined and data.siege.latitude is defined and data.siege.longitude is defined and data.siege.latitude and data.siege.longitude %}
<span class="font-mono">{{ data.siege.latitude }}, {{ data.siege.longitude }}</span>
{% else %}
@@ -166,9 +166,9 @@
</tbody>
</table>
{% else %}
<div style="padding:2rem;text-align:center;">
<span style="background:#fee2e2;border:2px solid #111827;padding:0.25rem 0.75rem;" class="text-xs font-black uppercase">SIRET non trouve</span>
<p class="text-gray-400 text-sm font-bold" style="margin-top:0.5rem;">Aucun resultat retourne par l'API pour ce SIRET.</p>
<div class="py-8 text-center">
<span class="admin-badge-red text-xs font-black uppercase">SIRET non trouve</span>
<p class="text-gray-400 text-sm font-bold mt-2">Aucun resultat retourne par l'API pour ce SIRET.</p>
</div>
{% endif %}
</div>
@@ -176,50 +176,50 @@
</div>
{% if rnaData %}
<div style="margin-top:1.5rem;">
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;">Journal Officiel (JOAFE)</h2>
<table style="width:100%;border-collapse:collapse;">
<div class="mt-6">
<div class="admin-card">
<h2 class="text-sm font-black uppercase tracking-widest mb-4">Journal Officiel (JOAFE)</h2>
<table class="admin-detail-table">
<thead>
<tr style="border-bottom:2px solid #e5e7eb;">
<th style="padding:0.5rem 0;text-align:left;width:180px;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Champ</th>
<th style="padding:0.5rem 0;text-align:left;" class="text-[10px] font-black uppercase tracking-widest text-gray-400">Valeur</th>
<tr>
<th class="text-[10px] font-black uppercase tracking-widest text-gray-400 w-[180px]">Champ</th>
<th class="text-[10px] font-black uppercase tracking-widest text-gray-400">Valeur</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;width:180px;" class="font-bold text-sm text-gray-400">RNA</td>
<td style="padding:0.5rem 0;" class="text-sm font-mono">{{ rnaData.numero_rna ?? '—' }}</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Regime</td>
<td style="padding:0.5rem 0;" class="text-sm">{{ rnaData.association_type_libelle ?? '—' }}</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;vertical-align:top;" class="font-bold text-sm text-gray-400">Objet</td>
<td style="padding:0.5rem 0;" class="text-sm">{{ rnaData.objet ?? '—' }}</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Domaine d'activite</td>
<td style="padding:0.5rem 0;" class="text-sm">{{ rnaData.domaine_activite_libelle_categorise ?? '—' }}</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Date declaration</td>
<td style="padding:0.5rem 0;" class="text-sm">{{ rnaData.datedeclaration ?? '—' }}</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Date parution JOAFE</td>
<td style="padding:0.5rem 0;" class="text-sm">{{ rnaData.dateparution ?? '—' }}</td>
</tr>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">Lieu declaration</td>
<td style="padding:0.5rem 0;" class="text-sm">{{ rnaData.lieupref ?? '—' }}</td>
<tr>
<td class="font-bold text-sm text-gray-400 w-[180px]">RNA</td>
<td class="text-sm font-mono">{{ rnaData.numero_rna ?? '—' }}</td>
</tr>
<tr>
<td style="padding:0.5rem 0;" class="font-bold text-sm text-gray-400">PDF JOAFE</td>
<td style="padding:0.5rem 0;">
<td class="font-bold text-sm text-gray-400">Regime</td>
<td class="text-sm">{{ rnaData.association_type_libelle ?? '—' }}</td>
</tr>
<tr>
<td class="font-bold text-sm text-gray-400 align-top">Objet</td>
<td class="text-sm">{{ rnaData.objet ?? '—' }}</td>
</tr>
<tr>
<td class="font-bold text-sm text-gray-400">Domaine d'activite</td>
<td class="text-sm">{{ rnaData.domaine_activite_libelle_categorise ?? '—' }}</td>
</tr>
<tr>
<td class="font-bold text-sm text-gray-400">Date declaration</td>
<td class="text-sm">{{ rnaData.datedeclaration ?? '—' }}</td>
</tr>
<tr>
<td class="font-bold text-sm text-gray-400">Date parution JOAFE</td>
<td class="text-sm">{{ rnaData.dateparution ?? '—' }}</td>
</tr>
<tr>
<td class="font-bold text-sm text-gray-400">Lieu declaration</td>
<td class="text-sm">{{ rnaData.lieupref ?? '—' }}</td>
</tr>
<tr>
<td class="font-bold text-sm text-gray-400">PDF JOAFE</td>
<td>
{% if rnaData.url_pdf is defined and rnaData.url_pdf %}
<a href="{{ rnaData.url_pdf }}" target="_blank" style="border:2px solid #111827;padding:0.15rem 0.5rem;background:#fabf04;display:inline-block;" class="text-xs font-black uppercase hover:bg-indigo-600 hover:text-black transition-all">Telecharger</a>
<a href="{{ rnaData.url_pdf }}" target="_blank" class="admin-download text-xs font-black uppercase hover:bg-indigo-600 hover:text-black transition-all">Telecharger</a>
{% else %}
{% endif %}
@@ -231,47 +231,47 @@
</div>
{% endif %}
<div style="margin-top:2rem;display:flex;gap:0.75rem;flex-wrap:wrap;">
<form method="post" action="{{ path('app_admin_siret_refresh', {id: user.id}) }}" style="display:inline;">
<button type="submit" style="padding:0.5rem 1rem;border:3px solid #111827;background:white;cursor:pointer;" class="font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Rafraichir SIRET</button>
<div class="mt-8 flex gap-3 flex-wrap">
<form method="post" action="{{ path('app_admin_siret_refresh', {id: user.id}) }}" class="inline">
<button type="submit" class="admin-btn-outline font-black uppercase text-xs tracking-widest hover:bg-indigo-600 hover:text-black transition-all">Rafraichir SIRET</button>
</form>
<a href="{{ path('app_admin_organizers') }}" style="padding:0.5rem 1rem;border:3px solid #111827;background:white;display:inline-block;" class="font-black uppercase text-xs tracking-widest hover:bg-gray-100 transition-all">Retour</a>
<a href="{{ path('app_admin_organizers') }}" class="admin-btn-outline inline-block font-black uppercase text-xs tracking-widest hover:bg-gray-100 transition-all">Retour</a>
</div>
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;margin-top:2rem;">
<div style="flex:1;min-width:300px;">
<div style="border:4px solid #111827;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;color:#16a34a;">Approuver l'organisateur</h2>
<form method="post" action="{{ path('app_admin_approve_organizer', {id: user.id}) }}" style="display:flex;flex-direction:column;gap:1rem;">
<div class="flex flex-wrap gap-6 mt-8">
<div class="flex-1 min-w-[300px]">
<div class="admin-card">
<h2 class="text-sm font-black uppercase tracking-widest mb-4 text-green-600">Approuver l'organisateur</h2>
<form method="post" action="{{ path('app_admin_approve_organizer', {id: user.id}) }}" class="flex flex-col gap-4">
<div>
<label for="approve_offer" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Offre</label>
<select id="approve_offer" name="offer" style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;cursor:pointer;">
<label for="approve_offer" class="admin-form-label-lg font-black uppercase text-gray-400">Offre</label>
<select id="approve_offer" name="offer" class="admin-form-select">
<option value="free">Gratuit</option>
<option value="basic">Basique</option>
<option value="custom">Sur-mesure</option>
</select>
</div>
<div>
<label for="approve_commission" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Taux de commission (%)</label>
<label for="approve_commission" class="admin-form-label-lg font-black uppercase text-gray-400">Taux de commission (%)</label>
<input type="number" id="approve_commission" name="commission_rate" value="3" step="0.1" min="0" max="100"
style="width:100%;padding:0.5rem 0.75rem;border:3px solid #111827;font-weight:700;outline:none;">
class="admin-form-input-lg">
</div>
<button type="submit" style="padding:0.5rem 1rem;border:3px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#fabf04;cursor:pointer;" class="font-black uppercase text-xs tracking-widest hover:bg-green-500 hover:text-black transition-all">Approuver l'organisateur</button>
<button type="submit" class="admin-btn font-black uppercase text-xs tracking-widest hover:bg-green-500 hover:text-black transition-all">Approuver l'organisateur</button>
</form>
</div>
</div>
<div style="flex:1;min-width:300px;">
<div style="border:4px solid #991b1b;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;padding:1.5rem;">
<h2 class="text-sm font-black uppercase tracking-widest" style="margin-bottom:1rem;color:#991b1b;">Refuser la demande</h2>
<form method="post" action="{{ path('app_admin_reject_organizer', {id: user.id}) }}" data-confirm="Etes-vous sur de vouloir refuser et supprimer le compte de {{ user.firstName }} {{ user.lastName }} ? Cette action est irreversible." style="display:flex;flex-direction:column;gap:1rem;">
<div class="flex-1 min-w-[300px]">
<div class="admin-card-reject">
<h2 class="text-sm font-black uppercase tracking-widest mb-4 text-red-800">Refuser la demande</h2>
<form method="post" action="{{ path('app_admin_reject_organizer', {id: user.id}) }}" data-confirm="Etes-vous sur de vouloir refuser et supprimer le compte de {{ user.firstName }} {{ user.lastName }} ? Cette action est irreversible." class="flex flex-col gap-4">
<div>
<label for="reject_reason" style="font-size:10px;letter-spacing:0.1em;display:block;margin-bottom:0.5rem;" class="font-black uppercase text-gray-400">Motif du refus</label>
<label for="reject_reason" class="admin-form-label-lg font-black uppercase text-gray-400">Motif du refus</label>
<textarea id="reject_reason" name="reason" required rows="4"
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;resize:vertical;"
class="admin-form-textarea"
placeholder="Expliquez la raison du refus..."></textarea>
</div>
<button type="submit" style="padding:0.5rem 1rem;border:3px solid #991b1b;box-shadow:4px 4px 0 rgba(0,0,0,1);background:#dc2626;color:white;cursor:pointer;" class="font-black uppercase text-xs tracking-widest hover:bg-red-800 transition-all">Refuser et supprimer le compte</button>
<button type="submit" class="admin-btn-danger font-black uppercase text-xs tracking-widest hover:bg-red-800 transition-all">Refuser et supprimer le compte</button>
</form>
</div>
</div>

View File

@@ -10,34 +10,34 @@
<div class="glass p-6">
<div class="overflow-x-auto">
<table style="width:100%;border-collapse:collapse;">
<table class="admin-table">
<thead>
<tr class="text-white/60 text-xs font-bold uppercase tracking-widest">
<th style="padding:12px;text-align:left;border-bottom:1px solid rgba(255,255,255,0.1);">Nom</th>
<th style="padding:12px;text-align:left;border-bottom:1px solid rgba(255,255,255,0.1);">Email</th>
<th style="padding:12px;text-align:left;border-bottom:1px solid rgba(255,255,255,0.1);">Roles</th>
<th style="padding:12px;text-align:left;border-bottom:1px solid rgba(255,255,255,0.1);">Verifie</th>
<th style="padding:12px;text-align:left;border-bottom:1px solid rgba(255,255,255,0.1);">Approuve</th>
<th style="padding:12px;text-align:left;border-bottom:1px solid rgba(255,255,255,0.1);">Inscription</th>
<th class="border-b border-white/10">Nom</th>
<th class="border-b border-white/10">Email</th>
<th class="border-b border-white/10">Roles</th>
<th class="border-b border-white/10">Verifie</th>
<th class="border-b border-white/10">Approuve</th>
<th class="border-b border-white/10">Inscription</th>
</tr>
</thead>
<tbody>
{% for user in users %}
<tr class="hover:bg-white/5 transition-all">
<td style="padding:12px;border-bottom:1px solid rgba(255,255,255,0.05);" class="font-bold">{{ user.firstName }} {{ user.lastName }}</td>
<td style="padding:12px;border-bottom:1px solid rgba(255,255,255,0.05);" class="text-white/70">{{ user.email }}</td>
<td style="padding:12px;border-bottom:1px solid rgba(255,255,255,0.05);">
<td class="border-b border-white/5 font-bold">{{ user.firstName }} {{ user.lastName }}</td>
<td class="border-b border-white/5 text-white/70">{{ user.email }}</td>
<td class="border-b border-white/5">
{% for role in user.roles %}
<span class="inline-block px-2 py-0.5 text-xs font-bold rounded-lg {{ role == 'ROLE_ROOT' ? 'bg-red-500/20 text-red-400' : (role == 'ROLE_ORGANIZER' ? 'bg-indigo-500/20 text-indigo-400' : 'bg-white/10 text-white/60') }}">{{ role }}</span>
{% endfor %}
</td>
<td style="padding:12px;border-bottom:1px solid rgba(255,255,255,0.05);">
<td class="border-b border-white/5">
{% if user.verified %}<span class="text-green-400">&#10003;</span>{% else %}<span class="text-white/30">&#10005;</span>{% endif %}
</td>
<td style="padding:12px;border-bottom:1px solid rgba(255,255,255,0.05);">
<td class="border-b border-white/5">
{% if user.approved %}<span class="text-green-400">&#10003;</span>{% else %}<span class="text-white/30">&#10005;</span>{% endif %}
</td>
<td style="padding:12px;border-bottom:1px solid rgba(255,255,255,0.05);" class="text-white/50 text-sm">{{ user.createdAt|date('d/m/Y') }}</td>
<td class="border-b border-white/5 text-white/50 text-sm">{{ user.createdAt|date('d/m/Y') }}</td>
</tr>
{% endfor %}
</tbody>

View File

@@ -142,19 +142,19 @@
</main>
<footer class="bg-yellow-400 border-t-8 border-gray-900 text-gray-900 mt-auto">
<div style="max-width:80rem;margin:0 auto;padding:3rem 1rem;">
<div style="display:flex;flex-wrap:wrap;gap:3rem;padding-bottom:3rem;margin-bottom:3rem;border-bottom:4px solid #111827;">
<div style="flex:1;min-width:280px;">
<h3 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:1rem;">Nous Contacter</h3>
<p class="font-bold text-lg" style="line-height:1.4;">42 RUE DE SAINT-QUENTIN<br>02800 BEAUTOR, FRANCE</p>
<a href="mailto:contact@e-cosplay.fr" style="display:inline-block;margin-top:1rem;padding:0.5rem 1rem;" class="bg-gray-900 text-white font-black uppercase text-sm hover:bg-indigo-600 transition-colors">
<div class="max-w-7xl mx-auto py-12 px-4">
<div class="flex flex-wrap gap-12 pb-12 mb-12 border-b-4 border-gray-900">
<div class="flex-1 min-w-[280px]">
<h3 class="text-3xl font-black uppercase tracking-tighter italic border-b-4 border-gray-900 inline-block mb-4">Nous Contacter</h3>
<p class="font-bold text-lg leading-snug">42 RUE DE SAINT-QUENTIN<br>02800 BEAUTOR, FRANCE</p>
<a href="mailto:contact@e-cosplay.fr" class="inline-block mt-4 px-4 py-2 bg-gray-900 text-white font-black uppercase text-sm hover:bg-indigo-600 transition-colors">
contact@e-cosplay.fr
</a>
</div>
<div style="flex:1;min-width:280px;">
<h3 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:1rem;">E-Ticket</h3>
<p class="font-bold text-gray-800 italic" style="line-height:1.5;">
<div class="flex-1 min-w-[280px]">
<h3 class="text-3xl font-black uppercase tracking-tighter italic border-b-4 border-gray-900 inline-block mb-4">E-Ticket</h3>
<p class="font-bold text-gray-800 italic leading-normal">
E-Ticket est une plateforme de billetterie destinee aux associations
pour la vente de tickets evenementiels, la reservation de tables,
l'organisation de brocantes et le vote en ligne.
@@ -162,21 +162,21 @@
</div>
</div>
<div style="display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:1.5rem;">
<div class="flex flex-wrap justify-between items-center gap-6">
<div>
<p class="font-black uppercase text-sm">&copy; {{ "now"|date("Y") }} E-TICKET.</p>
<p style="font-size:11px;" class="font-bold opacity-80">Solution proposee par l'association <a href="https://www.e-cosplay.fr" class="underline hover:no-underline">e-cosplay.fr</a></p>
<p style="font-size:10px;" class="font-bold opacity-70">RNA N&deg;W022006988</p>
<p class="text-[11px] font-bold opacity-80">Solution proposee par l'association <a href="https://www.e-cosplay.fr" class="underline hover:no-underline">e-cosplay.fr</a></p>
<p class="text-[10px] font-bold opacity-70">RNA N&deg;W022006988</p>
</div>
<div style="display:flex;flex-wrap:wrap;gap:0.5rem;">
<a href="{{ path('app_mentions_legales') }}" style="font-size:10px;padding:0.25rem 0.5rem;" class="font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">Mentions Legales</a>
<a href="{{ path('app_cookies') }}" style="font-size:10px;padding:0.25rem 0.5rem;" class="font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">Politique de Cookies</a>
<a href="{{ path('app_cgu') }}" style="font-size:10px;padding:0.25rem 0.5rem;" class="font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">CGU</a>
<a href="{{ path('app_cgv') }}" style="font-size:10px;padding:0.25rem 0.5rem;" class="font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">CGV</a>
<a href="{{ path('app_rgpd') }}" style="font-size:10px;padding:0.25rem 0.5rem;" class="font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">Politique RGPD</a>
<a href="{{ path('app_hosting') }}" style="font-size:10px;padding:0.25rem 0.5rem;" class="font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">Hebergement</a>
<a href="{{ path('app_tarifs') }}" style="font-size:10px;padding:0.25rem 0.5rem;" class="font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">Tarifs</a>
<a href="{{ path('app_conformite') }}" style="font-size:10px;padding:0.25rem 0.5rem;" class="font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">Conformite</a>
<div class="flex flex-wrap gap-2">
<a href="{{ path('app_mentions_legales') }}" class="text-[10px] px-2 py-1 font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">Mentions Legales</a>
<a href="{{ path('app_cookies') }}" class="text-[10px] px-2 py-1 font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">Politique de Cookies</a>
<a href="{{ path('app_cgu') }}" class="text-[10px] px-2 py-1 font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">CGU</a>
<a href="{{ path('app_cgv') }}" class="text-[10px] px-2 py-1 font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">CGV</a>
<a href="{{ path('app_rgpd') }}" class="text-[10px] px-2 py-1 font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">Politique RGPD</a>
<a href="{{ path('app_hosting') }}" class="text-[10px] px-2 py-1 font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">Hebergement</a>
<a href="{{ path('app_tarifs') }}" class="text-[10px] px-2 py-1 font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">Tarifs</a>
<a href="{{ path('app_conformite') }}" class="text-[10px] px-2 py-1 font-black uppercase bg-gray-900 text-white hover:bg-indigo-600 transition-colors">Conformite</a>
</div>
</div>
</div>

View File

@@ -39,7 +39,7 @@
"@context": "https://schema.org",
"@type": "Product",
"name": "E-Ticket Sur-mesure",
"description": "Abonnement sur-mesure : evenements et billets illimites, commission a partir de 0.5%, accompagnement dedie, tarif personnalise",
"description": "Abonnement sur-mesure : evenements et billets illimites, commission a partir de 0.5%, billets personnalisables, accompagnement dedie, tarif personnalise",
"brand": {"@type": "Organization", "name": "E-Ticket"},
"offers": {
"@type": "AggregateOffer",
@@ -54,85 +54,85 @@
{% endblock %}
{% block body %}
<div style="max-width:60rem;margin:0 auto;padding:3rem 1rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:0.5rem;">Tarifs</h1>
<p class="font-bold text-gray-600 italic" style="margin-bottom:2rem;">Transparence totale sur nos commissions et abonnements.</p>
<div class="page-container-lg">
<h1 class="heading-page text-3xl font-black uppercase tracking-tighter italic">Tarifs</h1>
<p class="font-bold text-gray-600 italic mb-8">Transparence totale sur nos commissions et abonnements.</p>
<h2 class="text-2xl font-black uppercase" style="margin-bottom:1.5rem;">Commission par transaction</h2>
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:3rem;">
<h2 class="text-2xl font-black uppercase mb-6">Commission par transaction</h2>
<div class="flex flex-wrap gap-6 mb-12">
<div style="flex:1;min-width:250px;border:4px solid #111827;padding:1.5rem;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<p style="font-size:10px;letter-spacing:0.1em;" class="font-black uppercase text-gray-500">Commission plateforme</p>
<p class="text-4xl font-black" style="margin:0.5rem 0;">3%</p>
<div class="card-brutal flex-1 min-w-[250px]">
<p class="text-[10px] tracking-widest font-black uppercase text-gray-500">Commission plateforme</p>
<p class="text-4xl font-black my-2">3%</p>
<p class="text-sm font-bold text-gray-600">du montant de chaque billet vendu</p>
<p class="text-sm font-bold text-gray-600" style="margin-top:0.5rem;">Negociable selon votre profil, contactez-nous.</p>
<p style="margin-top:1rem;font-size:0.75rem;" class="text-gray-500 font-bold">+ frais Stripe (1.5% + 0.25&euro; par transaction, non negociables)</p>
<p class="text-sm font-bold text-gray-600 mt-2">Negociable selon votre profil, contactez-nous.</p>
<p class="mt-4 text-xs text-gray-500 font-bold">+ frais Stripe (1.5% + 0.25&euro; par transaction, non negociables)</p>
</div>
<div style="flex:1;min-width:250px;border:4px solid #111827;padding:1.5rem;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<p style="font-size:10px;letter-spacing:0.1em;" class="font-black uppercase text-gray-500">Billets gratuits</p>
<p class="text-4xl font-black" style="margin:0.5rem 0;">0&euro;</p>
<div class="card-brutal flex-1 min-w-[250px]">
<p class="text-[10px] tracking-widest font-black uppercase text-gray-500">Billets gratuits</p>
<p class="text-4xl font-black my-2">0&euro;</p>
<p class="text-sm font-bold text-gray-600">aucune commission sur les billets gratuits</p>
</div>
</div>
<h2 class="text-2xl font-black uppercase" style="margin-bottom:1.5rem;">Abonnements organisateur</h2>
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:3rem;">
<h2 class="text-2xl font-black uppercase mb-6">Abonnements organisateur</h2>
<div class="flex flex-wrap gap-6 mb-12">
<div style="flex:1;min-width:250px;border:4px solid #111827;padding:1.5rem;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<div style="background:#fabf04;border:2px solid #111827;display:inline-block;padding:0.25rem 0.75rem;margin-bottom:1rem;">
<p style="font-size:10px;letter-spacing:0.1em;" class="font-black uppercase">Gratuit</p>
<div class="card-brutal flex-1 min-w-[250px]">
<div class="inline-block mb-4 px-3 py-1 border-2 border-gray-900 bg-[#fabf04]">
<p class="text-[10px] tracking-widest font-black uppercase">Gratuit</p>
</div>
<p class="text-4xl font-black" style="margin:0.5rem 0;">0&euro;<span class="text-sm font-bold text-gray-500">/mois</span></p>
<p class="text-sm font-bold text-gray-600" style="margin-bottom:0.5rem;">Sur demande, apres approbation par la plateforme</p>
<ul style="list-style:none;padding:0;margin-top:1rem;" class="text-sm font-bold">
<li style="padding:0.25rem 0;">&#10003; 5 evenements simultanement</li>
<li style="padding:0.25rem 0;">&#10003; Billets illimites</li>
<li style="padding:0.25rem 0;">&#10003; QR Code securise</li>
<li style="padding:0.25rem 0;">&#10003; Paiement Stripe</li>
<li style="padding:0.25rem 0;">&#10003; Email de confirmation</li>
<p class="text-4xl font-black my-2">0&euro;<span class="text-sm font-bold text-gray-500">/mois</span></p>
<p class="text-sm font-bold text-gray-600 mb-2">Sur demande, apres approbation par la plateforme</p>
<ul class="list-none p-0 mt-4 text-sm font-bold">
<li class="py-1">&#10003; 5 evenements simultanement</li>
<li class="py-1">&#10003; Billets illimites</li>
<li class="py-1">&#10003; QR Code securise</li>
<li class="py-1">&#10003; Paiement Stripe</li>
<li class="py-1">&#10003; Email de confirmation</li>
</ul>
<a href="mailto:contact@e-cosplay.fr" style="display:inline-block;margin-top:1rem;padding:0.5rem 1rem;border:2px solid #111827;" class="bg-gray-900 text-white font-black uppercase text-xs hover:bg-indigo-600 transition-colors">Faire une demande</a>
<a href="mailto:contact@e-cosplay.fr" class="inline-block mt-4 px-4 py-2 border-2 border-gray-900 bg-gray-900 text-white font-black uppercase text-xs hover:bg-indigo-600 transition-colors">Faire une demande</a>
</div>
<div style="flex:1;min-width:250px;border:4px solid #111827;padding:1.5rem;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<div style="background:#4f46e5;color:white;border:2px solid #111827;display:inline-block;padding:0.25rem 0.75rem;margin-bottom:1rem;">
<p style="font-size:10px;letter-spacing:0.1em;" class="font-black uppercase">Basique</p>
<div class="card-brutal flex-1 min-w-[250px]">
<div class="inline-block mb-4 px-3 py-1 border-2 border-gray-900 bg-indigo-600 text-white">
<p class="text-[10px] tracking-widest font-black uppercase">Basique</p>
</div>
<p class="text-4xl font-black" style="margin:0.5rem 0;">10&euro;<span class="text-sm font-bold text-gray-500">/mois</span></p>
<ul style="list-style:none;padding:0;margin-top:1rem;" class="text-sm font-bold">
<li style="padding:0.25rem 0;">&#10003; Evenements illimites</li>
<li style="padding:0.25rem 0;">&#10003; Billets illimites</li>
<li style="padding:0.25rem 0;">&#10003; Commission reduite a 1.5%</li>
<li style="padding:0.25rem 0;">&#10003; Page organisateur personnalisee</li>
<p class="text-4xl font-black my-2">10&euro;<span class="text-sm font-bold text-gray-500">/mois</span></p>
<ul class="list-none p-0 mt-4 text-sm font-bold">
<li class="py-1">&#10003; Evenements illimites</li>
<li class="py-1">&#10003; Billets illimites</li>
<li class="py-1">&#10003; Commission reduite a 1.5%</li>
<li class="py-1">&#10003; Page organisateur personnalisee</li>
</ul>
</div>
<div style="flex:1;min-width:250px;border:4px solid #111827;padding:1.5rem;box-shadow:6px 6px 0 rgba(0,0,0,1);background:#111827;color:white;">
<div style="background:#ec4899;color:white;border:2px solid white;display:inline-block;padding:0.25rem 0.75rem;margin-bottom:1rem;">
<p style="font-size:10px;letter-spacing:0.1em;" class="font-black uppercase">Sur-mesure</p>
<div class="card-brutal flex-1 min-w-[250px] !bg-gray-900 text-white">
<div class="inline-block mb-4 px-3 py-1 border-2 border-white bg-pink-500 text-white">
<p class="text-[10px] tracking-widest font-black uppercase">Sur-mesure</p>
</div>
<p class="text-4xl font-black" style="margin:0.5rem 0;">Sur devis</p>
<p class="text-sm font-bold" style="opacity:0.8;">Tarif personnalise selon vos besoins</p>
<ul style="list-style:none;padding:0;margin-top:1rem;" class="text-sm font-bold">
<li style="padding:0.25rem 0;">&#10003; Evenements illimites</li>
<li style="padding:0.25rem 0;">&#10003; Billets illimites</li>
<li style="padding:0.25rem 0;">&#10003; Commission a partir de 0.5%</li>
<li style="padding:0.25rem 0;">&#10003; Page organisateur personnalisee</li>
<li style="padding:0.25rem 0;">&#10003; Reservation de tables</li>
<li style="padding:0.25rem 0;">&#10003; Gestion de brocantes</li>
<li style="padding:0.25rem 0;">&#10003; Billets personnalisables</li>
<li style="padding:0.25rem 0;">&#10003; Accompagnement dedie</li>
<p class="text-4xl font-black my-2">Sur devis</p>
<p class="text-sm font-bold opacity-80">Tarif personnalise selon vos besoins</p>
<ul class="list-none p-0 mt-4 text-sm font-bold">
<li class="py-1">&#10003; Evenements illimites</li>
<li class="py-1">&#10003; Billets illimites</li>
<li class="py-1">&#10003; Commission a partir de 0.5%</li>
<li class="py-1">&#10003; Page organisateur personnalisee</li>
<li class="py-1">&#10003; Reservation de tables</li>
<li class="py-1">&#10003; Gestion de brocantes</li>
<li class="py-1">&#10003; Billets personnalisables</li>
<li class="py-1">&#10003; Accompagnement dedie</li>
</ul>
<a href="mailto:contact@e-cosplay.fr" style="display:inline-block;margin-top:1rem;padding:0.5rem 1rem;border:2px solid white;" class="bg-white text-gray-900 font-black uppercase text-xs hover:bg-yellow-400 transition-colors">Nous contacter</a>
<a href="mailto:contact@e-cosplay.fr" class="inline-block mt-4 px-4 py-2 border-2 border-white bg-white text-gray-900 font-black uppercase text-xs hover:bg-yellow-400 transition-colors">Nous contacter</a>
</div>
</div>
<div style="border:4px solid #111827;padding:1.5rem;background:#f9fafb;box-shadow:6px 6px 0 rgba(0,0,0,1);">
<h3 class="text-lg font-black uppercase" style="margin-bottom:0.5rem;">Inclus dans toutes les formules</h3>
<ul style="list-style:disc;padding-left:1.5rem;" class="text-sm font-bold text-gray-700">
<div class="card-brutal-info">
<h3 class="text-lg font-black uppercase mb-2">Inclus dans toutes les formules</h3>
<ul class="list-disc pl-6 text-sm font-bold text-gray-700">
<li>Paiement securise via Stripe</li>
<li>Billets electroniques avec QR Code</li>
<li>Emails signes S/MIME</li>
@@ -142,6 +142,6 @@
</ul>
</div>
<p class="text-sm opacity-70 italic" style="margin-top:2rem;">Les tarifs sont exprimes en euros HT. Contact : <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a></p>
<p class="text-sm opacity-70 italic mt-8">Les tarifs sont exprimes en euros HT. Contact : <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a></p>
</div>
{% endblock %}

View File

@@ -4,58 +4,58 @@
{% block description %}Conditions Generales d'Utilisation de la plateforme E-Ticket{% endblock %}
{% block body %}
<div style="max-width:50rem;margin:0 auto;padding:3rem 1rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:2rem;">Conditions Generales d'Utilisation</h1>
<div class="page-container">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page mb-8">Conditions Generales d'Utilisation</h1>
<div style="display:flex;gap:0.5rem;margin-bottom:2rem;">
<button id="btn-acheteur" data-tab="tab-acheteur" style="padding:0.75rem 1.5rem;font-weight:900;text-transform:uppercase;font-size:0.75rem;letter-spacing:0.1em;border:2px solid #111827;background:#111827;color:white;cursor:pointer;">Acheteur</button>
<button id="btn-organisateur" data-tab="tab-organisateur" style="padding:0.75rem 1.5rem;font-weight:900;text-transform:uppercase;font-size:0.75rem;letter-spacing:0.1em;border:2px solid #111827;background:white;color:#111827;cursor:pointer;">Organisateur</button>
<div class="flex gap-2 mb-8">
<button id="btn-acheteur" data-tab="tab-acheteur" class="section-header font-black uppercase text-xs tracking-widest border-2 border-gray-900 text-white cursor-pointer">Acheteur</button>
<button id="btn-organisateur" data-tab="tab-organisateur" class="py-3 px-6 font-black uppercase text-xs tracking-widest border-2 border-gray-900 bg-white text-gray-900 cursor-pointer">Organisateur</button>
</div>
<div id="tab-acheteur" style="display:block;">
<div style="display:flex;flex-direction:column;gap:2rem;">
<div id="tab-acheteur" class="block">
<div class="flex flex-col gap-8">
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">1. Objet</h2>
<h2 class="text-xl font-black uppercase mb-2">1. Objet</h2>
<p>Les presentes Conditions Generales d'Utilisation (CGU) regissent l'utilisation de la plateforme E-Ticket (ticket.e-cosplay.fr) par les acheteurs de billets. En achetant un billet, vous acceptez sans reserve les presentes CGU.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">2. Inscription</h2>
<h2 class="text-xl font-black uppercase mb-2">2. Inscription</h2>
<p>L'achat de billets necessite la creation d'un compte utilisateur. Vous vous engagez a fournir des informations exactes et a jour. Vous etes responsable de la confidentialite de vos identifiants de connexion.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">3. Achat de billets</h2>
<h2 class="text-xl font-black uppercase mb-2">3. Achat de billets</h2>
<p>L'achat d'un billet constitue un contrat directement entre <strong>l'acheteur et l'organisateur de l'evenement</strong>. La Plateforme E-Ticket agit uniquement en tant qu'intermediaire technique facilitant la mise en relation et le paiement.</p>
<p style="margin-top:0.5rem;">Le prix des billets est fixe par l'organisateur. Une commission de service peut etre appliquee par la Plateforme, dont le montant est indique avant la validation du paiement.</p>
<p class="mt-2">Le prix des billets est fixe par l'organisateur. Une commission de service peut etre appliquee par la Plateforme, dont le montant est indique avant la validation du paiement.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">4. Paiement</h2>
<h2 class="text-xl font-black uppercase mb-2">4. Paiement</h2>
<p>Les paiements sont securises par Stripe. La Plateforme ne stocke aucune donnee bancaire. Le paiement est debite immediatement a la validation de la commande.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">5. Billets et QR Code</h2>
<h2 class="text-xl font-black uppercase mb-2">5. Billets et QR Code</h2>
<p>Apres validation du paiement, un billet electronique comportant un QR Code unique est envoye par email. Ce billet est personnel et ne peut etre revendu. Toute duplication ou falsification est interdite et pourra donner lieu a des poursuites.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">6. Annulation et remboursement</h2>
<h2 class="text-xl font-black uppercase mb-2">6. Annulation et remboursement</h2>
<p><strong>L'organisateur est seul responsable</strong> de la politique d'annulation et de remboursement de ses evenements. En cas d'annulation d'un evenement :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>L'acheteur doit contacter directement l'organisateur pour toute demande de remboursement</li>
<li>La Plateforme E-Ticket n'est pas responsable des remboursements</li>
<li>La commission de service de la Plateforme n'est pas remboursable</li>
</ul>
<p style="margin-top:0.5rem;">Conformement a l'article L221-28 du Code de la consommation, le droit de retractation ne s'applique pas aux prestations de services de loisirs devant etre fournis a une date determinee.</p>
<p class="mt-2">Conformement a l'article L221-28 du Code de la consommation, le droit de retractation ne s'applique pas aux prestations de services de loisirs devant etre fournis a une date determinee.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">7. Responsabilite de la Plateforme</h2>
<h2 class="text-xl font-black uppercase mb-2">7. Responsabilite de la Plateforme</h2>
<p>La Plateforme E-Ticket decline toute responsabilite concernant :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>L'organisation, le deroulement ou l'annulation des evenements</li>
<li>La qualite ou la securite des evenements</li>
<li>Les litiges entre acheteurs et organisateurs</li>
@@ -64,14 +64,14 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">8. Donnees personnelles</h2>
<h2 class="text-xl font-black uppercase mb-2">8. Donnees personnelles</h2>
<p>Vos donnees sont traitees conformement a notre <a href="{{ path('app_rgpd') }}" class="text-indigo-600 hover:underline">Politique de confidentialite</a>. Vos donnees (nom, email) sont transmises a l'organisateur de l'evenement pour la gestion de votre billet.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">9. Comportement</h2>
<h2 class="text-xl font-black uppercase mb-2">9. Comportement</h2>
<p>L'acheteur s'engage a :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Ne pas utiliser la Plateforme a des fins frauduleuses</li>
<li>Ne pas revendre les billets achetes</li>
<li>Ne pas perturber le fonctionnement de la Plateforme</li>
@@ -80,29 +80,29 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">10. Droit applicable</h2>
<h2 class="text-xl font-black uppercase mb-2">10. Droit applicable</h2>
<p>Les presentes CGU sont soumises au droit francais. Tout litige sera soumis aux tribunaux competents de Laon.</p>
</section>
</div>
</div>
<div id="tab-organisateur" style="display:none;">
<div style="display:flex;flex-direction:column;gap:2rem;">
<div id="tab-organisateur" class="hidden">
<div class="flex flex-col gap-8">
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">1. Objet</h2>
<h2 class="text-xl font-black uppercase mb-2">1. Objet</h2>
<p>Les presentes CGU regissent l'utilisation de la plateforme E-Ticket par les organisateurs d'evenements. En publiant un evenement, vous acceptez sans reserve les presentes CGU.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">2. Inscription organisateur</h2>
<h2 class="text-xl font-black uppercase mb-2">2. Inscription organisateur</h2>
<p>Pour publier un evenement, l'organisateur doit creer un compte et fournir des informations exactes sur son identite (association, entreprise ou particulier). La Plateforme se reserve le droit de verifier ces informations et de refuser ou suspendre un compte en cas d'informations inexactes.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">3. Publication d'evenements</h2>
<h2 class="text-xl font-black uppercase mb-2">3. Publication d'evenements</h2>
<p>L'organisateur est seul responsable du contenu publie sur la Plateforme (descriptions, images, tarifs, dates, conditions). Il garantit que :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Les informations publiees sont exactes et a jour</li>
<li>Il dispose de tous les droits necessaires sur les contenus publies (images, textes, logos)</li>
<li>L'evenement respecte la legislation en vigueur</li>
@@ -111,32 +111,32 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">4. Tarification et paiement</h2>
<h2 class="text-xl font-black uppercase mb-2">4. Tarification et paiement</h2>
<p>L'organisateur fixe librement le prix de ses billets. La Plateforme preleve une commission de service sur chaque vente, dont le taux est communique a l'organisateur avant la mise en vente.</p>
<p style="margin-top:0.5rem;">Les fonds collectes sont reverses a l'organisateur via Stripe Connect selon les modalites suivantes :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<p class="mt-2">Les fonds collectes sont reverses a l'organisateur via Stripe Connect selon les modalites suivantes :</p>
<ul class="list-disc pl-6 mt-2">
<li>Reversement apres l'evenement ou selon le calendrier defini avec l'organisateur</li>
<li>Deduction de la commission de la Plateforme et des frais Stripe</li>
</ul>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">5. Responsabilite de l'organisateur</h2>
<h2 class="text-xl font-black uppercase mb-2">5. Responsabilite de l'organisateur</h2>
<p><strong>L'organisateur est entierement responsable de :</strong></p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>L'organisation, le deroulement et la securite de son evenement</li>
<li>Le respect de la reglementation applicable (ERP, securite, assurances, SACEM, etc.)</li>
<li>La gestion des reclamations et remboursements envers les acheteurs</li>
<li>La conformite des informations publiees</li>
<li>La declaration fiscale des revenus generes par la vente de billets</li>
</ul>
<p style="margin-top:0.5rem;">L'organisateur s'engage a <strong>indemniser la Plateforme</strong> de tout prejudice, reclamation ou action resultant du non-respect de ses obligations.</p>
<p class="mt-2">L'organisateur s'engage a <strong>indemniser la Plateforme</strong> de tout prejudice, reclamation ou action resultant du non-respect de ses obligations.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">6. Annulation d'evenement</h2>
<h2 class="text-xl font-black uppercase mb-2">6. Annulation d'evenement</h2>
<p>En cas d'annulation d'un evenement, l'organisateur s'engage a :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Informer immediatement la Plateforme et les acheteurs</li>
<li>Proceder au remboursement integral des acheteurs dans un delai de 30 jours</li>
<li>La commission de la Plateforme reste due sauf accord contraire</li>
@@ -144,9 +144,9 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">7. Donnees des acheteurs</h2>
<h2 class="text-xl font-black uppercase mb-2">7. Donnees des acheteurs</h2>
<p>L'organisateur recoit les donnees des acheteurs (nom, email) strictement pour la gestion de son evenement. Il s'engage a :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Ne pas utiliser ces donnees a d'autres fins (prospection, revente, etc.)</li>
<li>Respecter le RGPD dans le traitement de ces donnees</li>
<li>Supprimer les donnees dans un delai raisonnable apres l'evenement</li>
@@ -154,9 +154,9 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">8. Moderation</h2>
<h2 class="text-xl font-black uppercase mb-2">8. Moderation</h2>
<p>La Plateforme se reserve le droit de :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Refuser, suspendre ou supprimer un evenement sans preavis en cas de non-respect des CGU</li>
<li>Suspendre ou supprimer le compte d'un organisateur en cas de fraude, abus ou plaintes repetees</li>
<li>Retenir les fonds en cas de litige ou de suspicion de fraude</li>
@@ -164,17 +164,17 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">9. Responsabilite de la Plateforme</h2>
<h2 class="text-xl font-black uppercase mb-2">9. Responsabilite de la Plateforme</h2>
<p>La Plateforme agit en tant qu'intermediaire technique et decline toute responsabilite concernant les evenements publies par les organisateurs. La Plateforme ne garantit pas le succes commercial d'un evenement.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">10. Droit applicable</h2>
<h2 class="text-xl font-black uppercase mb-2">10. Droit applicable</h2>
<p>Les presentes CGU sont soumises au droit francais. Tout litige sera soumis aux tribunaux competents de Laon.</p>
</section>
</div>
</div>
<p class="text-sm opacity-70 italic" style="margin-top:2rem;">Derniere mise a jour : {{ "now"|date("d/m/Y") }}</p>
<p class="text-sm opacity-70 italic mt-8">Derniere mise a jour : {{ "now"|date("d/m/Y") }}</p>
</div>
{% endblock %}

View File

@@ -4,20 +4,20 @@
{% block description %}Conditions Generales de Vente de la plateforme E-Ticket{% endblock %}
{% block body %}
<div style="max-width:50rem;margin:0 auto;padding:3rem 1rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:2rem;">Conditions Generales de Vente</h1>
<div class="page-container">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page mb-8">Conditions Generales de Vente</h1>
<div style="display:flex;flex-direction:column;gap:2rem;">
<div class="flex flex-col gap-8">
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">1. Objet</h2>
<h2 class="text-xl font-black uppercase mb-2">1. Objet</h2>
<p>Les presentes Conditions Generales de Vente (CGV) regissent les transactions effectuees sur la plateforme E-Ticket (ticket.e-cosplay.fr), editee par l'association E-Cosplay (SIREN 943121517). Elles s'appliquent a toute vente de billets realisee via la Plateforme.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">2. Role de la Plateforme</h2>
<h2 class="text-xl font-black uppercase mb-2">2. Role de la Plateforme</h2>
<p>La Plateforme E-Ticket agit en qualite d'<strong>intermediaire technique</strong> entre les organisateurs d'evenements et les acheteurs de billets. La Plateforme :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Met a disposition un outil de creation et de vente de billets</li>
<li>Assure le traitement securise des paiements via Stripe</li>
<li>Genere et envoie les billets electroniques (QR Code)</li>
@@ -26,11 +26,11 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">3. Prix et commission</h2>
<h2 class="text-xl font-black uppercase mb-2">3. Prix et commission</h2>
<p>Les prix des billets sont fixes librement par chaque organisateur et affiches en euros (EUR) toutes taxes comprises.</p>
<p style="margin-top:0.5rem;">Une <strong>commission de service</strong> est appliquee par la Plateforme sur chaque transaction. Le montant de cette commission est clairement indique a l'acheteur avant la validation du paiement et a l'organisateur lors de la creation de l'evenement.</p>
<p style="margin-top:0.5rem;">La commission comprend :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<p class="mt-2">Une <strong>commission de service</strong> est appliquee par la Plateforme sur chaque transaction. Le montant de cette commission est clairement indique a l'acheteur avant la validation du paiement et a l'organisateur lors de la creation de l'evenement.</p>
<p class="mt-2">La commission comprend :</p>
<ul class="list-disc pl-6 mt-2">
<li>Les frais de fonctionnement de la Plateforme</li>
<li>Les frais de traitement du paiement (Stripe)</li>
<li>La generation et l'envoi du billet electronique</li>
@@ -38,8 +38,8 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">4. Processus d'achat</h2>
<ul style="list-style:disc;padding-left:1.5rem;">
<h2 class="text-xl font-black uppercase mb-2">4. Processus d'achat</h2>
<ul class="list-disc pl-6">
<li>L'acheteur selectionne un evenement et le nombre de billets souhaites</li>
<li>Le recapitulatif de la commande (prix, commission, total) est affiche avant validation</li>
<li>Le paiement est effectue en ligne via Stripe (carte bancaire)</li>
@@ -49,39 +49,39 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">5. Billets electroniques</h2>
<h2 class="text-xl font-black uppercase mb-2">5. Billets electroniques</h2>
<p>Chaque billet est unique et comporte un QR Code securise. Le billet est :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Personnel et nominatif</li>
<li>Non cessible et non revendable</li>
<li>Valable uniquement pour l'evenement et la date indiques</li>
<li>Signe electroniquement (S/MIME) pour garantir son authenticite</li>
</ul>
<p style="margin-top:0.5rem;">Toute falsification, duplication ou revente de billets est interdite et passible de poursuites judiciaires.</p>
<p class="mt-2">Toute falsification, duplication ou revente de billets est interdite et passible de poursuites judiciaires.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">6. Annulation, remboursement et droit de retractation</h2>
<h2 class="text-xl font-black uppercase mb-2">6. Annulation, remboursement et droit de retractation</h2>
<p>Conformement a l'article L221-28 12&deg; du Code de la consommation, <strong>le droit de retractation ne s'applique pas</strong> aux prestations de services de loisirs devant etre fournies a une date determinee.</p>
<p style="margin-top:0.75rem;"><strong>En cas d'annulation par l'organisateur :</strong></p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.25rem;">
<p class="mt-3"><strong>En cas d'annulation par l'organisateur :</strong></p>
<ul class="list-disc pl-6 mt-1">
<li>L'organisateur est seul responsable du remboursement des acheteurs</li>
<li>Le remboursement doit intervenir dans un delai de 30 jours suivant l'annulation</li>
<li>La commission de la Plateforme n'est pas remboursable, sauf accord contraire</li>
</ul>
<p style="margin-top:0.75rem;"><strong>En cas de modification par l'organisateur</strong> (changement de date, lieu, programme) :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.25rem;">
<p class="mt-3"><strong>En cas de modification par l'organisateur</strong> (changement de date, lieu, programme) :</p>
<ul class="list-disc pl-6 mt-1">
<li>L'organisateur doit informer les acheteurs dans les meilleurs delais</li>
<li>L'acheteur peut demander un remboursement a l'organisateur si la modification est substantielle</li>
</ul>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">7. Reversement aux organisateurs</h2>
<h2 class="text-xl font-black uppercase mb-2">7. Reversement aux organisateurs</h2>
<p>Les fonds collectes sont reverses aux organisateurs via Stripe Connect :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Apres la tenue de l'evenement, ou selon le calendrier convenu</li>
<li>Apres deduction de la commission de la Plateforme et des frais Stripe</li>
<li>La Plateforme se reserve le droit de retenir les fonds en cas de litige, fraude ou reclamation</li>
@@ -89,45 +89,45 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">8. CGV specifiques des organisateurs</h2>
<h2 class="text-xl font-black uppercase mb-2">8. CGV specifiques des organisateurs</h2>
<p>Chaque organisateur peut definir ses propres conditions de vente specifiques a ses evenements (politique de remboursement, conditions d'acces, reglement interieur, etc.).</p>
<p style="margin-top:0.5rem;"><strong>Les conditions specifiques de l'organisateur ne doivent en aucun cas etre en conflit avec les presentes CGV de la Plateforme.</strong> En cas de contradiction, les presentes CGV prevalent.</p>
<p style="margin-top:0.5rem;">Les conditions specifiques de l'organisateur sont affichees sur la page de l'evenement et doivent etre acceptees par l'acheteur avant l'achat. L'organisateur est seul responsable du contenu et de la legalite de ses conditions specifiques.</p>
<p class="mt-2"><strong>Les conditions specifiques de l'organisateur ne doivent en aucun cas etre en conflit avec les presentes CGV de la Plateforme.</strong> En cas de contradiction, les presentes CGV prevalent.</p>
<p class="mt-2">Les conditions specifiques de l'organisateur sont affichees sur la page de l'evenement et doivent etre acceptees par l'acheteur avant l'achat. L'organisateur est seul responsable du contenu et de la legalite de ses conditions specifiques.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">9. Responsabilite</h2>
<h2 class="text-xl font-black uppercase mb-2">9. Responsabilite</h2>
<p>La Plateforme E-Ticket, en tant qu'intermediaire technique :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li><strong>N'est pas responsable</strong> de l'organisation, du deroulement ou de l'annulation des evenements</li>
<li><strong>N'est pas responsable</strong> des litiges entre organisateurs et acheteurs</li>
<li><strong>N'est pas responsable</strong> des dommages directs ou indirects lies a un evenement</li>
<li>S'engage a assurer la disponibilite et la securite de la Plateforme dans la mesure du possible</li>
</ul>
<p style="margin-top:0.5rem;">L'organisateur est seul responsable de ses evenements et de ses obligations envers les acheteurs.</p>
<p class="mt-2">L'organisateur est seul responsable de ses evenements et de ses obligations envers les acheteurs.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">10. Propriete intellectuelle</h2>
<h2 class="text-xl font-black uppercase mb-2">10. Propriete intellectuelle</h2>
<p>L'ensemble des elements de la Plateforme (code, design, logo, textes) est la propriete exclusive de l'association E-Cosplay. Les contenus publies par les organisateurs restent leur propriete.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">11. Donnees personnelles</h2>
<h2 class="text-xl font-black uppercase mb-2">11. Donnees personnelles</h2>
<p>Les donnees personnelles collectees dans le cadre des ventes sont traitees conformement a notre <a href="{{ path('app_rgpd') }}" class="text-indigo-600 hover:underline">Politique de confidentialite</a> et au RGPD.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">12. Mediation</h2>
<h2 class="text-xl font-black uppercase mb-2">12. Mediation</h2>
<p>En cas de litige, l'acheteur peut recourir gratuitement au service de mediation suivant :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Plateforme de reglement en ligne des litiges de la Commission Europeenne : ec.europa.eu/consumers/odr</li>
</ul>
<p style="margin-top:0.5rem;">Avant toute mediation, l'acheteur est invite a contacter la Plateforme a l'adresse <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a>.</p>
<p class="mt-2">Avant toute mediation, l'acheteur est invite a contacter la Plateforme a l'adresse <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a>.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">13. Droit applicable</h2>
<h2 class="text-xl font-black uppercase mb-2">13. Droit applicable</h2>
<p>Les presentes CGV sont soumises au droit francais. Tout litige sera soumis aux tribunaux competents de Laon.</p>
</section>

View File

@@ -4,33 +4,33 @@
{% block description %}Conformite technique, securite des paiements et qualite du code de la plateforme E-Ticket{% endblock %}
{% block body %}
<div style="max-width:50rem;margin:0 auto;padding:3rem 1rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:0.5rem;">Conformite Technique</h1>
<p class="font-bold text-gray-600 italic" style="margin-bottom:2rem;">Transparence sur nos pratiques de securite, paiement et qualite logicielle.</p>
<div class="page-container">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page mb-2">Conformite Technique</h1>
<p class="font-bold text-gray-600 italic mb-8">Transparence sur nos pratiques de securite, paiement et qualite logicielle.</p>
<div style="display:flex;flex-direction:column;gap:2rem;">
<div class="flex flex-col gap-8">
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">1. Securite des paiements</h2>
<div style="border:4px solid #111827;padding:1.5rem;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<p style="margin-bottom:1rem;">E-Ticket utilise <strong>Stripe</strong> comme prestataire de paiement. Stripe est certifie <strong>PCI DSS niveau 1</strong>, le plus haut niveau de certification de l'industrie des paiements.</p>
<ul style="list-style:disc;padding-left:1.5rem;" class="text-sm font-bold text-gray-700">
<h2 class="text-xl font-black uppercase mb-2">1. Securite des paiements</h2>
<div class="card-brutal">
<p class="mb-4">E-Ticket utilise <strong>Stripe</strong> comme prestataire de paiement. Stripe est certifie <strong>PCI DSS niveau 1</strong>, le plus haut niveau de certification de l'industrie des paiements.</p>
<ul class="list-disc pl-6 text-sm font-bold text-gray-700">
<li><strong>PSD2 / SCA</strong> : Authentification forte du client (Strong Customer Authentication) via 3D Secure 2 pour toutes les transactions europeennes</li>
<li><strong>3D Secure</strong> : Verification supplementaire aupres de la banque emettrice pour reduire la fraude</li>
<li><strong>Tokenisation</strong> : Aucune donnee de carte bancaire ne transite ou n'est stockee sur nos serveurs</li>
<li><strong>HTTPS</strong> : Toutes les communications sont chiffrees via TLS 1.3</li>
<li><strong>Cloudflare</strong> : Protection DDoS et WAF (Web Application Firewall)</li>
</ul>
<p class="text-xs text-gray-500 italic" style="margin-top:1rem;">E-Ticket ne collecte, ne stocke et ne traite aucune donnee de carte bancaire. Stripe gere l'integralite du flux de paiement.</p>
<p class="text-xs text-gray-500 italic mt-4">E-Ticket ne collecte, ne stocke et ne traite aucune donnee de carte bancaire. Stripe gere l'integralite du flux de paiement.</p>
</div>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">2. Qualite du code source</h2>
<div style="border:4px solid #111827;padding:1.5rem;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<p style="margin-bottom:1rem;">Le code source est analyse en continu par <strong>SonarQube</strong>, un outil d'analyse statique qui detecte les bugs, vulnerabilites et mauvaises pratiques.</p>
<h2 class="text-xl font-black uppercase mb-2">2. Qualite du code source</h2>
<div class="card-brutal">
<p class="mb-4">Le code source est analyse en continu par <strong>SonarQube</strong>, un outil d'analyse statique qui detecte les bugs, vulnerabilites et mauvaises pratiques.</p>
<div style="display:flex;flex-wrap:wrap;gap:0.5rem;margin-bottom:1rem;">
<div class="flex flex-wrap gap-2 mb-4">
<img src="{{ path('app_sonar_badge', {metric: 'alert_status'}) }}" alt="Quality Gate">
<img src="{{ path('app_sonar_badge', {metric: 'security_rating'}) }}" alt="Security Rating">
<img src="{{ path('app_sonar_badge', {metric: 'reliability_rating'}) }}" alt="Reliability Rating">
@@ -41,7 +41,7 @@
<img src="{{ path('app_sonar_badge', {metric: 'code_smells'}) }}" alt="Code Smells">
</div>
<ul style="list-style:disc;padding-left:1.5rem;" class="text-sm font-bold text-gray-700">
<ul class="list-disc pl-6 text-sm font-bold text-gray-700">
<li><strong>PHPStan</strong> : Analyse statique PHP niveau 6</li>
<li><strong>PHP CS Fixer</strong> : Respect des standards de codage</li>
<li><strong>ESLint / Stylelint</strong> : Analyse du code JavaScript et SCSS</li>
@@ -52,23 +52,23 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">3. Integration et deploiement continus</h2>
<div style="border:4px solid #111827;padding:1.5rem;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<p style="margin-bottom:1rem;">Chaque modification du code passe par un pipeline d'integration continue automatise avant d'etre deploye en production.</p>
<ul style="list-style:disc;padding-left:1.5rem;" class="text-sm font-bold text-gray-700">
<h2 class="text-xl font-black uppercase mb-2">3. Integration et deploiement continus</h2>
<div class="card-brutal">
<p class="mb-4">Chaque modification du code passe par un pipeline d'integration continue automatise avant d'etre deploye en production.</p>
<ul class="list-disc pl-6 text-sm font-bold text-gray-700">
<li><strong>Gitea</strong> : Plateforme Git auto-hebergee pour le controle de version</li>
<li><strong>CI/CD</strong> : Tests automatiques, analyse de code et deploiement via Gitea Actions</li>
<li><strong>SonarQube</strong> : Analyse de qualite auto-hebergee apres chaque push</li>
<li><strong>Deploiement automatise</strong> : Deploiement en production uniquement si tous les controles passent</li>
</ul>
<p class="text-xs text-gray-500 italic" style="margin-top:1rem;">L'infrastructure CI/CD est entierement auto-hebergee et administree par l'association E-Cosplay.</p>
<p class="text-xs text-gray-500 italic mt-4">L'infrastructure CI/CD est entierement auto-hebergee et administree par l'association E-Cosplay.</p>
</div>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">4. Securite des communications</h2>
<div style="border:4px solid #111827;padding:1.5rem;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<ul style="list-style:disc;padding-left:1.5rem;" class="text-sm font-bold text-gray-700">
<h2 class="text-xl font-black uppercase mb-2">4. Securite des communications</h2>
<div class="card-brutal">
<ul class="list-disc pl-6 text-sm font-bold text-gray-700">
<li><strong>S/MIME</strong> : Tous les emails envoyes par la plateforme sont signes numeriquement</li>
<li><strong>CSP</strong> : Politique de securite du contenu stricte pour prevenir les injections XSS</li>
<li><strong>HSTS</strong> : Force les connexions HTTPS</li>
@@ -79,9 +79,9 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">5. Donnees et conformite</h2>
<div style="border:4px solid #111827;padding:1.5rem;box-shadow:6px 6px 0 rgba(0,0,0,1);background:white;">
<ul style="list-style:disc;padding-left:1.5rem;" class="text-sm font-bold text-gray-700">
<h2 class="text-xl font-black uppercase mb-2">5. Donnees et conformite</h2>
<div class="card-brutal">
<ul class="list-disc pl-6 text-sm font-bold text-gray-700">
<li><strong>RGPD</strong> : Conforme au reglement general sur la protection des donnees (<a href="{{ path('app_rgpd') }}" class="text-indigo-600 hover:underline">voir notre politique RGPD</a>)</li>
<li><strong>Hebergement</strong> : Infrastructure hebergee en France (<a href="{{ path('app_hosting') }}" class="text-indigo-600 hover:underline">voir notre hebergeur</a>)</li>
<li><strong>Chiffrement</strong> : Donnees sensibles chiffrees au repos et en transit</li>
@@ -91,6 +91,6 @@
</div>
<p class="text-sm opacity-70 italic" style="margin-top:2rem;">Derniere mise a jour : {{ "now"|date("d/m/Y") }}. Contact : <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a></p>
<p class="text-sm opacity-70 italic mt-8">Derniere mise a jour : {{ "now"|date("d/m/Y") }}. Contact : <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a></p>
</div>
{% endblock %}

View File

@@ -4,20 +4,20 @@
{% block description %}Politique de cookies de la plateforme E-Ticket{% endblock %}
{% block body %}
<div style="max-width:50rem;margin:0 auto;padding:3rem 1rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:2rem;">Politique de Cookies</h1>
<div class="page-container">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page mb-8">Politique de Cookies</h1>
<div style="display:flex;flex-direction:column;gap:2rem;">
<div class="flex flex-col gap-8">
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">1. Qu'est-ce qu'un cookie ?</h2>
<h2 class="text-xl font-black uppercase mb-2">1. Qu'est-ce qu'un cookie ?</h2>
<p>Un cookie est un petit fichier texte depose sur votre terminal (ordinateur, tablette, smartphone) lors de la visite d'un site web. Il permet au site de memoriser des informations relatives a votre navigation (preferences, session, etc.).</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">2. Cookies utilises sur la Plateforme</h2>
<h2 class="text-xl font-black uppercase mb-2">2. Cookies utilises sur la Plateforme</h2>
<p>La plateforme E-Ticket utilise exclusivement des <strong>cookies strictement necessaires</strong> au fonctionnement du site :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li><strong>Cookie de session</strong> : permet de maintenir votre connexion et votre navigation sur la Plateforme. Il est supprime a la fermeture du navigateur.</li>
<li><strong>Cookie de securite (CSRF)</strong> : protege contre les attaques de type Cross-Site Request Forgery lors de la soumission de formulaires.</li>
<li><strong>Cookie de preference</strong> : memorise vos choix (langue, theme) pour ameliorer votre experience utilisateur.</li>
@@ -25,18 +25,18 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">3. Cookies tiers</h2>
<h2 class="text-xl font-black uppercase mb-2">3. Cookies tiers</h2>
<p>La Plateforme peut integrer des services tiers qui deposent leurs propres cookies :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li><strong>Stripe</strong> : pour le traitement securise des paiements. Ces cookies sont necessaires au fonctionnement du module de paiement.</li>
<li><strong>Cloudflare</strong> : pour la securite et la performance du site (protection DDoS, CDN). Ces cookies sont strictement techniques.</li>
</ul>
<p style="margin-top:0.5rem;">La Plateforme <strong>n'utilise aucun cookie publicitaire, de tracking ou d'analyse comportementale</strong> (pas de Google Analytics, Facebook Pixel, etc.).</p>
<p class="mt-2">La Plateforme <strong>n'utilise aucun cookie publicitaire, de tracking ou d'analyse comportementale</strong> (pas de Google Analytics, Facebook Pixel, etc.).</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">4. Duree de conservation</h2>
<ul style="list-style:disc;padding-left:1.5rem;">
<h2 class="text-xl font-black uppercase mb-2">4. Duree de conservation</h2>
<ul class="list-disc pl-6">
<li><strong>Cookies de session</strong> : supprimes a la fermeture du navigateur</li>
<li><strong>Cookies de securite (Cloudflare)</strong> : duree maximale de 24 heures</li>
<li><strong>Cookies Stripe</strong> : selon la politique de Stripe, generalement le temps de la transaction</li>
@@ -44,11 +44,11 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">5. Gestion des cookies</h2>
<h2 class="text-xl font-black uppercase mb-2">5. Gestion des cookies</h2>
<p>Etant donne que la Plateforme utilise uniquement des cookies strictement necessaires, aucun consentement prealable n'est requis conformement a l'article 82 de la loi Informatique et Libertes et aux recommandations de la CNIL.</p>
<p style="margin-top:0.5rem;">Vous pouvez toutefois configurer votre navigateur pour refuser les cookies. Veuillez noter que la desactivation des cookies necessaires peut empecher le bon fonctionnement de la Plateforme (connexion, paiement, etc.).</p>
<p style="margin-top:0.5rem;">Pour configurer les cookies dans votre navigateur :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<p class="mt-2">Vous pouvez toutefois configurer votre navigateur pour refuser les cookies. Veuillez noter que la desactivation des cookies necessaires peut empecher le bon fonctionnement de la Plateforme (connexion, paiement, etc.).</p>
<p class="mt-2">Pour configurer les cookies dans votre navigateur :</p>
<ul class="list-disc pl-6 mt-2">
<li>Chrome : Parametres &gt; Confidentialite et securite &gt; Cookies</li>
<li>Firefox : Parametres &gt; Vie privee et securite &gt; Cookies</li>
<li>Safari : Preferences &gt; Confidentialite &gt; Cookies</li>
@@ -57,9 +57,9 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">6. Base legale</h2>
<h2 class="text-xl font-black uppercase mb-2">6. Base legale</h2>
<p>Le depot de cookies strictement necessaires repose sur l'<strong>interet legitime</strong> de l'editeur a assurer le fonctionnement et la securite de la Plateforme, conformement a :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Article 82 de la loi n&deg;78-17 du 6 janvier 1978 (Informatique et Libertes)</li>
<li>Directive 2002/58/CE (directive ePrivacy)</li>
<li>Recommandations de la CNIL sur les cookies et traceurs</li>
@@ -67,16 +67,16 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">7. Delegue a la Protection des Donnees</h2>
<h2 class="text-xl font-black uppercase mb-2">7. Delegue a la Protection des Donnees</h2>
<p>Pour toute question relative aux cookies ou a vos donnees personnelles :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>DPO : <strong>DPO-167945</strong></li>
<li>Email : <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a></li>
</ul>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">8. Droit applicable</h2>
<h2 class="text-xl font-black uppercase mb-2">8. Droit applicable</h2>
<p>Tout litige en relation avec l'utilisation des cookies sur la Plateforme est soumis au droit francais. Il est fait attribution exclusive de juridiction aux tribunaux competents de Laon.</p>
</section>

View File

@@ -4,15 +4,15 @@
{% block description %}Informations sur l'hebergement de la plateforme E-Ticket{% endblock %}
{% block body %}
<div style="max-width:50rem;margin:0 auto;padding:3rem 1rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:2rem;">Hebergement</h1>
<div class="page-container">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page mb-8">Hebergement</h1>
<div style="display:flex;flex-direction:column;gap:2rem;">
<div class="flex flex-col gap-8">
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">1. Hebergeur principal</h2>
<h2 class="text-xl font-black uppercase mb-2">1. Hebergeur principal</h2>
<p>Le site <strong>ticket.e-cosplay.fr</strong> est heberge par :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li><strong>Google Cloud Platform (GCP)</strong></li>
<li>Google Ireland Limited</li>
<li>Gordon House, Barrow Street, Dublin 4, Irlande</li>
@@ -22,8 +22,8 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">2. CDN et securite</h2>
<ul style="list-style:disc;padding-left:1.5rem;">
<h2 class="text-xl font-black uppercase mb-2">2. CDN et securite</h2>
<ul class="list-disc pl-6">
<li><strong>Cloudflare, Inc.</strong></li>
<li>101 Townsend St, San Francisco, CA 94107, Etats-Unis</li>
<li>Services : CDN, protection DDoS, WAF, gestion DNS, certificats TLS</li>
@@ -32,8 +32,8 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">3. Stockage des fichiers</h2>
<ul style="list-style:disc;padding-left:1.5rem;">
<h2 class="text-xl font-black uppercase mb-2">3. Stockage des fichiers</h2>
<ul class="list-disc pl-6">
<li><strong>Stockage objet compatible S3</strong></li>
<li>Heberge sur infrastructure ESY-WEB (s3.esy-web.dev)</li>
<li>Localisation : Europe</li>
@@ -42,8 +42,8 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">4. Service d'envoi d'emails</h2>
<ul style="list-style:disc;padding-left:1.5rem;">
<h2 class="text-xl font-black uppercase mb-2">4. Service d'envoi d'emails</h2>
<ul class="list-disc pl-6">
<li><strong>Amazon Simple Email Service (SES)</strong></li>
<li>Amazon Web Services EMEA SARL</li>
<li>38 Avenue John F. Kennedy, L-1855 Luxembourg</li>
@@ -53,8 +53,8 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">5. Service de paiement</h2>
<ul style="list-style:disc;padding-left:1.5rem;">
<h2 class="text-xl font-black uppercase mb-2">5. Service de paiement</h2>
<ul class="list-disc pl-6">
<li><strong>Stripe Payments Europe, Ltd.</strong></li>
<li>1 Grand Canal Street Lower, Grand Canal Dock, Dublin 2, Irlande</li>
<li>Utilisation : traitement des paiements en ligne, gestion des remboursements</li>
@@ -64,13 +64,13 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">6. Localisation des donnees</h2>
<h2 class="text-xl font-black uppercase mb-2">6. Localisation des donnees</h2>
<p>L'ensemble des donnees de la Plateforme (base de donnees, fichiers, sauvegardes) est heberge dans l'<strong>Union Europeenne</strong>.</p>
<p style="margin-top:0.5rem;">Les sous-traitants americains (Cloudflare, Stripe) operent sous le cadre du <strong>Data Privacy Framework (DPF)</strong> et/ou des <strong>Clauses Contractuelles Types (CCT)</strong> pour les transferts de donnees hors UE.</p>
<p class="mt-2">Les sous-traitants americains (Cloudflare, Stripe) operent sous le cadre du <strong>Data Privacy Framework (DPF)</strong> et/ou des <strong>Clauses Contractuelles Types (CCT)</strong> pour les transferts de donnees hors UE.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">7. Contact</h2>
<h2 class="text-xl font-black uppercase mb-2">7. Contact</h2>
<p>Pour toute question relative a l'hebergement : <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a></p>
</section>

View File

@@ -4,15 +4,15 @@
{% block description %}Mentions legales de la plateforme E-Ticket{% endblock %}
{% block body %}
<div style="max-width:50rem;margin:0 auto;padding:3rem 1rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:2rem;">Mentions Legales</h1>
<div class="page-container">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page mb-8">Mentions Legales</h1>
<div style="display:flex;flex-direction:column;gap:2rem;">
<div class="flex flex-col gap-8">
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">1. Editeur du site</h2>
<h2 class="text-xl font-black uppercase mb-2">1. Editeur du site</h2>
<p>Le site <strong>ticket.e-cosplay.fr</strong> (ci-apres "la Plateforme") est edite par :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li><strong>Association E-Cosplay</strong></li>
<li>RNA : W022006988</li>
<li>SIREN : 943121517</li>
@@ -24,68 +24,68 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">2. Hebergement</h2>
<h2 class="text-xl font-black uppercase mb-2">2. Hebergement</h2>
<p>Le site est heberge par :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li><strong>Google Cloud Platform</strong></li>
<li>Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irlande</li>
</ul>
<p style="margin-top:0.5rem;">Le nom de domaine est gere via <strong>Cloudflare, Inc.</strong>, 101 Townsend St, San Francisco, CA 94107, Etats-Unis.</p>
<p class="mt-2">Le nom de domaine est gere via <strong>Cloudflare, Inc.</strong>, 101 Townsend St, San Francisco, CA 94107, Etats-Unis.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">3. Nature de la Plateforme</h2>
<h2 class="text-xl font-black uppercase mb-2">3. Nature de la Plateforme</h2>
<p>La Plateforme E-Ticket est un <strong>intermediaire technique</strong> qui met a disposition des organisateurs d'evenements (associations, collectifs, particuliers) un outil de creation et de vente de billets en ligne.</p>
<p style="margin-top:0.5rem;">La Plateforme <strong>n'organise aucun evenement</strong> et <strong>n'est pas partie prenante</strong> aux transactions effectuees entre les organisateurs et les acheteurs de billets.</p>
<p class="mt-2">La Plateforme <strong>n'organise aucun evenement</strong> et <strong>n'est pas partie prenante</strong> aux transactions effectuees entre les organisateurs et les acheteurs de billets.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">4. Responsabilite</h2>
<h2 class="text-xl font-black uppercase mb-2">4. Responsabilite</h2>
<p><strong>L'association E-Cosplay, en tant qu'editeur de la Plateforme, decline toute responsabilite concernant :</strong></p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>L'organisation, le deroulement, l'annulation ou la modification des evenements publies sur la Plateforme</li>
<li>La qualite, la conformite ou la securite des evenements proposes par les organisateurs</li>
<li>Les litiges commerciaux entre les organisateurs et les acheteurs (remboursements, reclamations, etc.)</li>
<li>Les informations publiees par les organisateurs sur leurs evenements (descriptions, dates, tarifs, etc.)</li>
<li>Les dommages directs ou indirects resultant de l'utilisation de la Plateforme ou de la participation a un evenement</li>
</ul>
<p style="margin-top:0.5rem;"><strong>Chaque organisateur est seul responsable</strong> de son evenement, de la vente de ses billets, du respect de la reglementation applicable (securite, assurance, droits d'auteur, etc.) et de ses obligations envers les acheteurs, notamment en matiere de remboursement.</p>
<p class="mt-2"><strong>Chaque organisateur est seul responsable</strong> de son evenement, de la vente de ses billets, du respect de la reglementation applicable (securite, assurance, droits d'auteur, etc.) et de ses obligations envers les acheteurs, notamment en matiere de remboursement.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">5. Paiement</h2>
<h2 class="text-xl font-black uppercase mb-2">5. Paiement</h2>
<p>Les paiements en ligne sont securises par <strong>Stripe</strong> (Stripe Payments Europe, Ltd., 1 Grand Canal Street Lower, Dublin 2, Irlande). La Plateforme ne stocke aucune donnee bancaire.</p>
<p style="margin-top:0.5rem;">Les fonds collectes sont reverses directement aux organisateurs via Stripe Connect. L'association E-Cosplay peut percevoir une commission sur chaque transaction, dont le montant est indique dans les CGV.</p>
<p class="mt-2">Les fonds collectes sont reverses directement aux organisateurs via Stripe Connect. L'association E-Cosplay peut percevoir une commission sur chaque transaction, dont le montant est indique dans les CGV.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">6. Propriete intellectuelle</h2>
<h2 class="text-xl font-black uppercase mb-2">6. Propriete intellectuelle</h2>
<p>L'ensemble du contenu de la Plateforme (textes, graphismes, logos, icones, code source) est la propriete exclusive de l'association E-Cosplay, sauf mention contraire. Toute reproduction, meme partielle, est interdite sans autorisation ecrite prealable.</p>
<p style="margin-top:0.5rem;">Les contenus publies par les organisateurs (textes, images, logos) restent leur propriete. En publiant sur la Plateforme, ils accordent a E-Cosplay une licence non exclusive d'utilisation a des fins d'affichage et de promotion sur la Plateforme.</p>
<p class="mt-2">Les contenus publies par les organisateurs (textes, images, logos) restent leur propriete. En publiant sur la Plateforme, ils accordent a E-Cosplay une licence non exclusive d'utilisation a des fins d'affichage et de promotion sur la Plateforme.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">7. Donnees personnelles</h2>
<h2 class="text-xl font-black uppercase mb-2">7. Donnees personnelles</h2>
<p>Conformement au Reglement General sur la Protection des Donnees (RGPD), l'association E-Cosplay s'engage a proteger la confidentialite des donnees personnelles collectees. Pour toute information ou exercice de vos droits Informatique et Libertes sur les traitements de donnees personnelles, vous pouvez contacter notre Delegue a la Protection des Donnees (DPO).</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Identifiant DPO : <strong>DPO-167945</strong></li>
<li>Contact DPO : <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a></li>
</ul>
<p style="margin-top:0.5rem;">Pour plus d'informations, consultez notre <a href="{{ path('app_rgpd') }}" class="text-indigo-600 hover:underline">Politique de confidentialite</a>.</p>
<p class="mt-2">Pour plus d'informations, consultez notre <a href="{{ path('app_rgpd') }}" class="text-indigo-600 hover:underline">Politique de confidentialite</a>.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">8. Cookies</h2>
<h2 class="text-xl font-black uppercase mb-2">8. Cookies</h2>
<p>La Plateforme utilise des cookies strictement necessaires a son fonctionnement. Pour plus de details, consultez notre <a href="{{ path('app_cookies') }}" class="text-indigo-600 hover:underline">Politique de cookies</a>.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">9. Droit applicable et litiges</h2>
<h2 class="text-xl font-black uppercase mb-2">9. Droit applicable et litiges</h2>
<p>Les presentes mentions legales sont regies par le droit francais. En cas de litige, les tribunaux competents de Laon (Aisne) seront seuls competents.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">10. Contact</h2>
<h2 class="text-xl font-black uppercase mb-2">10. Contact</h2>
<p>Pour toute question relative aux presentes mentions legales, vous pouvez nous contacter a l'adresse : <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a>.</p>
</section>

View File

@@ -4,15 +4,15 @@
{% block description %}Politique de confidentialite et protection des donnees personnelles de la plateforme E-Ticket{% endblock %}
{% block body %}
<div style="max-width:50rem;margin:0 auto;padding:3rem 1rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:2rem;">Politique de Confidentialite</h1>
<div class="page-container">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page mb-8">Politique de Confidentialite</h1>
<div style="display:flex;flex-direction:column;gap:2rem;">
<div class="flex flex-col gap-8">
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">1. Responsable du traitement</h2>
<h2 class="text-xl font-black uppercase mb-2">1. Responsable du traitement</h2>
<p>Le responsable du traitement des donnees personnelles est :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li><strong>Association E-Cosplay</strong></li>
<li>SIREN : 943121517 / RNA : W022006988</li>
<li>42 rue de Saint-Quentin, 02800 Beautor, France</li>
@@ -21,42 +21,42 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">2. Delegue a la Protection des Donnees (DPO)</h2>
<h2 class="text-xl font-black uppercase mb-2">2. Delegue a la Protection des Donnees (DPO)</h2>
<p>Conformement au RGPD, un Delegue a la Protection des Donnees a ete designe :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Identifiant DPO : <strong>DPO-167945</strong></li>
<li>Contact : <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a></li>
</ul>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">3. Donnees collectees</h2>
<h2 class="text-xl font-black uppercase mb-2">3. Donnees collectees</h2>
<p>La Plateforme collecte les donnees suivantes :</p>
<p style="margin-top:0.75rem;"><strong>Lors de la creation de compte :</strong></p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.25rem;">
<p class="mt-3"><strong>Lors de la creation de compte :</strong></p>
<ul class="list-disc pl-6 mt-1">
<li>Nom et prenom</li>
<li>Adresse email</li>
<li>Mot de passe (stocke sous forme hashee)</li>
</ul>
<p style="margin-top:0.75rem;"><strong>Lors de l'achat de billets :</strong></p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.25rem;">
<p class="mt-3"><strong>Lors de l'achat de billets :</strong></p>
<ul class="list-disc pl-6 mt-1">
<li>Nom et prenom de l'acheteur</li>
<li>Adresse email</li>
<li>Donnees de paiement (traitees exclusivement par Stripe, non stockees sur nos serveurs)</li>
</ul>
<p style="margin-top:0.75rem;"><strong>Donnees techniques :</strong></p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.25rem;">
<p class="mt-3"><strong>Donnees techniques :</strong></p>
<ul class="list-disc pl-6 mt-1">
<li>Adresse IP (anonymisee via Cloudflare)</li>
<li>Cookies strictement necessaires (voir <a href="{{ path('app_cookies') }}" class="text-indigo-600 hover:underline">Politique de cookies</a>)</li>
</ul>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">4. Finalites du traitement</h2>
<ul style="list-style:disc;padding-left:1.5rem;">
<h2 class="text-xl font-black uppercase mb-2">4. Finalites du traitement</h2>
<ul class="list-disc pl-6">
<li>Gestion des comptes utilisateurs</li>
<li>Traitement des commandes et emission des billets</li>
<li>Envoi des billets et confirmations par email</li>
@@ -67,8 +67,8 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">5. Bases legales</h2>
<ul style="list-style:disc;padding-left:1.5rem;">
<h2 class="text-xl font-black uppercase mb-2">5. Bases legales</h2>
<ul class="list-disc pl-6">
<li><strong>Execution du contrat</strong> : traitement des commandes, emission des billets, gestion du compte</li>
<li><strong>Obligation legale</strong> : conservation des donnees de facturation</li>
<li><strong>Interet legitime</strong> : securite de la Plateforme, prevention des fraudes</li>
@@ -77,9 +77,9 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">6. Destinataires des donnees</h2>
<h2 class="text-xl font-black uppercase mb-2">6. Destinataires des donnees</h2>
<p>Vos donnees personnelles sont accessibles par :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li><strong>L'association E-Cosplay</strong> : administration de la Plateforme</li>
<li><strong>Les organisateurs d'evenements</strong> : uniquement les donnees necessaires a la gestion de leurs evenements (nom, email de l'acheteur)</li>
<li><strong>Stripe</strong> : traitement des paiements (Stripe Payments Europe, Ltd., Dublin, Irlande)</li>
@@ -87,21 +87,21 @@
<li><strong>Google Cloud Platform</strong> : hebergement des donnees (region Europe)</li>
<li><strong>Cloudflare</strong> : securite et CDN</li>
</ul>
<p style="margin-top:0.5rem;">Aucune donnee n'est vendue ou cedee a des tiers a des fins commerciales ou publicitaires.</p>
<p class="mt-2">Aucune donnee n'est vendue ou cedee a des tiers a des fins commerciales ou publicitaires.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">7. Transferts hors UE</h2>
<h2 class="text-xl font-black uppercase mb-2">7. Transferts hors UE</h2>
<p>Certains sous-traitants (Stripe, Cloudflare) peuvent transferer des donnees en dehors de l'Union Europeenne. Ces transferts sont encadres par :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Les Clauses Contractuelles Types (CCT) de la Commission Europeenne</li>
<li>Le Data Privacy Framework (DPF) UE-US pour les entreprises certifiees</li>
</ul>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">8. Duree de conservation</h2>
<ul style="list-style:disc;padding-left:1.5rem;">
<h2 class="text-xl font-black uppercase mb-2">8. Duree de conservation</h2>
<ul class="list-disc pl-6">
<li><strong>Donnees de compte</strong> : conservees pendant la duree d'existence du compte, puis 3 ans apres la derniere activite</li>
<li><strong>Donnees de transaction</strong> : 10 ans (obligation legale comptable)</li>
<li><strong>Donnees de connexion (logs)</strong> : 12 mois</li>
@@ -110,9 +110,9 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">9. Securite des donnees</h2>
<h2 class="text-xl font-black uppercase mb-2">9. Securite des donnees</h2>
<p>L'association E-Cosplay met en oeuvre des mesures techniques et organisationnelles appropriees pour garantir la securite des donnees :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>Chiffrement des communications (TLS/HTTPS)</li>
<li>Hashage des mots de passe (bcrypt)</li>
<li>Signature S/MIME des emails</li>
@@ -123,9 +123,9 @@
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">10. Vos droits</h2>
<h2 class="text-xl font-black uppercase mb-2">10. Vos droits</h2>
<p>Conformement au RGPD, vous disposez des droits suivants :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li><strong>Droit d'acces</strong> : obtenir une copie de vos donnees personnelles</li>
<li><strong>Droit de rectification</strong> : corriger des donnees inexactes ou incompletes</li>
<li><strong>Droit a l'effacement</strong> : demander la suppression de vos donnees (sous reserve des obligations legales)</li>
@@ -134,20 +134,20 @@
<li><strong>Droit d'opposition</strong> : vous opposer au traitement de vos donnees pour des motifs legitimes</li>
<li><strong>Droit de retrait du consentement</strong> : retirer votre consentement a tout moment (newsletter, etc.)</li>
</ul>
<p style="margin-top:0.5rem;">Pour exercer vos droits, contactez le DPO a l'adresse <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a> en precisant votre identite. Une reponse vous sera apportee dans un delai maximum de 30 jours.</p>
<p class="mt-2">Pour exercer vos droits, contactez le DPO a l'adresse <a href="mailto:contact@e-cosplay.fr" class="text-indigo-600 hover:underline">contact@e-cosplay.fr</a> en precisant votre identite. Une reponse vous sera apportee dans un delai maximum de 30 jours.</p>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">11. Reclamation</h2>
<h2 class="text-xl font-black uppercase mb-2">11. Reclamation</h2>
<p>Si vous estimez que le traitement de vos donnees personnelles constitue une violation du RGPD, vous avez le droit d'introduire une reclamation aupres de la Commission Nationale de l'Informatique et des Libertes (CNIL) :</p>
<ul style="list-style:disc;padding-left:1.5rem;margin-top:0.5rem;">
<ul class="list-disc pl-6 mt-2">
<li>CNIL - 3 Place de Fontenoy, TSA 80715, 75334 Paris Cedex 07</li>
<li>Site : www.cnil.fr</li>
</ul>
</section>
<section>
<h2 class="text-xl font-black uppercase" style="margin-bottom:0.5rem;">12. Droit applicable</h2>
<h2 class="text-xl font-black uppercase mb-2">12. Droit applicable</h2>
<p>Tout litige en relation avec le traitement des donnees personnelles est soumis au droit francais. Il est fait attribution exclusive de juridiction aux tribunaux competents de Laon.</p>
</section>

View File

@@ -1,7 +1,54 @@
{% extends 'base.html.twig' %}
{% block title %}Modifier mon mot de passe - E-Ticket{% endblock %}
{% block description %}Modifiez votre mot de passe E-Ticket{% endblock %}
{% block body %}
<div class="page-container-xs">
<h1 class="text-3xl font-black uppercase tracking-tighter italic heading-page">Modifier mon mot de passe</h1>
<p class="font-bold text-gray-600 italic mb-8">Saisissez votre mot de passe actuel et choisissez-en un nouveau.</p>
{% for message in app.flashes('success') %}
<div class="flash-success mb-8"><p class="font-black text-sm">{{ message }}</p></div>
{% endfor %}
{% for message in app.flashes('error') %}
<div class="flash-error mb-8"><p class="font-black text-sm">{{ message }}</p></div>
{% endfor %}
<form method="post" action="{{ path('app_change_password') }}" class="form-col">
<div>
<label for="current_password" class="text-xs font-black uppercase tracking-widest form-label">Mot de passe actuel</label>
<input type="password" id="current_password" name="current_password" required autofocus
class="form-input focus:border-indigo-600"
placeholder="••••••••">
</div>
<div>
<label for="new_password" class="text-xs font-black uppercase tracking-widest form-label">Nouveau mot de passe</label>
<input type="password" id="new_password" name="new_password" required minlength="8"
class="form-input focus:border-indigo-600"
placeholder="••••••••">
</div>
<div>
<label for="confirm_password" class="text-xs font-black uppercase tracking-widest form-label">Confirmer le nouveau mot de passe</label>
<input type="password" id="confirm_password" name="confirm_password" required minlength="8"
class="form-input focus:border-indigo-600"
placeholder="••••••••">
</div>
<input type="hidden" name="_csrf_token" value="{{ csrf_token('change_password') }}">
<div>
<button type="submit" class="btn-brutal-full bg-yellow-400 font-black uppercase text-sm tracking-widest hover:bg-indigo-600 hover:text-white transition-all">
Modifier le mot de passe
</button>
</div>
</form>
<div class="mt-8 text-center">
<p class="text-sm font-bold text-gray-600"><a href="{{ path('app_account') }}" class="text-indigo-600 hover:underline font-black">Retour a mon compte</a></p>
</div>
</div>
{% endblock %}

View File

@@ -4,177 +4,159 @@
{% block description %}Creez votre compte E-Ticket en tant qu'acheteur ou organisateur d'evenements{% endblock %}
{% block body %}
<div style="max-width:36rem;margin:0 auto;padding:3rem 1rem;">
<h1 class="text-3xl font-black uppercase tracking-tighter italic" style="border-bottom:4px solid #111827;display:inline-block;margin-bottom:0.5rem;">Inscription</h1>
<p class="font-bold text-gray-600 italic" style="margin-bottom:2rem;">Creez votre compte.</p>
<div class="page-container-sm">
<h1 class="heading-page text-3xl font-black uppercase tracking-tighter italic">Inscription</h1>
<p class="font-bold text-gray-600 italic mb-8">Creez votre compte.</p>
{% for message in app.flashes('success') %}
<div style="border:4px solid #111827;padding:1rem 1.5rem;margin-bottom:2rem;background:#d1fae5;box-shadow:4px 4px 0 rgba(0,0,0,1);">
<div class="flash-success mb-8">
<p class="font-black text-sm">{{ message }}</p>
</div>
{% endfor %}
{% for message in app.flashes('error') %}
<div style="border:4px solid #111827;padding:1rem 1.5rem;margin-bottom:2rem;background:#fee2e2;box-shadow:4px 4px 0 rgba(0,0,0,1);">
<div class="flash-error mb-8">
<p class="font-black text-sm">{{ message }}</p>
</div>
{% endfor %}
<div style="display:flex;gap:0;margin-bottom:2rem;">
<div class="flex mb-8">
<button data-tab="tab-buyer" type="button"
style="flex:1;padding:0.75rem;border:3px solid #111827;border-right:none;cursor:pointer;background:#111827;color:white;"
class="font-black uppercase text-sm tracking-widest transition-all">
class="flex-1 py-3 border-3 border-gray-900 border-r-0 cursor-pointer bg-gray-900 text-white font-black uppercase text-sm tracking-widest transition-all">
Acheteur
</button>
<button data-tab="tab-organizer" type="button"
style="flex:1;padding:0.75rem;border:3px solid #111827;cursor:pointer;background:white;color:#111827;"
class="font-black uppercase text-sm tracking-widest transition-all">
class="flex-1 py-3 border-3 border-gray-900 cursor-pointer bg-white text-gray-900 font-black uppercase text-sm tracking-widest transition-all">
Organisateur
</button>
</div>
<div id="tab-buyer" style="display:block;">
<form method="post" action="{{ path('app_register') }}" style="display:flex;flex-direction:column;gap:1.5rem;">
<div id="tab-buyer" class="block">
<form method="post" action="{{ path('app_register') }}" class="form-col">
<input type="hidden" name="type" value="buyer">
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;">
<div style="flex:1;min-width:150px;">
<label for="buyer_last_name" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Nom</label>
<div class="form-row">
<div class="form-group min-w-[150px]">
<label for="buyer_last_name" class="form-label text-xs font-black uppercase tracking-widest">Nom</label>
<input type="text" id="buyer_last_name" name="last_name" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="Dupont">
</div>
<div style="flex:1;min-width:150px;">
<label for="buyer_first_name" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Prenom</label>
<div class="form-group min-w-[150px]">
<label for="buyer_first_name" class="form-label text-xs font-black uppercase tracking-widest">Prenom</label>
<input type="text" id="buyer_first_name" name="first_name" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="Jean">
</div>
</div>
<div>
<label for="buyer_email" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Email</label>
<label for="buyer_email" class="form-label text-xs font-black uppercase tracking-widest">Email</label>
<input type="email" id="buyer_email" name="email" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="jean.dupont@exemple.fr">
</div>
<div>
<label for="buyer_password" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Mot de passe</label>
<label for="buyer_password" class="form-label text-xs font-black uppercase tracking-widest">Mot de passe</label>
<input type="password" id="buyer_password" name="password" required minlength="8"
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="••••••••">
</div>
<div>
<button type="submit"
style="width:100%;padding:0.75rem 2rem;border:3px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);cursor:pointer;"
class="bg-yellow-400 font-black uppercase text-sm tracking-widest hover:bg-indigo-600 hover:text-white transition-all">
class="btn-brutal-full bg-yellow-400 font-black uppercase text-sm tracking-widest hover:bg-indigo-600 hover:text-white transition-all">
Creer mon compte
</button>
</div>
</form>
</div>
<div id="tab-organizer" style="display:none;">
<form method="post" action="{{ path('app_register') }}" style="display:flex;flex-direction:column;gap:1.5rem;">
<div id="tab-organizer" class="hidden">
<form method="post" action="{{ path('app_register') }}" class="form-col">
<input type="hidden" name="type" value="organizer">
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;">
<div style="flex:1;min-width:150px;">
<label for="orga_last_name" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Nom</label>
<div class="form-row">
<div class="form-group min-w-[150px]">
<label for="orga_last_name" class="form-label text-xs font-black uppercase tracking-widest">Nom</label>
<input type="text" id="orga_last_name" name="last_name" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="Dupont">
</div>
<div style="flex:1;min-width:150px;">
<label for="orga_first_name" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Prenom</label>
<div class="form-group min-w-[150px]">
<label for="orga_first_name" class="form-label text-xs font-black uppercase tracking-widest">Prenom</label>
<input type="text" id="orga_first_name" name="first_name" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="Jean">
</div>
</div>
<div>
<label for="orga_company" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Raison sociale / Nom de l'association</label>
<label for="orga_company" class="form-label text-xs font-black uppercase tracking-widest">Raison sociale / Nom de l'association</label>
<input type="text" id="orga_company" name="company_name" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="Mon association">
</div>
<div>
<label for="orga_siret" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">SIRET</label>
<label for="orga_siret" class="form-label text-xs font-black uppercase tracking-widest">SIRET</label>
<input type="text" id="orga_siret" name="siret" required pattern="[0-9]{14}" maxlength="14"
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="12345678901234">
</div>
<div>
<label for="orga_email" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Email</label>
<label for="orga_email" class="form-label text-xs font-black uppercase tracking-widest">Email</label>
<input type="email" id="orga_email" name="email" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="contact@association.fr">
</div>
<div>
<label for="orga_address" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Adresse</label>
<label for="orga_address" class="form-label text-xs font-black uppercase tracking-widest">Adresse</label>
<input type="text" id="orga_address" name="address" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="12 rue de la Paix">
</div>
<div style="display:flex;flex-wrap:wrap;gap:1.5rem;">
<div style="flex:1;min-width:120px;">
<label for="orga_postal" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Code postal</label>
<div class="form-row">
<div class="form-group min-w-[120px]">
<label for="orga_postal" class="form-label text-xs font-black uppercase tracking-widest">Code postal</label>
<input type="text" id="orga_postal" name="postal_code" required pattern="[0-9]{5}" maxlength="5"
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="75001">
</div>
<div style="flex:2;min-width:150px;">
<label for="orga_city" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Ville</label>
<div class="form-group min-w-[150px] flex-2">
<label for="orga_city" class="form-label text-xs font-black uppercase tracking-widest">Ville</label>
<input type="text" id="orga_city" name="city" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="Paris">
</div>
</div>
<div>
<label for="orga_phone" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Telephone</label>
<label for="orga_phone" class="form-label text-xs font-black uppercase tracking-widest">Telephone</label>
<input type="tel" id="orga_phone" name="phone" required
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="06 12 34 56 78">
</div>
<div>
<label for="orga_password" class="text-xs font-black uppercase tracking-widest" style="display:block;margin-bottom:0.5rem;">Mot de passe</label>
<label for="orga_password" class="form-label text-xs font-black uppercase tracking-widest">Mot de passe</label>
<input type="password" id="orga_password" name="password" required minlength="8"
style="width:100%;padding:0.75rem 1rem;border:3px solid #111827;font-weight:700;outline:none;"
class="focus:border-indigo-600"
class="form-input focus:border-indigo-600"
placeholder="••••••••">
</div>
<div>
<button type="submit"
style="width:100%;padding:0.75rem 2rem;border:3px solid #111827;box-shadow:4px 4px 0 rgba(0,0,0,1);cursor:pointer;"
class="bg-yellow-400 font-black uppercase text-sm tracking-widest hover:bg-indigo-600 hover:text-white transition-all">
class="btn-brutal-full bg-yellow-400 font-black uppercase text-sm tracking-widest hover:bg-indigo-600 hover:text-white transition-all">
Creer mon compte organisateur
</button>
</div>
</form>
</div>
<div style="margin-top:2rem;text-align:center;">
<div class="mt-8 text-center">
<p class="text-sm font-bold text-gray-600">Deja un compte ? <a href="{{ path('app_login') }}" class="text-indigo-600 hover:underline font-black">Connexion</a></p>
</div>
</div>