/**
  * Calculo las unidades (kgrs) netas restando a las unidades brutas
  * Comprueba que se haya indicado el lote si procede(
  * Comprueba que se haya indicado la ubiación si procede
  *
  * @return boolean
  */
 public function validaLogico()
 {
     parent::validaLogico();
     $this->setUnidadesNetas($this->UnidadesBrutas - ($this->Pales * $this->DestarePale + $this->Cajas * $this->DestareCaja));
     if ($this->Unidades == 0 or $this->UnidadesNetas == 0) {
         $this->_errores[] = "Debe indicar la cantidad recibida y las unidades brutas";
     }
     $articulo = new Articulos($this->IDArticulo);
     if ($articulo->getTrazabilidad()->getIDTipo() and !$this->IDLote) {
         $this->_errores[] = "Debe indicar un lote";
     }
     unset($articulo);
     $almacen = new Almacenes($this->IDAlmacen);
     if ($almacen->getControlUbicaciones()->getIDTipo() and !$this->IDUbicacion) {
         $this->_errores[] = "Debe indicar una ubicación";
     }
     unset($almacen);
     return count($this->_errores) == 0;
 }
 /**
  * Realiza validaciones logicas antes de crear/actualizar el objeto:
  * 
  * 1.- Comprueba la existencia del lote y ubicación (si procede)
  * 2.- Agrupa con código de artículo, lote ubicación
  */
 public function validaLogico()
 {
     parent::validaLogico();
     // Control Lote y Ubicación
     $articulo = new Articulos($this->IDArticulo);
     if ($articulo->getStatus()) {
         $trazabilidad = $articulo->getTrazabilidad()->getIDTipo() == 1;
         $this->Descripcion = $articulo->getDescripcion();
     } else {
         $this->_errores[] = "El artículo no existe";
     }
     unset($articulo);
     $inventario = new InventariosCab($this->IDInventario);
     $controlUbicaciones = $inventario->getIDAlmacen()->getControlUbicaciones()->getIDTipo() == 1;
     unset($inventario);
     if ($trazabilidad) {
         if ($this->IDLote == 0) {
             $this->_errores[] = "Debe indicar un lote";
         } else {
             // Comprobar que el lote pertenezca al artículo
             $lote = new Lotes($this->IDLote);
             if ($lote->getIDArticulo()->getIDArticulo() != $this->IDArticulo) {
                 $this->_errores[] = "El lote no pertenece al artículo";
             }
             unset($lote);
         }
     }
     if ($controlUbicaciones and $this->IDUbicacion == 0) {
         $this->_errores[] = "Debe indicar la ubicación";
     }
     // Agrupar en la misma línea de inventario las entradas
     // que coinciden en el código de articulo, lote y ubicación
     $rows = $this->cargaCondicion("*", "IDArticulo='{$this->IDArticulo}' and IDLote='{$this->IDLote}' and IDUbicacion='{$this->IDUbicacion}' and IDInventario='{$this->IDInventario}'");
     if (count($rows)) {
         $this->_idLineaNueva = $rows[0]['IDLinea'];
         $this->Stock += $rows[0]['Stock'];
         $this->Cajas += $rows[0]['Cajas'];
         $this->Pales += $rows[0]['Pales'];
         $this->_flagAgrupa = true;
     }
 }
 /**
  * Valida la idoneidad del movimiento.
  *
  * Chequea si se aplica o no la trazabilidad, la ubicacion y el bloqueo de stock
  *
  * @param char $signo El signo del movimiento (E=Entrada, S=Salida)
  * @return boolean
  */
 private function validaMovimiento($signo)
 {
     $articulo = new Articulos($this->IDArticulo);
     $almacen = new Almacenes($this->IDAlmacen);
     $hayTrazabilidad = $articulo->getTrazabilidad()->getIDTipo();
     $hayBloqueoStock = $articulo->getBloqueoStock()->getIDTipo();
     $hayControlUbicaciones = $almacen->getControlUbicaciones()->getIDTipo();
     if ($hayBloqueoStock) {
         $exi = new Existencias();
         $stock = $exi->getStock($this->IDArticulo, $this->IDAlmacen, $this->IDLote, $this->IDUbicacion, '', 'UMA');
         unset($exi);
         switch ($signo) {
             case 'S':
                 $unidades = $this->UnidadesE + $this->UnidadesS;
                 if ($unidades < 0) {
                     $okBloqueoStock = true;
                 } else {
                     $okBloqueoStock = $stock['RE'] >= $unidades;
                 }
                 break;
             case 'E':
                 $unidades = $this->UnidadesE + $this->UnidadesS;
                 if ($unidades < 0) {
                     $okBloqueoStock = $unidades + $stock['RE'] >= 0;
                 } else {
                     $okBloqueoStock = true;
                 }
                 break;
         }
     } else {
         $okBloqueoStock = true;
     }
     $okTrazabilidad = (!$hayTrazabilidad or $this->IDLote != 0);
     $okUbicacion = (!$hayControlUbicaciones or $this->IDUbicacion != 0);
     if (!$okBloqueoStock) {
         $this->_errores[] = "No hay stock suficiente para " . $articulo->getDescripcion();
     }
     if (!$okTrazabilidad) {
         $this->_errores[] = "Debe indicar el lote para " . $articulo->getDescripcion();
     }
     if (!$okUbicacion) {
         $this->_errores[] = "Debe indicar la ubicación para " . $articulo->getDescripcion();
     }
     unset($articulo);
     unset($almacen);
     return count($this->_errores) == 0;
 }