Преглед изворни кода

FD3-778 validación voip único. fixes

Guillermo Espinoza пре 6 година
родитељ
комит
fa737375c6

Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
app/DoctrineMigrations/src/action.yml


+ 14 - 11
src/CablemodemBundle/Admin/CablemodemAdmin.php

@@ -73,7 +73,6 @@ class CablemodemAdmin extends WorkflowBaseAdmin
                         ->add('mac', 'text', array(
                             'attr' => array(
                                 'pattern' => '([a-fA-F0-9]{2}[:]*){6}',
-//                                'pattern' => '[a-zA-Z0-9]+',
                                 'title' => $this->trans('Only accept', [], 'CablemodemBundle') . " ([a-fA-F0-9]{2}[:]*){6}",
                                 'maxlength' => '17',
                                 'minlength' => '12'
@@ -85,13 +84,17 @@ class CablemodemAdmin extends WorkflowBaseAdmin
                     ->end()
                 ->end()
                 ->tab('cm_form_advanced')
-                    ->with('cm_form_voip')
+                    ->with('cm_form_voip', ['class' => "col-md-12 hidden cm_form_voip"])
                         ->add('mtaEnabled')
                         ->add('voip', 'collection', array(
                                 'entry_type'   => 'CablemodemBundle\\Form\\VoipType',
-                                'allow_add' => true, 
+                                'allow_add' => true,
                                 'required' => false,
-                                'allow_delete' => true))
+                                'allow_delete' => true,
+                                'attr' => [
+                                    'class' => 'voip',
+                                ],
+                            ))
                     ->end()
                     ->with('DHCP')
                         ->add('fixedIP')
@@ -100,11 +103,11 @@ class CablemodemAdmin extends WorkflowBaseAdmin
                     ->end()
                 ->end()
         ;
-                
+
         // Actualizo los campos fixedIP dependiendo si hay valores cargados en el Cablemodem
         $subject = $this->getSubject();
         $formMapper->getFormBuilder()->addEventSubscriber(new FixedIPSubscriber($subject));
-        
+
     }
 
     /**
@@ -125,7 +128,7 @@ class CablemodemAdmin extends WorkflowBaseAdmin
             ->add('cpeFixedIP')
             ->add('mtaFixedIP')
         ;
-        
+
         $this->addDHCPTab($showMapper);
     }
 
@@ -143,12 +146,12 @@ class CablemodemAdmin extends WorkflowBaseAdmin
             ->end();
         }
         $template = 'CablemodemBundle:CRUD:host_show_field.html.twig';
-        
+
         $types = [
             'Cpe',
             'Mta',
         ];
-        
+
         $showMapper
         ->tab('DHCP')
         ->with('Host')
@@ -156,7 +159,7 @@ class CablemodemAdmin extends WorkflowBaseAdmin
             'template' => $template,
         ])
         ->end();
-        
+
         foreach ($types as $type) {
             $method = "get{$type}FixedIp";
             if ($this->getSubject()->$method()) {
@@ -173,7 +176,7 @@ class CablemodemAdmin extends WorkflowBaseAdmin
                     ->end();
             }
         }
-        
+
         $showMapper->end();
     }
 

+ 36 - 2
src/CablemodemBundle/Controller/CablemodemController.php

@@ -30,7 +30,7 @@ class CablemodemController extends Controller
             $shortname = $request->get('shortname');
             $webservice = $this->get('webservice');
             $url = $this->getParameter('url_dhcp') . '/api/hosts/ipv4s/ranges.json';
-            
+
             $result = $webservice->makeGetRequest($url, HttpRequestInterface::METHOD_POST, compact('shortname'));
             $result = json_decode($result, true);
         } catch (\Exception $ex) {
@@ -38,7 +38,41 @@ class CablemodemController extends Controller
                 'error' => $ex->getMessage(),
             ];
         }
-        
+
+        return new JsonResponse($result);
+    }
+
+    /**
+     * @param Request $request
+     *
+     * @return JsonResponse
+     *
+     * @Route("/cablemodem/model/voip", name="cablemodem_model_check_voip")
+     */
+    public function checkModelVoipAction(Request $request)
+    {
+        $result = [];
+        try {
+            $modelId = $request->get('modelId');
+            $em = $this->getDoctrine()->getManager();
+            $repo = $em->getRepository('CablemodemBundle:CablemodemModel');
+            $model = $repo->find($modelId);
+            if (!$model) {
+                throw new \Exception('CablemodemModel not found');
+            }
+            $name = $model->getName();
+            $technology = $model->getTechnology();
+            if ((strripos($name, 'mgcp') || $technology == 'mgcp' || strripos($name, 'sip') || $technology == 'sip') && $model->getMtaDocsisTemplate()) {
+                $result['result'] = true;
+            } else {
+                $result['result'] = false;
+            }
+        } catch (\Exception $ex) {
+            $result = [
+                'error' => $ex->getMessage(),
+            ];
+        }
+
         return new JsonResponse($result);
     }
 

+ 50 - 2
src/CablemodemBundle/Entity/Cablemodem.php

@@ -19,9 +19,10 @@ use WorkflowBundle\Entity\Traits\WorkflowTrait;
 use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity as SoftDeleteable;
 use Base\AdminBundle\Interfaces\SoftDeleteInterface;
 use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
+use Symfony\Component\Validator\Context\ExecutionContextInterface;
 
 /**
- * @ORM\Entity
+ * @ORM\Entity(repositoryClass="CablemodemBundle\Repository\CablemodemRepository")
  * @ORM\Table(indexes={@ORM\Index(name="mac", columns={"mac"})})
  *
  * @UniqueEntity(fields={"mac"})
@@ -31,6 +32,8 @@ use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
  *
  * @ValidatorAssert\Device
  * @HasLifecycleCallbacks
+ *
+ * @Assert\Callback("validateVoip")
  */
 class Cablemodem implements DeviceInterface, TenancyIdTraitInterface, LocationInterface, WorkflowInterface, SoftDeleteInterface
 {
@@ -147,7 +150,6 @@ class Cablemodem implements DeviceInterface, TenancyIdTraitInterface, LocationIn
     protected $mtaEnabled = false;
 
     /**
-     *
      * @ORM\Column(type="array", nullable=true)
      *
      * @Assert\Callback(
@@ -555,4 +557,50 @@ class Cablemodem implements DeviceInterface, TenancyIdTraitInterface, LocationIn
         $this->setMac(str_replace(":", "", $this->getMac()));
     }
 
+    /**
+     * Validaciones de Voip
+     *
+     * @param ExecutionContextInterface $context
+     */
+    public function validateVoip(ExecutionContextInterface $context)
+    {
+        if (is_null($this->voip) || empty($this->voip)) {
+            return;
+        }
+
+        // verifico que no esten vacíos
+        foreach ($this->voip as $voip) {
+            if (array_key_exists('number', $voip) && array_key_exists('password', $voip) && ((is_null($voip['number']) || $voip['number'] == '') || (is_null($voip['password']) || $voip['password'] == ''))) {
+                $context->buildViolation('cablemodem.voip.invalid')
+                    ->atPath('voip')
+                    ->addViolation();
+
+                return;
+            }
+        }
+
+        // verifico que no sean iguales
+        if (is_array($this->voip) && isset($voip[0]) && isset($voip[1]) && $voip[0]['number'] == $voip[1]['number']) {
+            $context->buildViolation('cablemodem.voip.repeated_number')
+                ->atPath('voip')
+                ->addViolation();
+
+            return;
+        }
+
+        global $kernel;
+        $cablemodemRepository = $kernel->getContainer()->get('doctrine')->getRepository('CablemodemBundle:Cablemodem');
+
+        // verifico que sean únicos
+        foreach ($this->voip as $voip) {
+            if (array_key_exists('number', $voip) && count($cablemodemRepository->findByVoipNumber($voip['number'], $this->id)) > 0) {
+                $context->buildViolation('cablemodem.voip.not_unique')
+                    ->atPath('voip')
+                    ->addViolation();
+
+                return;
+            }
+        }
+    }
+
 }

+ 29 - 0
src/CablemodemBundle/Repository/CablemodemRepository.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace CablemodemBundle\Repository;
+
+class CablemodemRepository extends \Doctrine\ORM\EntityRepository
+{
+
+    /**
+     * Busca los Cablemodem según el $number de voip
+     * y que no tengan el mismo $id
+     *
+     * @param string $number
+     * @param int $id
+     *
+     * @return Cablemodem
+     */
+    public function findByVoipNumber($number, $id)
+    {
+        $len = strlen($number);
+        $qb = $this->createQueryBuilder('Cablemodem')
+            ->select('Cablemodem.id')
+            ->where('Cablemodem.voip LIKE :number')->setParameter('number', sprintf('%%"number";s:%s:"%d"%%', $len, $number))
+            ->andWhere('Cablemodem.id <> :id')->setParameter('id', $id)
+            ;
+
+        return $qb->getQuery()->getResult();
+    }
+
+}

+ 4 - 0
src/CablemodemBundle/Resources/translations/validators.es.yml

@@ -0,0 +1,4 @@
+cablemodem.voip:
+    invalid: Número y password no pueden estar vacíos
+    repeated_number: Los números no pueden ser iguales
+    not_unique: El número debe ser único

+ 48 - 5
src/CablemodemBundle/Resources/views/CRUD/edit.html.twig

@@ -7,7 +7,7 @@
 <script type="text/javascript">
 
 $(document).ready(function() {
-    
+
     var fixedIPIds = [
         '#{{ admin.uniqid ~ "_fixedIP" }}',
         '#{{ admin.uniqid ~ "_cpeFixedIP" }}',
@@ -16,7 +16,26 @@ $(document).ready(function() {
     for (i = 0; i < fixedIPIds.length; i++) {
         updateFixedIPs(fixedIPIds[i], $(fixedIPIds[i]).val());
     }
-            
+
+    // según el tipo de CablemodemModel se muestra el apartado voip
+    $('[id="{{ admin.uniqid }}_model"]').on('click', showVoip);
+    showVoip();
+
+    // máximo 2 voip
+    if ($('.voip .sonata-collection-row').length == 2) {
+        $('.voip .sonata-collection-add').hide();
+    }
+    $(document).on('sonata-collection-item-added', function() {
+        if ($('.voip .sonata-collection-row').length == 2) {
+            $('.voip .sonata-collection-add').hide();
+        }
+    });
+    $(document).on('sonata-collection-item-deleted-successful', function() {
+        if ($('.voip .sonata-collection-row').length < 2) {
+            $('.voip .sonata-collection-add').show();
+        }
+    });
+
 });
 
 // Según el id del select, que depende del hostType se busca por Ajax y REST en DHCP
@@ -24,7 +43,7 @@ $(document).ready(function() {
 function updateFixedIPs(id, value)
 {
     var $hostTypeName = '';
-    
+
     if (id === '#{{ admin.uniqid ~ "_fixedIP" }}') {
         $hostTypeName = 'cablemodem';
     } else if (id === '#{{ admin.uniqid ~ "_cpeFixedIP" }}') {
@@ -32,7 +51,7 @@ function updateFixedIPs(id, value)
     } else {
         $hostTypeName = 'mta';
     }
-    
+
     if ($hostTypeName) {
         $.ajax({
             url: '{{ path ('ajax_host_ipv4_range') }}',
@@ -54,13 +73,37 @@ function updateFixedIPs(id, value)
                 if (data.error) {
                     console.log(data.error);
                 }
-                
+
                 return false;
             },
         });
     }
 }
 
+// Realiza un ajax para comprobar el modelo de cablemodem tenga Voip
+// y muestra|oculta los campos relacionados
+function showVoip($modelId)
+{
+    var $modelId = $('[id="{{ admin.uniqid }}_model"]').val();
+    $.ajax({
+        url: '{{ path('cablemodem_model_check_voip') }}',
+        data: {
+            'modelId': $modelId
+        },
+        success: function(result) {
+            if (result.result) {
+                $('.cm_form_voip').removeClass('hidden');
+            } else {
+                // Deshabilito mtaEnabled y borro los voip creados
+                $('.cm_form_voip').addClass('hidden');
+                $('[id="{{ admin.uniqid }}_mtaEnabled"]').iCheck('uncheck');
+                $('.cm_form_voip .sonata-collection-row').remove();
+                $('.voip .sonata-collection-add').show();
+            }
+        }
+    });
+}
+
 </script>
 
 {% endblock javascripts %}