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

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.                     // Solo al crear el expediente se pondrá el estado en Iniciado
  73.                     if ($value === 'Iniciado') {
  74.                         return ['disabled' => 'disabled'];
  75.                     }
  76.                     if ($value === 'Invoiced' && !$options['invoiced']) {
  77.                         return ['disabled' => 'disabled'];
  78.                     }
  79.                     if ($value === 'Cotizado' && !$options['cotizable']) {
  80.                        return ['disabled' => 'disabled'];
  81.                     }
  82.                     return [];
  83.                 },
  84.             ])
  85.             ->add('daysBlock'IntegerType::class, [
  86.                 'label' => 'Días de bloqueo',
  87.                 'required' => false
  88.             ])
  89.             // Usar DateType para que Symfony maneje la conversión de fecha automáticamente
  90.             ->add('days'DateType::class, [
  91.                 'widget' => 'single_text',
  92.                 'html5' => true// Renderiza <input type="date">
  93.                 'required' => false,
  94.                 'label' => 'Fecha límite bloqueo'
  95.             ])
  96.             ->add('dateNextMailAlert'DateType::class, [
  97.                 'widget' => 'single_text',
  98.                 'html5' => true,
  99.                 'required' => false,
  100.                 'label' => 'Fecha de próxima notificación',
  101.                 'mapped' => false
  102.             ])
  103.             ->add('priority'HiddenType::class)
  104.             ->add('contract'HiddenType::class) // Asumiendo que es un campo simple
  105.             ->add('comHtGp'TextType::class, [
  106.                 'required' => false,
  107.                 'label' => 'Catering commission'
  108.             ])
  109.             ->add('description'TextareaType::class, [
  110.                 'required' => false,
  111.                 'label' => 'Description - Briefing',
  112.                 'attr' => ['rows' => 7'class' => 'summernote']
  113.             ])
  114.             ->add('dateStart'DateType::class, [
  115.                 'widget' => 'single_text',
  116.                 'html5' => true// Renderiza <input type="date">
  117.                 'required' => false,
  118.                 'label' => 'Fecha de Inicio'
  119.             ])
  120.             ->add('dateEnd'DateType::class, [
  121.                 'widget' => 'single_text',
  122.                 'html5' => true// Renderiza <input type="date">
  123.                 'required' => false,
  124.                 'label' => 'Fecha de Fin'
  125.             ])
  126.             ->add('save'SubmitType::class, ['label' => 'Save']);
  127.             $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
  128.                 /** @var Reservation|null $reservation */
  129.                 $reservation $event->getData();
  130.                 $form $event->getForm();
  131.                 // Si $reservation es null (formulario sin datos iniciales) no hacemos nada.
  132.                 if (!$reservation) {
  133.                     return;
  134.                 }
  135.                 // Comprobamos si tiene ID. Si NO tiene ID, es una creación nueva.
  136.                 if (null === $reservation->getId()) {
  137.                     $form->add('pax'IntegerType::class, [
  138.                         // 'mapped' => false,    // No se guarda en la entidad Reservation automáticamente
  139.                         'required' => false,
  140.                         'label' => 'Personas Total',
  141.                         'attr' => [
  142.                             'placeholder' => 'Pax Total',
  143.                             'class' => 'form-control' // Ayuda a que se vea bien en Bootstrap 3 por defecto
  144.                         ]
  145.                     ]);
  146.                 }
  147.             });
  148.     }
  149.     public function configureOptions(OptionsResolver $resolver): void
  150.     {
  151.         $resolver->setDefaults([
  152.             'data_class' => Reservation::class,
  153.             // Permitimos pasar variables extra al formulario para la lógica de visualización
  154.             'allow_extra_fields' => true,
  155.             'confirmable' => false
  156.             'cotizable'   => false,
  157.             'invoiced'    => false,
  158.         ]);
  159.         $resolver->setAllowedTypes('confirmable''bool');
  160.         $resolver->setAllowedTypes('cotizable''bool');
  161.         $resolver->setAllowedTypes('invoiced''bool');
  162.     }
  163.     public function getBlockPrefix(): string
  164.     {
  165.         return 'mds_venuesbundle_reservation';
  166.     }
  167. }