src/MDS/VenuesBundle/Form/ReservationType.php line 24

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\MDS\VenuesBundle\Form;
  4. use App\Entity\Client;
  5. use App\MDS\VenuesBundle\Entity\Reservation;
  6. use Symfony\Component\Form\AbstractType;
  7. use Symfony\Component\Form\FormBuilderInterface;
  8. use Symfony\Component\OptionsResolver\OptionsResolver;
  9. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  10. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  11. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  12. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  13. use Symfony\Component\Form\Extension\Core\Type\TextType;
  14. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  15. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  16. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  17. use Symfony\Component\Form\Extension\Core\Type\DateType;
  18. use Symfony\Component\Form\FormEvent;
  19. use Symfony\Component\Form\FormEvents;
  20. class ReservationType extends AbstractType
  21. {
  22.     public function buildForm(FormBuilderInterface $builder, array $options): void
  23.     {
  24.         $builder
  25.             ->add('title', TextType::class, [
  26.                 'required' => true,
  27.                 'label' => 'Title'
  28.             ])
  29.             ->add('sucoe', CheckboxType::class, [
  30.                 'label' => '¿Es SUCOE?', 
  31.                 'required' => false,
  32.             ])
  33.             ->add('client', EntityType::class, [
  34.                 'class' => Client::class,
  35.                 'choice_label' => 'name',
  36.                 'placeholder'  => 'Select a client',
  37.                 'required'     => false,
  38.                 'label'        => 'Client',
  39.             ])
  40.             ->add('clientContact', HiddenType::class)
  41.             
  42.             // Campos "No registrados"
  43.             ->add('contactUnregistered', TextType::class, [
  44.                 'required' => false, 
  45.                 'label' => 'Correo electrónico'
  46.             ])
  47.             ->add('nameContactUnregistered', TextType::class, [
  48.                 'required' => false, 
  49.                 'label' => 'Nombre y apellido'
  50.             ])
  51.             ->add('phoneContactUnregistered', TextType::class, [
  52.                 'required' => false, 
  53.                 'label' => 'Teléfono'
  54.             ])
  55.             ->add('status', ChoiceType::class, [
  56.                 'required' => false,
  57.                 'choices' => [
  58.                     'INICIADO' => 'Iniciado',
  59.                     'BLOQUEO'  => 'Bloqueo', // Mapeado exacto si tu BD guarda inglés/español
  60.                     'CONFIRMADO' => 'Confirmed',
  61.                     'COTIZADO' => 'Cotizado',
  62.                     'FACTURADO *'  => 'Invoiced',
  63.                     'CANCELADO' => 'Deleted',
  64.                     'PENDIENTE' => 'Pendiente',
  65.                 ],
  66.                 'placeholder' => 'Select a status',
  67.                 'label' => 'Status',
  68.                 'choice_attr' => function($choice, $key, $value) use ($options) {
  69.                     if ($value === 'Iniciado') {
  70.                         return ['disabled' => 'disabled'];
  71.                     }
  72.                     if ($value === 'Invoiced' && !$options['invoiced']) {
  73.                         return ['disabled' => 'disabled'];
  74.                     }
  75.                     if ($value === 'Cotizado' && !$options['cotizable']) {
  76.                        return ['disabled' => 'disabled'];
  77.                     }
  78.                     return [];
  79.                 },
  80.             ])
  81.             ->add('daysBlock', IntegerType::class, [
  82.                 'label' => 'Días de bloqueo',
  83.                 'required' => false
  84.             ])
  85.             ->add('days', DateType::class, [
  86.                 'widget' => 'single_text',
  87.                 'html5' => true,
  88.                 'required' => false,
  89.                 'label' => 'Fecha límite bloqueo'
  90.             ])
  91.             ->add('dateNextMailAlert', DateType::class, [
  92.                 'widget' => 'single_text',
  93.                 'html5' => true,
  94.                 'required' => false,
  95.                 'label' => 'Fecha de próxima notificación',
  96.                 'mapped' => false
  97.             ])
  98.             ->add('priority', HiddenType::class)
  99.             ->add('contract', HiddenType::class)
  100.             ->add('comHtGp', TextType::class, [
  101.                 'required' => false,
  102.                 'label' => 'Catering commission'
  103.             ])
  104.             ->add('description', TextareaType::class, [
  105.                 'required' => false,
  106.                 'label' => 'Description - Briefing',
  107.                 'attr' => ['rows' => 7, 'class' => 'summernote']
  108.             ])
  109.             ->add('dateStart', DateType::class, [
  110.                 'widget' => 'single_text',
  111.                 'html5' => true,
  112.                 'required' => false,
  113.                 'label' => 'Fecha de Inicio'
  114.             ])
  115.             ->add('dateEnd', DateType::class, [
  116.                 'widget' => 'single_text',
  117.                 'html5' => true,
  118.                 'required' => false,
  119.                 'label' => 'Fecha de Fin'
  120.             ])
  121.             ->add('save', SubmitType::class, [
  122.                 'label' => 'Save'
  123.             ]); // Aquí cerramos correctamente la asignación estructural del builder.
  124.         // Event Listener añadido de forma independiente al flujo fluido del builder
  125.         $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
  126.             /** @var Reservation|null $reservation */
  127.             $reservation = $event->getData();
  128.             $form = $event->getForm();
  129.             if (!$reservation) {
  130.                 return;
  131.             }
  132.             if (null === $reservation->getId()) {
  133.                 $form->add('pax', IntegerType::class, [
  134.                     'required' => false,
  135.                     'label' => 'Personas Total',
  136.                     'attr' => [
  137.                         'placeholder' => 'Pax Total',
  138.                         'class' => 'form-control'
  139.                     ]
  140.                 ]);
  141.             }
  142.         });
  143.     }
  144.     public function configureOptions(OptionsResolver $resolver): void
  145.     {
  146.         $resolver->setDefaults([
  147.             'data_class' => Reservation::class,
  148.             'allow_extra_fields' => true,
  149.             'confirmable' => false, 
  150.             'cotizable'   => false,
  151.             'invoiced'    => false,
  152.         ]);
  153.         $resolver->setAllowedTypes('confirmable', 'bool');
  154.         $resolver->setAllowedTypes('cotizable', 'bool');
  155.         $resolver->setAllowedTypes('invoiced', 'bool');
  156.     }
  157.     public function getBlockPrefix(): string
  158.     {
  159.         return 'mds_venuesbundle_reservation';
  160.     }
  161. }