/** * 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; }
/** * 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; }