src/Form/Frontend/InscripcionType.php line 52

Open in your IDE?
  1. <?php
  2. namespace App\Form\Frontend;
  3. use Symfony\Component\Form\AbstractType;
  4. use Symfony\Component\Form\FormBuilderInterface;
  5. use Symfony\Component\Form\FormEvents;
  6. use Doctrine\ORM\EntityRepository;
  7. use App\DBAL\Backend\EnumTurnoHorarioType as EnumTurnoHorarioType;
  8. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  9. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  10. use Symfony\Component\Form\Extension\Core\Type\FileType;
  11. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  12. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  13. use Symfony\Component\Validator\Constraints as Assert;
  14. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  15. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  16. use Symfony\Component\Form\Extension\Core\Type\TextType;
  17. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  18. use Doctrine\Persistence\ManagerRegistry;
  19. use App\Entity\Backend\Categoria;
  20. use App\Entity\Backend\Tarifa;
  21. use App\Util\UtilInscritos;
  22. class InscripcionType extends AbstractType {
  23. private $em;
  24. private $utilInscritos;
  25. //AƱadimos el EntityManager para poder ir a la BD y traernos las barra-categorias disponibles de esa competicion, para evitar fallos de validacion en el formulario
  26. public function __construct(ManagerRegistry $em, UtilInscritos $utilInscritos, private readonly ValidateInscriptionRates $validateInscriptionRates){
  27. $this->em = $em;
  28. $this->utilInscritos = $utilInscritos;
  29. }
  30. public function buildForm(FormBuilderInterface $builder, array $options) {
  31. $builder->addEventListener(FormEvents::POST_SUBMIT, $this->validateInscriptionRates);
  32. $idc = $options['attr']['competicion']->getId();
  33. $permitirExtranjeros = $options['attr']['competicion']->getpermitirExtranjeros() ? "-andEnglish" : "";
  34. $competition = $options['attr']['competicion'];
  35. if ($competition->isRyderCup()) {
  36. $teams = $this->em->getRepository(\App\Entity\Backend\Equipo::class)->findBy(['competicion' => $competition], ['equipo' => 'ASC']);
  37. $members = $this->em->getRepository(\App\Entity\Backend\Inscrito::class)->findActiveRyderRegistrations($competition);
  38. $counts = [];
  39. foreach ($members as $member) {
  40. $id = (int) $member->getEquipoEntidad()?->getId();
  41. $counts[$id] = ($counts[$id] ?? 0) + 1;
  42. }
  43. $choices = [];
  44. foreach ($teams as $team) {
  45. if (($counts[(int) $team->getId()] ?? 0) < $competition->getJugadores()) {
  46. $choices[$team->getNombre() . ' (Equipo ' . $team->getEquipo() . ')'] = (int) $team->getId();
  47. }
  48. }
  49. $builder->add('teamId', ChoiceType::class, [
  50. 'mapped' => false, 'required' => true, 'label' => 'Equipo', 'translation_domain' => false,
  51. 'placeholder' => 'Selecciona tu equipo', 'choices' => $choices,
  52. ]);
  53. }
  54. $builder
  55. ->add('save', SubmitType::class, array('label' => 'competicion.inscritos.continue', 'translation_domain' => 'FrontendBundle', 'attr' => array('class' => 'ui big blue circular fluid right floated disabled button ')))
  56. ->add('nombre_jugador', TextType::class, array('required' => true, 'mapped' => false, 'label' => 'competicion.inscritos.name' . $permitirExtranjeros, 'translation_domain' => 'FrontendBundle', 'attr' => array('required' => true, 'disabled' => 'disabled')))
  57. ->add('licencia', TextType::class, array('label' => 'competicion.inscritos.licencia' . $permitirExtranjeros, 'translation_domain' => 'FrontendBundle', 'required' => true, 'mapped' => false, 'attr' => array('class' => 'prompt licencia', 'autocomplete' => 'off')))
  58. ->add('tarifa_select', EntityType::class, array('attr' => array('disabled' => 'disabled'),
  59. 'label' => 'competicion.inscritos.fare' . $permitirExtranjeros,
  60. 'translation_domain' => 'FrontendBundle',
  61. 'mapped' => false,
  62. 'required' => true,
  63. 'class' => Tarifa::class,
  64. 'placeholder' => 'competicion.inscritos.fare-empty' . $permitirExtranjeros,
  65. 'query_builder' => function (EntityRepository $e) use ($idc) {
  66. $now = new \DateTime('now');
  67. return $e->createQueryBuilder('a')
  68. ->innerJoin('Backend:Competicion', 'c', 'WITH', 'c.id = a.competicion')
  69. ->innerJoin('Backend:Club', 'cl', 'WITH', 'c.club = cl.id')
  70. ->innerJoin('Backend:Timezone', 't', 'WITH', 't.id = cl.timezone')
  71. ->where('a.competicion = :competicion')
  72. ->andWhere("a.inicio IS NULL OR CONVERT_TZ(a.inicio, t.nombre, '" . date_default_timezone_get() . "') <= :now")
  73. ->andWhere("a.fin IS NULL OR CONVERT_TZ(a.fin, t.nombre, '". date_default_timezone_get() . "') >= :now")
  74. ->setParameter('now', $now)
  75. ->setParameter('competicion', $idc);
  76. }
  77. ))
  78. ->add('documentoHcp', FileType::class, array('label' => 'competicion.inscritos.document' . $permitirExtranjeros, 'translation_domain' => 'FrontendBundle', 'mapped' => false, 'required' => false, 'attr' => array('class' => 'documentoHcp', 'accept' => "application/pdf", 'data-help' => 'competicion.inscritos.document-help' . $permitirExtranjeros, 'disabled' => 'disabled')))
  79. ->add('email', EmailType::class, array('label' => 'competicion.inscritos.email', 'translation_domain' => 'FrontendBundle', 'mapped' => false, 'required' => true, 'attr' => array('class' => 'email form_email', 'data-help' => 'competicion.inscritos.email-help' . $permitirExtranjeros, 'disabled' => 'disabled')))
  80. ->add('observaciones', TextareaType::class, array('label' => 'competicion.inscritos.annotation' . $permitirExtranjeros, 'translation_domain' => 'FrontendBundle', 'required' => false, 'mapped' => false, 'attr' => array('maxlength' => 100, 'rows' => 6)))
  81. ->add('id', HiddenType::class)
  82. ->add('categoria', HiddenType::class, array('required' => true, 'mapped' => false))
  83. ->add('tarifa', HiddenType::class, array('required' => true, 'mapped' => false))
  84. ->add('telefono_jugador', TextType::class, array('required' => false, 'mapped' => false, 'label' => 'competicion.inscritos.phone' . $permitirExtranjeros, 'translation_domain' => 'FrontendBundle',
  85. 'attr' => array('disabled' => 'disabled', 'data-help' => 'competicion.inscritos.phone-help' . $permitirExtranjeros, 'class' => 'phone-input')))
  86. ->add('tlfnPrefix', HiddenType::class, array('mapped' => false, 'attr' => array('class' => 'phone-prefix-input')))
  87. ->add('sgCliente', HiddenType::class, array('mapped' => false))
  88. ;
  89. if (!$options['attr']['competicion']->getBarraSalida()) {
  90. $builder
  91. ->add('categoria_select', EntityType::class, array('attr' => array('disabled' => 'disabled'),
  92. 'label' => 'competicion.inscritos.category' . $permitirExtranjeros,
  93. 'translation_domain' => 'FrontendBundle',
  94. 'mapped' => false,
  95. 'required' => true,
  96. 'class' => Categoria::class,
  97. 'placeholder' => 'competicion.inscritos.category-empty' . $permitirExtranjeros,
  98. 'query_builder' => function (EntityRepository $e) use ($idc) {
  99. return $e->createQueryBuilder('a')
  100. ->where('a.competicion = :competicion')
  101. ->setParameter('competicion', $idc);
  102. }
  103. ));
  104. } else {
  105. $builder
  106. ->add('barra', ChoiceType::class, array(
  107. 'attr' => ['class' => 'barraSalida '],
  108. 'label' => 'competicion.inscritos.tee' . $permitirExtranjeros,
  109. 'translation_domain' => 'FrontendBundle',
  110. 'mapped' => false,
  111. 'required' => true,
  112. 'empty_data' => 'competicion.inscritos.tee-empty' . $permitirExtranjeros,
  113. 'placeholder' => 'competicion.inscritos.tee-empty' . $permitirExtranjeros,
  114. 'choices' => $this->utilInscritos->barrasCategorias($idc) //nos traemos los barra-categoria de la competicion, si tenemos al jugador filtramos ademas por sexo
  115. ));
  116. }
  117. //SI ES CM00 O TIENE NEW-FORM EN EL CODIGO SE MUESTRA NUEVO FORM COVID
  118. //Se cambia segun tarea NEX-1447-5
  119. //if ($options['attr']['org'] == "CM00" || ($options['attr']['competicion']->getCodigo() == "NEW-FORM")) {
  120. //Se elimina el COVID de la inscripcion segun NEX-1838
  121. // if (strpos($options['attr']['org'], "00") !== false) {
  122. // $builder->add('covidfilename', HiddenType::class, array('label' => "", 'mapped' => false, 'required' => false, 'attr' => array('class' => 'covidfilename')));
  123. // }
  124. //fin covid
  125. //
  126. // //Segun la nota informativa del 28/03/2022 se comenta esta parte
  127. // if ($options['attr']['org'] == "AM00") {
  128. // $builder->add('certificado', 'hidden', array('label' => "", 'mapped' => false, 'required' => false, 'attr' => array('class' => 'certificado')));
  129. // }
  130. //solo mostramos turno si hay plazas definidas
  131. if (($options['attr']['competicion']->getPlazasManana() > 0) || ($options['attr']['competicion']->getPlazasTarde() > 0)) {
  132. $dispManana = $options['attr']['dispManana']; //las plazas que hay vacantes aun (totales menos las usadas)
  133. $dispTarde = $options['attr']['dispTarde'];
  134. if (($dispManana >= 1) && ($dispTarde >= 1)) {
  135. $builder->add('turno', ChoiceType::class, array('choices' => EnumTurnoHorarioType::getSmallChoices(), 'expanded' => false, 'mapped' => false, 'required' => true, 'attr' => array('class' => 'form-control')));
  136. } elseif (($dispManana >= 1) && ($dispTarde < 1)) {
  137. $builder->add('turno', ChoiceType::class, array('choices' => EnumTurnoHorarioType::getMananaChoices(), 'expanded' => false, 'mapped' => false, 'required' => true, 'attr' => array('class' => 'form-control')));
  138. } elseif (($dispManana < 1) && ($dispTarde >= 1)) {
  139. $builder->add('turno', ChoiceType::class, array('choices' => EnumTurnoHorarioType::getTardeChoices(), 'expanded' => false, 'mapped' => false, 'required' => true, 'attr' => array('class' => 'form-control')));
  140. }
  141. }
  142. if (count(($options['attr']['competicion']->getVouchers())) > 0) {
  143. $builder->add('voucher', TextType::class, array('mapped' => false, 'required' => false, 'attr' => array('class' => 'form-control')));
  144. }
  145. //->add('captcha', 'captcha', array('width' => 240, 'height' => 60, 'max_front_lines' => 1, 'max_behind_lines' => 3, 'distortion' => true, 'quality' => 150, 'length' => 6, 'interpolation' => true, 'background_color' => [245, 245, 245]));
  146. }
  147. // public function getDefaultOptions() {
  148. // return array(
  149. // 'data_class' => 'App\Entity\Backend\Inscrito',
  150. // 'id' => null
  151. // );
  152. // }
  153. public function getName() {
  154. return $this->getBlockPrefix();
  155. }
  156. public function getBlockPrefix(): string {
  157. return 'inscripcion_jugador';
  158. }
  159. }