src/Form/EquipoType.php line 362

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