feat: contrat migration SARL SITECONSEIL - PDF, DocuSeal, webhook, page publique
PDF ContratMigrationSiteconseilPdf: - Preambule: cessation SARL SITECONSEIL, continuite par E-Cosplay - Avertissement orange: pas de reprise d'anciennete ni accords anterieurs - 8 articles: objet, transfert, tarifs, duree, anciennete, responsabilite, RGPD, droit applicable - 2 signatures DocuSeal (Company auto-signe + Client signe) Controller admin: - create: genere le PDF automatiquement a la creation - generate-pdf: regeneration PDF - send-signature: envoi DocuSeal 2 parties + email client avec lien - Boutons: Regenerer PDF, Voir PDF, Envoyer/Renvoyer signature, Annuler Page publique /move/from/siteconseil: - Explication complete de la migration (pourquoi, ce qui change, ce qui ne change pas, etapes, FAQ) - Accessible sans authentification - Liee dans l'email de signature Webhook DocuSeal (doc_type=contrat): - Telecharge PDF signe + audit (unlink apres flush) - State SIGNED + signedAt - Email client + admin avec PDFs en piece jointe Templates email: - contrat_signature: lien page migration + lien signer + avertissement - contrat_signed: confirmation + PDFs attaches Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
34
migrations/Version20260409061033.php
Normal file
34
migrations/Version20260409061033.php
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace DoctrineMigrations;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Doctrine\Migrations\AbstractMigration;
|
||||
|
||||
/**
|
||||
* Auto-generated Migration: Please modify to your needs!
|
||||
*/
|
||||
final class Version20260409061033 extends AbstractMigration
|
||||
{
|
||||
public function getDescription(): string
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
public function up(Schema $schema): void
|
||||
{
|
||||
// this up() migration is auto-generated, please modify it to your needs
|
||||
$this->addSql('CREATE TABLE contrat (id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, email VARCHAR(255) NOT NULL, raison_sociale VARCHAR(255) NOT NULL, type VARCHAR(50) NOT NULL, state VARCHAR(20) DEFAULT \'draft\' NOT NULL, submission_id VARCHAR(255) DEFAULT NULL, submitter_company_id INT DEFAULT NULL, submitter_customer_id INT DEFAULT NULL, pdf_unsigned VARCHAR(255) DEFAULT NULL, pdf_signed VARCHAR(255) DEFAULT NULL, pdf_audit VARCHAR(255) DEFAULT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, signed_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, updated_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, customer_id INT DEFAULT NULL, PRIMARY KEY (id))');
|
||||
$this->addSql('CREATE INDEX IDX_603499939395C3F3 ON contrat (customer_id)');
|
||||
$this->addSql('ALTER TABLE contrat ADD CONSTRAINT FK_603499939395C3F3 FOREIGN KEY (customer_id) REFERENCES customer (id) ON DELETE SET NULL NOT DEFERRABLE');
|
||||
}
|
||||
|
||||
public function down(Schema $schema): void
|
||||
{
|
||||
// this down() migration is auto-generated, please modify it to your needs
|
||||
$this->addSql('ALTER TABLE contrat DROP CONSTRAINT FK_603499939395C3F3');
|
||||
$this->addSql('DROP TABLE contrat');
|
||||
}
|
||||
}
|
||||
@@ -3,12 +3,20 @@
|
||||
namespace App\Controller\Admin;
|
||||
|
||||
use App\Entity\Contrat;
|
||||
use App\Service\DocuSealService;
|
||||
use App\Service\MailerService;
|
||||
use App\Service\Pdf\ContratMigrationSiteconseilPdf;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\DependencyInjection\Attribute\Autowire;
|
||||
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpKernel\KernelInterface;
|
||||
use Symfony\Component\Routing\Attribute\Route;
|
||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||
use Symfony\Component\Security\Http\Attribute\IsGranted;
|
||||
use Twig\Environment;
|
||||
|
||||
#[Route('/admin/contrats', name: 'app_admin_contrats_')]
|
||||
#[IsGranted('ROLE_EMPLOYE')]
|
||||
@@ -30,7 +38,7 @@ class ContratController extends AbstractController
|
||||
}
|
||||
|
||||
#[Route('/create', name: 'create', methods: ['POST'])]
|
||||
public function create(Request $request): Response
|
||||
public function create(Request $request, KernelInterface $kernel): Response
|
||||
{
|
||||
$email = trim($request->request->getString('email'));
|
||||
$raisonSociale = trim($request->request->getString('raisonSociale'));
|
||||
@@ -52,7 +60,10 @@ class ContratController extends AbstractController
|
||||
$this->em->persist($contrat);
|
||||
$this->em->flush();
|
||||
|
||||
$this->addFlash('success', 'Contrat '.$contrat->getReference().' cree.');
|
||||
// Generer le PDF selon le type
|
||||
$this->generateContratPdf($contrat, $kernel);
|
||||
|
||||
$this->addFlash('success', 'Contrat '.$contrat->getReference().' cree avec PDF.');
|
||||
|
||||
return $this->redirectToRoute('app_admin_contrats_show', ['id' => $contrat->getId()]);
|
||||
}
|
||||
@@ -70,6 +81,124 @@ class ContratController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route('/{id}/generate-pdf', name: 'generate_pdf', requirements: ['id' => '\d+'], methods: ['POST'])]
|
||||
public function generatePdf(int $id, KernelInterface $kernel): Response
|
||||
{
|
||||
$contrat = $this->em->getRepository(Contrat::class)->find($id);
|
||||
if (null === $contrat) {
|
||||
throw $this->createNotFoundException('Contrat introuvable');
|
||||
}
|
||||
|
||||
$this->generateContratPdf($contrat, $kernel);
|
||||
$this->addFlash('success', 'PDF regenere.');
|
||||
|
||||
return $this->redirectToRoute('app_admin_contrats_show', ['id' => $id]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Envoie le contrat pour signature DocuSeal (2 parties : Company auto-signe + Client signe).
|
||||
*/
|
||||
#[Route('/{id}/send-signature', name: 'send_signature', requirements: ['id' => '\d+'], methods: ['POST'])]
|
||||
public function sendSignature(
|
||||
int $id,
|
||||
DocuSealService $docuSeal,
|
||||
MailerService $mailer,
|
||||
Environment $twig,
|
||||
UrlGeneratorInterface $urlGenerator,
|
||||
#[Autowire(env: 'DOCUSEAL_URL')] string $docuSealUrl = '',
|
||||
#[Autowire('%kernel.project_dir%')] string $projectDir = '',
|
||||
): Response {
|
||||
$contrat = $this->em->getRepository(Contrat::class)->find($id);
|
||||
if (null === $contrat) {
|
||||
throw $this->createNotFoundException('Contrat introuvable');
|
||||
}
|
||||
|
||||
if (null === $contrat->getPdfUnsigned()) {
|
||||
$this->addFlash('error', 'Le PDF doit etre genere avant l\'envoi.');
|
||||
|
||||
return $this->redirectToRoute('app_admin_contrats_show', ['id' => $id]);
|
||||
}
|
||||
|
||||
$pdfPath = $projectDir.'/public/uploads/contrats/'.$contrat->getPdfUnsigned();
|
||||
if (!file_exists($pdfPath)) {
|
||||
$this->addFlash('error', 'Fichier PDF introuvable.');
|
||||
|
||||
return $this->redirectToRoute('app_admin_contrats_show', ['id' => $id]);
|
||||
}
|
||||
|
||||
$signedRedirectUrl = $urlGenerator->generate('app_admin_contrats_show', [
|
||||
'id' => $contrat->getId(),
|
||||
], UrlGeneratorInterface::ABSOLUTE_URL);
|
||||
|
||||
try {
|
||||
$pdfBase64 = base64_encode(file_get_contents($pdfPath));
|
||||
|
||||
$result = $docuSeal->getApi()->createSubmissionFromPdf([
|
||||
'name' => 'Contrat '.$contrat->getReference().' - '.$contrat->getRaisonSociale(),
|
||||
'send_email' => false,
|
||||
'flatten' => true,
|
||||
'documents' => [[
|
||||
'name' => 'contrat-'.$contrat->getReference().'.pdf',
|
||||
'file' => 'data:application/pdf;base64,'.$pdfBase64,
|
||||
]],
|
||||
'submitters' => [
|
||||
[
|
||||
'email' => 'contact@e-cosplay.fr',
|
||||
'name' => 'Association E-Cosplay',
|
||||
'role' => 'Company',
|
||||
'completed' => true,
|
||||
'send_email' => false,
|
||||
'values' => ['Sign' => $docuSeal->getLogoBase64()],
|
||||
'metadata' => ['doc_type' => 'contrat', 'contrat_id' => $contrat->getId()],
|
||||
],
|
||||
[
|
||||
'email' => $contrat->getEmail(),
|
||||
'name' => $contrat->getRaisonSociale(),
|
||||
'role' => 'First Party',
|
||||
'send_email' => false,
|
||||
'completed_redirect_url' => $signedRedirectUrl,
|
||||
'metadata' => ['doc_type' => 'contrat', 'contrat_id' => $contrat->getId()],
|
||||
],
|
||||
],
|
||||
]);
|
||||
|
||||
$submitterId = $result['submitters'][1]['id'] ?? ($result[1]['id'] ?? null);
|
||||
$companySubmitterId = $result['submitters'][0]['id'] ?? ($result[0]['id'] ?? null);
|
||||
|
||||
if (null !== $submitterId) {
|
||||
$contrat->setSubmissionId((string) $submitterId);
|
||||
$contrat->setSubmitterCompanyId(null !== $companySubmitterId ? (int) $companySubmitterId : null);
|
||||
$contrat->setSubmitterCustomerId((int) $submitterId);
|
||||
$contrat->setState(Contrat::STATE_SEND);
|
||||
$this->em->flush();
|
||||
|
||||
// Envoyer email au client avec le lien
|
||||
$slug = $docuSeal->getSubmitterSlug($submitterId);
|
||||
$signUrl = null !== $slug ? rtrim($docuSealUrl, '/').'/s/'.$slug : null;
|
||||
|
||||
$mailer->sendEmail(
|
||||
$contrat->getEmail(),
|
||||
'Contrat a signer - '.$contrat->getTypeLabel().' - '.$contrat->getReference(),
|
||||
$twig->render('emails/contrat_signature.html.twig', [
|
||||
'contrat' => $contrat,
|
||||
'signUrl' => $signUrl,
|
||||
]),
|
||||
null,
|
||||
null,
|
||||
false,
|
||||
);
|
||||
|
||||
$this->addFlash('success', 'Contrat envoye pour signature a '.$contrat->getEmail().'.');
|
||||
} else {
|
||||
$this->addFlash('error', 'Erreur DocuSeal : aucun submitter retourne.');
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
$this->addFlash('error', 'Erreur DocuSeal : '.$e->getMessage());
|
||||
}
|
||||
|
||||
return $this->redirectToRoute('app_admin_contrats_show', ['id' => $id]);
|
||||
}
|
||||
|
||||
#[Route('/{id}/cancel', name: 'cancel', requirements: ['id' => '\d+'], methods: ['POST'])]
|
||||
public function cancel(int $id): Response
|
||||
{
|
||||
@@ -85,4 +214,29 @@ class ContratController extends AbstractController
|
||||
|
||||
return $this->redirectToRoute('app_admin_contrats_index');
|
||||
}
|
||||
|
||||
private function generateContratPdf(Contrat $contrat, KernelInterface $kernel): void
|
||||
{
|
||||
$pdf = match ($contrat->getType()) {
|
||||
Contrat::TYPE_MIGRATION_SITECONSEIL => new ContratMigrationSiteconseilPdf($kernel, $contrat),
|
||||
default => throw new \RuntimeException('Type de contrat non supporte : '.$contrat->getType()),
|
||||
};
|
||||
|
||||
$pdf->generate();
|
||||
|
||||
$tmpPath = tempnam(sys_get_temp_dir(), 'contrat_').'.pdf';
|
||||
$pdf->Output('F', $tmpPath);
|
||||
|
||||
$contrat->setPdfUnsignedFile(new UploadedFile(
|
||||
$tmpPath,
|
||||
'contrat-'.$contrat->getReference().'.pdf',
|
||||
'application/pdf',
|
||||
null,
|
||||
true,
|
||||
));
|
||||
$contrat->setUpdatedAt(new \DateTimeImmutable());
|
||||
$this->em->flush();
|
||||
|
||||
@unlink($tmpPath);
|
||||
}
|
||||
}
|
||||
|
||||
16
src/Controller/MoveFromSiteconseilController.php
Normal file
16
src/Controller/MoveFromSiteconseilController.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controller;
|
||||
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\Attribute\Route;
|
||||
|
||||
class MoveFromSiteconseilController extends AbstractController
|
||||
{
|
||||
#[Route('/move/from/siteconseil', name: 'app_move_from_siteconseil')]
|
||||
public function index(): Response
|
||||
{
|
||||
return $this->render('move/siteconseil.html.twig');
|
||||
}
|
||||
}
|
||||
@@ -64,6 +64,10 @@ class WebhookDocuSealController extends AbstractController
|
||||
}
|
||||
|
||||
// Dispatch par type de document
|
||||
if ('contrat' === $docType) {
|
||||
return $this->handleContratEvent($eventType, $data, $metadata, $mailer, $twig, $em, $projectDir);
|
||||
}
|
||||
|
||||
if ('attestation_custom' === $docType) {
|
||||
return $this->handleAttestationCustomEvent($eventType, $data, $metadata, $em, $projectDir);
|
||||
}
|
||||
@@ -183,6 +187,119 @@ class WebhookDocuSealController extends AbstractController
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, mixed> $data
|
||||
* @param array<string, mixed> $metadata
|
||||
*/
|
||||
private function handleContratEvent(
|
||||
string $eventType,
|
||||
array $data,
|
||||
array $metadata,
|
||||
MailerService $mailer,
|
||||
Environment $twig,
|
||||
EntityManagerInterface $em,
|
||||
string $projectDir,
|
||||
): JsonResponse {
|
||||
if ('form.completed' !== $eventType) {
|
||||
return new JsonResponse(['status' => 'ok', 'event' => $eventType, 'doc_type' => 'contrat']);
|
||||
}
|
||||
|
||||
$contratId = $metadata['contrat_id'] ?? null;
|
||||
if (null === $contratId) {
|
||||
return new JsonResponse(['status' => 'ignored', 'reason' => 'contrat_id missing']);
|
||||
}
|
||||
|
||||
$contrat = $em->getRepository(\App\Entity\Contrat::class)->find((int) $contratId);
|
||||
if (null === $contrat) {
|
||||
return new JsonResponse(['status' => 'ignored', 'reason' => 'contrat not found']);
|
||||
}
|
||||
|
||||
// Telecharger les PDFs signes
|
||||
$tmpFiles = [];
|
||||
|
||||
$documents = $data['documents'] ?? [];
|
||||
$pdfUrl = $documents[0]['url'] ?? null;
|
||||
if (null !== $pdfUrl) {
|
||||
$content = @file_get_contents($pdfUrl);
|
||||
if (false !== $content && str_starts_with($content, '%PDF')) {
|
||||
$tmp = tempnam(sys_get_temp_dir(), 'ctr_signed_').'.pdf';
|
||||
file_put_contents($tmp, $content);
|
||||
$contrat->setPdfSignedFile(new \Symfony\Component\HttpFoundation\File\UploadedFile($tmp, 'contrat-signe-'.$contrat->getReference().'.pdf', 'application/pdf', null, true));
|
||||
$tmpFiles[] = $tmp;
|
||||
}
|
||||
}
|
||||
|
||||
$auditUrl = $data['audit_log_url'] ?? null;
|
||||
if (null !== $auditUrl) {
|
||||
$auditContent = @file_get_contents($auditUrl);
|
||||
if (false !== $auditContent) {
|
||||
$tmp = tempnam(sys_get_temp_dir(), 'ctr_audit_').'.pdf';
|
||||
file_put_contents($tmp, $auditContent);
|
||||
$contrat->setPdfAuditFile(new \Symfony\Component\HttpFoundation\File\UploadedFile($tmp, 'audit-'.$contrat->getReference().'.pdf', 'application/pdf', null, true));
|
||||
$tmpFiles[] = $tmp;
|
||||
}
|
||||
}
|
||||
|
||||
$contrat->setState(\App\Entity\Contrat::STATE_SIGNED);
|
||||
$contrat->setSignedAt(new \DateTimeImmutable());
|
||||
$em->flush();
|
||||
|
||||
foreach ($tmpFiles as $f) {
|
||||
@unlink($f);
|
||||
}
|
||||
|
||||
// Pieces jointes
|
||||
$attachments = [];
|
||||
if (null !== $contrat->getPdfSigned()) {
|
||||
$signedPath = $projectDir.'/public/uploads/contrats/signed/'.$contrat->getPdfSigned();
|
||||
if (file_exists($signedPath)) {
|
||||
$attachments[] = ['path' => $signedPath, 'name' => 'contrat-signe-'.$contrat->getReference().'.pdf'];
|
||||
}
|
||||
}
|
||||
if (null !== $contrat->getPdfAudit()) {
|
||||
$auditPath = $projectDir.'/public/uploads/contrats/audit/'.$contrat->getPdfAudit();
|
||||
if (file_exists($auditPath)) {
|
||||
$attachments[] = ['path' => $auditPath, 'name' => 'audit-'.$contrat->getReference().'.pdf'];
|
||||
}
|
||||
}
|
||||
|
||||
// Mail client
|
||||
try {
|
||||
$mailer->sendEmail(
|
||||
$contrat->getEmail(),
|
||||
'Contrat '.$contrat->getReference().' signe - '.$contrat->getTypeLabel(),
|
||||
$twig->render('emails/contrat_signed.html.twig', [
|
||||
'contrat' => $contrat,
|
||||
]),
|
||||
null,
|
||||
null,
|
||||
false,
|
||||
$attachments,
|
||||
);
|
||||
} catch (\Throwable) {
|
||||
// silencieux
|
||||
}
|
||||
|
||||
// Mail admin
|
||||
try {
|
||||
$mailer->sendEmail(
|
||||
self::MONITOR_EMAIL,
|
||||
'Contrat '.$contrat->getReference().' signe par '.$contrat->getRaisonSociale(),
|
||||
$twig->render('emails/contrat_signed.html.twig', [
|
||||
'contrat' => $contrat,
|
||||
]),
|
||||
null,
|
||||
null,
|
||||
false,
|
||||
$attachments,
|
||||
);
|
||||
} catch (\Throwable) {
|
||||
// silencieux
|
||||
}
|
||||
|
||||
return new JsonResponse(['status' => 'ok', 'event' => 'contrat_signed', 'reference' => $contrat->getReference()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, mixed> $data
|
||||
* @param array<string, mixed> $metadata
|
||||
|
||||
291
src/Service/Pdf/ContratMigrationSiteconseilPdf.php
Normal file
291
src/Service/Pdf/ContratMigrationSiteconseilPdf.php
Normal file
@@ -0,0 +1,291 @@
|
||||
<?php
|
||||
|
||||
namespace App\Service\Pdf;
|
||||
|
||||
use App\Entity\Contrat;
|
||||
use setasign\Fpdi\Fpdi;
|
||||
use Symfony\Component\HttpKernel\KernelInterface;
|
||||
|
||||
class ContratMigrationSiteconseilPdf extends Fpdi
|
||||
{
|
||||
public function __construct(
|
||||
private readonly KernelInterface $kernel,
|
||||
private readonly Contrat $contrat,
|
||||
) {
|
||||
parent::__construct();
|
||||
$this->SetTitle($this->enc('Contrat Migration '.$this->contrat->getReference().' - '.$this->contrat->getRaisonSociale()));
|
||||
$this->SetAuthor($this->enc('Association E-Cosplay'));
|
||||
}
|
||||
|
||||
public function generate(): void
|
||||
{
|
||||
$this->AliasNbPages();
|
||||
$this->AddPage();
|
||||
|
||||
$this->writeHeader();
|
||||
$this->writePreambule();
|
||||
$this->writeArticles();
|
||||
$this->writeSignatures();
|
||||
}
|
||||
|
||||
/** @codeCoverageIgnore */
|
||||
public function Header(): void
|
||||
{
|
||||
}
|
||||
|
||||
/** @codeCoverageIgnore */
|
||||
public function Footer(): void
|
||||
{
|
||||
$this->SetY(-22);
|
||||
$this->SetDrawColor(253, 140, 4);
|
||||
$this->Line(15, $this->GetY(), 195, $this->GetY());
|
||||
$this->Ln(3);
|
||||
$this->SetFont('Arial', '', 7);
|
||||
$this->SetTextColor(0, 0, 0);
|
||||
$this->Cell(190, 3, $this->enc('42 rue de Saint-Quentin - 02800 BEAUTOR - Tel: 06 79 34 88 02 - contact@e-cosplay.fr'), 0, 1, 'C');
|
||||
$this->Cell(190, 3, $this->enc('Association E-Cosplay - N SIRET 943 121 517 00011 - CODE APE 9329Z - RNA W022006988'), 0, 1, 'C');
|
||||
$this->SetFont('Arial', 'I', 7);
|
||||
$this->SetTextColor(150, 150, 150);
|
||||
$this->Cell(190, 3, $this->enc('Page ').$this->PageNo().' / {nb}', 0, 0, 'C');
|
||||
}
|
||||
|
||||
/** @codeCoverageIgnore */
|
||||
private function writeHeader(): void
|
||||
{
|
||||
$logo = $this->kernel->getProjectDir().'/public/logo.jpg';
|
||||
if (file_exists($logo)) {
|
||||
$this->Image($logo, 10, 8, 45);
|
||||
}
|
||||
|
||||
$this->SetFont('Arial', 'B', 14);
|
||||
$this->SetXY(60, 10);
|
||||
$this->Cell(0, 7, $this->enc('CONTRAT DE MIGRATION'), 0, 1, 'L');
|
||||
|
||||
$this->SetFont('Arial', 'B', 10);
|
||||
$this->SetXY(60, 17);
|
||||
$this->SetTextColor(253, 140, 4);
|
||||
$this->Cell(0, 5, $this->enc('Transfert de services SARL SITECONSEIL'), 0, 1, 'L');
|
||||
$this->SetTextColor(0, 0, 0);
|
||||
|
||||
$this->SetFont('Arial', '', 9);
|
||||
$this->SetXY(60, 23);
|
||||
$this->SetTextColor(150, 150, 150);
|
||||
$this->Cell(0, 5, $this->enc('Ref. : '.$this->contrat->getReference()), 0, 1, 'L');
|
||||
$this->SetTextColor(0, 0, 0);
|
||||
|
||||
$formatter = new \IntlDateFormatter(
|
||||
'fr_FR',
|
||||
\IntlDateFormatter::FULL,
|
||||
\IntlDateFormatter::NONE,
|
||||
'Europe/Paris',
|
||||
\IntlDateFormatter::GREGORIAN
|
||||
);
|
||||
|
||||
$this->SetFont('Arial', '', 10);
|
||||
$this->SetXY(60, 29);
|
||||
$this->Cell(0, 5, $this->enc('Emis a Beautor, le '.$formatter->format($this->contrat->getCreatedAt())), 0, 1, 'L');
|
||||
|
||||
// Parties
|
||||
$this->SetY(42);
|
||||
|
||||
// Partie 1 : Association
|
||||
$this->SetFont('Arial', 'B', 9);
|
||||
$this->Cell(0, 5, $this->enc('ENTRE LES SOUSSIGNES :'), 0, 1, 'L');
|
||||
$this->Ln(2);
|
||||
$this->SetFont('Arial', '', 9);
|
||||
$this->MultiCell(0, 4, $this->enc(
|
||||
'L\'Association E-Cosplay, association loi 1901, immatriculee sous le numero '
|
||||
.'SIRET 943 121 517 00011, dont le siege social est situe au 42 rue de Saint-Quentin, '
|
||||
.'02800 BEAUTOR, representee par son/sa President(e),'
|
||||
), 0, 'L');
|
||||
$this->SetFont('Arial', 'I', 9);
|
||||
$this->Cell(0, 5, $this->enc('Ci-apres denommee "le Prestataire",'), 0, 1, 'L');
|
||||
$this->Ln(3);
|
||||
|
||||
// Partie 2 : Client
|
||||
$this->SetFont('Arial', 'B', 9);
|
||||
$this->Cell(0, 5, $this->enc('ET :'), 0, 1, 'L');
|
||||
$this->Ln(2);
|
||||
$this->SetFont('Arial', '', 9);
|
||||
$this->MultiCell(0, 4, $this->enc(
|
||||
$this->contrat->getRaisonSociale().', '
|
||||
.'joignable a l\'adresse email '.$this->contrat->getEmail().','
|
||||
), 0, 'L');
|
||||
$this->SetFont('Arial', 'I', 9);
|
||||
$this->Cell(0, 5, $this->enc('Ci-apres denomme(e) "le Client",'), 0, 1, 'L');
|
||||
$this->Ln(5);
|
||||
}
|
||||
|
||||
/** @codeCoverageIgnore */
|
||||
private function writePreambule(): void
|
||||
{
|
||||
$this->SetFont('Arial', 'B', 11);
|
||||
$this->SetFillColor(250, 191, 4);
|
||||
$this->Cell(0, 8, $this->enc(' PREAMBULE'), 0, 1, 'L', true);
|
||||
$this->Ln(4);
|
||||
|
||||
$this->SetFont('Arial', '', 9);
|
||||
$paragraphs = [
|
||||
'Dans le cadre de la cessation d\'activite de la SARL SITECONSEIL, l\'Association E-Cosplay '
|
||||
.'assure depuis plusieurs mois la gestion de l\'infrastructure technique et des services '
|
||||
.'precedemment operes par la SARL SITECONSEIL, dans un objectif de continuite de service '
|
||||
.'pour l\'ensemble des clients concernes.',
|
||||
|
||||
'La SARL SITECONSEIL a decide de transmettre la gestion de vos services a l\'Association '
|
||||
.'E-Cosplay. Cette transmission necessite la signature d\'un nouveau contrat de prestation '
|
||||
.'entre vous et l\'Association E-Cosplay.',
|
||||
|
||||
'Le present contrat definit les conditions dans lesquelles l\'Association E-Cosplay '
|
||||
.'poursuivra la fourniture des services dont vous beneficiez jusqu\'a present.',
|
||||
];
|
||||
|
||||
foreach ($paragraphs as $p) {
|
||||
$this->MultiCell(0, 5, $this->enc($p), 0, 'J');
|
||||
$this->Ln(2);
|
||||
}
|
||||
|
||||
// Avertissement important
|
||||
$this->Ln(2);
|
||||
$this->SetFillColor(255, 247, 237);
|
||||
$this->SetDrawColor(234, 88, 12);
|
||||
$this->Rect($this->GetX(), $this->GetY(), 180, 18, 'DF');
|
||||
|
||||
$this->SetFont('Arial', 'B', 9);
|
||||
$this->SetTextColor(154, 52, 18);
|
||||
$this->SetX(15);
|
||||
$this->Cell(0, 6, $this->enc('ATTENTION :'), 0, 1, 'L');
|
||||
$this->SetFont('Arial', '', 8);
|
||||
$this->SetX(15);
|
||||
$this->MultiCell(170, 4, $this->enc(
|
||||
'L\'Association E-Cosplay ne prendra pas en compte votre anciennete avec la SARL SITECONSEIL, '
|
||||
.'ni les accords ou conditions particulieres que vous auriez pu conclure avec cette derniere. '
|
||||
.'Le present contrat constitue un engagement nouveau et independant.'
|
||||
), 0, 'J');
|
||||
$this->SetTextColor(0, 0, 0);
|
||||
$this->SetDrawColor(200, 200, 200);
|
||||
$this->Ln(5);
|
||||
}
|
||||
|
||||
/** @codeCoverageIgnore */
|
||||
private function writeArticles(): void
|
||||
{
|
||||
$articles = [
|
||||
'OBJET DU CONTRAT' => [
|
||||
'Le present contrat a pour objet de definir les conditions dans lesquelles l\'Association '
|
||||
.'E-Cosplay fournira au Client les services informatiques precedemment assures par la '
|
||||
.'SARL SITECONSEIL, incluant sans s\'y limiter : l\'hebergement web, la gestion des noms '
|
||||
.'de domaine, la messagerie electronique, et tout autre service technique associe.',
|
||||
],
|
||||
'TRANSFERT DES SERVICES' => [
|
||||
'Le Client reconnait que les services qui lui etaient fournis par la SARL SITECONSEIL '
|
||||
.'sont desormais operes par l\'Association E-Cosplay.',
|
||||
'Le Client accepte que le transfert de ses services soit effectue dans les conditions '
|
||||
.'du present contrat, sans garantie de reprise des conditions anterieures.',
|
||||
],
|
||||
'CONDITIONS TARIFAIRES' => [
|
||||
'Les tarifs applicables seront ceux en vigueur au sein de l\'Association E-Cosplay '
|
||||
.'au moment de la signature du present contrat.',
|
||||
'Les tarifs precedemment appliques par la SARL SITECONSEIL ne sont pas opposables '
|
||||
.'a l\'Association E-Cosplay.',
|
||||
'Les devis et factures seront emis par l\'Association E-Cosplay selon sa propre grille tarifaire.',
|
||||
],
|
||||
'DUREE ET RESILIATION' => [
|
||||
'Le present contrat prend effet a la date de sa signature et est conclu pour une duree indeterminee.',
|
||||
'Chacune des parties peut resilier le contrat a tout moment, sous reserve d\'un preavis '
|
||||
.'de 30 jours, notifie par email avec accuse de reception.',
|
||||
],
|
||||
'ANCIENNETE ET DROITS ANTERIEURS' => [
|
||||
'Le Client reconnait expressement que l\'Association E-Cosplay ne reprend aucun '
|
||||
.'engagement, garantie, condition particuliere ou anciennete lies aux relations '
|
||||
.'commerciales entre le Client et la SARL SITECONSEIL.',
|
||||
'Tout litige relatif aux prestations anterieures de la SARL SITECONSEIL devra etre '
|
||||
.'dirige exclusivement vers cette derniere.',
|
||||
],
|
||||
'RESPONSABILITE' => [
|
||||
'L\'Association E-Cosplay s\'engage a assurer la continuite des services dans la mesure '
|
||||
.'du possible. Elle ne saurait etre tenue responsable des interruptions de service '
|
||||
.'liees a la transition depuis la SARL SITECONSEIL.',
|
||||
],
|
||||
'DONNEES PERSONNELLES' => [
|
||||
'L\'Association E-Cosplay s\'engage a traiter les donnees personnelles du Client '
|
||||
.'conformement au Reglement General sur la Protection des Donnees (RGPD) et a la '
|
||||
.'loi Informatique et Libertes.',
|
||||
],
|
||||
'DROIT APPLICABLE ET JURIDICTION' => [
|
||||
'Le present contrat est soumis au droit francais. En cas de litige, les parties '
|
||||
.'s\'engagent a rechercher une solution amiable. A defaut, les tribunaux competents '
|
||||
.'de Laon seront seuls competents.',
|
||||
],
|
||||
];
|
||||
|
||||
$articleNum = 1;
|
||||
foreach ($articles as $title => $contents) {
|
||||
if ($this->GetY() + 25 > $this->GetPageHeight() - 25) {
|
||||
$this->AddPage();
|
||||
}
|
||||
|
||||
$this->SetFont('Arial', 'B', 10);
|
||||
$this->Cell(0, 6, $this->enc('Article '.$articleNum.' - '.$title), 0, 1, 'L');
|
||||
$this->Ln(1);
|
||||
|
||||
$this->SetFont('Arial', '', 9);
|
||||
foreach ($contents as $content) {
|
||||
$this->MultiCell(0, 4, $this->enc($content), 0, 'J');
|
||||
$this->Ln(2);
|
||||
}
|
||||
|
||||
$this->Ln(2);
|
||||
++$articleNum;
|
||||
}
|
||||
}
|
||||
|
||||
/** @codeCoverageIgnore */
|
||||
private function writeSignatures(): void
|
||||
{
|
||||
if ($this->GetY() + 50 > $this->GetPageHeight() - 25) {
|
||||
$this->AddPage();
|
||||
}
|
||||
|
||||
$this->SetDrawColor(200, 200, 200);
|
||||
$this->Cell(0, 0.5, '', 'T', 1, 'L');
|
||||
$this->Ln(3);
|
||||
|
||||
$formatter = new \IntlDateFormatter(
|
||||
'fr_FR',
|
||||
\IntlDateFormatter::LONG,
|
||||
\IntlDateFormatter::NONE,
|
||||
'Europe/Paris',
|
||||
\IntlDateFormatter::GREGORIAN
|
||||
);
|
||||
|
||||
$this->SetFont('Arial', '', 9);
|
||||
$this->Cell(0, 5, $this->enc('Fait a Beautor, le '.$formatter->format(new \DateTime()).', en deux exemplaires.'), 0, 1, 'L');
|
||||
$this->Ln(5);
|
||||
|
||||
$colWidth = 85;
|
||||
|
||||
// Labels
|
||||
$this->SetFont('Arial', 'B', 9);
|
||||
$this->Cell($colWidth, 5, $this->enc('Pour l\'Association E-Cosplay :'), 0, 0, 'L');
|
||||
$this->Cell(10, 5, '', 0, 0);
|
||||
$this->Cell($colWidth, 5, $this->enc('Le Client ('.$this->contrat->getRaisonSociale().') :'), 0, 1, 'L');
|
||||
$this->Ln(2);
|
||||
|
||||
// Signatures DocuSeal
|
||||
$this->SetFont('Arial', '', 10);
|
||||
$this->Cell($colWidth, 20, '{{Sign;type=signature;role=Company}}', 0, 0, 'L');
|
||||
$this->Cell(10, 20, '', 0, 0);
|
||||
$this->Cell($colWidth, 20, '{{SignClient;type=signature;role=First Party}}', 0, 1, 'L');
|
||||
|
||||
$this->Ln(5);
|
||||
$this->SetFont('Arial', 'I', 8);
|
||||
$this->SetTextColor(150, 150, 150);
|
||||
$this->Cell(0, 4, $this->enc('Signature electronique via DocuSeal - Valeur juridique (reglement eIDAS, art. 1367 Code civil)'), 0, 1, 'C');
|
||||
$this->SetTextColor(0, 0, 0);
|
||||
}
|
||||
|
||||
private function enc(string $text): string
|
||||
{
|
||||
return mb_convert_encoding($text, 'Windows-1252', 'UTF-8');
|
||||
}
|
||||
}
|
||||
@@ -56,12 +56,28 @@
|
||||
|
||||
{# Actions #}
|
||||
<div class="flex flex-wrap gap-2 mb-6">
|
||||
{% if contrat.pdfUnsigned %}
|
||||
{% if contrat.state == 'draft' %}
|
||||
{% if contrat.pdfUnsigned %}
|
||||
<form method="post" action="{{ path('app_admin_contrats_generate_pdf', {id: contrat.id}) }}" data-confirm="Regenerer le PDF ?">
|
||||
<button type="submit" class="px-4 py-2 bg-yellow-500/20 text-yellow-700 hover:bg-yellow-500 hover:text-white font-bold uppercase text-[10px] tracking-wider transition-all">Regenerer PDF</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if contrat.pdfUnsigned and contrat.state in ['draft', 'send'] %}
|
||||
<a href="{{ vich_uploader_asset(contrat, 'pdfUnsignedFile') }}" target="_blank"
|
||||
class="px-4 py-2 bg-gray-900 text-white font-bold uppercase text-[10px] tracking-wider hover:bg-[#fabf04] hover:text-gray-900 transition-all">
|
||||
Voir PDF
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if contrat.state == 'draft' and contrat.pdfUnsigned %}
|
||||
<form method="post" action="{{ path('app_admin_contrats_send_signature', {id: contrat.id}) }}" data-confirm="Envoyer le contrat pour signature au client {{ contrat.raisonSociale }} ({{ contrat.email }}) ?">
|
||||
<button type="submit" class="px-4 py-2 bg-purple-500/20 text-purple-700 hover:bg-purple-500 hover:text-white font-bold uppercase text-[10px] tracking-wider transition-all">Envoyer pour signature</button>
|
||||
</form>
|
||||
{% elseif contrat.state == 'send' and contrat.pdfUnsigned %}
|
||||
<form method="post" action="{{ path('app_admin_contrats_send_signature', {id: contrat.id}) }}" data-confirm="Renvoyer le contrat pour signature ?">
|
||||
<button type="submit" class="px-4 py-2 bg-purple-500/20 text-purple-700 hover:bg-purple-500 hover:text-white font-bold uppercase text-[10px] tracking-wider transition-all">Renvoyer signature</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% if contrat.pdfSigned %}
|
||||
<a href="{{ vich_uploader_asset(contrat, 'pdfSignedFile') }}" target="_blank"
|
||||
class="px-4 py-2 bg-green-500/20 text-green-700 font-bold uppercase text-[10px] tracking-wider hover:bg-green-500 hover:text-white transition-all">
|
||||
|
||||
60
templates/emails/contrat_signature.html.twig
Normal file
60
templates/emails/contrat_signature.html.twig
Normal file
@@ -0,0 +1,60 @@
|
||||
{% extends 'email/base.html.twig' %}
|
||||
|
||||
{% block content %}
|
||||
<table width="600" cellpadding="0" cellspacing="0" style="margin: 0 auto;">
|
||||
<tr>
|
||||
<td style="padding: 32px;">
|
||||
<h1 style="font-family: Arial, Helvetica, sans-serif; font-size: 22px; font-weight: 700; color: #111827; margin: 0 0 16px;">Chez {{ contrat.raisonSociale }},</h1>
|
||||
|
||||
<p style="font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #374151; line-height: 22px; margin: 0 0 16px;">
|
||||
Dans le cadre de la cessation d'activite de la SARL SITECONSEIL, l'Association E-Cosplay assure desormais la gestion de vos services. Un nouveau contrat doit etre signe pour officialiser cette transition.
|
||||
</p>
|
||||
|
||||
<p style="font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #374151; line-height: 22px; margin: 0 0 16px;">
|
||||
Nous vous invitons a prendre connaissance de toutes les informations relatives a cette migration en consultant la page dediee :
|
||||
</p>
|
||||
|
||||
<table cellpadding="0" cellspacing="0" style="margin: 20px auto;">
|
||||
<tr>
|
||||
<td style="background-color: #111827; padding: 14px 32px;">
|
||||
<a href="{{ url('app_move_from_siteconseil') }}" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #fabf04; text-decoration: none;">En savoir plus sur la migration</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<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%;">Reference</td>
|
||||
<td style="padding: 10px 16px; font-family: monospace; font-size: 13px; font-weight: 700;">{{ contrat.reference }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding: 10px 16px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #9ca3af; background: #f9fafb;">Type</td>
|
||||
<td style="padding: 10px 16px; font-size: 13px; font-weight: 700;">{{ contrat.typeLabel }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
{% if signUrl %}
|
||||
<p style="font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #374151; line-height: 22px; margin: 16px 0;">
|
||||
Une fois informe, veuillez signer le contrat en cliquant ci-dessous :
|
||||
</p>
|
||||
<table cellpadding="0" cellspacing="0" style="margin: 20px auto;">
|
||||
<tr>
|
||||
<td style="background-color: #fabf04; padding: 14px 32px;">
|
||||
<a href="{{ signUrl }}" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #111827; text-decoration: none;">Signer le contrat</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{% endif %}
|
||||
|
||||
<div style="background: #fff7ed; border-left: 4px solid #ea580c; padding: 12px 16px; margin: 20px 0;">
|
||||
<p style="font-family: Arial, Helvetica, sans-serif; font-size: 11px; font-weight: 700; color: #9a3412; margin: 0 0 4px;">Important</p>
|
||||
<p style="font-family: Arial, Helvetica, sans-serif; font-size: 11px; color: #374151; margin: 0;">L'Association E-Cosplay ne prendra pas en compte votre anciennete avec la SARL SITECONSEIL, ni les accords ou conditions particulieres conclus avec cette derniere.</p>
|
||||
</div>
|
||||
|
||||
<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 %}
|
||||
44
templates/emails/contrat_signed.html.twig
Normal file
44
templates/emails/contrat_signed.html.twig
Normal file
@@ -0,0 +1,44 @@
|
||||
{% extends 'email/base.html.twig' %}
|
||||
|
||||
{% block content %}
|
||||
<table width="600" cellpadding="0" cellspacing="0" style="margin: 0 auto;">
|
||||
<tr>
|
||||
<td style="padding: 32px;">
|
||||
<h1 style="font-family: Arial, Helvetica, sans-serif; font-size: 22px; font-weight: 700; color: #111827; margin: 0 0 16px;">Chez {{ contrat.raisonSociale }},</h1>
|
||||
|
||||
<div style="background: #f0fdf4; border: 1px solid #bbf7d0; padding: 16px; margin: 0 0 20px;">
|
||||
<p style="font-family: Arial, Helvetica, sans-serif; font-size: 14px; font-weight: 700; color: #16a34a; margin: 0;">
|
||||
Contrat {{ contrat.reference }} signe avec succes
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p style="font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #374151; line-height: 22px; margin: 0 0 16px;">
|
||||
Votre contrat a ete signe avec succes. Vous trouverez en piece jointe le contrat signe ainsi que le certificat d'audit de signature.
|
||||
</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%;">Reference</td>
|
||||
<td style="padding: 10px 16px; font-family: monospace; font-size: 13px; font-weight: 700;">{{ contrat.reference }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding: 10px 16px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #9ca3af; background: #f9fafb;">Type</td>
|
||||
<td style="padding: 10px 16px; font-size: 13px; font-weight: 700;">{{ contrat.typeLabel }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding: 10px 16px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #9ca3af; background: #f9fafb;">Signe le</td>
|
||||
<td style="padding: 10px 16px; font-size: 13px; font-weight: 700; color: #16a34a;">{{ contrat.signedAt ? contrat.signedAt|date('d/m/Y H:i') : 'Maintenant' }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p style="font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #374151; line-height: 22px; margin: 16px 0;">
|
||||
Votre espace client sera cree prochainement. Vous recevrez un email avec vos identifiants de connexion.
|
||||
</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 %}
|
||||
170
templates/move/siteconseil.html.twig
Normal file
170
templates/move/siteconseil.html.twig
Normal file
@@ -0,0 +1,170 @@
|
||||
{% extends 'base.html.twig' %}
|
||||
|
||||
{% block title %}Migration SARL SITECONSEIL - Association E-Cosplay{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<div class="min-h-screen" style="background: linear-gradient(135deg, #f5f5f0 0%, #e8e8e0 100%);">
|
||||
|
||||
{# Header #}
|
||||
<div class="glass-dark text-white py-8">
|
||||
<div class="max-w-4xl mx-auto px-6">
|
||||
<div class="flex items-center gap-4 mb-4">
|
||||
<img src="/logo.jpg" alt="E-Cosplay" class="h-14 w-auto">
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold uppercase tracking-widest">Migration de vos services</h1>
|
||||
<p class="text-sm text-white/60">Transfert depuis SARL SITECONSEIL vers Association E-Cosplay</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="max-w-4xl mx-auto px-6 py-10">
|
||||
|
||||
{# Introduction #}
|
||||
<div class="glass-heavy p-8 mb-8">
|
||||
<h2 class="text-xl font-bold uppercase tracking-wider mb-4">Pourquoi cette migration ?</h2>
|
||||
<p class="text-sm text-gray-600 leading-relaxed mb-4">
|
||||
Dans le cadre de la <strong>cessation d'activite de la SARL SITECONSEIL</strong>, l'Association E-Cosplay a pris en charge la gestion de l'infrastructure technique et des services qui vous etaient fournis par la SARL SITECONSEIL.
|
||||
</p>
|
||||
<p class="text-sm text-gray-600 leading-relaxed mb-4">
|
||||
Depuis plusieurs mois, notre equipe assure la <strong>continuite de vos services</strong> (sites internet, emails, noms de domaine, hebergement) afin de vous garantir une transition sans interruption.
|
||||
</p>
|
||||
<p class="text-sm text-gray-600 leading-relaxed">
|
||||
La SARL SITECONSEIL a decide de nous <strong>transmettre definitivement la gestion de vos services</strong>. Pour officialiser cette transition, un nouveau contrat doit etre signe entre vous et l'Association E-Cosplay.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{# Ce qui change #}
|
||||
<div class="glass-heavy p-8 mb-8">
|
||||
<h2 class="text-xl font-bold uppercase tracking-wider mb-4">Ce qui change</h2>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<div class="glass p-5">
|
||||
<h3 class="text-sm font-bold uppercase tracking-wider mb-3" style="color: #fabf04;">Votre nouveau prestataire</h3>
|
||||
<ul class="text-sm text-gray-600 space-y-2">
|
||||
<li class="flex items-start gap-2">
|
||||
<svg class="w-4 h-4 text-green-500 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>
|
||||
<span>L'Association E-Cosplay devient votre interlocuteur unique</span>
|
||||
</li>
|
||||
<li class="flex items-start gap-2">
|
||||
<svg class="w-4 h-4 text-green-500 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>
|
||||
<span>Nouveau contrat avec nos conditions generales</span>
|
||||
</li>
|
||||
<li class="flex items-start gap-2">
|
||||
<svg class="w-4 h-4 text-green-500 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>
|
||||
<span>Nouvelle facturation selon notre grille tarifaire</span>
|
||||
</li>
|
||||
<li class="flex items-start gap-2">
|
||||
<svg class="w-4 h-4 text-green-500 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>
|
||||
<span>Espace client dedie avec suivi en temps reel</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="glass p-5">
|
||||
<h3 class="text-sm font-bold uppercase tracking-wider mb-3 text-green-600">Ce qui ne change pas</h3>
|
||||
<ul class="text-sm text-gray-600 space-y-2">
|
||||
<li class="flex items-start gap-2">
|
||||
<svg class="w-4 h-4 text-green-500 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>
|
||||
<span>Vos sites internet restent en ligne et accessibles</span>
|
||||
</li>
|
||||
<li class="flex items-start gap-2">
|
||||
<svg class="w-4 h-4 text-green-500 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>
|
||||
<span>Vos emails continuent de fonctionner</span>
|
||||
</li>
|
||||
<li class="flex items-start gap-2">
|
||||
<svg class="w-4 h-4 text-green-500 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>
|
||||
<span>Vos noms de domaine sont preserves</span>
|
||||
</li>
|
||||
<li class="flex items-start gap-2">
|
||||
<svg class="w-4 h-4 text-green-500 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/></svg>
|
||||
<span>Vos donnees sont conservees et securisees</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# Avertissement important #}
|
||||
<div class="glass-heavy p-8 mb-8" style="border-left: 4px solid #ea580c;">
|
||||
<h2 class="text-lg font-bold uppercase tracking-wider mb-3 text-orange-700">Information importante</h2>
|
||||
<p class="text-sm text-gray-600 leading-relaxed mb-3">
|
||||
<strong>L'Association E-Cosplay ne prendra pas en compte votre anciennete avec la SARL SITECONSEIL</strong>, ni les accords, conditions particulieres, tarifs preferentiels ou engagements que vous auriez pu conclure avec cette derniere.
|
||||
</p>
|
||||
<p class="text-sm text-gray-600 leading-relaxed">
|
||||
Le nouveau contrat constitue un engagement <strong>nouveau et independant</strong>. Les tarifs applicables seront ceux en vigueur au sein de l'Association E-Cosplay.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{# Etapes #}
|
||||
<div class="glass-heavy p-8 mb-8">
|
||||
<h2 class="text-xl font-bold uppercase tracking-wider mb-6">Comment ca se passe ?</h2>
|
||||
<div class="space-y-4">
|
||||
<div class="flex items-start gap-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center text-white font-bold text-sm shrink-0" style="background: #fabf04; color: #111;">1</div>
|
||||
<div>
|
||||
<p class="text-sm font-bold">Vous recevez un email avec le contrat</p>
|
||||
<p class="text-xs text-gray-500">Le contrat de migration vous est envoye par email avec un lien de signature electronique.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-start gap-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center text-white font-bold text-sm shrink-0" style="background: #fabf04; color: #111;">2</div>
|
||||
<div>
|
||||
<p class="text-sm font-bold">Vous signez le contrat electroniquement</p>
|
||||
<p class="text-xs text-gray-500">La signature est securisee via DocuSeal (valeur juridique, reglement eIDAS).</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-start gap-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center text-white font-bold text-sm shrink-0" style="background: #fabf04; color: #111;">3</div>
|
||||
<div>
|
||||
<p class="text-sm font-bold">Votre espace client est cree</p>
|
||||
<p class="text-xs text-gray-500">Un espace client vous est attribue avec acces a vos services, factures et support.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-start gap-4">
|
||||
<div class="w-8 h-8 flex items-center justify-center text-white font-bold text-sm shrink-0" style="background: #fabf04; color: #111;">4</div>
|
||||
<div>
|
||||
<p class="text-sm font-bold">Vos services continuent normalement</p>
|
||||
<p class="text-xs text-gray-500">Aucune interruption. Vos sites, emails et domaines restent actifs.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# FAQ #}
|
||||
<div class="glass-heavy p-8 mb-8">
|
||||
<h2 class="text-xl font-bold uppercase tracking-wider mb-6">Questions frequentes</h2>
|
||||
<div class="space-y-4">
|
||||
<div class="glass p-4">
|
||||
<p class="text-sm font-bold mb-1">Que se passe-t-il si je ne signe pas le contrat ?</p>
|
||||
<p class="text-xs text-gray-500">Sans signature, nous ne pourrons pas maintenir vos services au-dela de la periode de transition. Vos services seront desactives.</p>
|
||||
</div>
|
||||
<div class="glass p-4">
|
||||
<p class="text-sm font-bold mb-1">Mes tarifs vont-ils changer ?</p>
|
||||
<p class="text-xs text-gray-500">Les tarifs de l'Association E-Cosplay s'appliqueront. Ils peuvent differer de ceux de la SARL SITECONSEIL. Un devis vous sera transmis.</p>
|
||||
</div>
|
||||
<div class="glass p-4">
|
||||
<p class="text-sm font-bold mb-1">Mes donnees sont-elles en securite ?</p>
|
||||
<p class="text-xs text-gray-500">Oui. Toutes vos donnees sont hebergees sur notre infrastructure securisee et traitees conformement au RGPD.</p>
|
||||
</div>
|
||||
<div class="glass p-4">
|
||||
<p class="text-sm font-bold mb-1">Puis-je recuperer mes donnees si je ne souhaite pas continuer ?</p>
|
||||
<p class="text-xs text-gray-500">Oui. Vous pouvez demander l'export de vos donnees a tout moment en contactant notre support.</p>
|
||||
</div>
|
||||
<div class="glass p-4">
|
||||
<p class="text-sm font-bold mb-1">A qui m'adresser pour un litige avec SARL SITECONSEIL ?</p>
|
||||
<p class="text-xs text-gray-500">Tout litige relatif aux prestations anterieures doit etre dirige vers la SARL SITECONSEIL. L'Association E-Cosplay n'est pas responsable des engagements passes.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# Contact #}
|
||||
<div class="glass-heavy p-8 text-center">
|
||||
<h2 class="text-lg font-bold uppercase tracking-wider mb-3">Une question ?</h2>
|
||||
<p class="text-sm text-gray-600 mb-4">Notre equipe est a votre disposition pour repondre a toutes vos questions.</p>
|
||||
<p class="text-sm">
|
||||
<a href="mailto:contact@e-cosplay.fr" class="font-bold text-lg" style="color: #fabf04;">contact@e-cosplay.fr</a>
|
||||
</p>
|
||||
<p class="text-xs text-gray-400 mt-2">Tel : 06 79 34 88 02</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user