Files
crm_ecosplay/templates/emails/echeancier_proposition.html.twig

70 lines
5.3 KiB
Twig
Raw Normal View History

{% extends 'email/base.html.twig' %}
{% block content %}
<table width="600" cellpadding="0" cellspacing="0" style="margin: 0 auto;">
<tr>
<td style="padding: 32px;">
{% set greeting = customer.raisonSociale ? 'Chez ' ~ customer.raisonSociale : 'Bonjour ' ~ customer.firstName %}
<h1 style="font-family: Arial, Helvetica, sans-serif; font-size: 22px; font-weight: 700; color: #111827; margin: 0 0 16px;">{{ greeting }},</h1>
<p style="font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #374151; line-height: 22px; margin: 0 0 16px;">
feat: systeme complet echeancier SEPA, E-Flex, attestations, avertissements clients Echeancier - Webhooks DocuSeal: - Webhook form.completed: telecharge PDF signe + audit, state SIGNED, prepare SEPA, notifie client + admin - Webhook form.declined: state CANCELLED, notifie client + admin - Reference EC_ECH_XXXXX affichee dans PDF, emails, pages client, admin - Attestation fin de paiement auto via DocuSeal au completion Echeancier - SEPA Direct Debit (remplace Subscriptions): - Page /echeancier/setup-payment/{id}: formulaire IBAN Stripe Elements + mandat SEPA - Confirmation SetupIntent -> stocke PaymentMethod -> state ACTIVE - Commande cron app:echeancier:process-payments: preleve les echeances dues via PaymentIntent off_session - Webhooks payment_intent.succeeded/failed: met a jour EcheancierLine, notifie client - Regularisation CB via Stripe Checkout en cas d'echec prelevement - Bouton "Forcer prelevement" par echeance dans admin - Infos SEPA stockees (last4, bank_code, country) + affichees admin - Page setup_payment_done quand SEPA deja configure - Annulation auto apres 2 rejets + sync paiements vers Advert lie Echeancier - Lien Advert: - Champ advert (ManyToOne nullable) sur Echeancier - Select "Avis lie" dans formulaire creation - AdvertPayment cree a chaque echeance payee - Advert passe en accepted quand echeancier completed Comptabilite: - Export echeanciers CSV/JSON/PDF/PDF signe dans /admin/comptabilite - Colonnes: reference, client, creance, majoration, total, paye, restant, Stripe PI, avis lie Stats: - Case "Total impaye global" = factures impayees + echeances non payees - Tableau echeanciers en cours avec restant du Confiance client: - Statut Confiant/Attention/Danger calcule dynamiquement - Badge en haut a droite de la fiche client - Integre warningLevel (1st=Attention, 2nd=Attention, last=Danger) - Creation echeancier bloquee si Danger (template + controller) Avertissements client (tab Controle, ROLE_ROOT): - 3 niveaux: 1st, 2nd (procedure suspension preparee), last (48h) - Motifs cochables: impayes, irrespect, hors horaires, services gratuits - PDF signe DocuSeal pour chaque avertissement (ClientWarningPdf) - PDF levee avertissement signe (ClientWarningResetPdf) - Webhooks DocuSeal client_warning + client_warning_reset - Barre progression 4 etapes dans admin - Mentions legales: huis clos, contestation direction@e-cosplay.fr Cloture compte: - Bouton "Envoyer notification de cloture" apres dernier avertissement - PDF signe DocuSeal (ClientClosurePdf): suppression 24h, recouvrement, commissaire justice, forces ordre - Bouton "Suspendre le compte" (state suspended) - Webhook DocuSeal client_closure: envoie PDF signe a client + admin + direction Factures: - Auto-generation PDF si absent lors de l'envoi - Bouton "Envoyer" visible meme sans PDF pour factures payees E-Flex (financement services): - Entites EFlex + EFlexLine (reference E_FLEX_XXXXX) - Methodes: SEPA, CB (Stripe Checkout), virement manuel - PDF contrat avec 2 signatures DocuSeal (Company + Client) - Controller admin CRUD + force payment + paiement manuel - Pages client: verify, process, sign, signed, setup SEPA, paiement CB - Webhook DocuSeal eflex: telecharge PDFs, prepare Stripe, notifie - Webhooks Stripe payment_intent: gestion paiements E-Flex - Cron traite aussi les E-Flex SEPA dans process-payments - Tab E-Flex dans fiche client avec liste + modal creation - Emails: signature, signed, verify_code, echeance_payee, echeance_echec Attestations custom (ROLE_ROOT): - Entite AttestationCustom avec items JSON + HMAC SHA-256 - Repeater dynamique pour ajouter elements a attester - PDF avec phrase officielle "Je soussigne(e)..." + QR code verification - Signature manuelle dans DocuSeal (redirection) - Webhook attestation_custom: telecharge PDF signe + audit - Page publique /attestation/verify/{id}/{hmac} avec validation HMAC - Lien dans sidebar Super Admin Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 07:45:22 +02:00
Nous vous proposons un echeancier de paiement <strong>{{ echeancier.reference }}</strong> pour faciliter le reglement de votre solde.
</p>
<table width="100%" cellpadding="0" cellspacing="0" style="margin: 20px 0; border: 1px solid #e5e7eb;">
<tr>
<td style="padding: 10px 16px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #9ca3af; background: #f9fafb; width: 35%;">Motif</td>
<td style="padding: 10px 16px; font-size: 13px; font-weight: 700;">{{ echeancier.description }}</td>
</tr>
<tr>
<td style="padding: 10px 16px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #9ca3af; background: #f9fafb;">Montant de la creance</td>
<td style="padding: 10px 16px; font-family: monospace; font-size: 14px; font-weight: 700;">{{ echeancier.totalAmountHt }} &euro;</td>
</tr>
<tr>
<td style="padding: 10px 16px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #9ca3af; background: #f9fafb;">Majoration (5%)</td>
<td style="padding: 10px 16px; font-family: monospace; font-size: 14px; font-weight: 700; color: #dc2626;">+ {{ echeancier.majoration|number_format(2, ',', ' ') }} &euro;</td>
</tr>
<tr>
<td style="padding: 10px 16px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #9ca3af; background: #f9fafb;">Total a payer</td>
<td style="padding: 10px 16px; font-family: monospace; font-size: 16px; font-weight: 700;">{{ echeancier.totalWithMajoration|number_format(2, ',', ' ') }} &euro;</td>
</tr>
<tr>
<td style="padding: 10px 16px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #9ca3af; background: #f9fafb;">Nombre d'echeances</td>
<td style="padding: 10px 16px; font-size: 13px; font-weight: 700;">{{ echeancier.nbLines }} mois</td>
</tr>
<tr>
<td style="padding: 10px 16px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #9ca3af; background: #f9fafb;">Montant mensuel</td>
<td style="padding: 10px 16px; font-family: monospace; font-size: 16px; font-weight: 700; color: #fabf04;">{{ echeancier.monthlyAmount|number_format(2, ',', ' ') }} &euro;/mois</td>
</tr>
</table>
<h2 style="font-family: Arial, Helvetica, sans-serif; font-size: 14px; font-weight: 700; color: #111827; margin: 20px 0 10px;">Detail des echeances :</h2>
<table width="100%" cellpadding="0" cellspacing="0" style="border: 1px solid #e5e7eb;">
<tr>
<th style="padding: 8px 12px; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #ffffff; background: #111827; text-align: left;">N</th>
<th style="padding: 8px 12px; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #ffffff; background: #111827; text-align: left;">Date prevue</th>
<th style="padding: 8px 12px; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #ffffff; background: #111827; text-align: right;">Montant</th>
</tr>
{% for line in echeancier.lines %}
<tr style="background: {{ loop.index is odd ? '#f9fafb' : '#ffffff' }};">
<td style="padding: 8px 12px; font-size: 12px;">{{ line.position }}</td>
<td style="padding: 8px 12px; font-size: 12px;">{{ line.scheduledAt|date('d/m/Y') }}</td>
<td style="padding: 8px 12px; font-size: 12px; font-weight: 700; text-align: right;">{{ line.amount }} &euro;</td>
</tr>
{% endfor %}
</table>
<p style="font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #374151; line-height: 22px; margin: 16px 0;">
Une fois le contrat signe, un email vous sera envoye pour effectuer la configuration des prelevements automatiques.
Chaque echeance sera prelevee a la date prevue.
</p>
<p style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; color: #9ca3af; margin: 16px 0 0;">
Pour toute question : <a href="mailto:contact@e-cosplay.fr" style="color: #fabf04;">contact@e-cosplay.fr</a>
</p>
</td>
</tr>
</table>
{% endblock %}