public ActionResult Imprimir(itemImprimir imprimir, string ListaPiezasID = "")
        {
            string[] listaID = ListaPiezasID.Split(',');
            string FormatoImpresion = "_FormatoBasicoPDF";
            imprimir.ListaPiezas = new List<itemPiezaMini>();

            foreach (var itemID in listaID)
            {
                var piezaTemp = db.Piezas.Find(new Guid(itemID));

                if (piezaTemp != null)
                {
                    //extraer toda la informacion de la pieza
                    //llenar la lista piezas
                    generarPiezaImprimir(piezaTemp, imprimir);
                }

            }

            string tipo = "";

            switch (imprimir.TipoImprimir)
            {
                case "Etiqueta":
                    tipo = "print-logoFondo";
                    break;

                default:
                    tipo = "";
                    break;
            }

            ViewBag.tipo = tipo;

            if (imprimir.TipoImprimir == "Etiqueta")
            {
                FormatoImpresion = "_FormatoEtiqueta5163PDF";

                return new ViewAsPdf(FormatoImpresion, imprimir)
                {
                    // FileName = flightPlan.ListingItemDetailsModel.FlightDetails + ".pdf",
                    PageSize = Size.Letter,
                    PageOrientation = Orientation.Portrait,
                    PageMargins = new Margins(0, 0, 0, 0),
                    //PageWidth = 210,
                    //PageHeight = 297
                    CustomSwitches = "--disable-smart-shrinking"
                };
            }

            return new ViewAsPdf(FormatoImpresion, imprimir);
        }
        private void generarPiezaImprimir(Pieza pieza, itemImprimir imprimir)
        {
            string nombreDatos = "";
            string nombreArchivos = "";

            if (imprimir.DatosCompletos)
            {
                switch (imprimir.TipoImprimir)
                {
                    case "Conservacion":
                        nombreDatos = "Completos";
                        nombreArchivos = "Conservacion";
                        break;

                    case "Etiqueta":
                        nombreDatos = "Etiquetas";
                        nombreArchivos = "Basicos";
                        break;

                    default:
                        nombreDatos = "Completos";
                        nombreArchivos = "Completos";
                        break;
                }
            }
            else
            {
                switch (imprimir.TipoImprimir)
                {

                    case "Etiqueta":
                        nombreDatos = "Etiquetas";
                        nombreArchivos = "Basicos";
                        break;

                    case "Conservacion":
                        nombreDatos = "Conservacion";
                        nombreArchivos = "Conservacion";
                        break;

                    default:
                        nombreDatos = "Basicos";
                        nombreArchivos = "Basicos";
                        break;
                }
            }

            itemPiezaMini piezaMini = new itemPiezaMini()
            {
                ObraID = pieza.ObraID,
                PiezaID = pieza.PiezaID,
                FolioObra = pieza.Obra.LetraFolio.Nombre + pieza.Obra.NumeroFolio,
                FolioPieza = pieza.ImprimirFolio(),
                NombreObra = pieza.Obra.TipoObra.Nombre,
                NombrePieza = pieza.TipoPieza.Nombre,
                esPrincipal = pieza.TipoPieza.EsPrincipal,
                //esBusqueda = esBusqueda,
                //ListaPiezasHijas = new List<Guid>(),
                Atributos = new List<itemPiezaMiniAtt>(),
                UbicacionOrigenID = pieza.UbicacionID
            };

            //Encontrar Imagen de la pieza
            var tipoMostrarArchivos = db.TipoMostrarArchivos.FirstOrDefault(a => a.Nombre == nombreArchivos);
            TipoArchivo tipoArchivo = db.TipoArchivos.FirstOrDefault(a => a.Temp == "imagen_clave");

            var imagen = pieza.ArchivosPiezas.Where(a => a.Status && a.TipoArchivoID == tipoArchivo.TipoArchivoID && a.MostrarArchivos.Any(b => b.TipoMostrarArchivo.TipoMostrarArchivoID == tipoMostrarArchivos.TipoMostrarArchivoID && b.Status)).OrderBy(a => a.Orden).FirstOrDefault();
            if (imagen != null)
            {
                //Comprobar que el archivo exista
                FileInfo infoThumb = new FileInfo(Server.MapPath("~" + imagen.Ruta));

                if (infoThumb.Exists)
                {
                    piezaMini.ImagenID = imagen.ArchivoPiezaID;
                    piezaMini.RutaImagenMini = imagen.RutaThumb;
                }
            }

            //extraer una lista de los atributos que presenta la pieza
            var tipoMostrarDatos = db.TipoMostarlos.FirstOrDefault(a => a.Nombre == nombreDatos);
            List<Atributo> listaAtt = pieza.TipoPieza.Atributos.Where(a => a.Status && a.MostrarAtributos.Any(b => b.TipoMostrarID == tipoMostrarDatos.TipoMostrarID && b.Status) && a.TipoAtributo.Status).OrderBy(a => a.Orden).ToList();

            //llenar los atributos de la pieza
            foreach (var att in listaAtt)
            {
                var tipoAtt = att.TipoAtributo;
                var infoAtt = att.MostrarAtributos.FirstOrDefault(a => a.TipoMostrarID == tipoMostrarDatos.TipoMostrarID);

                infoAtt.InicioHTML = infoAtt.InicioHTML ?? "";
                infoAtt.FinHTML = infoAtt.FinHTML ?? "";

                var attFicha = new itemPiezaMiniAtt()
                {
                    Nombre = att.NombreAlterno,
                    Orden = att.Orden,
                    PiezaID = piezaMini.PiezaID,
                    AtributoID = att.AtributoID,
                    Valores = new List<itemPiezaMiniAttValor>()
                };

                if (tipoAtt.EsGenerico)
                {
                    var lista_AttPieza = pieza.AtributoPiezas.Where(a => a.Atributo == att).ToList();

                    if (lista_AttPieza.Count > 0)
                    {
                        foreach (var item in lista_AttPieza)
                        {
                            var attValor = new itemPiezaMiniAttValor()
                            {
                                AtributoPiezaID = item.AtributoPiezaID,
                                Orden = attFicha.Valores.Count + 1
                            };

                            if (tipoAtt.EsLista)
                            {
                                attValor.Valor = item.ListaValor.Valor;
                            }
                            else
                            {
                                attValor.Valor = item.Valor;
                            }

                            if (!string.IsNullOrWhiteSpace(attValor.Valor))
                            {
                                attFicha.Valores.Add(attValor);
                            }
                        }
                    }
                }
                else
                {
                    switch (tipoAtt.TablaSQL)
                    {
                        case "Autor":
                            var lista_AttAutor = pieza.AutorPiezas.Where(a => a.Status).OrderByDescending(a => a.esPrincipal).ThenBy(a => a.Prefijo).ThenBy(a => a.Autor.Nombre).ToList();
                            if (lista_AttAutor.Count > 0)
                            {
                                foreach (var item in lista_AttAutor)
                                {
                                    var attValor = new itemPiezaMiniAttValor()
                                    {
                                        AtributoPiezaID = item.AutorID,
                                        Orden = attFicha.Valores.Count + 1
                                    };

                                    var textoNombre = Regex.Replace(string.Format(item.Autor.Seudonimo + " " + item.Autor.Nombre + " " + item.Autor.ApellidoPaterno + " " + item.Autor.ApellidoMaterno).ToString().Trim(), @"\s+", " ");

                                    attValor.Valor = string.IsNullOrWhiteSpace(item.Prefijo) ? "" : item.Prefijo + ": " + textoNombre;

                                    if (!string.IsNullOrWhiteSpace(textoNombre))
                                    {
                                        attFicha.Valores.Add(attValor);
                                    }
                                }
                            }
                            break;

                        case "Ubicacion":
                            if (pieza.UbicacionID != null)
                            {
                                var attValor = new itemPiezaMiniAttValor()
                                {
                                    AtributoPiezaID = pieza.UbicacionID,
                                    Orden = 1,
                                    Valor = pieza.Ubicacion.Nombre
                                };

                                if (!string.IsNullOrWhiteSpace(attValor.Valor))
                                {
                                    attFicha.Valores.Add(attValor);
                                }

                            }
                            break;

                        case "TipoTecnica":
                            var lista_Tecnicas = pieza.TecnicaPiezas.Where(a => a.Status).OrderBy(a => a.TipoTecnica.Nombre).ToList();

                            if (lista_Tecnicas.Count > 0)
                            {
                                foreach (var item in lista_Tecnicas)
                                {
                                    var attValor = new itemPiezaMiniAttValor()
                                    {
                                        AtributoPiezaID = item.TecnicaID,
                                        Orden = attFicha.Valores.Count + 1
                                    };

                                    attValor.Valor = item.TipoTecnica.Nombre + ": " + item.Tecnica.Descripcion;

                                    if (!string.IsNullOrWhiteSpace(item.Tecnica.Descripcion))
                                    {
                                        attFicha.Valores.Add(attValor);
                                    }
                                }
                            }
                            break;

                        case "TipoMedida":
                            var lista_Medidas = pieza.MedidaPiezas.Where(a => a.Status).OrderBy(a => a.TipoMedida.Nombre).ToList();
                            if (lista_Medidas.Count > 0)
                            {
                                foreach (var item in lista_Medidas)
                                {
                                    var attValor = new itemPiezaMiniAttValor()
                                    {
                                        AtributoPiezaID = item.TipoMedidaID,
                                        Orden = attFicha.Valores.Count + 1
                                    };

                                    string medidaTexto = "";
                                    bool existe0 = false;
                                    bool existe1 = false;

                                    //1x
                                    existe0 = item.Altura.HasValue ? true : false;
                                    existe1 = item.Anchura.HasValue ? true : false;

                                    medidaTexto += existe0 ? item.Altura.ToString() : "";
                                    medidaTexto += existe0 && existe1 ? "x" : "";
                                    existe0 = existe1;
                                    existe1 = item.Profundidad.HasValue ? true : false;

                                    //2x
                                    medidaTexto += medidaTexto.EndsWith("x") ? "" : medidaTexto.Length > 0 && existe0 ? "x" : "";
                                    medidaTexto += existe0 ? item.Anchura.ToString() : "";
                                    medidaTexto += existe0 && existe1 ? "x" : "";
                                    existe0 = existe1;
                                    existe1 = item.Diametro.HasValue ? true : false;

                                    //3x
                                    medidaTexto += medidaTexto.EndsWith("x") ? "" : medidaTexto.Length > 0 && existe0 ? "x" : "";
                                    medidaTexto += existe0 ? item.Profundidad.ToString() : "";
                                    medidaTexto += existe0 && existe1 ? "x" : "";
                                    existe0 = existe1;
                                    existe1 = item.Diametro2.HasValue ? true : false;

                                    //4Øx
                                    medidaTexto += medidaTexto.EndsWith("x") ? "" : medidaTexto.Length > 0 && existe0 ? "x" : "";
                                    medidaTexto += existe0 ? item.Diametro.ToString() + "Ø" : "";
                                    medidaTexto += existe0 && existe1 ? "x" : "";
                                    existe0 = existe1;
                                    existe1 = item.UMLongitud.HasValue ? true : false;

                                    //cm
                                    medidaTexto += medidaTexto.EndsWith("x") ? "" : medidaTexto.Length > 0 && existe0 ? "x" : "";
                                    medidaTexto += existe0 ? item.Diametro2.ToString() + "Ø" : "";
                                    medidaTexto += existe1 && medidaTexto.Length > 0 ? item.UMLongitud.ToString() + " " : " ";
                                    existe0 = item.Peso.HasValue ? true : false;

                                    //6
                                    medidaTexto += medidaTexto.EndsWith(" ") && existe0 ? item.Peso.ToString() + item.UMMasa : "";
                                    existe0 = item.Otra == null || item.Otra == "" ? false : true;

                                    //otra
                                    medidaTexto += existe0 ? medidaTexto.Length > 0 ? ", " + item.Otra : item.Otra : "";

                                    attValor.Valor = medidaTexto;

                                    if (!string.IsNullOrWhiteSpace(attValor.Valor))
                                    {
                                        attFicha.Valores.Add(attValor);
                                    }
                                }
                            }
                            break;
                        default:
                            break;
                    }
                }

                if (attFicha.Valores.Count > 0)
                {
                    //Asignarles la etiqueta html

                    foreach (var etiquetaHTML in infoAtt.InicioHTML.Split(','))
                        if (!string.IsNullOrWhiteSpace(etiquetaHTML))
                            foreach (var itemValor in attFicha.Valores)
                                itemValor.Valor = "<" + etiquetaHTML + ">" + itemValor.Valor + "</" + etiquetaHTML + ">";

                    piezaMini.Atributos.Add(attFicha);
                }
            }

            imprimir.ListaPiezas.Add(piezaMini);

            if (imprimir.ConPiezasAdicionales)
            {
                foreach (var item in pieza.PiezasHijas)
                {
                    generarPiezaImprimir(item, imprimir);
                }
            }
        }
        // GET: Imprimir
        public ActionResult Menu(string id)
        {
            var imprimir = new itemImprimir()
            {
                TipoImprimir = "Busqueda"
            };

            ViewBag.TipoVista = id;

            return PartialView("_Menu", imprimir);
        }