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
 /**
  * Si hay stock no se puede cambiar el estado de inventario ni las unidades de medida
  * Si las unidades de media son iguales, los factores de conversión los pongo a 1
  * Calculo el precio de venta sobre EL PRECIO MEDIO DE COSTO
  * Si columna 'etiqueta' está vacía, le pongo valor de la descripción del artículo
  */
 protected function validaLogico()
 {
     parent::validaLogico();
     // Si hay stock no se puede cambiar:
     // - ni el estado de inventario
     // - ni las unidades de medida
     // - ni si es compuesto o no
     $exi = new Existencias();
     if ($exi->hayRegistroExistencias($this->IDArticulo)) {
         // Hay registro de existencias
         $articulo = new Articulos($this->IDArticulo);
         $this->setInventario($articulo->getInventario()->getIDTipo());
         $this->setUMA($articulo->getUMA()->getId());
         $this->setUMC($articulo->getUMC()->getId());
         $this->setUMV($articulo->getUMV()->getId());
         $this->setAllowsChildren($articulo->getAllowsChildren()->getIDTipo());
         unset($articulo);
         $this->_alertas[] = "Hay Stock, no puede cambiar ni el estado de Inventario ni las Unidades de Medida, ni si es compuesto";
     } else {
         // Si no es inventariable, pongo los valores relativos
         // al inventario a 0.
         if ($this->Inventario == 0) {
             $this->Trazabilidad = 0;
             $this->BloqueoStock = 0;
             $this->StockMinimo = 0;
             $this->StockMaximo = 0;
             $this->Caducidad = 0;
         }
         // Si las unidades de media son iguales, los factores de conversión los pongo a 1
         if ($this->UMC == $this->UMB) {
             $this->CUMC = 1;
         }
         if ($this->UMA == $this->UMB) {
             $this->CUMA = 1;
         }
         if ($this->UMV == $this->UMB) {
             $this->CUMV = 1;
         }
     }
     // Calculo el precio de venta sobre EL PRECIO MEDIO DE COSTO
     if ($this->Pmc == 0) {
         $this->Pmc = $this->Pvd;
     }
     if ($this->Pmc != 0) {
         $this->Pvp = $this->Pmc * (1 + $this->Margen / 100);
     }
     // Pongo valores por defecto
     if (trim($this->CodigoEAN == '')) {
         $this->CodigoEAN = $this->Codigo;
     }
     if (trim($this->Subtitulo == '')) {
         $this->Subtitulo = $this->Descripcion;
     }
     if (trim($this->Resumen == '')) {
         $this->Resumen = $this->Descripcion;
     }
     if (trim($this->Etiqueta == '')) {
         $this->Etiqueta = substr($this->Descripcion, 0, 29);
     }
     // Valido que no se dupliquen los estados
     $valida = array();
     for ($i = 1; $i <= 5; $i++) {
         $idEstado = $this->{"IDEstado{$i}"};
         if (isset($valida[$idEstado])) {
             $this->{"IDEstado{$i}"} = 0;
         } else {
             $valida[$idEstado] = '1';
         }
     }
     // Si no está vigente, entonces tampoco se publica
     if (!$this->Vigente) {
         $this->Publish = 0;
     }
     unset($exi);
 }
Exemplo n.º 3
0
/**
 * Construye un tag html <select> con todos los lotes que existen de un
 * articulo en un almacen
 *
 * @param type $filtro El id de almacen y el id de articulo separados por un guion
 * @param string $nameSelect El Name del select
 * @param string $idSelect El Id del select
 * @return string Codigo html con el tag select
 */
function lotesAlmacenArticulo($filtro, $nameSelect = '', $idSelect = '')
{
    if ($nameSelect == '') {
        $nameSelect = $_GET['nameselect'];
    }
    if ($idSelect == '') {
        $idSelect = $_GET['idselect'];
    }
    // En el filtro viene separado por un guión el id del almacen y el id del articulo
    $valores = explode("-", $filtro);
    $idAlmacen = $valores[0];
    $idArticulo = $valores[1];
    $articulo = new Articulos($idArticulo);
    $rows = $articulo->getLotesDisponibles($idAlmacen, true);
    $uma = $articulo->getUMA();
    unset($articulo);
    $ch .= "<div class='Etiqueta'>Lote</div>";
    if (count($rows)) {
        $ch .= "<select name='MvtosAlmacen[IDLote]' id='MvtosAlmacen_IDLote' class='Select' style='width:190px;'";
        $ch .= "onblur=\"DesplegableAjax('div_MvtosAlmacen_IDUbicacion','MvtosAlmacen_IDUbicacion','MvtosAlmacen[IDUbicacion]','mvtosAlmacenUbicacion',this.value+'-'+\$('#MvtosAlmacen_IDAlmacen').val());\"";
        $ch .= ">";
        foreach ($rows as $row) {
            $ch .= "<option value='" . $row['Id'] . "'>" . $row['Value'] . " -> " . sprintf("%9.2f", $row['Reales']) . " {$uma}</option>";
        }
    } else {
        $ch .= "No hay lotes";
    }
    $ch .= "</select></div>";
    return $ch;
}