feat(Devis): Ajoute le champ signatureId à l'entité Devis.
 feat(Signature): Crée le service Client pour gérer les signatures.
```
This commit is contained in:
Serreau Jovann
2026-01-16 15:34:41 +01:00
parent a1c76eac6b
commit c952f2487a
3 changed files with 141 additions and 3 deletions

View File

@@ -2,12 +2,103 @@
namespace App\Service\Signature;
use App\Entity\CustomerOrder;
use App\Entity\Devis;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\HttpKernel\KernelInterface;
use Vich\UploaderBundle\Storage\StorageInterface;
class Client
{
private \Docuseal\Api $client;
private \Docuseal\Api $docuseal;
private string $baseUrl;
public function __construct()
public function __construct(
private readonly RequestStack $requestStack,
private readonly UrlGeneratorInterface $urlGenerator,
private readonly EntityManagerInterface $entityManager,
private readonly KernelInterface $kernel,
private readonly StorageInterface $storage,
) {
// Configuration via les variables d'environnement
$key = $_ENV['ESYSIGN_APIEY'] ?? '';
$this->baseUrl = $_ENV['ESYSIGN_URL'] ?? '';
// L'URL API est le point d'entrée pour le SDK Docuseal
$apiUrl = rtrim($this->baseUrl, '/') . '/api';
$this->docuseal = new \Docuseal\Api($key, $apiUrl);
}
/**
* Crée une soumission pour un Devis
*/
public function createSubmissionDevis(Devis $devis): string
{
$this->client = new \Docuseal\Api($_ENV['ESYSIGN_APIEY'],'https://signature.esy-wev.dev/api');
// Si aucune signature n'est lancée, on initialise la soumission
if ($devis->getSignatureId() === null) {
// URL où le client sera redirigé après signature
$completedRedirectUrl = $this->baseUrl . $this->urlGenerator->generate(
'app_sign_complete',
['type' => 'devis', 'id' => $devis->getId()]
);
// Récupération du fichier via VichUploader (champ devisDocuSealFile)
$relativeFileUrl = $this->storage->resolveUri($devis, 'devisDocuSealFile');
$fileUrl = $this->baseUrl . $relativeFileUrl;
$submission = $this->docuseal->createSubmissionFromPdf([
'name' => 'Devis N°' . $devis->getNum(), // Correction : getNum()
'completed_redirect_url' => $completedRedirectUrl,
'send_email' => true,
'documents' => [
[
'name' => 'devis_' . $devis->getNum() . '.pdf', // Correction : getNum()
'file' => $fileUrl,
],
],
'submitters' => [
[
'role' => 'Client',
'email' => $devis->getCustomer()->getEmail(),
'name' => $devis->getCustomer()->getSurname() . ' ' . $devis->getCustomer()->getName(),
'metadata' => [
'id' => $devis->getId(),
'type' => 'devis'
]
],
],
]);
// Stockage de l'ID submitter de Docuseal dans ton entité
$devis->setSignatureId($submission['submitters'][0]['id']);
$this->entityManager->flush();
}
return $this->getLinkSign($devis->getSignatureId());
}
/**
* Retourne l'URL de signature publique pour le client
*/
public function getLinkSign(?string $submitterId): string
{
if (!$submitterId) {
throw new \InvalidArgumentException("ID Submitter absent.");
}
$submissionData = $this->docuseal->getSubmitter($submitterId);
return rtrim($this->baseUrl, '/') . "/s/" . $submissionData['slug'];
}
/**
* Récupère l'état d'un signataire (pour vérifier si c'est signé)
*/
public function getSubmiter(?string $submitterId): array
{
return $this->docuseal->getSubmitter($submitterId);
}
}