From 663986c66d0b8b7b4d43c889a14f717a4a4669e5 Mon Sep 17 00:00:00 2001 From: Dimitri Gritsajuk Date: Fri, 31 Jan 2025 16:26:05 +0100 Subject: [PATCH] [Petition] add reminder command --- migrations/2025/Version20250131151354.php | 19 +++++++++++ ...indUnconfirmedPetitionSignatureCommand.php | 33 +++++++++++++++++++ src/Entity/PetitionSignature.php | 6 +++- .../PetitionConfirmationReminderMessage.php | 25 ++++++++++++++ src/Renaissance/Petition/SignatureManager.php | 16 +++++++-- .../PetitionSignatureRepository.php | 29 ++++++++++++++++ 6 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 migrations/2025/Version20250131151354.php create mode 100644 src/Command/RemindUnconfirmedPetitionSignatureCommand.php create mode 100644 src/Mailer/Message/Renaissance/PetitionConfirmationReminderMessage.php create mode 100644 src/Repository/PetitionSignatureRepository.php diff --git a/migrations/2025/Version20250131151354.php b/migrations/2025/Version20250131151354.php new file mode 100644 index 0000000000..40acff3380 --- /dev/null +++ b/migrations/2025/Version20250131151354.php @@ -0,0 +1,19 @@ +addSql('ALTER TABLE petition_signature ADD reminded_at DATETIME DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE petition_signature DROP reminded_at'); + } +} diff --git a/src/Command/RemindUnconfirmedPetitionSignatureCommand.php b/src/Command/RemindUnconfirmedPetitionSignatureCommand.php new file mode 100644 index 0000000000..dcc155bfbb --- /dev/null +++ b/src/Command/RemindUnconfirmedPetitionSignatureCommand.php @@ -0,0 +1,33 @@ +repository->findAllToRemind() as $signature) { + $this->manager->remind($signature); + } + + return self::SUCCESS; + } +} diff --git a/src/Entity/PetitionSignature.php b/src/Entity/PetitionSignature.php index 3e7038106e..6fb2fa8b8a 100644 --- a/src/Entity/PetitionSignature.php +++ b/src/Entity/PetitionSignature.php @@ -4,11 +4,12 @@ use App\Enum\CivilityEnum; use App\Renaissance\Petition\SignatureRequest; +use App\Repository\PetitionSignatureRepository; use Doctrine\ORM\Mapping as ORM; use libphonenumber\PhoneNumber; use Ramsey\Uuid\Uuid; -#[ORM\Entity] +#[ORM\Entity(repositoryClass: PetitionSignatureRepository::class)] class PetitionSignature { use EntityIdentityTrait; @@ -45,6 +46,9 @@ class PetitionSignature #[ORM\Column(type: 'datetime', nullable: true)] public ?\DateTime $validatedAt = null; + #[ORM\Column(type: 'datetime', nullable: true)] + public ?\DateTime $remindedAt = null; + public function __construct() { $this->uuid = Uuid::uuid4(); diff --git a/src/Mailer/Message/Renaissance/PetitionConfirmationReminderMessage.php b/src/Mailer/Message/Renaissance/PetitionConfirmationReminderMessage.php new file mode 100644 index 0000000000..1a77858864 --- /dev/null +++ b/src/Mailer/Message/Renaissance/PetitionConfirmationReminderMessage.php @@ -0,0 +1,25 @@ +emailAddress, + $signature->getFullName(), + 'Confirmez votre signature à la pétition', + [ + 'first_name' => $signature->firstName, + 'petition_name' => $signature->petitionName, + 'primary_link' => $url, + ], + ); + } +} diff --git a/src/Renaissance/Petition/SignatureManager.php b/src/Renaissance/Petition/SignatureManager.php index 2e2887f701..6065d3868b 100644 --- a/src/Renaissance/Petition/SignatureManager.php +++ b/src/Renaissance/Petition/SignatureManager.php @@ -5,6 +5,7 @@ use App\Entity\PetitionSignature; use App\Mailer\MailerService; use App\Mailer\Message\Renaissance\PetitionConfirmationMessage; +use App\Mailer\Message\Renaissance\PetitionConfirmationReminderMessage; use Doctrine\ORM\EntityManagerInterface; use Firebase\JWT\JWT; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; @@ -23,10 +24,21 @@ public function save(SignatureRequest $request): void $this->entityManager->persist($signature = PetitionSignature::createFromRequest($request)); $this->entityManager->flush(); - $this->transactionalMailer->sendMessage(PetitionConfirmationMessage::create($signature, $this->generateUrl($signature))); + $this->transactionalMailer->sendMessage(PetitionConfirmationMessage::create($signature, $this->generateConfirmUrl($signature))); } - private function generateUrl(PetitionSignature $signature): string + public function remind(PetitionSignature $signature): void + { + if ($signature->validatedAt || $signature->remindedAt) { + return; + } + + $this->transactionalMailer->sendMessage(PetitionConfirmationReminderMessage::create($signature, $this->generateConfirmUrl($signature))); + $signature->remindedAt = new \DateTime(); + $this->entityManager->flush(); + } + + private function generateConfirmUrl(PetitionSignature $signature): string { return $this->urlGenerator->generate('app_petition_validate', [ 'uuid' => $signature->getUuid(), diff --git a/src/Repository/PetitionSignatureRepository.php b/src/Repository/PetitionSignatureRepository.php new file mode 100644 index 0000000000..fa6845cabd --- /dev/null +++ b/src/Repository/PetitionSignatureRepository.php @@ -0,0 +1,29 @@ +createQueryBuilder('ps') + ->where('ps.validatedAt IS NULL AND ps.remindedAt IS NULL') + ->andWhere('ps.createdAt < :date') + ->setParameter('date', new \DateTime('-1 week')) + ->getQuery() + ->getResult() + ; + } +}