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