/**
  * Validaciones antes de actualizar o crear
  */
 public function valida(array $rules)
 {
     unset($this->_errores);
     //Para tener disponibles los datos de la
     //cabecera del pedido
     $pedido = new PedidosCab($this->IDPedido);
     // Compruebo la existencia del artículo y que pertenezca a
     // la sucursal de la cabecera del pedido.
     if ($this->IDArticulo == '') {
         $this->_errores[] = "Debe indicar un código de artículo";
     } else {
         $articulo = new Articulos($this->IDArticulo);
         if ($articulo->getStatus() == 0) {
             $this->_errores[] = "El artículo indicado no existe";
             unset($articulo);
         }
     }
     // Si existe el articulo ...
     if (count($this->_errores) == 0) {
         $aviso = $articulo->getAvisosPedidos();
         if ($aviso) {
             $this->_alertas[] = $aviso;
         }
         $this->checkPackingCompras($articulo);
         // Si la descripcion está vacia, pongo la del artículo
         // Si trae algo, la respeto.
         if ($this->Descripcion == '') {
             $this->setDescripcion($articulo->getDescripcion());
         }
         // Si no se ha indicado precio, pongo el precio de costo de la ficha del articulo
         if ($this->Precio == '') {
             $this->setPrecio($articulo->getPrecioCosto());
         }
         // Totalizar la linea de pedido
         $this->setImporte($this->Unidades * $this->Precio * (1 - $this->Descuento / 100));
         //Comparar el precio respecto al PMC.
         //Si el importe neto (despues de dctos) unitario supera el P.M.C. se emite alerta
         if ($this->getImporte() / $this->getUnidades() > $articulo->getPmc()) {
             $this->_alertas[] = "El precio supera al Precio Medio de Compra: " . $articulo->getPmc();
         }
         // Poner el mismo almacen de la cabecera del pedido y el agente en curso
         $this->setIDAlmacen($pedido->getIDAlmacen()->getIDAlmacen());
         $this->setIDAgente($_SESSION['usuarioPortal']['Id']);
         // Si el proveedor no está sujeto a Iva, pongo a 0 el iva y el recargo
         if ($pedido->getIDProveedor()->getIva()->getIDTipo() == '0') {
             $this->setIva('0');
             $this->setRecargo('0');
         } else {
             // Si no se ha indicando iva, pongo el iva asociado al artículo,
             if ($this->Iva == '') {
                 $this->setIva($articulo->getIDIva()->getIva());
             }
         }
         // Si el artículo es inventariable:
         // Comprobar existencias sin tener en cuenta lote ni ubicación
         // de almacen. Solo se buscan existencias en el almacen indicado
         // en la línea del pedido
         if ($articulo->getInventario()->getIDTipo() == '1') {
             $existencias = new Existencias();
             $stock = $existencias->getStock($this->IDArticulo, $this->IDAlmacen);
             // Se genera una alerta si hay stock disponible o pendiente de entrada
             if ($stock['PE'] > 0 or $stock['DI'] > 0) {
                 $this->_alertas[] = "Hay stock";
                 $this->_alertas[] = "---------";
             }
             $this->_alertas[] = "Disponible: " . $stock['DI'];
             $this->_alertas[] = "Real: " . $stock['RE'];
             $this->_alertas[] = "Reservado: " . $stock['RV'];
             $this->_alertas[] = "Pte. Entrada: " . $stock['PE'];
         }
     }
     unset($articulo);
     unset($pedido);
     unset($existencias);
     return count($this->_errores) == 0;
 }