/**
  * Cierra el inventario.
  * 
  * Consiste en generar los movimientos de almacén necesarios
  * para dejar las existencias de cada articulo/lote/ubicación 
  * según lo indicado en las líneas de inventario
  */
 public function cierra()
 {
     $ok = true;
     // Si no está cerrado
     if ($this->Cerrado == 0) {
         $lineas = new InventariosLineas();
         $rows = $lineas->cargaCondicion("*", "IDInventario='{$this->IDInventario}'");
         unset($lineas);
         $exi = new Existencias();
         foreach ($rows as $row) {
             // Buscar la existencias que hay para calcular el mvto
             // de almacén de tal forma que se queden como dice el inventario
             $stock = $exi->cargaCondicion("*", "IDAlmacen='{$this->IDAlmacen}' and IDArticulo='{$row['IDArticulo']}' and IDLote='{$row['IDLote']}' and IDUbicacion='{$row['IDUbicacion']}'");
             $valores = array('UM' => 'UMA', 'Reales' => $row['Stock'] - $stock[0]['Reales'], 'Pales' => $row['Pales'] - $stock[0]['Pales'], 'Cajas' => $row['Cajas'] - $stock[0]['Cajas'], 'Reservadas' => 0, 'Entrando' => 0);
             /**
             if ($valores['Reales']>=0)
                 $signo = "E";
             else {
                 $signo = "S";
                 $valores['Reales'] = abs($valores['Reales']);
             }
             */
             $signo = "E";
             $mvtoAlmacen = new MvtosAlmacen();
             $ok = $mvtoAlmacen->genera('InventariosCab', $signo, $this->IDInventario, $this->IDAlmacen, $row['IDArticulo'], $row['IDLote'], $row['IDUbicacion'], 0, $valores);
             // Valores con los que actualizar
         }
         unset($exi);
         unset($mvtoAlmacen);
         // Marcar el inventario como cerrado
         if ($ok) {
             $this->setCerrado(1);
             $this->save();
         }
     }
     return $ok;
 }
 private function LineasInventario($fecha, $id, $dbLink)
 {
     $query = "select i.*,a.IDArticulo as id,a.Descripcion from {$this->dbOrigen}.inventarios i LEFT JOIN {$this->dbDestino}.ErpArticulos a on i.IDArticulo=a.Codigo WHERE DATE_FORMAT(Fecha,'%Y-%m-%d')='{$fecha}' and a.IDArticulo>0";
     $result = mysql_query($query, $dbLink);
     while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
         $l = new InventariosLineas();
         $l->setIDInventario($id);
         $l->setIDArticulo($row['id']);
         $l->setIDLote(0);
         $l->setIDUbicacion(0);
         $l->setDescripcion($row['Descripcion']);
         $l->setStock($row['Stock']);
         $pk = $l->create();
         if (!$id) {
             $errores[] = $l->getErrores();
             $nErrores++;
         } else {
             $l->setIDLinea($pk);
             $l->setPrimaryKeyMD5(md5($pk));
             $l->save();
             $nItems++;
         }
     }
     print_r($errores);
 }
 /**
  * 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;
 }