/**
  * 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;
     }
 }
Example #3
0
 /**
  * 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;
 }
Example #4
0
$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']) {
Example #5
0
 /**
  * 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;
 }
Example #6
0
/**
 * 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;
 }