feat(etl): implémente la finalisation et la signature électronique de l'état des lieux

This commit is contained in:
Serreau Jovann
2026-02-06 15:37:38 +01:00
parent bad00ec857
commit fb1bab0cc6
14 changed files with 927 additions and 51 deletions

View File

@@ -6,6 +6,7 @@ use App\Entity\Contrats;
use App\Entity\ContratsPayments;
use App\Entity\CustomerOrder;
use App\Entity\Devis;
use App\Entity\EtatLieux;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
@@ -322,4 +323,79 @@ class Client
return $documentUrl;
}
public function createSubmissionEtatLieux(EtatLieux $etatLieux): void
{
// Si déjà initié, on arrête (ou on pourrait retourner les liens existants)
if ($etatLieux->getSignIdCustomer()) {
return;
}
$contrat = $etatLieux->getContrat();
$customer = $contrat->getCustomer();
// Prestataire or Admin
$prestataireEmail = 'contact@ludikevent.fr';
if ($etatLieux->getPrestataire()) {
$prestataireEmail = $etatLieux->getPrestataire()->getEmail();
} elseif ($etatLieux->getAccount()) {
$prestataireEmail = $etatLieux->getAccount()->getEmail();
}
// URL où on redirige après signature
$completedRedirectUrl = $this->baseUrl . $this->urlGenerator->generate('etl_mission_signed_entry_state', ['id' => $contrat->getId()]);
// Récupération du fichier PDF EDL (Non signé)
$relativeFileUrl = $this->storage->resolveUri($etatLieux, 'etatLieuxUnsignFile');
$fileUrl = $this->baseUrl . $relativeFileUrl;
$submission = $this->docuseal->createSubmissionFromPdf([
'name' => 'Etat des Lieux - Contrat #' . $contrat->getNumReservation(),
'completed_redirect_url' => $completedRedirectUrl,
'send_email' => true, // Envoi email aux deux parties
'documents' => [
[
'name' => 'edl_' . $contrat->getNumReservation() . '.pdf',
'file' => $fileUrl,
],
],
'submitters' => [
[
'role' => 'Ludikevent', // Prestataire
'email' => $prestataireEmail,
],
[
'role' => 'Client',
'email' => $customer->getEmail(),
'name' => $customer->getSurname() . ' ' . $customer->getName(),
],
],
]);
// Mapping des IDs
foreach ($submission['submitters'] as $submitter) {
if ($submitter['role'] === 'Ludikevent') {
$etatLieux->setSignIdDelivery($submitter['id']);
} elseif ($submitter['role'] === 'Client') {
$etatLieux->setSignIdCustomer($submitter['id']);
}
}
$this->entityManager->persist($etatLieux);
$this->entityManager->flush();
}
public function getSigningUrl(EtatLieux $etatLieux, string $role): ?string
{
$submitterId = match ($role) {
'Ludikevent', 'Prestataire' => $etatLieux->getSignIdDelivery(),
'Client' => $etatLieux->getSignIdCustomer(),
default => null
};
if (!$submitterId) {
return null;
}
return $this->getLinkSign($submitterId);
}
}