Skip to content

Commit

Permalink
add constraints on transport #790
Browse files Browse the repository at this point in the history
  • Loading branch information
numew committed Sep 27, 2024
1 parent b8b2548 commit ccf7785
Show file tree
Hide file tree
Showing 7 changed files with 78 additions and 105 deletions.
6 changes: 4 additions & 2 deletions src/Controller/Front/SignalementTransportController.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use App\Form\SignalementTransportType;
use App\Manager\SignalementManager;
use App\Service\Mailer\MailerProvider;
use App\Service\Signalement\GeolocateService;
use App\Service\Upload\UploadHandlerService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
Expand Down Expand Up @@ -40,7 +41,8 @@ public function save(
SignalementManager $signalementManager,
UploadHandlerService $uploadHandlerService,
MailerProvider $mailerProvider,
ParameterBagInterface $parameterBag
ParameterBagInterface $parameterBag,
GeolocateService $geolocateService,
): Response {
if (!$parameterBag->get('feature_three_forms')) {
return $this->redirectToRoute('home');
Expand All @@ -50,9 +52,9 @@ public function save(
$form->handleRequest($request);

if ($form->isValid()) {
dump($signalement->getPunaisesViewedAt());
$files = $uploadHandlerService->handleUploadFilesRequest($request->files->get('file-upload'));
$signalement->setPhotos($files);
$geolocateService->geolocate($signalement);
$signalementManager->save($signalement);
$mailerProvider->sendSignalementValidationWithConseilsEviterPunaises($signalement);

Expand Down
34 changes: 26 additions & 8 deletions src/Entity/Signalement.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Uid\Uuid;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

#[ORM\Entity(repositoryClass: SignalementRepository::class)]
#[ORM\HasLifecycleCallbacks()]
Expand Down Expand Up @@ -54,7 +56,7 @@ class Signalement
#[Assert\Length(max: 255)]
#[Assert\NotBlank(
message: 'Veuillez renseigner la ville.',
groups: ['front_add_signalement_logement']
groups: ['front_add_signalement_logement', 'front_add_signalement_transport']
)]
private ?string $ville = null;

Expand Down Expand Up @@ -94,12 +96,8 @@ class Signalement

#[ORM\Column(length: 100, nullable: true)]
#[Assert\Length(max: 100)]
#[Assert\Email]
#[Email(mode : Email::VALIDATION_MODE_STRICT, message: 'Veuillez renseigner un email valide.', )]
#[Assert\NotBlank(message: 'Veuillez renseigner votre e-mail.', groups: ['front_add_signalement_logement'])]
#[Assert\Email(
message: 'Veuillez renseigner une adresse e-mail valide.',
groups: ['front_add_signalement_logement']
)]
private ?string $emailOccupant = null;

#[ORM\Column(length: 30, nullable: true)]
Expand Down Expand Up @@ -258,26 +256,36 @@ class Signalement
)]
private ?\DateTimeImmutable $punaisesViewedAt = null;

#[ORM\Column(type: 'string', nullable: true, enumType: PlaceType::class)]
#[ORM\Column(type: 'string', enumType: PlaceType::class, nullable: true)]
#[Assert\NotBlank(message: 'Veuillez renseigner le type de transport', groups: ['front_add_signalement_transport'])]
private ?PlaceType $placeType = null;

#[ORM\Column(length: 50, nullable: true)]
#[Assert\Length(max: 50)]
private ?string $transportLineNumber = null;

#[ORM\Column(nullable: true)]
#[Assert\NotNull(message: 'Veuillez indiquer si vous avez prévenu la compagnie de transport.', groups: ['front_add_signalement_transport'])]
private ?bool $isPlaceAvertie = null;

#[ORM\Column(type: 'text', nullable: true)]
#[Assert\Length(min: 10, max: 500, minMessage: 'Merci de proposer une description (minimum 10 caractères).')]
private ?string $autresInformations;

#[ORM\Column(length: 50, nullable: true)]
#[Assert\Length(max: 50)]
#[Assert\NotBlank(message: 'Veuillez renseigner votre nom.', groups: ['front_add_signalement_transport'])]
private ?string $nomDeclarant = null;

#[ORM\Column(length: 50, nullable: true)]
#[Assert\Length(max: 50)]
#[Assert\NotBlank(message: 'Veuillez renseigner votre prénom.', groups: ['front_add_signalement_transport'])]
private ?string $prenomDeclarant = null;

#[ORM\Column(length: 100, nullable: true)]
#[Assert\Email]
#[Assert\Length(max: 100)]
#[Email(mode : Email::VALIDATION_MODE_STRICT, message: 'Veuillez renseigner un email valide.', )]
#[Assert\NotBlank(message: 'Veuillez renseigner votre e-mail.', groups: ['front_add_signalement_transport'])]
private ?string $emailDeclarant = null;

public function __construct()
Expand All @@ -287,6 +295,16 @@ public function __construct()
$this->messagesThread = new ArrayCollection();
}

#[Assert\Callback(groups: ['front_add_signalement_transport'])]
public function validate(ExecutionContextInterface $context, $payload): void
{
if (!$this->transportLineNumber && PlaceType::TYPE_TRANSPORT_AUTRE !== $this->placeType) {
$context->buildViolation('Veuillez renseigner le numéro de ligne.')
->atPath('transportLineNumber')
->addViolation();
}
}

public function getId(): ?int
{
return $this->id;
Expand Down
73 changes: 3 additions & 70 deletions src/Form/SignalementTransportType.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
use App\Service\Signalement\SignalementDateTimeProcessing;
use App\Service\Signalement\ZipCodeProvider;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
Expand All @@ -25,7 +24,6 @@
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Email;

class SignalementTransportType extends AbstractType
{
Expand Down Expand Up @@ -87,16 +85,13 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
'class' => 'fr-hint-text',
],
'required' => true,
'constraints' => [
new Assert\NotBlank(message: 'Veuillez renseigner la commune.'),
//TODO : rebase de precedente PR pour eviter conflit
],
])
->add('geoloc', HiddenType::class, [
'attr' => [
'class' => 'fr-hidden',
],
'required' => false,
'mapped' => false,
])
->add('codePostal', HiddenType::class, [
'attr' => [
Expand Down Expand Up @@ -125,9 +120,6 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
],
'label' => 'Type de transport',
'required' => true,
'constraints' => [
new Assert\NotBlank(message: 'Veuillez renseigner le type de transport.'),
],
])
->add('transportLineNumber', TextType::class, [
'attr' => [
Expand All @@ -143,10 +135,6 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
'class' => 'fr-hint-text',
],
'required' => true,
'constraints' => [
new Assert\NotBlank(message: 'Veuillez renseigner le numéro de ligne.'),
new Assert\Length(max: 50, maxMessage: 'Veuillez renseigner un numéro de ligne correcte.'),
],
])
->add('isPlaceAvertie', ChoiceType::class, [
'choice_attr' => [
Expand All @@ -162,9 +150,6 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
],
'label' => 'Avez-vous prévenu la compagnie de transport ?',
'required' => true,
'constraints' => [
new Assert\NotBlank(message: 'Veuillez indiquer si vous avez prévenu la compagnie de transport.'),
],
])
->add('autresInformations', TextareaType::class, [
'attr' => [
Expand All @@ -182,39 +167,28 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
'class' => 'fr-hint-text',
],
'required' => false,
'constraints' => [
new Assert\Length(min: 10, minMessage: 'Merci de proposer une description (minimum 10 caractères).'),
],
])
->add('nomDeclarant', TextType::class, [
'attr' => [
'class' => 'fr-input',
'maxlength' => '100',
'maxlength' => '50',
],
'label_attr' => [
'class' => 'fr-label',
],
'label' => 'Nom',
'required' => true,
'constraints' => [
new Assert\NotBlank(message: 'Veuillez renseigner votre nom.'),
new Assert\Length(max: 100),
],
])
->add('prenomDeclarant', TextType::class, [
'attr' => [
'class' => 'fr-input',
'maxlength' => '100',
'maxlength' => '50',
],
'label_attr' => [
'class' => 'fr-label',
],
'label' => 'Prénom',
'required' => true,
'constraints' => [
new Assert\NotBlank(message: 'Veuillez renseigner votre prénom.'),
new Assert\Length(max: 100),
],
])
->add('emailDeclarant', EmailType::class, [
'attr' => [
Expand All @@ -225,49 +199,8 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
],
'label' => 'Adresse email',
'required' => true,
'constraints' => [
new Assert\NotBlank(message: 'Veuillez renseigner votre email.'),
new Email(
mode: Email::VALIDATION_MODE_STRICT,
message: 'Veuillez renseigner un email valide.'
),
],
]);

$builder->get('geoloc')->addModelTransformer(new CallbackTransformer(
function ($tagsAsArray) {
// transform the array to a string
if (!empty($tagsAsArray)) {
return $tagsAsArray[0].'|'.$tagsAsArray[1];
}

return '';
},
function ($tagsAsString) {
// transform the string back to an array
if (!empty($tagsAsString)) {
$coord = explode('|', $tagsAsString);

return ['lat' => $coord[0], 'lng' => $coord[1]];
}

return [];
}
));

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();

if ($data['placeType'] === PlaceType::TYPE_TRANSPORT_AUTRE->name) {
$form->add('transportLineNumber', TextType::class, [
'constraints' => [
new Assert\Length(max: 50, maxMessage: 'Veuillez renseigner un numéro de ligne correcte.'),
],
]);
}
});

$builder->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) {
$form = $event->getForm();
/** @var Signalement $signalement */
Expand Down
64 changes: 42 additions & 22 deletions src/Service/Signalement/GeolocateService.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

namespace App\Service\Signalement;

use App\Entity\Enum\SignalementType;
use App\Entity\Signalement;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Contracts\HttpClient\ResponseInterface;

class GeolocateService
{
Expand All @@ -17,29 +19,12 @@ public function __construct(

public function geolocate(Signalement $signalement): int
{
$address = $signalement->getAdresse();
$postalCode = $signalement->getCodePostal();
$city = $signalement->getVille();

// Compose the address string to be used in the geocoding API request
$fullAddress = '';
if (null !== $address) {
$fullAddress .= $address.', ';
}
if (null !== $postalCode) {
$fullAddress .= $postalCode.', ';
}
if (null !== $city) {
$fullAddress .= $city;
if (SignalementType::TYPE_LOGEMENT === $signalement->getType()) {
$response = $this->geolocateAddress($signalement);
} else {
$response = $this->geolocateMunicipality($signalement);
}

// Make the API request to geocode the address
$response = $this->client->request('GET', 'https://api-adresse.data.gouv.fr/search', [
'query' => [
'q' => $fullAddress,
'limit' => 1,
],
]);
$response = $this->geolocateAddress($signalement);
$statusCode = $response->getStatusCode();
if (Response::HTTP_OK === $statusCode) {
$data = json_decode($response->getContent(), true);
Expand All @@ -60,4 +45,39 @@ public function geolocate(Signalement $signalement): int

return $statusCode;
}

private function geolocateAddress(Signalement $signalement): ResponseInterface
{
$address = $signalement->getAdresse();
$postalCode = $signalement->getCodePostal();
$city = $signalement->getVille();
$fullAddress = '';
if (null !== $address) {
$fullAddress .= $address.', ';
}
if (null !== $postalCode) {
$fullAddress .= $postalCode.', ';
}
if (null !== $city) {
$fullAddress .= $city;
}

return $this->client->request('GET', 'https://api-adresse.data.gouv.fr/search', [
'query' => [
'q' => $fullAddress,
'limit' => 1,
],
]);
}

private function geolocateMunicipality(Signalement $signalement): ResponseInterface
{
return $this->client->request('GET', 'https://api-adresse.data.gouv.fr/search', [
'query' => [
'q' => $signalement->getVille(),
'type' => 'municipality',
'limit' => 1,
],
]);
}
}
2 changes: 1 addition & 1 deletion templates/signalement_list/erp-transports.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
<td>{{ signalement.nomProprietaire }}</td>
{% endif %}
<td>{{ signalement.codePostal }} {{ signalement.ville }}</td>
<td>{{ signalement.territoire.zip }}</td>
<td>{% if signalement.territoire %}{{ signalement.territoire.zip }}{% endif %}</td>
<td class="button-view">
<button class="fr-btn fr-icon-arrow-right-fill" data-fr-opened="false" aria-controls="fr-modal-signalement-erp-transports-{{signalement.uuid}}" title="Voir le signalement {{ signalement.reference }}">
Voir le signalement {{ signalement.reference }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
{% endif %}

<br>
Territoire : {{signalement.territoire.nomComplet}}
Territoire : {% if signalement.territoire %}{{signalement.territoire.nomComplet}}{% endif %}
<br>
{% if signalement.type is same as enum('App\\Entity\\Enum\\SignalementType').TYPE_ERP %}
Adresse : {{ signalement.adresse }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public function testPostInvalidFormTransport(): void
'error' => [
'signalement_transport[nomDeclarant]' => 'Veuillez renseigner votre nom.',
'signalement_transport[prenomDeclarant]' => 'Veuillez renseigner votre prénom.',
'signalement_transport[emailDeclarant]' => 'Veuillez renseigner votre email.',
'signalement_transport[emailDeclarant]' => 'Veuillez renseigner votre e-mail.',
'signalement_transport[transportLineNumber]' => 'Veuillez renseigner le numéro de ligne.',
],
],
Expand Down

0 comments on commit ccf7785

Please sign in to comment.