src/Entrepreneurs/Bundle/Entrepreneur/Form/QuestionnaireType.php line 43

Open in your IDE?
  1. <?php
  2. namespace Entrepreneurs\Bundle\Entrepreneur\Form;
  3. use Entrepreneurs\Bundle\AppBundle\Propel\Civilite;
  4. use Entrepreneurs\Bundle\AppBundle\Propel\Departement;
  5. use Entrepreneurs\Bundle\AppBundle\Propel\DepartementQuery;
  6. use Entrepreneurs\Bundle\AppBundle\Propel\EffectifEntreprise;
  7. use Entrepreneurs\Bundle\AppBundle\Propel\EffectifEntrepriseQuery;
  8. use Entrepreneurs\Bundle\AppBundle\Propel\Entrepreneur;
  9. use Entrepreneurs\Bundle\AppBundle\Propel\FonctionEntrepreneur;
  10. use Entrepreneurs\Bundle\AppBundle\Propel\FonctionEntrepreneurQuery;
  11. use Entrepreneurs\Bundle\AppBundle\Propel\ModeCommunication;
  12. use Entrepreneurs\Bundle\AppBundle\Propel\ModeCommunicationQuery;
  13. use Entrepreneurs\Bundle\AppBundle\Propel\NePlusIntervenirRaison;
  14. use Entrepreneurs\Bundle\AppBundle\Propel\NePlusIntervenirRaisonQuery;
  15. use Entrepreneurs\Bundle\AppBundle\Propel\ProvenanceEntrepreneur;
  16. use Entrepreneurs\Bundle\AppBundle\Propel\Reseau;
  17. use Entrepreneurs\Bundle\AppBundle\Propel\ReseauQuery;
  18. use Entrepreneurs\Bundle\AppBundle\Propel\SecteurActivite;
  19. use Entrepreneurs\Bundle\AppBundle\Propel\SecteurActiviteQuery;
  20. use Propel\Bundle\PropelBundle\Form\Type\ModelType;
  21. use Propel\Runtime\ActiveQuery\Criteria;
  22. use Symfony\Component\Form\AbstractType;
  23. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  24. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  25. use Symfony\Component\Form\Extension\Core\Type\CountryType;
  26. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  27. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  28. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  29. use Symfony\Component\Form\Extension\Core\Type\TextType;
  30. use Symfony\Component\Form\FormBuilderInterface;
  31. use Symfony\Component\Form\FormEvent;
  32. use Symfony\Component\Form\FormEvents;
  33. use Symfony\Component\OptionsResolver\OptionsResolver;
  34. use Symfony\Component\Validator\Constraints\Blank;
  35. use Symfony\Component\Validator\Constraints\Count;
  36. use Symfony\Component\Validator\Constraints\Email;
  37. use Symfony\Component\Validator\Constraints\IsTrue;
  38. use Symfony\Component\Validator\Constraints\Length;
  39. use Symfony\Component\Validator\Constraints\NotBlank;
  40. class QuestionnaireType extends AbstractType
  41. {
  42.     public const TYPE_RESEAU_ENTREPRENEUR '%| Entrepreneur |%';
  43.     public function buildForm(FormBuilderInterface $builder, array $options)
  44.     {
  45.         $entrepreneur $options['entrepreneur'];
  46.         $isFromSurvey2 $options['isFromSurvey2'];
  47.         $isFromSignUp $options['isFromSignUp'];
  48.         if (!$entrepreneur->getId()) {
  49.             if (!$isFromSurvey2 && !$isFromSignUp) {
  50.                 $builder
  51.                     ->add('compte_existe'ChoiceType::class, [
  52.                         'label' => 'Avez-vous déjà un compte "entrepreneur" chez 100 000 entrepreneurs ?',
  53.                         'choices' => [
  54.                             'Non' => 'Non',
  55.                             'Oui' => 'Oui',
  56.                         ],
  57.                         'mapped' => false,
  58.                         'expanded' => true,
  59.                         'constraints' => new NotBlank(),
  60.                     ])
  61.                 ;
  62.             }
  63.             $builder->add('email'EmailType::class, [
  64.                     'label' => 'Mail',
  65.                     'constraints' => [
  66.                         new NotBlank(),
  67.                         new Email([
  68.                             'mode' => Email::VALIDATION_MODE_HTML5,
  69.                         ]),
  70.                     ],
  71.                 ])
  72.             ;
  73.         }
  74.         $builder
  75.             ->add('civilite'ChoiceType::class, [
  76.                 'label' => 'Civilité',
  77.                 'choices' => array_flip(Civilite::getChoiceList()),
  78.                 'constraints' => new NotBlank(),
  79.             ])
  80.             ->add('nom'TextType::class, [
  81.                 'label' => 'Nom',
  82.                 'constraints' => new NotBlank(),
  83.             ])
  84.             ->add('prenom'TextType::class, [
  85.                 'label' => 'Prénom',
  86.                 'constraints' => new NotBlank(),
  87.             ])
  88.             ->add('telephone_1'TextType::class, [
  89.                 'label' => 'Téléphone portable',
  90.                 'constraints' => [
  91.                     new NotBlank(),
  92.                     new Length([
  93.                         'min' => 10,
  94.                         'max' => 20,
  95.                     ]),
  96.                 ],
  97.             ])
  98.             ->add('linkedin'TextType::class, [
  99.                 'label' => 'LinkedIn',
  100.                 'required' => false,
  101.             ])
  102.             ->add('adresse_1'TextType::class, [
  103.                 'label' => 'Adresse de votre domicile',
  104.                 'constraints' => new NotBlank(),
  105.             ])
  106.             ->add('code_postal'TextType::class, [
  107.                 'label' => 'Code postal de votre domicile pour nous aider à géolocaliser des interventions proches de chez vous',
  108.                 'constraints' => new NotBlank(),
  109.             ])
  110.             ->add('ville'TextType::class, [
  111.                 'label' => 'Ville de votre domicile ',
  112.                 'constraints' => new NotBlank(),
  113.             ])
  114.             ->add('pays'CountryType::class, [
  115.                 'label' => 'Pays de votre domicile',
  116.                 'preferred_choices' => ['FR'],
  117.                 'attr' => [
  118.                     'class' => 'form-control',
  119.                 ],
  120.                 'constraints' => new NotBlank(),
  121.             ])
  122.             ->add('entreprise'TextType::class, [
  123.                 'label' => 'Précisez le nom de votre structure',
  124.                 'constraints' => new NotBlank(),
  125.             ])
  126.             ->add('meme_adresse'CheckboxType::class, [
  127.                 'label' => 'Même adresse que la précédente',
  128.                 'required' => false,
  129.                 'mapped' => false,
  130.             ])
  131.             ->add('entreprise_adresse'TextType::class, [
  132.                 'label' => 'Adresse de votre lieu de travail',
  133.                 'constraints' => new NotBlank(),
  134.             ])
  135.             ->add('entreprise_ville'TextType::class, [
  136.                 'label' => 'Ville de votre lieu de travail',
  137.                 'constraints' => new NotBlank(),
  138.             ])
  139.             ->add('entreprise_code_postal'TextType::class, [
  140.                 'label' => 'Code postal de votre lieu de travail',
  141.                 'constraints' => new NotBlank(),
  142.             ])
  143.             ->add('entreprise_pays'CountryType::class, [
  144.                 'label' => 'Pays de votre lieu de travail',
  145.                 'preferred_choices' => ['FR'],
  146.                 'attr' => [
  147.                     'class' => 'form-control',
  148.                 ],
  149.                 'constraints' => new NotBlank(),
  150.             ])
  151.             ->add('SecteurActivites'ModelType::class, [
  152.                 'class' => SecteurActivite::class,
  153.                 'label' => "Secteur(s) d'activité (plusieurs choix possibles)",
  154.                 'attr' => ['placeholder' => "Secteur d'activité"],
  155.                 'query' => SecteurActiviteQuery::createForReferentiel(),
  156.                 'constraints' => new NotBlank(),
  157.                 'multiple' => true,
  158.             ])
  159.             ->add('activite_principale'TextType::class, [
  160.                 'label' => "Préciser l'activité",
  161.                 'attr' => [
  162.                     'placeholder' => "Préciser l'activité",
  163.                 ],
  164.                 'constraints' => new NotBlank(),
  165.             ])
  166.             ->add('fonction'ModelType::class, [
  167.                 'class' => FonctionEntrepreneur::class,
  168.                 'label' => 'Quelle est votre fonction ?',
  169.                 'constraints' => new NotBlank(),
  170.                 'query' => FonctionEntrepreneurQuery::create()->filterByActif(true),
  171.             ])
  172.             ->add('entreprise_effectif'ModelType::class, [
  173.                 'class' => EffectifEntreprise::class,
  174.                 'query' => EffectifEntrepriseQuery::create()->filterForSelect(),
  175.                 'placeholder' => "Quel est l'effectif de votre structure ?",
  176.                 'label' => "Quel est l'effectif de votre structure ?",
  177.                 'constraints' => new NotBlank(),
  178.             ])
  179.             ->add('reseaux'ModelType::class, [
  180.                 'label' => "À quel(s) réseau(x) d'entrepreneurs appartenez-vous ?",
  181.                 'class' => Reseau::class,
  182.                 'multiple' => true,
  183.                 'required' => true,
  184.                 'query' => ReseauQuery::create()->filterByTypeReseau(self::TYPE_RESEAU_ENTREPRENEURCriteria::LIKE),
  185.                 'constraints' => [
  186.                     new Count([
  187.                         'min' => 1,
  188.                         'minMessage' => 'Le(s) réseau(x) sont requis',
  189.                     ]),
  190.                     new NotBlank(),
  191.                 ],
  192.             ])
  193.             ->add('reseau_non_appartenance'CheckboxType::class, [
  194.                 'label' => "Je n'appartiens pas à un réseau d'entrepreneurs.",
  195.                 'required' => false,
  196.             ])
  197.             ->add('reseau_non_reference'CheckboxType::class, [
  198.                 'label' => 'Je ne trouve pas mon réseau, je le précise ci-après.',
  199.                 'required' => false,
  200.             ])
  201.             ->add('reseau_precision'TextType::class, [
  202.                 'label' => 'Précision',
  203.                 'attr' => ['placeholder' => "Précisez s'il vous plait"],
  204.                 'required' => false,
  205.                 'constraints' => new Blank([
  206.                     'message' => 'Le(s) réseau(x) doit/doivent être vide(s)',
  207.                 ]),
  208.             ])
  209.             ->add('souhait_intervenir'ChoiceType::class, [
  210.                 'label' => 'Souhaitez-vous intervenir cette année?',
  211.                 'choices' => [
  212.                     'Oui' => 'Oui',
  213.                     'Non' => 'Non',
  214.                 ],
  215.                 'constraints' => new NotBlank(),
  216.             ])
  217.             ->add('ne_plus_intervenir_raisons'ModelType::class, [
  218.                 'label' => 'Pour quelle raison ne souhaitez-vous pas/plus intervenir ?',
  219.                 'class' => NePlusIntervenirRaison::class,
  220.                 'query' => NePlusIntervenirRaisonQuery::create()->filterByActif(true),
  221.                 'multiple' => true,
  222.                 'required' => false,
  223.             ])
  224.             ->add('ne_plus_intervenir_autre_precision'TextType::class, [
  225.                 'label' => 'Si Autre, merci de préciser',
  226.                 'attr' => [
  227.                     'placeholder' => 'Pourquoi ne souhaite plus intervenir',
  228.                 ],
  229.                 'required' => false,
  230.             ])
  231.             ->add('rythme_souhaite'ChoiceType::class, [
  232.                 'label' => 'À quel rythme souhaitez-vous intervenir ?',
  233.                 'placeholder' => 'À quel rythme souhaitez-vous intervenir ?',
  234.                 'choices' => [
  235.                     'Moins de 5 par an' => 'Moins de 5 par an',
  236.                     'Plus de 5 par an' => 'Plus de 5 par an',
  237.                 ],
  238.                 'constraints' => new NotBlank(),
  239.             ])
  240.             ->add('mode_communications'ModelType::class, [
  241.                 'label' => 'Nous communiquons avec vous par mail, téléphone et SMS, mais auriez-vous une préférence à nous indiquer ?',
  242.                 'class' => ModeCommunication::class,
  243.                 'multiple' => true,
  244.                 'query' => ModeCommunicationQuery::create()->filterByActif(true),
  245.                 'constraints' => new NotBlank(),
  246.             ])
  247.             ->add('departements'ModelType::class, [
  248.                 'label' => 'Dans quel(s) département(s) proche(s) de votre domicile et/ou lieu de travail êtes-vous
  249.                  disponible ?',
  250.                 'class' => Departement::class,
  251.                 'query' => DepartementQuery::create()->filterByActif(true)->orderByNumero()->filterByNumero('00'Criteria::NOT_EQUAL),
  252.                 'multiple' => true,
  253.                 'constraints' => [
  254.                     new Count([
  255.                         'min' => 1,
  256.                         'minMessage' => "Vous devez renseigner au minimum {{ limit }} département d'intervention.|Vous devez saisir au minimum {{ limit }} départements d'intervention.", ]
  257.                     ),
  258.                     new NotBlank(),
  259.                 ],
  260.             ])
  261.             ->add('souhait_devenir_rt'ChoiceType::class, [
  262.                 'label' => "Seriez-vous intéressé.e pour être un relais territorial ? (être l'ambassadeur bénévole de
  263.                     l'association 100 000 entrepreneurs et nous aider à développer les témoignages auprès des jeunes
  264.                     de votre territoire)",
  265.                 'required' => true,
  266.                 'placeholder' => '',
  267.                 'choices' => [
  268.                     Entrepreneur::ACCEPT_DEVENIR_RT => Entrepreneur::ACCEPT_DEVENIR_RT,
  269.                     Entrepreneur::PK_PAS_DEVENIR_RT => Entrepreneur::PK_PAS_DEVENIR_RT,
  270.                     Entrepreneur::REFUSE_DEVENIR_RT => Entrepreneur::REFUSE_DEVENIR_RT,
  271.                 ],
  272.                 'constraints' => new NotBlank(),
  273.             ])
  274.         ;
  275.         if (!$entrepreneur->getId()) {
  276.             $builder
  277.                 ->add('provenance_entrepreneur'ModelType::class, [
  278.                     'label' => 'Comment avez-vous connu 100 000 entrepreneurs ?',
  279.                     'required' => false,
  280.                     'placeholder' => 'Faites un choix',
  281.                     'class' => ProvenanceEntrepreneur::class,
  282.                 ])
  283.                 ->add('provenance_precision'TextType::class, [
  284.                     'label' => 'Précision',
  285.                     'required' => false,
  286.                     'attr' => ['placeholder' => "Précisez s'il vous plait"],
  287.                 ])
  288.                 ->add('provenance_commentaire'TextareaType::class, [
  289.                     'label' => 'Précision',
  290.                     'required' => false,
  291.                 ])
  292.                 ->add('reception_mailing_hebdo'CheckboxType::class, [
  293.                     'label' => 'Je confirme que je souhaite recevoir des mails de la part de 100 000 entrepreneurs',
  294.                     'required' => true,
  295.                     'mapped' => false,
  296.                     'constraints' => new IsTrue([
  297.                         'message' => 'Vous devez accepter de recevoir des mails de la part de 100 000 entrepreneurs',
  298.                     ]),
  299.                 ])
  300.                 ->add('politique_confidentialite'CheckboxType::class, [
  301.                     'required' => true,
  302.                     'mapped' => false,
  303.                     'constraints' => new IsTrue([
  304.                         'message' => 'Vous devez accepter la politique de confidentialité de 100 000 entrepreneurs',
  305.                     ]),
  306.                 ])
  307.             ;
  308.         }
  309.         $builder
  310.             ->add('commentaire'TextType::class, [
  311.                 'label' => "Quelle question auriez-vous aimé qu'on vous pose ? Une idée à nous soumettre ? Une dernière observation ou question ?",
  312.                 'required' => false,
  313.             ])
  314.             ->add('enregistrer'SubmitType::class, [
  315.                 'label' => 'Valider',
  316.             ])
  317.         ;
  318.         $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
  319.             $form $event->getForm();
  320.             $data $event->getData();
  321.             if ('Non' === $data['souhait_intervenir']) {
  322.                 $form
  323.                     ->add('ne_plus_intervenir_raisons'ModelType::class, [
  324.                         'label' => 'Pour quelle raison ne souhaitez-vous pas/plus intervenir ?',
  325.                         'class' => NePlusIntervenirRaison::class,
  326.                         'multiple' => true,
  327.                         'constraints' => new Count(['min' => 1'minMessage' => 'Le(s) raison(s) sont requise(s)']),
  328.                     ])
  329.                     ->add('rythme_souhaite'ChoiceType::class, [
  330.                         'label' => 'À quel rythme souhaitez-vous intervenir ?',
  331.                         'placeholder' => 'À quel rythme souhaitez-vous intervenir ?',
  332.                         'choices' => [
  333.                             'Moins de 5 par an' => 'Moins de 5 par an',
  334.                             'Plus de 5 par an' => 'Plus de 5 par an',
  335.                         ],
  336.                         'required' => false,
  337.                         'constraints' => [],
  338.                     ])
  339.                     ->add('mode_communications'ModelType::class, [
  340.                         'label' => 'Nous communiquons avec vous par mail, téléphone et SMS, mais auriez-vous une préférence à nous indiquer ?',
  341.                         'class' => ModeCommunication::class,
  342.                         'multiple' => true,
  343.                         'required' => false,
  344.                         'query' => ModeCommunicationQuery::create()->filterByActif(true),
  345.                         'constraints' => [],
  346.                     ])
  347.                     ->add('departements'ModelType::class, [
  348.                         'label' => 'Dans quel(s) département(s) proche(s) de votre domicile et/ou lieu de travail êtes-vous
  349.                             disponible ? (2 chiffres, 3 chiffres pour Outre Mer - exemple : 11, 44, 972, 01)',
  350.                         'class' => Departement::class,
  351.                         'query' => DepartementQuery::create()->filterByActif(true)->orderByNumero()->filterByNumero('00'Criteria::NOT_EQUAL),
  352.                         'multiple' => true,
  353.                         'required' => false,
  354.                         'constraints' => [],
  355.                     ])
  356.                     ->add('souhait_devenir_rt'ChoiceType::class, [
  357.                         'label' => "Seriez-vous intéressé.e pour être un relais territorial ? (être l'ambassadeur de
  358.                             l'association 100 000 entrepreneurs et nous aider à développer les témoignages auprès des jeunes
  359.                             de votre territoire)",
  360.                         'placeholder' => '',
  361.                         'required' => false,
  362.                         'choices' => [
  363.                             Entrepreneur::ACCEPT_DEVENIR_RT => Entrepreneur::ACCEPT_DEVENIR_RT,
  364.                             Entrepreneur::PK_PAS_DEVENIR_RT => Entrepreneur::PK_PAS_DEVENIR_RT,
  365.                             Entrepreneur::REFUSE_DEVENIR_RT => Entrepreneur::REFUSE_DEVENIR_RT,
  366.                         ],
  367.                         'constraints' => [],
  368.                     ])
  369.                 ;
  370.             }
  371.             if (isset($data['reseau_non_reference'])) {
  372.                 $form->add('reseaux'ModelType::class, [
  373.                     'label' => 'Réseau(x) d\'entrepreneurs',
  374.                     'class' => Reseau::class,
  375.                     'query' => ReseauQuery::create()->filterByTypeReseau(self::TYPE_RESEAU_ENTREPRENEURCriteria::LIKE),
  376.                     'multiple' => true,
  377.                     'required' => false,
  378.                 ])
  379.                     ->add('reseau_precision'TextType::class, [
  380.                         'label' => 'Précision',
  381.                         'attr' => ['placeholder' => "Précisez le(s) s'il vous plait"],
  382.                         'required' => true,
  383.                         'constraints' => new NotBlank(['message' => 'Le(s) réseau(x) ne doit/doivent pas être vide(s)']),
  384.                     ]);
  385.             } elseif (isset($data['reseau_non_appartenance'])) {
  386.                 $form->add('reseaux'ModelType::class, [
  387.                     'label' => 'Réseau(x) d\'entrepreneurs',
  388.                     'class' => Reseau::class,
  389.                     'query' => ReseauQuery::create()->filterByTypeReseau(self::TYPE_RESEAU_ENTREPRENEURCriteria::LIKE),
  390.                     'multiple' => true,
  391.                     'required' => false,
  392.                 ]);
  393.             } else {
  394.                 $form->add('reseaux'ModelType::class, [
  395.                     'label' => 'Réseau(x) d\'entrepreneurs',
  396.                     'class' => Reseau::class,
  397.                     'query' => ReseauQuery::create()->filterByTypeReseau(self::TYPE_RESEAU_ENTREPRENEURCriteria::LIKE),
  398.                     'multiple' => true,
  399.                     'required' => true,
  400.                     'constraints' => new Count(['min' => 1'minMessage' => 'Le(s) réseau(x) sont requis']),
  401.                 ]);
  402.             }
  403.         });
  404.         return $builder;
  405.     }
  406.     public function configureOptions(OptionsResolver $resolver)
  407.     {
  408.         $resolver->setDefaults([
  409.             'data_class' => Entrepreneur::class,
  410.             'isFromSurvey2' => false,
  411.             'isFromSignUp' => false,
  412.         ]);
  413.         $resolver->setRequired(['entrepreneur']);
  414.     }
  415.     public function getBlockPrefix()
  416.     {
  417.         return 'inscription';
  418.     }
  419. }