<?php
namespace App\Form;
use App\Entity\Country;
use App\Entity\Prescriber;
use App\Entity\PrescriberSpeciality;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\IsTrue;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Regex;
class PrescriberRegistrationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('firstname', TextType::class, [
'label' => 'Prénom',
'attr' => [
'autocomplete' => 'given-name'
],
'constraints' => [
new NotBlank(['message' => 'Veuillez entrer votre prénom']),
new Length(['min' => 2, 'max' => 50, 'minMessage' => 'Votre prénom doit comporter au moins {{ limit }} caractères', 'maxMessage' => 'Votre prénom ne peut pas dépasser {{ limit }} caractères']),
],
])
->add('lastname', TextType::class, [
'label' => 'Nom',
'attr' => [
'autocomplete' => 'family-name'
],
'constraints' => [
new NotBlank(['message' => 'Veuillez entrer votre nom']),
new Length(['min' => 2, 'max' => 50, 'minMessage' => 'Votre nom doit comporter au moins {{ limit }} caractères', 'maxMessage' => 'Votre nom ne peut pas dépasser {{ limit }} caractères']),
new Regex(['pattern' => '/^[a-zA-Z\- ]+$/', 'message' => 'Le nom ne peut contenir que des lettres, des tirets et des espaces.']),
],
])
->add('civility', ChoiceType::class, [
'label' => 'Civilité',
'required' => false,
'choices' => [
'M.' => 'M.',
'Mme' => 'Mme',
'Dr' => 'Dr',
'Pr' => 'Pr',
'Autre' => 'Autre'
],
'placeholder' => 'Civilité',
])
->add('rppsNumber', TextType::class, [
'label' => 'Numéro RPPS',
'required' => false,
'constraints' => [
new Length(['min' => 11, 'max' => 11, 'exactMessage' => 'Le numéro RPPS doit comporter exactement {{ limit }} chiffres.']),
new Regex(['pattern' => '/^\d{11}$/', 'message' => 'Le numéro RPPS ne peut contenir que des chiffres.']),
],
])
->add('sirenNumber', TextType::class, [
'label' => 'Numéro SIREN',
'required' => true,
'constraints' => [
new NotBlank(['message' => 'Le numéro SIREN est obligatoire.']),
new Length(['min' => 9, 'max' => 9, 'exactMessage' => 'Le numéro SIREN doit comporter exactement {{ limit }} chiffres.']),
new Regex(['pattern' => '/^\d{9}$/', 'message' => 'Le numéro SIREN ne peut contenir que 9 chiffres.']),
]
])
->add('mainSpeciality', EntityType::class, [
'class' => PrescriberSpeciality::class,
'choice_label' => 'name',
'placeholder' => 'Sélectionnez votre spécialité',
'label' => 'Votre spécialité',
'attr' => [
'class' => 'form-control select2 select2-height-fix'
],
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('s')
->orderBy('s.name', 'ASC');
},
'constraints' => [
new NotBlank(['message' => 'Veuillez sélectionner votre spécialité']),
],
])
->add('company', TextType::class, [
'label' => 'Nom de votre société',
'required' => false,
'constraints' => [
new Length(['max' => 255, 'maxMessage' => 'Le nom de votre société ne peut pas dépasser {{ limit }} caractères']),
],
])
->add('email', EmailType::class, [
'label' => 'Email',
'attr' => [
'autocomplete' => 'email',
'placeholder' => 'votre.email@exemple.com',
'inputmode' => 'email'
],
'constraints' => [
new NotBlank(['message' => 'Veuillez entrer votre adresse email']),
new Email(['message' => 'L\'adresse email "{{ value }}" n\'est pas valide.']),
],
])
->add('username', TextType::class, [
'label' => 'Identifiant',
'attr' => ['class' => 'lowercase'],
'constraints' => [
new NotBlank(['message' => 'Veuillez choisir un identifiant']),
new Length(['min' => 3, 'max' => 25, 'minMessage' => 'Votre identifiant doit comporter au moins {{ limit }} caractères', 'maxMessage' => 'Votre identifiant ne peut pas dépasser {{ limit }} caractères']),
],
])
->add('plainPassword', RepeatedType::class, [
'type' => PasswordType::class,
'mapped' => false,
'first_options' => [
'label' => 'Mot de passe',
'constraints' => [
new NotBlank(['message' => 'Veuillez entrer un mot de passe']),
new Length(['min' => 6, 'minMessage' => 'Votre mot de passe doit comporter au moins {{ limit }} caractères', 'max' => 4096]),
],
],
'second_options' => ['label' => 'Confirmer le mot de passe'],
'invalid_message' => 'Les mots de passe doivent correspondre.',
])
->add('address', TextType::class, [
'label' => 'Adresse',
'attr' => [
'autocomplete' => 'street-address'
],
'constraints' => [
new NotBlank(['message' => 'Veuillez entrer votre adresse']),
],
])
->add('address2', TextType::class, [
'label' => 'Complément d\'adresse',
'required' => false,
])
->add('postalCode', TextType::class, [
'label' => 'Code postal',
'attr' => [
'autocomplete' => 'postal-code'
],
'constraints' => [
new NotBlank(['message' => 'Veuillez entrer votre code postal']),
],
])
->add('city', TextType::class, [
'label' => 'Ville',
'attr' => [
'autocomplete' => 'address-level2'
],
'constraints' => [
new NotBlank(['message' => 'Veuillez entrer votre ville']),
],
])
->add('country', EntityType::class, [
'class' => Country::class,
'choice_label' => 'name',
'placeholder' => 'Sélectionnez votre pays',
'label' => 'Pays',
'attr' => [
'autocomplete' => 'country'
],
'constraints' => [
new NotBlank(['message' => 'Veuillez sélectionner votre pays']),
],
])
->add('phone', TextType::class, [
'label' => 'Téléphone',
'attr' => [
'autocomplete' => 'tel'
],
'constraints' => [
new NotBlank(['message' => 'Veuillez entrer votre numéro de téléphone']),
],
])
->add('sourceDiscovery', ChoiceType::class, [
'label' => 'Comment nous avez-vous connus ?',
'required' => false,
'placeholder' => 'Sélectionnez une option',
'choices' => [
'Recommandations d\'un confrère/consœur' => 'colleague_recommendation',
'Recommandations d\'un(e) ami(e)/familiale' => 'friend_family_recommendation',
'Recherche sur Internet' => 'internet_search',
'Réseaux sociaux' => 'social_media',
'Réseaux BIONOPS (promoteurs, direction)' => 'bionops_network',
'Evènements professionnels (salons, symposium, formations)' => 'professional_events',
'Demande d\'un patient' => 'patient_request',
'Autre' => 'other'
],
'attr' => [
'class' => 'form-select'
]
])
->add('agreeTerms', CheckboxType::class, [
'mapped' => false,
'label' => 'J\'accepte les CGU du Club Espace Professionnel BIONOPS',
'constraints' => [
new IsTrue(['message' => 'Vous devez accepter nos conditions générales d\'utilisation pour vous inscrire.']),
],
])
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Prescriber::class,
]);
}
}