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

Open in your IDE?
  1. <?php
  2. namespace App\MDS\VenuesBundle\Form;
  3. use App\Entity\Client;
  4. use App\Entity\DocContractModel;
  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.                 // 'attr' => ['class' => 'switchery-info boolDelete'] // Se puede poner aquí o en la vista
  33.             ])
  34.             ->add('client'EntityType::class, [
  35.                 'class' => Client::class,
  36.                 'choice_label' => 'name',
  37.                 'placeholder'  => 'Select a client',
  38.                 'required'     => false,
  39.                 'label'        => 'Client',
  40.             ])
  41.             // Si clientContact es una entidad, usa EntityType. Si es texto manual, TextType.
  42.             // Lo mantengo como Hidden para respetar tu lógica actual de JS, pero lo ideal es EntityType.
  43.             ->add('clientContact'HiddenType::class)
  44.             
  45.             // Campos "No registrados"
  46.             ->add('contactUnregistered'TextType::class, [
  47.                 'required' => false
  48.                 'label' => 'Correo electrónico'
  49.             ])
  50.             ->add('nameContactUnregistered'TextType::class, [
  51.                 'required' => false
  52.                 'label' => 'Nombre y apellido'
  53.             ])
  54.             ->add('phoneContactUnregistered'TextType::class, [
  55.                 'required' => false
  56.                 'label' => 'Teléfono'
  57.             ])
  58.             ->add('status'ChoiceType::class, [
  59.                 'required' => false,
  60.                 'choices' => [
  61.                     'INICIADO' => 'Iniciado',
  62.                     'BLOQUEO'  => 'Bloqueo',
  63.                     'CONFIRMADO' => 'Confirmed',
  64.                     'COTIZADO' => 'Cotizado',
  65.                     'FACTURADO *'  => 'Invoiced',
  66.                     'CANCELADO' => 'Deleted',
  67.                     'PENDIENTE' => 'Pendiente',
  68.                 ],
  69.                 'placeholder' => 'Select a status',
  70.                 'label' => 'Status',
  71.                 'choice_attr' => function($choice$key$value) use ($options) {
  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.             // Usar DateType para que Symfony maneje la conversión de fecha automáticamente
  86.             ->add('days'DateType::class, [
  87.                 'widget' => 'single_text',
  88.                 'html5' => true// Renderiza <input type="date">
  89.                 'required' => false,
  90.                 'label' => 'Fecha límite bloqueo'
  91.             ])
  92.             ->add('dateNextMailAlert'DateType::class, [
  93.                 'widget' => 'single_text',
  94.                 'html5' => true,
  95.                 'required' => false,
  96.                 'label' => 'Fecha de próxima notificación',
  97.                 'mapped' => false
  98.             ])
  99.             ->add('priority'HiddenType::class)
  100.             ->add('contract'HiddenType::class) // Asumiendo que es un campo simple
  101.             ->add('comHtGp'TextType::class, [
  102.                 'required' => false,
  103.                 'label' => 'Catering commission'
  104.             ])
  105.             ->add('description'TextareaType::class, [
  106.                 'required' => false,
  107.                 'label' => 'Description - Briefing',
  108.                 'attr' => ['rows' => 7'class' => 'summernote']
  109.             ])
  110.             ->add('save'SubmitType::class, ['label' => 'Save']);
  111.             $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
  112.                 /** @var Reservation|null $reservation */
  113.                 $reservation $event->getData();
  114.                 $form $event->getForm();
  115.                 // Si $reservation es null (formulario sin datos iniciales) no hacemos nada.
  116.                 if (!$reservation) {
  117.                     return;
  118.                 }
  119.                 // Comprobamos si tiene ID. Si NO tiene ID, es una creación nueva.
  120.                 if (null === $reservation->getId()) {
  121.                     $form->add('pax'IntegerType::class, [
  122.                         // 'mapped' => false,    // No se guarda en la entidad Reservation automáticamente
  123.                         'required' => false,
  124.                         'label' => 'Personas Total',
  125.                         'attr' => [
  126.                             'placeholder' => 'Pax Total',
  127.                             'class' => 'form-control' // Ayuda a que se vea bien en Bootstrap 3 por defecto
  128.                         ]
  129.                     ]);
  130.                 }
  131.             });
  132.     }
  133.     public function configureOptions(OptionsResolver $resolver): void
  134.     {
  135.         $resolver->setDefaults([
  136.             'data_class' => Reservation::class,
  137.             // Permitimos pasar variables extra al formulario para la lógica de visualización
  138.             'allow_extra_fields' => true,
  139.             'confirmable' => false
  140.             'cotizable'   => false,
  141.             'invoiced'    => false,
  142.         ]);
  143.         $resolver->setAllowedTypes('confirmable''bool');
  144.         $resolver->setAllowedTypes('cotizable''bool');
  145.         $resolver->setAllowedTypes('invoiced''bool');
  146.     }
  147.     public function getBlockPrefix(): string
  148.     {
  149.         return 'mds_venuesbundle_reservation';
  150.     }
  151. }