/** * Catalogar (poner vigentes) todos los lotes */ public function CatalogarAction() { if ($this->values['permisos']['permisosModulo']['UP']) { $lote = new Lotes(); $lote->queryUpdate(array("Vigente" => 1)); unset($lote); return $this->indexAction(); } else { return array('template' => '_global/forbiden.html.twig'); } }
/** * 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; } }
/** * Devuelve un array con todos los lotes y ubicaciones donde * hay existencias reales del artículo en el almacén indicado * * Si se indica el parametro 'cantidad' solo devuelve los lotes-ubicaciones * necesarios para satisfacer esa cantidad. En caso contrario, devuelve todos. * * El array tiene 4 columnas: IDLote, FechaCaducidad, IDUbicacion, Reales * El orden es ascendente por FechaCadudidad * * @param integer $idAlmacen El id de almacén * @param decimal $cantidad La cantidad que se necesita (opcional) * @return array Los Lotes, Ubicaciones y Existencias Reales */ public function getLotesUbicaciones($idAlmacen, $cantidad = 0) { $lotesUbicaciones = array(); $tablaExistencias = new Existencias(); $tablaLotes = new Lotes(); $this->conecta(); if (is_resource($this->_dbLink)) { //Lotes con existencias. //$query = "Call LotesUbicacionesArticulo({$idAlmacen},{$this->IDArticulo});"; $query = "SELECT DISTINCT e.IDLote, l.FechaCaducidad, e.IDUbicacion, e.Reales\n FROM \n {$tablaExistencias->getDataBaseName()}.{$tablaExistencias->getTableName()} e, \n {$tablaLotes->getDataBaseName()}.{$tablaLotes->getTableName()} l\n WHERE\n e.IDArticulo = '{$this->IDArticulo}' AND\n e.IDAlmacen= '{$idAlmacen}' AND\n e.IDLote = l.IDLote AND\n e.Reales > 0\n ORDER BY l.FechaCaducidad, e.Reales ASC"; $this->_em->query($query); $lotesUbicaciones = $this->_em->fetchResult(); $this->_em->desConecta(); unset($this->_em); } unset($tablaExistencias); unset($tablaLotes); if ($cantidad > 0) { //Devolver solo lo necesario para satisfacer esta cantidad $aux = array(); $acumulado = 0; foreach ($lotesUbicaciones as $item) { $aux[] = $item; $acumulado += $item['Reales']; if ($acumulado >= $cantidad) { break; } } $lotesUbicaciones = $aux; } return $lotesUbicaciones; }
$config = sfYaml::load('../config/config.yml'); $app = $config['config']['app']; // --------------------------------------------------------------- // ACTIVAR EL AUTOLOADER DE CLASES Y FICHEROS A INCLUIR // --------------------------------------------------------------- define("APP_PATH", $_SERVER['DOCUMENT_ROOT'] . $app['path'] . "/"); include_once "../" . $app['framework'] . "Autoloader.class.php"; Autoloader::setCacheFilePath(APP_PATH . 'tmp/class_path_cache.txt'); Autoloader::excludeFolderNamesMatchingRegex('/^CVS|\\..*$/'); Autoloader::setClassPaths(array('../' . $app['framework'], '../entities/', '../lib/')); spl_autoload_register(array('Autoloader', 'loadClass')); // Crear el lote nuevo $formulario = new Form('Lotes'); $rules = $formulario->getRules(); unset($formulario); $lote = new Lotes(); $lote->setIDArticulo($_GET['idArticulo']); $lote->setLote($_GET['lote']); $lote->setFechaFabricacion($_GET['fFabricacion']); $lote->setFechaCaducidad($_GET['fCaducidad']); if ($lote->valida($rules)) { $idLote = $lote->create(); } $errores = $lote->getErrores(); if (count($errores)) { foreach ($errores as $error) { $tag .= $error . "\n"; } } $rows = $lote->fetchAll($_GET['idArticulo']); if (!$_GET['width']) {
/** * Devuelve un string con la descripción de los lotes ÚNICOS separados por guión * que han sido servidos en la línea $idEntidad de la entidad $entidad. * * @param string $entidad El nombre de la entidad (AlbaranesCab, PedidosCab, TraspasosCab, ManufacCab) * @param integer $idLineaEntidad El id de la entidad linea * @return string Descripción de lotes seperados por guión */ public function getLotes($entidad, $idLineaEntidad) { $arrayLotes = array(); $rows = $this->cargaCondicion("IDLote", "Entidad='{$entidad}' and IDLineaEntidad='{$idLineaEntidad}'", "IDLinea ASC"); foreach ($rows as $row) { $lote = new Lotes($row['IDLote']); $arrayLotes[$lote->getLote()] = ""; unset($lote); } foreach ($arrayLotes as $lote => $nada) { $lotes .= $lote . " - "; } $lotes = substr($lotes, 0, -3); return $lotes; }
/** * Construye un tag html <select> con todas las ubicaciones donde hay stock * para el lote y almacen indicado en el parametro * @param string $filtro El id de lote y el id de almacen 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 ubicacionesLote($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 lote y el id del almacen $valores = explode("-", $filtro); $idLote = $valores[0]; $idAlmacen = $valores[1]; $lote = new Lotes($idLote); $rows = $lote->getUbicaciones($idAlmacen); unset($lote); if (count($rows)) { $ch .= "<select name='" . $nameSelect . "' id='" . $idSelect . "' class='Select' style='width:110px;'>"; foreach ($rows as $row) { $ch .= "<option value='" . $row['Id'] . "'>" . $row['Value'] . "</option>"; } $ch .= "</select>"; } else { $ch .= "No hay ubicaciones"; } return $ch; }
/** * Importar el contenido del archivo $filename, genera un archivo log * cuyo path devuelve. * * Comprueba la existencias de los lotes y ubicaciones indicados * Si no existe el lote, lo crea. * * @param string $fileName * @return string El path al archivo log generado en la importación */ private function importarArchivo($fileName) { set_time_limit(0); $archivoImportar = new Archivo($fileName); if ($archivoImportar->open("r")) { // Abrir en modo escritura el archivo de log. $usuario = new Agentes($_SESSION['usuarioPortal']['Id']); $pathArchivoLog = "docs/docs" . $_SESSION['emp'] . "/tmp/logImportarInventario.txt"; $archivoLog = new Archivo($pathArchivoLog); $archivoLog->open("w"); $archivoLog->writeLine("IMPORTACIÓN DE ARCHIVO DE INVENTARIO"); $archivoLog->writeLine("FECHA: " . date('d-m-Y H:i:s')); $archivoLog->writeLine("ARCHIVO: " . $archivoImportar->getBaseName()); $archivoLog->writeLine("USUARIO: " . $usuario->getNombre()); $archivoLog->writeLine(str_repeat("-", 50)); unset($usuario); $fila = 1; $fallidos = 0; $cargados = 0; $primeraLinea = $archivoImportar->readLine(); // Pongo los títulos con la primera letra en mayúscula y le doy // la vuelta al array $titulos = $primeraLinea; foreach ($titulos as $key => $value) { $titulos[$key] = ucwords(trim($value)); } $titulos = array_flip($titulos); while (($linea = $archivoImportar->readLine()) !== FALSE) { $fila++; $lineaInventario = new InventariosLineas(); $lineaInventario->setIDInventario($this->request['InventariosCab']['IDInventario']); // Buscar el id del articulo a partir del codigo $articulo = new Articulos(); $articulo = $articulo->find("Codigo", trim($linea[$titulos['Codigo']])); $lineaInventario->setIDArticulo($articulo->getIDArticulo()); // Buscar el id del lote a partir del nombre de lote $nombreLote = trim($linea[$titulos['Lote']]); $lote = new Lotes(); $rows = $lote->cargaCondicion("IDLote", "IDArticulo='{$articulo->getIDArticulo()}' and Lote='" . $nombreLote . "'"); $idLote = $rows[0]['IDLote']; // Si no existe el lote, lo creo. if ($idLote == '' and $nombreLote != '') { $lote->setIDArticulo($articulo->getIDArticulo()); $lote->setLote($nombreLote); $idLote = $lote->create(); } $lineaInventario->setIDLote($idLote); // Buscar la id de la ubicacion del almacen en curso $ubicacion = new AlmacenesMapas(); $rows = $ubicacion->cargaCondicion("IDUbicacion", "IDAlmacen='{$this->request['InventariosCab']['IDAlmacen']}' and Ubicacion='" . trim($linea[$titulos['Ubicacion']]) . "'"); $lineaInventario->setIDUbicacion($rows[0]['IDUbicacion']); // A los valores numéricos les cambio la coma decimal por el punto $lineaInventario->setStock(str_replace(",", ".", $linea[$titulos['Stock']])); $lineaInventario->setCajas(str_replace(",", ".", $linea[$titulos['Cajas']])); $lineaInventario->validaLogico(); if (count($lineaInventario->getErrores()) == 0) { $lineaInventario->create(); $cargados++; } else { // Si hay errores de validacion muestro la linea y los errores $fallidos++; $archivoLog->writeLine("Error en línea: " . $fila); foreach ($linea as $key => $value) { $string = "\t" . $primeraLinea[$key] . " : " . $value; $archivoLog->writeLine($string); } foreach ($lineaInventario->getErrores() as $error) { $archivoLog->writeLine("\t* " . $error); } } } $archivoLog->writeLine("" . str_repeat("-", 50)); $archivoLog->writeLine("Total registros : " . ($fila - 1)); $archivoLog->writeLine("Registros cargados: " . $cargados); $archivoLog->writeLine("Registros fallidos: " . $fallidos); $archivoImportar->close(); $archivoLog->close(); unset($archivoLog); } else { $resultado[] = "El archivo de importación no existe"; } unset($archivoImportar); return $pathArchivoLog; }