Files
crm_ecosplay/templates/legal/rgpd.html.twig
Serreau Jovann 95d33a9a6d feat: gestion complete Devis + Avis de paiement + DocuSeal signature + mails
Devis :
- Entity DevisLine (pos, title, description, priceHt) liee a Devis (OneToMany cascade/orphanRemoval)
- Champs ajoutes sur Devis : customer (ManyToOne), submissionId, state machine (created/send/accepted/refused/cancel), raisonMessage, totaux HT/TVA/TTC, updatedAt, setUpdatedAt public
- Relation Devis <-> Advert changee de ManyToOne a OneToOne nullable
- Vich Attribute (migration Annotation -> Attribute) pour unsignedPdf/signedPdf/auditPdf
- DevisController CRUD complet : create (form repeater lignes + boutons rapides TarificationService), edit, cancel (libere OrderNumber), generate-pdf, send, resend, create-advert, events
- DevisPdf (FPDF/FPDI) : header legacy (logo, num, date, client), body lignes, summary totaux, footer SITECONSEIL + pagination, champ signature DocuSeal sur page devis + derniere page CGV
- OrderNumberService : preview() et generate() reutilisent les OrderNumber non utilises (isUsed=false) en priorite
- OrderNumber::markAsUnused() ajoute

DocuSeal integration devis :
- DocuSealService : sendDevisForSignature (avec completed_redirect_url), resendDevisSignature (archive ancienne submission), getSubmitterSlug, downloadSignedDevis (sauvegarde via Vich UploadedFile test=true)
- WebhookDocuSealController : dispatch par doc_type devis/attestation, handleDevisEvent (form.completed -> STATE_ACCEPTED + download PDF signe/audit, form.declined -> STATE_REFUSED + raison)
- DocusealEvent entity pour tracer form.viewed/started/completed/declined en temps reel
- Page evenements admin /admin/devis/{id}/events avec badges et payload JSON

Signature client :
- DevisProcessController : page publique /devis/process/{id}/{hmac} securisee par HMAC, boutons Signer (redirect DocuSeal) / Refuser (motif optionnel)
- Pages confirmation : signed.html.twig (merci + recap) et refused.html.twig (confirmation refus + motif)
- Nelmio whitelist : signature.esy-web.dev + signature.siteconseil.fr

Avis de paiement :
- Entity AdvertLine (pos, title, description, priceHt) liee a Advert
- Advert refactorise : customer, state, totaux, raisonMessage, submissionId, advertFile (Vich mapping advert_pdf), lines collection, updatedAt
- AdvertController : generate-pdf, send (mail + PJ + lien paiement), resend (rappel), cancel (delie devis, libere OrderNumber), search Meilisearch
- AdvertPdf (FPDF/FPDI) : QR code Endroid pointant vers /order/{numOrder}, texte "Scannez pour payer"
- OrderPaymentController : page publique /order/{numOrder} avec detail prestations, totaux, options paiement (placeholder)
- Creation auto depuis devis signe : copie client, totaux, lignes, meme OrderNumber

Meilisearch :
- Index customer_devis et customer_advert avec searchable (numOrder, customerName, customerEmail, state) et filterable (customerId, state)
- CRUD indexation sur chaque action (create, edit, send, cancel, create-advert)
- Recherche AJAX dans tabs Devis et Avis avec debounce + dropdown glassmorphism
- Sync admin : boutons syncDevis / syncAdverts + compteurs dans /admin/sync

Emails :
- MailerService : VCF auto (fiche contact SARL SITECONSEIL) en PJ sur tous les mails, bloc HTML pieces jointes injecte automatiquement (exclut .asc/.p7z/smime) avec icone trombone + taille fichier
- Templates : devis_to_sign, devis_signed_client/admin (PJ signed+audit), devis_refused_client/admin, advert_send (PJ + bouton paiement), ndd_expiration
- TestMailCommand : option --force-dsn pour envoyer via un DSN SMTP specifique (test prod depuis dev)

Commande NDD :
- app:ndd:check : verifie expiration domaines <= 30j, envoie mail groupe a monitor@siteconseil.fr
- Cron quotidien 8h (docker + ansible)

Divers :
- Titles templates : CRM SITECONSEIL -> SARL SITECONSEIL (52 fichiers)
- VAULT_URL dev = https://kms.esy-web.dev (comme prod)
- app.js : initDevisLines (repeater + drag & drop), initTabSearch, toggle refus devis
- app.scss : styles drag & drop
- setasign/fpdi-fpdf installe pour fusion PDF
- 5 migrations Doctrine

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 09:44:35 +02:00

209 lines
13 KiB
Twig

{% extends 'legal/_layout.html.twig' %}
{% block title %}Politique de Confidentialite - SARL SITECONSEIL{% endblock %}
{% block description %}Politique de protection des donnees personnelles du CRM SITECONSEIL.{% endblock %}
{% block body %}
<div class="page-container">
<h1 class="text-2xl font-bold heading-page mb-8">Politique de Confidentialite</h1>
<div class="flex flex-col gap-8">
<section>
<h2 class="text-xl font-bold uppercase mb-2">1. Responsable du traitement</h2>
<p>Le responsable du traitement des donnees personnelles est :</p>
<ul class="list-disc pl-6 mt-2">
<li><strong>SARL SITECONSEIL</strong></li>
<li>Siret : 418 664 058</li>
<li>27 rue Le Sérurier, 02100 Saint-Quentin, France</li>
<li>Email : <a href="mailto:contact@siteconseil.fr" class="text-indigo-800 underline hover:text-indigo-950">contact@siteconseil.fr</a></li>
</ul>
</section>
<section>
<h2 class="text-xl font-bold 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 class="list-disc pl-6 mt-2">
<li>Contact : <a href="mailto:rgpd@siteconseil.fr" class="text-indigo-800 underline hover:text-indigo-950">rgpd@siteconseil.fr</a></li>
</ul>
</section>
<section>
<h2 class="text-xl font-bold uppercase mb-2">3. Donnees collectees</h2>
<p>La Plateforme collecte les donnees suivantes :</p>
<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 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 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_legal_cookie') }}" class="text-indigo-800 underline hover:text-indigo-950">Politique de cookies</a>)</li>
</ul>
</section>
<section>
<h2 class="text-xl font-bold 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>
<li>Communication liee aux evenements achetes (modifications, annulations)</li>
<li>Securite de la Plateforme et prevention des fraudes</li>
<li>Respect des obligations legales et reglementaires</li>
</ul>
</section>
<section>
<h2 class="text-xl font-bold 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>
<li><strong>Consentement</strong> : envoi de communications commerciales (newsletter)</li>
</ul>
</section>
<section>
<h2 class="text-xl font-bold uppercase mb-2">6. Destinataires des donnees</h2>
<p>Vos donnees personnelles sont accessibles par :</p>
<ul class="list-disc pl-6 mt-2">
<li><strong>La SARL SITECONSEIL</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>
<li><strong>Amazon Web Services (SES)</strong> : envoi des emails transactionnels (region eu-west-3, Irlande)</li>
<li><strong>Google Cloud Platform</strong> : hebergement des donnees (region Europe)</li>
<li><strong>Cloudflare</strong> : securite et CDN</li>
</ul>
<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-bold 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 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-bold 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>
<li><strong>Donnees de prospection</strong> : 3 ans apres le dernier contact</li>
</ul>
</section>
<section>
<h2 class="text-xl font-bold uppercase mb-2">9. Securite des donnees</h2>
<p>La SARL SITECONSEIL met en oeuvre des mesures techniques et organisationnelles appropriees pour garantir la securite des donnees :</p>
<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>
<li>Protection DDoS et WAF via Cloudflare</li>
<li>Acces restreint aux donnees (principe du moindre privilege)</li>
<li>Sauvegardes regulieres et chiffrees</li>
</ul>
</section>
<section>
<h2 class="text-xl font-bold uppercase mb-2">10. Vos droits</h2>
<p>Conformement au RGPD, vous disposez des droits suivants :</p>
<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>
<li><strong>Droit a la limitation</strong> : limiter le traitement dans certains cas</li>
<li><strong>Droit a la portabilite</strong> : recevoir vos donnees dans un format structure et lisible</li>
<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 class="mt-2">Pour exercer vos droits, contactez le DPO a l'adresse <a href="mailto:rgpd@siteconseil.fr" class="text-indigo-800 underline hover:text-indigo-950">rgpd@siteconseil.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-bold 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 class="list-disc pl-6 mt-2">
<li>CNIL - 3 Place de Fontenoy, TSA 80715, 75334 Paris Cedex 07</li>
<li>Site : <a href="https://www.cnil.fr" class="text-indigo-800 underline hover:text-indigo-950" target="_blank" rel="noopener">www.cnil.fr</a></li>
</ul>
</section>
<section>
<h2 class="text-xl font-bold 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 Saint-Quentin.</p>
</section>
<p class="text-sm opacity-70 italic mb-8">Derniere mise a jour : 30/03/2026</p>
<section id="exercer-droits">
<h2 class="text-xl font-bold uppercase mb-4">Exercer vos droits</h2>
{% for type, messages in app.flashes %}
{% for message in messages %}
<div class="mb-6 p-4 glass font-medium text-sm rounded-xl {{ type == 'success' ? 'border-green-300 text-green-800' : 'border-red-300 text-red-800' }}">
{{ message }}
</div>
{% endfor %}
{% endfor %}
<div class="flex flex-col lg:flex-row gap-6">
<div class="flex-1 glass p-6">
<h3 class="text-lg font-bold uppercase mb-2">Droit d'acces</h3>
<p class="text-sm text-gray-600 mb-4">Recevez par email un PDF contenant toutes les donnees de navigation que nous detenons vous concernant (article 15 du RGPD).</p>
<form method="post" action="{{ path('app_legal_rgpd_access') }}" class="flex flex-col gap-3">
<div>
<label for="access_email" class="text-xs font-bold uppercase block mb-1">Email</label>
<input type="email" id="access_email" name="email" required placeholder="votre@email.fr" class="w-full px-3 py-2 input-glass font-medium text-sm">
</div>
<div>
<label for="access_ip" class="text-xs font-bold uppercase block mb-1">Adresse IP</label>
<input type="text" id="access_ip" name="ip" required value="{{ client_ip }}" class="w-full px-3 py-2 input-glass font-medium text-sm">
</div>
<button type="submit" class="px-4 py-2 glass bg-[#fabf04] font-bold uppercase text-xs tracking-widest cursor-pointer hover:bg-yellow-500 transition-all">
Demander mes donnees
</button>
</form>
</div>
<div class="flex-1 border-2 border-red-600 p-6">
<h3 class="text-lg font-bold uppercase mb-2">Droit a l'effacement</h3>
<p class="text-sm text-gray-600 mb-4">Supprimez toutes vos donnees de navigation de nos systemes et recevez une attestation par email (article 17 du RGPD).</p>
<form method="post" action="{{ path('app_legal_rgpd_deletion') }}" data-confirm="Cette action est irreversible. Toutes vos donnees de navigation seront definitivement supprimees. Continuer ?" class="flex flex-col gap-3">
<div>
<label for="delete_email" class="text-xs font-bold uppercase block mb-1">Email</label>
<input type="email" id="delete_email" name="email" required placeholder="votre@email.fr" class="w-full px-3 py-2 input-glass font-medium text-sm">
</div>
<div>
<label for="delete_ip" class="text-xs font-bold uppercase block mb-1">Adresse IP</label>
<input type="text" id="delete_ip" name="ip" required value="{{ client_ip }}" class="w-full px-3 py-2 input-glass font-medium text-sm">
</div>
<button type="submit" class="px-4 py-2 btn-dark font-bold uppercase text-xs tracking-wider cursor-pointer">
Supprimer mes donnees
</button>
</form>
</div>
</div>
</section>
</div>
</div>
{% endblock %}