Exemplo n.º 1
0
 /**
  * Valida que la cantidad indicada esté disponible en
  * el almacén, ubicación y lote
  * 
  * @return boolean
  */
 public function validaLogico()
 {
     parent::validaLogico();
     $articulo = new Articulos($this->IDArticulo);
     $bloqueoStock = $articulo->getBloqueoStock()->getIDTIpo() == '1';
     if ($this->Unidades == 0) {
         $this->_errores[] = "Debe indicar una cantidad distinta a cero";
     }
     $almacen = new Almacenes($this->IDAlmacen);
     //print_r($this);
     if ($almacen->getControlUbicaciones()->getIDTipo() == '1' and $this->IDUbicacion == 0) {
         $this->_errores[] = "Debe indicar la ubicación";
     }
     unset($almacen);
     if ($bloqueoStock) {
         $udadMedidaVenta = $articulo->getUMV();
         $udadMedidaAlmacen = $articulo->getUMA();
         $stock = new Existencias();
         $existencias = $stock->getStock($this->IDArticulo, $this->IDAlmacen, $this->IDLote, $this->IDUbicacion);
         unset($stock);
         // Calcular las cantidades de ese articulo, almacen, lote y ubicación que estan
         // en lineas de expediciones sin estar expedidas aún. O sea lo que está en
         // proceso de expedición. No tengo en cuenta los valores de la BD de la línea actual
         // porque puede que hayan cambiado.
         $filtro = "IDLinea<>'{$this->IDLinea}' and Expedida='0' and IDAlmacen='{$this->IDAlmacen}' and IDLote='{$this->IDLote}' and IDUbicacion='{$this->IDUbicacion}'";
         $expedicion = new Expediciones();
         $rows = $expedicion->cargaCondicion("sum(Unidades) as Unidades,sum(Pales) as Pales,sum(Cajas) as Cajas", $filtro);
         $row = $rows[0];
         $row['Unidades'] += $this->Unidades;
         $row['Pales'] += $this->Pales;
         $row['Cajas'] += $this->Cajas;
         unset($expedicion);
         if ($existencias['DI'] < $articulo->convertUnit('UMV', 'UMA', $row['Unidades'])) {
             $this->_errores[] = "Hay " . round($articulo->convertUnit('UMA', 'UMV', $existencias['DI']), 2) . " {$udadMedidaVenta} (" . round($existencias['DI'], 2) . " {$udadMedidaAlmacen}) disponibles para ese lote y ubicación";
         }
         if ($existencias['CA'] < $row['Cajas']) {
             $this->_errores[] = "Hay {$existencias['CA']} cajas disponibles para ese lote y ubicacion";
         }
         if ($existencias['PT'] < $row['Pales']) {
             $this->_errores[] = "Hay {$existencias['PT']} pales disponibles para ese lote y ubicacion";
         }
     }
     unset($articulo);
     return count($this->_errores) == 0;
 }
Exemplo n.º 2
0
 /**
  * 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;
 }