src/Form/EquipoType.php line 294

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\CEstadoUso;
  4. use App\Entity\CMarcas;
  5. use App\Entity\CMaterial;
  6. use App\Entity\Equipo;
  7. use App\Entity\Ubicacion;
  8. use App\Entity\Unidad;
  9. use App\Entity\Usuario;
  10. use Symfony\Component\Form\AbstractType;
  11. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  12. use Symfony\Component\Form\Extension\Core\Type\NumberType;
  13. use Symfony\Component\Form\FormBuilderInterface;
  14. use Symfony\Component\Form\FormEvent;
  15. use Symfony\Component\Form\FormEvents;
  16. use Symfony\Component\OptionsResolver\OptionsResolver;
  17. use Doctrine\ORM\EntityRepository;
  18. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  19. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  20. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  21. use Symfony\Component\Form\Extension\Core\Type\TextType;
  22. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  23. use Symfony\Component\Validator\Constraints\Ip;
  24. use Symfony\Component\Validator\Constraints\NotBlank;
  25. use Symfony\Component\Validator\Constraints\NotNull;
  26. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  27. use Symfony\Component\Validator\Constraints\Choice;
  28. class EquipoType extends AbstractType
  29. {
  30.     private TokenStorageInterface $token;
  31.     public function __construct(TokenStorageInterface $token)
  32.     {
  33.         $this->token $token;
  34.     }
  35.     public function buildForm(FormBuilderInterface $builder, array $options): void
  36.     {
  37.         $builder
  38.             ->add('marbete'TextType::class, [
  39.                 'label' => '* Marbete',
  40.                 'required' => false,
  41.                 'constraints' => [
  42.                     new NotBlank(['message' => 'El campo "Marbete" no debe estar vacío.'])
  43.                 ],
  44.                 'attr' => [
  45.                     'class' => 'form-control form-control-sm',
  46.                     'readonly' => $options['bloquear_edicion']
  47.                 ]
  48.             ])
  49.             ->add('descripcion'TextareaType::class, [
  50.                 'label' => '* Descripción',
  51.                 'required' => false,
  52.                 'constraints' => [
  53.                     new NotBlank(['message' => 'El campo "Descripción" no debe estar vacío.']),
  54.                 ],
  55.                 'attr' => [
  56.                     'class' => 'form-control form-control-sm',
  57. //                    'readonly' => $options['bloquear_edicion']
  58.                 ],
  59.             ])
  60.             ->add('modelo'TextType::class, [
  61.                 'label' => '* Modelo',
  62.                 'required' => false,
  63.                 'constraints' => [
  64.                     new NotBlank(['message' => 'El campo "Modelo" no debe estar vacío.'])
  65.                 ],
  66.                 'attr' => [
  67.                     'class' => 'form-control form-control-sm',
  68.                     'readonly' => $options['bloquear_edicion']
  69.                 ]
  70.             ])
  71.             ->add('serie'TextType::class, [
  72.                 'label' => '* No. serie',
  73.                 'required' => false,
  74.                 'constraints' => [
  75.                     new NotBlank(['message' => 'El campo "Numero de serie" no debe estar vacío.'])
  76.                 ],
  77.                 'attr' => [
  78.                     'class' => 'form-control form-control-sm',
  79.                     'readonly' => $options['bloquear_edicion']
  80.                 ]
  81.             ])
  82.             ->add('procesador'TextType::class, [
  83.                 'label' => 'Procesador',
  84.                 'required' => false,
  85.                 'attr' => [
  86.                     'class' => 'form-control form-control-sm'
  87.                 ]
  88.             ])
  89.             ->add('nucleos'IntegerType::class, [
  90.                 'label' => 'Núcleos',
  91.                 'constraints' => [
  92.                     new NotBlank(['message' => 'El campo "Núcleos" no debe estar vacío.'])
  93.                 ],
  94.                 'attr' => [
  95.                     'class' => 'form-control form-control-sm'
  96.                 ]
  97.             ])
  98.             ->add('cpuVelocidad'NumberType::class, [
  99.                 'label' => 'Velocidad de CPU',
  100.                 'constraints' => [
  101.                     new NotBlank(['message' => 'El campo "CPU" no debe estar vacío.'])
  102.                 ],
  103.                 'attr' => [
  104.                     'class' => 'form-control form-control-sm'
  105.                 ]
  106.             ])
  107.             ->add('ram'IntegerType::class, [
  108.                 'label' => 'RAM',
  109.                 'constraints' => [
  110.                     new NotBlank(['message' => 'El campo "RAM" no debe estar vacío.'])
  111.                 ],
  112.                 'attr' => [
  113.                     'class' => 'form-control form-control-sm'
  114.                 ]
  115.             ])
  116.             ->add('hhd'NumberType::class, [
  117.                 'label' => 'HDD',
  118.                 'required' => false,
  119.                 'attr' => [
  120.                     'class' => 'form-control form-control-sm'
  121.                 ]
  122.             ])
  123.             ->add('ssd'NumberType::class, [
  124.                 'label' => 'SSD',
  125.                 'required' => false,
  126.                 'attr' => [
  127.                     'class' => 'form-control form-control-sm'
  128.                 ]
  129.             ])
  130.             ->add('monitorMarbete'TextType::class, [
  131.                 'label' => 'Marbete',
  132.                 'required' => false,
  133.                 'attr' => [
  134.                     'class' => 'form-control form-control-sm'
  135.                 ]
  136.             ])
  137.             ->add('monitorMarca'EntityType::class, array(
  138.                 'label' => 'Marca',
  139.                 'required' => false,
  140.                 'class' => CMarcas::class,
  141.                 'choice_label' => 'marca',
  142.                 'placeholder' => 'Seleccione marca del monitor',
  143.                 'query_builder' => function (EntityRepository $er) {
  144.                     return $er->createQueryBuilder('b')
  145.                         ->orderBy('b.idMarca''ASC');
  146.                 },
  147.                 'attr' => array(
  148.                     'class' => 'form-control form-control-sm search-marca'
  149.                 )
  150.             ))
  151.             ->add('monitorModelo'TextType::class, [
  152.                 'label' => 'Modelo',
  153.                 'required' => false,
  154.                 'attr' => [
  155.                     'class' => 'form-control form-control-sm'
  156.                 ]
  157.             ])
  158.             ->add('monitorSerie'TextType::class, [
  159.                 'label' => 'No. serie',
  160.                 'required' => false,
  161.                 'attr' => [
  162.                     'class' => 'form-control form-control-sm'
  163.                 ]
  164.             ])
  165.             ->add('monitorTipo'TextType::class, [
  166.                 'label' => 'Tipo',
  167.                 'required' => false,
  168.                 'attr' => [
  169.                     'class' => 'form-control form-control-sm'
  170.                 ]
  171.             ])
  172.             ->add('monitorPulgadas'TextType::class, [
  173.                 'label' => 'Pulgadas',
  174.                 'required' => false,
  175.                 'attr' => [
  176.                     'class' => 'form-control form-control-sm'
  177.                 ]
  178.             ])
  179.             ->add('tecladoMarca'EntityType::class, array(
  180.                 'label' => '* Marca',
  181.                 'required' => false,
  182.                 'class' => CMarcas::class,
  183.                 'choice_label' => 'marca',
  184.                 'placeholder' => 'Seleccione marca de teclado',
  185.                 'constraints' => [
  186.                     new NotBlank(['message' => 'El campo "Marca" no debe estar vacío.']),
  187.                 ],
  188.                 'query_builder' => function (EntityRepository $er) {
  189.                     return $er->createQueryBuilder('b')
  190.                         ->orderBy('b.idMarca''ASC');
  191.                 },
  192.                 'attr' => array(
  193.                     'class' => 'form-control form-control-sm search-marca',
  194.                 ),
  195.             ))
  196.             ->add('tecladoModelo'TextType::class, [
  197.                 'label' => 'Modelo',
  198.                 'required' => false,
  199.                 'attr' => [
  200.                     'class' => 'form-control form-control-sm'
  201.                 ]
  202.             ])
  203.             ->add('tecladoSerie'TextType::class, [
  204.                 'label' => 'No. serie',
  205.                 'required' => false,
  206.                 'attr' => [
  207.                     'class' => 'form-control form-control-sm'
  208.                 ]
  209.             ])
  210.             ->add('mouseMarca'EntityType::class, array(
  211.                 // looks for choices from this entity
  212.                 'label' => '* Marca',
  213.                 'required' => false,
  214.                 'class' => CMarcas::class,
  215.                 'choice_label' => 'marca',
  216.                 'placeholder' => 'Seleccione marca del mouse',
  217.                 'constraints' => [
  218.                     new NotBlank(['message' => 'El campo "Marca" no debe estar vacío.']),
  219.                 ],
  220.                 'query_builder' => function (EntityRepository $er) {
  221.                     return $er->createQueryBuilder('b')
  222.                         ->orderBy('b.idMarca''ASC');
  223.                 },
  224.                 'attr' => array(
  225.                     'class' => 'form-control form-control-sm search-marca',
  226.                 ),
  227.             ))
  228.             ->add('mouseModelo'TextType::class, [
  229.                 'label' => 'Modelo',
  230.                 'required' => false,
  231.                 'attr' => [
  232.                     'class' => 'form-control form-control-sm'
  233.                 ]
  234.             ])
  235.             ->add('mouseSerie'TextType::class, [
  236.                 'label' => 'No. serie',
  237.                 'required' => false,
  238.                 'attr' => [
  239.                     'class' => 'form-control form-control-sm'
  240.                 ]
  241.             ])
  242.             ->add('uso'ChoiceType::class, [
  243.                 'label' => 'Uso',
  244.                 'required' => false,
  245.                 'placeholder' => 'Seleccione un uso',
  246.                 'constraints' => [
  247.                     new NotBlank(['message' => 'El campo "Uso" no debe estar vacío.']),
  248.                 ],
  249.                 'choices'  => [
  250.                     'Educativo' => 1,
  251.                     'Docente' => 2,
  252.                     'Administrativo' => 3
  253.                 ],
  254.                 'attr' => [
  255.                     'class' => 'form-control form-control-sm'
  256.                 ],
  257.             ])
  258.             ->add('funcion'ChoiceType::class, [
  259.                 'label' => 'Función',
  260.                 'required' => false,
  261.                 'placeholder' => 'Seleccione una función',
  262.                 'constraints' => [
  263.                     new NotBlank(['message' => 'El campo "Función" no debe estar vacío.']),
  264.                 ],
  265.                 'choices'  => [
  266.                     'Escritorio' => 1,
  267.                     'Servidor' => 2
  268.                 ],
  269.                 'attr' => [
  270.                     'class' => 'form-control form-control-sm'
  271.                 ],
  272.             ])
  273.             ->add('funcionDescripcion'TextType::class, [
  274.                 'label' => 'Descripcion de la función',
  275.                 'required' => false,
  276.                 'attr' => [
  277.                     'class' => 'form-control form-control-sm'
  278.                 ]
  279.             ])
  280.             ->add('estatus'ChoiceType::class, [
  281.                 'label' => 'Estatus',
  282.                 'required' => false,
  283.                 'placeholder' => 'Seleccione un estatus',
  284.                 'constraints' => [
  285.                     new NotBlank(['message' => 'El campo "Estatus" no debe estar vacío.']),
  286.                 ],
  287.                 'choices'  => [
  288.                     'En operacion' => 1,
  289.                     'Descompuesto' => 2,
  290.                     'Sin instalar' => 3,
  291.                     'En proceso de baja' => 4,
  292.                     'Baja' => 5
  293.                 ],
  294.                 'attr' => ['class' => 'form-control form-control-sm'],
  295.             ])
  296.             ->add('usuario'EntityType::class, [
  297.                 'label' => 'Resguardatario',
  298.                 'required' => false,
  299.                 'class' => Usuario::class,
  300.                 'choice_label' => function($usuario) {
  301.                     return $usuario->getNombre() . ' ' $usuario->getPapellido() . ' ' $usuario->getSapellido();
  302.                 },
  303.                 'placeholder' => 'Seleccione un usuario',
  304.                 'constraints' => [
  305.                     new NotBlank(['message' => 'El campo "Resguardatario" no debe estar vacío.']),
  306.                 ],
  307.                 'query_builder' => function(EntityRepository $entityRepository) use ($options) {
  308.                     /** @var Usuario $user */
  309.                     $user $this->token->getToken()->getUser();
  310.                     $query $entityRepository->createQueryBuilder('u');
  311.                     $query->where('u.rol >= 3');
  312.                     $query->andWhere("u.estatus = 'Activo'");
  313.                     if ($options['unidad']) {
  314.                         $query->andWhere('u.unidad = :unidad');
  315.                         $query->setParameter('unidad'$user->getUnidad());
  316.                     }
  317.                     $query->orderBy('u.nombre''ASC');
  318.                     return $query;
  319.                 },
  320.                 'attr' => [
  321.                     'class' => 'form-control form-control-sm'
  322.                 ]
  323.             ])
  324.             ->add('ubicacion'EntityType::class, [
  325.                 'label' => 'Ubicación',
  326.                 'required' => false,
  327.                 'class' => Ubicacion::class,
  328.                 'placeholder' => 'Seleccione una ubicación',
  329.                 'constraints' => [
  330.                     new NotBlank(['message' => 'El campo "Ubicación" no debe estar vacío.']),
  331.                 ],
  332.                 'query_builder' => function(EntityRepository $entityRepository) use ($options) {
  333.                     /** @var Usuario $user */
  334.                     $user $this->token->getToken()->getUser();
  335.                     $query $entityRepository->createQueryBuilder('a');
  336.                     $query->where('a.activo = 1');
  337.                     if ($options['unidad']) {
  338.                         $query->andWhere('a.unidad = :unidad');
  339.                         $query->setParameter('unidad'$user->getUnidad());
  340.                     }
  341.                     $query->orderBy('a.area''ASC');
  342.                     return $query;
  343.                 },
  344.                 'attr' => [
  345.                     'class' => 'form-control form-control-sm'
  346.                 ]
  347.             ])
  348.             ->add('ip'TextType::class, [
  349.                 'label' => 'Dirección IP',
  350.                 'required' => false,
  351.                 'constraints' => [
  352.                     new Ip(['message' => 'El campo "Dirección IP" debe ser válido.'])
  353.                 ],
  354.                 'attr' => [
  355.                     'class' => 'form-control form-control-sm'
  356.                 ]
  357.             ])
  358.             ->add('allinone'CheckboxType::class, [
  359.                 'label' => 'All-in-One',
  360.                 'required' => false,
  361.                 'attr' => ['class' => 'form-check-input'], // Opcional, para estilizar con Bootstrap
  362.             ])
  363.             ->add('actualizable'CheckboxType::class, [
  364.                 'label' => 'Actualizable',
  365.                 'required' => false,
  366.                 'attr' => ['class' => 'form-check-input'], // Opcional
  367.             ])
  368.             ->add('mac'TextType::class, [
  369.                 'label' => 'Dirección Mac',
  370.                 'required' => false,
  371.                 'attr' => [
  372.                     'class' => 'form-control form-control-sm'
  373.                 ]
  374.             ])
  375.             ->add('idMaterial'EntityType::class, array(
  376.                 'label' => '* Material',
  377.                 'required' => false,
  378.                 'class' => CMaterial::class,
  379.                 'choice_label' => 'material',
  380.                 'placeholder' => 'Seleccione material',
  381.                 'constraints' => [
  382.                     new NotBlank(['message' => 'El campo "Material" no debe estar vacío.']),
  383.                 ],
  384.                 'query_builder' => function (EntityRepository $er) {
  385.                     return $er->createQueryBuilder('b')
  386.                         ->orderBy('b.material''ASC');
  387.                 },
  388.                 'attr' => array(
  389.                     'class' => 'form-control form-control-sm search-material'
  390.                 ),
  391.             ))
  392.             ->add('idUso'EntityType::class, array(
  393.                 'label' => '* Estado de uso',
  394.                 'required' => false,
  395.                 'class' => CEstadoUso::class,
  396.                 'choice_label' => 'estatusUso',
  397.                 'placeholder' => 'Seleccione estado de uso',
  398.                 'constraints' => [
  399.                     new NotBlank(['message' => 'El campo "Estado de uso" no debe estar vacío.']),
  400.                 ],
  401.                 'query_builder' => function (EntityRepository $er) {
  402.                     return $er->createQueryBuilder('b')
  403.                         ->orderBy('b.estatusUso''ASC');
  404.                 },
  405.                 'attr' => array(
  406.                     'class' => 'form-control form-control-sm'
  407.                 ),
  408.             ))
  409.             ->add('idMarca'EntityType::class, array(
  410.                 'label' => '* Marca',
  411.                 'required' => false,
  412.                 'class' => CMarcas::class,
  413.                 'choice_label' => 'marca',
  414.                 'placeholder' => 'Seleccione marca del equipo',
  415.                 'constraints' => [
  416.                     new NotBlank(['message' => 'El campo "Marca" no debe estar vacío.']),
  417.                 ],
  418.                 'query_builder' => function (EntityRepository $er) {
  419.                     return $er->createQueryBuilder('b')
  420.                         ->orderBy('b.idMarca''ASC');
  421.                 },
  422.                 'attr' => array(
  423.                     'class' => 'form-control form-control-sm search-marca',
  424.                     'readonly' => $options['bloquear_edicion']
  425.                 ),
  426.             ))
  427.             ->add('color'TextType::class, [
  428.                 'label' => '* Color',
  429.                 'required' => false,
  430.                 'attr' => [
  431.                     'class' => 'form-control form-control-sm',
  432.                 ],
  433.                 'constraints' => [
  434.                     new NotBlank(['message' => 'El campo "Color" no debe estar vacío.']),
  435.                 ],
  436.             ])
  437.             ->add('piso'TextType::class, [
  438.                 'label' => '* Piso',
  439.                 'required' => false,
  440.                 'constraints' => [
  441.                     new NotBlank(['message' => 'El campo "Piso" no debe estar vacío.']),
  442.                 ],
  443.                 'attr' => [
  444.                     'class' => 'form-control form-control-sm',
  445.                 ],
  446.             ])
  447.             ->add('seccionAula'TextType::class, [
  448.                 'label' => '* Sección o aula',
  449.                 'required' => false,
  450.                 'constraints' => [
  451.                     new NotBlank(['message' => 'El campo "Sección o aula" no debe estar vacío.']),
  452.                 ],
  453.                 'attr' => [
  454.                     'class' => 'form-control form-control-sm',
  455.                 ],
  456.             ])
  457.             ->add('numPuertaCubi'TextType::class, [
  458.                 'label' => '* No. de puerta o cubículo',
  459.                 'required' => false,
  460.                 'constraints' => [
  461.                     new NotBlank(['message' => 'El campo "No. de puerta o cubiculo" no debe estar vacío.']),
  462.                 ],
  463.                 'attr' => [
  464.                     'class' => 'form-control form-control-sm',
  465.                 ],
  466.             ])
  467.     ;
  468.         $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($options) {
  469.             $form $event->getForm();
  470.             if ($options['unidad']) {
  471.                 $form->add('unidad'EntityType::class, [
  472.                     'class' => Unidad::class,
  473.                     'required' => true,
  474.                     'query_builder' => function(EntityRepository $entityRepository){
  475.                         /** @var Usuario $user */
  476.                         $user $this->token->getToken()->getUser();
  477.                         $query $entityRepository->createQueryBuilder('u');
  478.                         $query->andWhere('u.idUni = :unidad');
  479.                         $query->orderBy('u.nombre''ASC');
  480.                         $query->setParameter('unidad'$user->getUnidad()->getIdUni());
  481.                         return $query;
  482.                     },
  483.                     'attr' => [
  484.                         'class' => 'form-control form-control-sm'
  485.                     ]
  486.                 ]);
  487.             }
  488.         });
  489.     }
  490.     public function configureOptions(OptionsResolver $resolver): void
  491.     {
  492.         $resolver->setDefaults([
  493.             'data_class' => Equipo::class,
  494.             'unidad' => false,
  495.             'bloquear_edicion' => false,
  496.         ]);
  497.     }
  498.     //Para subir formulario
  499. }