public ActionResult Crear(ImagenPieza imagenPieza, HttpPostedFileBase FileImagen)
        {
            var FileImageForm = FileImagen;

            if (ModelState.IsValid)
            {

                //guardar la imagen en carpeta
                string extension = Path.GetExtension(FileImageForm.FileName);
                imagenPieza.ImagenPiezaID = Guid.NewGuid();

                imagenPieza.NombreImagen = Guid.NewGuid().ToString() + extension;

                imagenPieza.RutaParcial = "/Content/img/pieza/";

                var rutaGuardar_Original = Server.MapPath(imagenPieza.Ruta);

                FileImageForm.SaveAs(rutaGuardar_Original);

                FileImageForm.InputStream.Dispose();
                FileImageForm.InputStream.Close();
                GC.Collect();

                ////Generar la mini
                Thumbnail mini = new Thumbnail()
                {
                    OrigenSrc = rutaGuardar_Original,
                    DestinoSrc = Server.MapPath(imagenPieza.RutaMini),
                    LimiteAnchoAlto = 250
                };

                mini.GuardarThumbnail();

                //add a la lista de imagenes

                //guardar en db
                db.ImagenPiezas.Add(imagenPieza);
                db.SaveChanges();

                AlertaSuccess(string.Format("Se guardo imagen <b>{0}</b>", imagenPieza.Titulo), true);

                string url = Url.Action("Carrusel", "ImagenPieza", new { id = imagenPieza.PiezaID, status = false, tipo = "thumb" });
                return Json(new { success = true, url = url, modelo = "ImagenPieza", lista = "lista", idPieza = imagenPieza.PiezaID });
            }

            return PartialView("_Crear", imagenPieza);
        }
        public ActionResult Editar(ImagenPieza imagenPieza, HttpPostedFileBase FileImagen)
        {
            if (ModelState.IsValid)
            {
                if (FileImagen != null)
                {

                    FileInfo infoThumb = new FileInfo(Server.MapPath("~" + imagenPieza.RutaMini));
                    if (infoThumb.Exists)
                        infoThumb.Delete();

                    FileInfo infoOriginal = new FileInfo(Server.MapPath("~" + imagenPieza.Ruta));
                    if (infoOriginal.Exists)
                        infoOriginal.Delete();

                    infoOriginal = null;
                    infoThumb = null;

                    string extension = Path.GetExtension(FileImagen.FileName);

                    imagenPieza.RutaParcial = "/Content/img/pieza/";
                    imagenPieza.NombreImagen = Guid.NewGuid().ToString() + extension;
                    imagenPieza.Ruta = imagenPieza.RutaParcial + imagenPieza.NombreImagen;
                    imagenPieza.RutaMini = imagenPieza.RutaParcial + "thumb/" + imagenPieza.NombreImagen;
                    var rutaGuardar_Original = Server.MapPath(imagenPieza.Ruta);
                    FileImagen.SaveAs(rutaGuardar_Original);
                    //Generar la mini
                    Thumbnail mini = new Thumbnail()
                    {
                        OrigenSrc = rutaGuardar_Original,
                        DestinoSrc = Server.MapPath(imagenPieza.RutaMini),
                        LimiteAnchoAlto = 250
                    };

                    mini.GuardarThumbnail();

                }

                db.Entry(imagenPieza).State = EntityState.Modified;
                db.SaveChanges();

                AlertaInfo(string.Format("Se edito imagen <b>{0}</b>", imagenPieza.Titulo), true);

                string url = Url.Action("Carrusel", "ImagenPieza", new { id = imagenPieza.PiezaID, status = false, tipo = "thumb" });
                return Json(new { success = true, url = url, modelo = "ImagenPieza", lista = "lista", idPieza = imagenPieza.PiezaID });

            }

            return PartialView("_Editar", imagenPieza);
        }
        public ActionResult Crear(ArchivoPieza archivoPieza, HttpPostedFileBase FileArchivo)
        {
            #region Inicio de crear

            //mostrar los archivos no se guardara en el historial, por que su implementacion es muy costosa

            var listaMostrarArchivos = new List<MostrarArchivo>();

            foreach (var item in db.TipoMostrarArchivos.Where(a => a.Status).ToList())
            {
                string keyStatus = Request.Form["mosArc_" + item.TipoMostrarArchivoID + "_Status"];
                bool valorStatus = keyStatus == "true,false" ? true : false;
                var tempMostrarArchivo = new MostrarArchivo()
                {
                    Status = valorStatus,
                    TipoMostrarArchivo = item,
                    TipoMostrarArchivoID = item.TipoMostrarArchivoID
                };

                listaMostrarArchivos.Add(tempMostrarArchivo);
            }

            #endregion

            try
            {

                #region Validaciones previas

                //comprobar las extensiones validas
                var tipoArchivo = db.TipoArchivos.Find(archivoPieza.TipoArchivoID);

                archivoPieza.Extension = Path.GetExtension(FileArchivo.FileName);

                if (!tipoArchivo.ExtensionesAceptadas.Replace(" ", "").Split(',').Any(a => "." + a == archivoPieza.Extension))
                    ModelState.AddModelError("", "Archivo no compatible.");

                if (FileArchivo == null)
                    ModelState.AddModelError("", "Seleccione un archivo");

                #endregion

                if (ModelState.IsValid)
                {
                    //Crear la entidad

                    #region pre-creacion de la entidad

                    //validar que la carpeta del tipo de archivo exista

                    if (!Directory.Exists(Server.MapPath(tipoArchivo.Ruta)))
                        Directory.CreateDirectory(Server.MapPath(tipoArchivo.Ruta));

                    if (!Directory.Exists(Server.MapPath(tipoArchivo.Ruta + "thumb/")))
                        Directory.CreateDirectory(Server.MapPath(tipoArchivo.Ruta + "thumb/"));

                    //Agregando valores que faltan
                    archivoPieza.ArchivoPiezaID = Guid.NewGuid();

                    archivoPieza.NombreArchivo = Guid.NewGuid().ToString();

                    archivoPieza.Orden = db.ArchivoPiezas.Where(a => a.TipoArchivoID == archivoPieza.TipoArchivoID && a.PiezaID == archivoPieza.PiezaID).Count() + 1;

                    archivoPieza.TipoArchivo = tipoArchivo;

                    string rutaGuardar = Server.MapPath(archivoPieza.Ruta);

                    FileArchivo.SaveAs(rutaGuardar);

                    FileArchivo.InputStream.Dispose();
                    FileArchivo.InputStream.Close();
                    GC.Collect();

                    #region Creacion de la miniatura

                    //generar la mini
                    switch (archivoPieza.Extension)
                    {
                        //imagenes
                        case ".jpg":
                        case ".png":
                        case ".tiff":
                            Thumbnail mini = new Thumbnail()
                            {
                                OrigenSrc = rutaGuardar,
                                DestinoSrc = Server.MapPath(archivoPieza.RutaThumb),
                                LimiteAnchoAlto = 220
                            };
                            mini.GuardarThumbnail();
                            break;
                        //videos
                        case ".mp4":
                        case ".avi":
                            break;
                    }

                    #endregion

                    #endregion

                    db.ArchivoPiezas.Add(archivoPieza);
                    db.SaveChanges();

                    //------ Logica HISTORIAL

                    #region Generar el historial

                    // Generar el historial
                    var historialLog =
                        HistorialLogica.CrearEntidad(
                        archivoPieza,
                        archivoPieza.GetType().Name,
                        archivoPieza.ArchivoPiezaID.ToString(),
                        User.UsuarioID,
                        db);

                    #endregion

                    #region Guardar el historial

                    //Guardar cambios si todo salio correcto
                    if (historialLog != null)
                    {
                        //Guardar la entidad
                        db.SaveChanges();

                        //Guardar el historial
                        db.HistorialLogs.Add(historialLog);
                        db.SaveChanges();
                    }
                    else
                    {
                        throw new Exception();
                    }

                    #endregion

                    //------

                    foreach (var item in listaMostrarArchivos)
                    {
                        item.ArchivoPiezaID = archivoPieza.ArchivoPiezaID;

                        db.MostrarArchivos.Add(item);
                        db.SaveChanges();
                    }

                    //Logica para terminar la instruccion
                    #region logica finalizar

                    AlertaSuccess(string.Format("Se guardo archivo {0} <b>{1}</b>", tipoArchivo.Nombre, archivoPieza.Titulo), true);

                    string url = "";
                    bool esImagen = tipoArchivo.Temp == "imagen_clave" ? true : false;
                    var tipoMostrarArchivo = db.TipoMostrarArchivos.FirstOrDefault(a => a.Nombre == "Completos");
                    if (esImagen)
                        url = Url.Action("ContenedorImagen", "ArchivoPieza", new { id = archivoPieza.PiezaID, tipoMostrarArchivoID = tipoMostrarArchivo.TipoMostrarArchivoID, esCompleta = true });
                    else
                        url = Url.Action("Lista", "ArchivoPieza", new { id = archivoPieza.PiezaID, TipoArchivoID = tipoArchivo.TipoArchivoID, esCompleta = true });

                    #endregion

                    return Json(new { success = true, url = url, idPieza = archivoPieza.PiezaID, esImagen = esImagen });
                }
            }
            catch (Exception)
            {

                ModelState.AddModelError("", "Error desconocido.");
            }

            archivoPieza.MostrarArchivos = listaMostrarArchivos;

            return PartialView("_Crear", archivoPieza);
        }
        public ActionResult Editar(ArchivoPieza archivoPieza, HttpPostedFileBase FileArchivo, string Motivo)
        {
            #region inicio de editar

            var listaMostrarArchivos = new List<MostrarArchivo>();

            //comprobar las extensiones validas
            var tipoArchivo = db.TipoArchivos.Find(archivoPieza.TipoArchivoID);
            archivoPieza.TipoArchivo = tipoArchivo;

            bool esImagen = tipoArchivo.Temp == "imagen_clave" ? true : false;

            ViewBag.esImagen = esImagen;

            foreach (var item in db.TipoMostrarArchivos.Where(a => a.Status).ToList())
            {
                string keyStatus = Request.Form["mosArc_" + item.TipoMostrarArchivoID + "_Status"];
                bool valorStatus = keyStatus == "true,false" ? true : false;

                var tempMostrarArchivo = db.MostrarArchivos.Find(item.TipoMostrarArchivoID, archivoPieza.ArchivoPiezaID);

                tempMostrarArchivo.Status = valorStatus;

                db.Entry(tempMostrarArchivo).State = EntityState.Modified;
            }

            #endregion

            try
            {
                #region Validaciones previas

                bool eliminarArchivo = false;
                string rutaThumb = "";
                string rutaOriginal = "";

                if (FileArchivo != null)
                {
                    eliminarArchivo = true;
                    archivoPieza.Extension = Path.GetExtension(FileArchivo.FileName);

                    if (!tipoArchivo.ExtensionesAceptadas.Replace(" ", "").Split(',').Any(a => "." + a == archivoPieza.Extension))
                    {
                        ModelState.AddModelError("", "Archivo no compatible.");
                        eliminarArchivo = false;
                    }

                    rutaThumb = "~" + archivoPieza.RutaThumb;
                    rutaOriginal = "~" + archivoPieza.Ruta;
                }

                if (string.IsNullOrWhiteSpace(Motivo))
                    ModelState.AddModelError("Motivo", "Motivo vacio.");

                #endregion

                if (ModelState.IsValid)
                {
                    //Guardar el mostrar archivo
                    db.SaveChanges();

                    #region preparar la eliminacion

                    if (eliminarArchivo)
                    {
                        if (!Directory.Exists(Server.MapPath(tipoArchivo.Ruta)))
                            Directory.CreateDirectory(Server.MapPath(tipoArchivo.Ruta));

                        if (!Directory.Exists(Server.MapPath(tipoArchivo.Ruta + "thumb/")))
                            Directory.CreateDirectory(Server.MapPath(tipoArchivo.Ruta + "thumb/"));

                        archivoPieza.NombreArchivo = Guid.NewGuid().ToString();

                        string rutaGuardar = Server.MapPath(archivoPieza.Ruta);

                        FileArchivo.SaveAs(rutaGuardar);

                        FileArchivo.InputStream.Dispose();
                        FileArchivo.InputStream.Close();
                        GC.Collect();

                        //generar la mini
                        switch (archivoPieza.Extension)
                        {
                            //imagenes
                            case ".jpg":
                            case ".png":
                            case ".tiff":
                                Thumbnail mini = new Thumbnail()
                                {
                                    OrigenSrc = rutaGuardar,
                                    DestinoSrc = Server.MapPath(archivoPieza.RutaThumb),
                                    LimiteAnchoAlto = 220
                                };
                                mini.GuardarThumbnail();
                                break;
                            //videos
                            case ".mp4":
                            case ".avi":
                                break;
                        }

                        //Eliminar los archivos
                        FileInfo infoThumb = new FileInfo(Server.MapPath(rutaThumb));
                        if (infoThumb.Exists) infoThumb.Delete();
                        FileInfo infoOriginal = new FileInfo(Server.MapPath(rutaOriginal));
                        if (infoOriginal.Exists) infoOriginal.Delete();
                    }

                    #endregion

                    //------ Logica HISTORIAL

                    #region Generar el historial

                    //objeto del formulario
                    var objeto = archivoPieza;
                    //Objeto de la base de datos
                    var objetoDB = db.ArchivoPiezas.Find(archivoPieza.ArchivoPiezaID);
                    //tabla o clase a la que pertenece
                    var tablaNombre = objeto.GetType().Name;
                    //llave primaria del objeto
                    var llavePrimaria = objetoDB.ArchivoPiezaID.ToString();

                    //generar el historial
                    var historialLog = HistorialLogica.EditarEntidad(
                        objeto,
                        objetoDB,
                        tablaNombre,
                        llavePrimaria,
                        User.UsuarioID,
                        db,
                        Motivo
                        );

                    #endregion

                    #region Guardar el historial

                    if (historialLog != null)
                    {
                        //Cambiar el estado a la entidad a modificada
                        db.Entry(objetoDB).State = EntityState.Modified;
                        //Guardamos la entidad modificada
                        db.SaveChanges();

                        //Guardar el historial
                        db.HistorialLogs.Add(historialLog);
                        db.SaveChanges();
                    }

                    #endregion

                    //------

                    //Logica para terminar la instruccion
                    #region logica finalizar

                    AlertaInfo(string.Format("Se edito archivo {0} <b>{1}</b>", tipoArchivo.Nombre, archivoPieza.Titulo), true);

                    string url = "";
                    var tipoMostrarArchivo = db.TipoMostrarArchivos.FirstOrDefault(a => a.Nombre == "Completos");

                    if (esImagen)
                        url = Url.Action("ContenedorImagen", "ArchivoPieza", new { id = archivoPieza.PiezaID, tipoMostrarArchivoID = tipoMostrarArchivo.TipoMostrarArchivoID, esCompleta = true });
                    else
                        url = Url.Action("Lista", "ArchivoPieza", new { id = archivoPieza.PiezaID, TipoArchivoID = tipoArchivo.TipoArchivoID, esCompleta = true });

                    #endregion

                    return Json(new { success = true, url = url, idPieza = archivoPieza.PiezaID, esImagen = esImagen });
                }
            }
            catch (Exception)
            {

                ModelState.AddModelError("", "Error desconocido.");
            }

            return PartialView("_Editar", archivoPieza);
        }
Exemplo n.º 5
0
        public ActionResult Registrar(Guid? TipoObraID, int? LetraFolioID, Guid? TipoPiezaID)
        {
            var Formulario = Request.Form;

            int InicioFolio = 1;
            if (TipoObraID == null || LetraFolioID == null || TipoPiezaID == null)
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

            var letra = db.LetraFolios.Find(LetraFolioID);
            var tipoObra = db.TipoObras.Find(TipoObraID);
            var tipoPieza = tipoObra.TipoPiezas.FirstOrDefault(a => a.TipoPiezaID == TipoPiezaID);

            if (tipoObra == null || letra == null || tipoPieza == null)
                return HttpNotFound();

            //buscar el ultimo numero del folio subido

            InicioFolio = db.Obras.Where(a => a.LetraFolioID == letra.LetraFolioID).Select(a=> a.NumeroFolio).OrderByDescending(a=> a).FirstOrDefault();

            var obra = new Obra()
            {
                FechaRegistro = DateTime.Now,
                TipoObraID = tipoObra.TipoObraID,
                LetraFolioID = letra.LetraFolioID,
                Status = false,
                NumeroFolio = InicioFolio
            };

            obra.ObraID = Guid.NewGuid();

            //Crear pieza
            Pieza pieza = new Pieza()
            {
                PiezaID = Guid.NewGuid(),
                FechaRegistro = obra.FechaRegistro,
                ObraID = obra.ObraID,
                Status = false,
                PiezaPadreID = null, // null = Principal o Maestra
                TipoPiezaID = tipoPieza.TipoPiezaID,
                SubFolio = tipoPieza.Prefijo
            };

            //lista de atributos de registro
            var listaAttRegistro = tipoPieza.Atributos.Where(a => a.Status && a.MostrarAtributos.Any(b => b.TipoMostrar.Nombre == "Registro" && b.Status) && a.TipoAtributo.Status).OrderBy(a => a.Orden).ToList();

            List<AtributoPieza> listaAdd_AttGen = new List<AtributoPieza>();
            List<AutorPieza> listaAdd_AttAutor = new List<AutorPieza>();
            List<ImagenPieza> listaAdd_AttImg = new List<ImagenPieza>();
            List<TecnicaPieza> listaAdd_AttTec = new List<TecnicaPieza>();
            List<MedidaPieza> listaAdd_AttMed = new List<MedidaPieza>();
            Ubicacion ubicacionAdd = null;

            List<string> listaKey;

            /*
             * Extraer los registros del formulario dependiendo el tipo de Atributo
             *
             * IMAGEN
             *      SIMPLE
             *          id_####################_File        (File)
             *          id_####################_Titulo      (Input)
             *          id_####################_Descripcion (Input)
             *

             *

             */

            foreach (var att in listaAttRegistro)
            {
                var tipoAtt = att.TipoAtributo;

                if (tipoAtt.EsGenerico)
                {
                    /*
                     * GENERICO
                     *      LISTA
                     *          SIMPLE
                     *              id_#################### (Select)
                     *          MULTI
                     *              id_####################_#################### (Input)
                     */
                    if (tipoAtt.EsLista)
                    {

                        if (tipoAtt.EsMultipleValor)
                            listaKey = Formulario.AllKeys.Where(k => k.StartsWith("id_" + att.AtributoID + "_")).ToList();
                        else
                            listaKey = Formulario.AllKeys.Where(k => k.StartsWith("id_" + att.AtributoID)).ToList();

                        //buscar en form todas las llaves que correspondan al id_xxxxxxxxxxxxxx_xxxxxxxxxxxxxx
                        foreach (string key in listaKey)
                        {
                            var addOk = true;
                            string valor = Formulario[key];

                            addOk = String.IsNullOrWhiteSpace(valor) ? false : true;

                            //validar el valorID, buscar el valor
                            Guid valorID = addOk ? new Guid(valor) : new Guid(new Byte[16]);

                            addOk = !addOk ? addOk : listaAdd_AttGen.Where(a => a.AtributoID == att.AtributoID && a.ListaValorID == valorID).FirstOrDefault() == null ? true : false;

                            addOk = !addOk ? addOk : db.ListaValores.Where(a => a.TipoAtributoID == tipoAtt.TipoAtributoID && a.Status && a.ListaValorID == valorID).FirstOrDefault() == null ? false : true;

                            if (addOk)
                                listaAdd_AttGen.Add(new AtributoPieza()
                                {
                                    AtributoPiezaID = Guid.NewGuid(),
                                    AtributoID = att.AtributoID,
                                    PiezaID = pieza.PiezaID,
                                    Status = true,
                                    ListaValorID = valorID
                                });
                        }
                    }
                    else
                    {
                        /*
                         * GENERICO
                         *    CAMPO
                         *        SIMPLE
                         *            id_#################### (Input)
                         *        MULTI
                         *            id_####################_##### (Input)
                         */

                        if (tipoAtt.EsMultipleValor)
                            listaKey = Formulario.AllKeys.Where(k => k.StartsWith("id_" + att.AtributoID + "_")).ToList();
                        else
                            listaKey = Formulario.AllKeys.Where(k => k.StartsWith("id_" + att.AtributoID)).ToList();

                        //buscar en form todas las llaves que correspondan al id_xxxxxxxxxxxxxx
                        foreach (string key in listaKey)
                        {
                            var addOk = true;
                            string valor = Formulario[key];

                            //validar el campo, quitar espacios en blanco, bla bla bla
                            valor = valor.Trim(); // quitar espacios en inicio y fin
                            valor = Regex.Replace(valor, @"\s+", " "); //quitar espacios de sobra

                            addOk = String.IsNullOrWhiteSpace(valor) ? false : true;
                            addOk = !addOk ? addOk : listaAdd_AttGen.Where(a => a.AtributoID == att.AtributoID && a.Valor == valor).FirstOrDefault() == null ? true : false;

                            if (addOk)
                                listaAdd_AttGen.Add(new AtributoPieza()
                                {
                                    AtributoPiezaID = Guid.NewGuid(),
                                    AtributoID = att.AtributoID,
                                    PiezaID = pieza.PiezaID,
                                    Status = true,
                                    Valor = valor
                                });

                        }
                    }
                }
                else
                {
                    switch (tipoAtt.TablaSQL)
                    {
                        case "Autor":
                            /*
                                * AUTOR
                                *      MULTIPLE
                                *          id_####################_####################            (Input)
                                *          id_####################_####################_prefijo    (Input)
                            */
                            //filtrar id_#######
                            listaKey = Formulario.AllKeys.Where(k => k.StartsWith("id_" + att.AtributoID + "_")).ToList();

                            ///filtrar: ignorar los _prefijo
                            listaKey = listaKey.Where(k => !k.EndsWith("_prefijo")).ToList();

                            //buscar en form todas las llaves que correspondan al id_xxxxxxxxxxxxxx_xxxxxxxxxxxxxx
                            foreach (string key in listaKey)
                            {
                                var addOk = true;
                                string text_autorID = Formulario[key];
                                string text_prefijo = Formulario[key + "_prefijo"];

                                addOk = String.IsNullOrWhiteSpace(text_autorID) ? false : true;

                                //validar el valorID, buscar el valor
                                Guid autorID = addOk ? new Guid(text_autorID) : new Guid(new Byte[16]);

                                addOk = !addOk ? addOk : listaAdd_AttAutor.Where(a => a.AutorID == autorID).FirstOrDefault() == null ? true : false;

                                addOk = !addOk ? addOk : db.Autores.Where(a => a.Status && a.AutorID == autorID).FirstOrDefault() == null ? false : true;

                                if (addOk)
                                {
                                    var autorPieza = new AutorPieza()
                                    {
                                        AutorID = autorID,
                                        PiezaID = pieza.PiezaID,
                                        esPrincipal = false,
                                        Prefijo = text_prefijo,
                                        Status = true
                                    };

                                    //validar si es principal
                                    if (autorPieza.Prefijo.ToLower() == "principal")
                                        autorPieza.esPrincipal = listaAdd_AttAutor.Where(a => a.esPrincipal).Count() == 0 ? true : false;

                                    listaAdd_AttAutor.Add(autorPieza);
                                }
                            }
                            break;

                        case "Ubicacion":
                            /*
                                * UBICACION
                                *      SIMPLE
                                *          id_####################     (select)
                            */

                            listaKey = Formulario.AllKeys.Where(k => k.StartsWith("id_" + att.AtributoID)).ToList();

                            //buscar en form todas las llaves que correspondan al id_xxxxxxxxxxxxxx_xxxxxxxxxxxxxx
                            foreach (string key in listaKey)
                            {
                                var addOk = true;
                                string texto_ubicacionID = Formulario[key];

                                addOk = String.IsNullOrWhiteSpace(texto_ubicacionID) ? false : true;

                                //validar el valorID, buscar el valor
                                Guid ubicacionID = addOk ? new Guid(texto_ubicacionID) : new Guid(new Byte[16]);

                                addOk = !addOk ? addOk : ubicacionAdd == null ? true : false;

                                addOk = !addOk ? addOk : db.Ubicaciones.Where(a => a.Status && a.UbicacionID == ubicacionID).FirstOrDefault() == null ? false : true;

                                if (addOk)
                                    pieza.UbicacionID = ubicacionID;
                            }
                            break;

                        case "TipoTecnica":
                            /*
                                * TECNICA
                                *      SIMPLE
                                *          id_####################     (Select)
                             */

                            listaKey = Formulario.AllKeys.Where(k => k.StartsWith("id_" + att.AtributoID)).ToList();

                            //buscar en form todas las llaves que correspondan al id_xxxxxxxxxxxxxx_xxxxxxxxxxxxxx
                            foreach (string key in listaKey)
                            {
                                var addOk = true;
                                string texto_TecnicaID = Formulario[key];

                                addOk = String.IsNullOrWhiteSpace(texto_TecnicaID) ? false : true;

                                //validar el valorID, buscar el valor
                                Guid tecnicaID = addOk ? new Guid(texto_TecnicaID) : new Guid(new Byte[16]);

                                addOk = !addOk ? addOk : listaAdd_AttTec.Where(a => a.TecnicaID == tecnicaID).FirstOrDefault() == null ? true : false;

                                addOk = !addOk ? addOk : db.Tecnicas.Where(a => a.TecnicaID == tecnicaID && a.Status).FirstOrDefault() == null ? false : true;

                                if (addOk)
                                {
                                    var tecnica = db.Tecnicas.Where(a => a.TecnicaID == tecnicaID && a.Status).FirstOrDefault();

                                    listaAdd_AttTec.Add(new TecnicaPieza()
                                    {
                                        PiezaID = pieza.PiezaID,
                                        Status = true,
                                        TecnicaID = tecnica.TecnicaID,
                                        TipoTecnicaID = tecnica.TipoTecnicaID
                                    });
                                }
                            }

                            break;

                        case "TipoMedida":
                            /*
                                * TIPO MEDIDA
                                *      SIMPLE
                                *          id_####################                 (Select)(TipoMedida)
                                *          id_####################_UML             (Select)
                                *          id_####################_Altura          (input)
                                *          id_####################_Anchura         (input)
                                *          id_####################_Profundidad     (input)
                                *          id_####################_Diametro        (input)
                                *          id_####################_Diametro2       (input)
                            */

                            listaKey = Formulario.AllKeys.Where(k => k == "TipoMedidaID").ToList();

                            //buscar en form todas las llaves que correspondan al id_xxxxxxxxxxxxxx_xxxxxxxxxxxxxx
                            foreach (string key in listaKey)
                            {
                                var addOk = true;
                                string texto_TipoMedidaID = Formulario[key];

                                addOk = String.IsNullOrWhiteSpace(texto_TipoMedidaID) ? false : true;

                                //validar el valorID, buscar el valor
                                Guid tipoMedidaID = addOk ? new Guid(texto_TipoMedidaID) : new Guid(new Byte[16]);

                                addOk = !addOk ? addOk : listaAdd_AttMed.Where(a => a.TipoMedidaID == tipoMedidaID).FirstOrDefault() == null ? true : false;

                                addOk = !addOk ? addOk : db.TipoMedidas.Where(a => a.TipoMedidaID == tipoMedidaID && a.Status).FirstOrDefault() == null ? false : true;

                                if (addOk)
                                {
                                    var medidaPieza = new MedidaPieza()
                                    {
                                        PiezaID = pieza.PiezaID,
                                        Status = true,
                                        TipoMedidaID = tipoMedidaID
                                    };

                                    string text_UML = String.IsNullOrWhiteSpace(Formulario["id_" + att.AtributoID + "_UML"]) ? "cm" : Formulario["id_" + att.AtributoID + "_UML"];
                                    string text_Altura = String.IsNullOrWhiteSpace(Formulario["id_" + att.AtributoID + "_Altura"]) ? "0" : Formulario["id_" + att.AtributoID + "_Altura"];
                                    string text_Anchura = String.IsNullOrWhiteSpace(Formulario["id_" + att.AtributoID + "_Anchura"]) ? "0" : Formulario["id_" + att.AtributoID + "_Anchura"];
                                    string text_Profundidad = String.IsNullOrWhiteSpace(Formulario["id_" + att.AtributoID + "_Profundidad"]) ? "0" : Formulario["id_" + att.AtributoID + "_Profundidad"];
                                    string text_Diametro = String.IsNullOrWhiteSpace(Formulario["id_" + att.AtributoID + "_Diametro"]) ? "0" : Formulario["id_" + att.AtributoID + "_Diametro"];
                                    string text_Diametro2 = String.IsNullOrWhiteSpace(Formulario["id_" + att.AtributoID + "_Diametro2"]) ? "0" : Formulario["id_" + att.AtributoID + "_Diametro2"];

                                    if (text_Altura == "0") medidaPieza.Altura = Convert.ToDouble("text_Altura");
                                    if (text_Anchura == "0") medidaPieza.Anchura = Convert.ToDouble("text_Anchura");
                                    if (text_Altura == "0") medidaPieza.Profundidad = Convert.ToDouble("text_Profundidad");
                                    if (text_Altura == "0") medidaPieza.Diametro = Convert.ToDouble("text_Diametro");
                                    if (text_Altura == "0") medidaPieza.Diametro2 = Convert.ToDouble("text_Diametro2");

                                    switch (text_UML)
                                    {
                                        case "pulgada": medidaPieza.UMLongitud = UMLongitud.pulgada; break;
                                        case "dc": medidaPieza.UMLongitud = UMLongitud.dc; break;
                                        case "m": medidaPieza.UMLongitud = UMLongitud.m; break;
                                        case "dam": medidaPieza.UMLongitud = UMLongitud.dam; break;
                                        case "mm": medidaPieza.UMLongitud = UMLongitud.mm; break;
                                        case "hm": medidaPieza.UMLongitud = UMLongitud.hm; break;
                                        case "km": medidaPieza.UMLongitud = UMLongitud.km; break;
                                        default: medidaPieza.UMLongitud = UMLongitud.cm; break;

                                    }

                                    listaAdd_AttMed.Add(medidaPieza);
                                }
                            }

                            break;

                        case "ImagenPieza":

                            listaKey = Request.Files.AllKeys.Where(k => k == "id_" + att.AtributoID + "_File").ToList();

                            //buscar en form todas las llaves que correspondan al id_xxxxxxxxxxxxxx_xxxxxxxxxxxxxx
                            foreach (string key in listaKey)
                            {
                                HttpPostedFileBase FileImageForm = Request.Files[key];

                                string texto_Titulo = Formulario["id_" + att.AtributoID + "_Titulo"];
                                string texto_Descripcion = Formulario["id_" + att.AtributoID + "_Descripcion"];
                                string extension = Path.GetExtension(FileImageForm.FileName);

                                var imgGuid = Guid.NewGuid();

                                ImagenPieza imagenPieza = new ImagenPieza()
                                {
                                    PiezaID = pieza.PiezaID,
                                    ImagenPiezaID = imgGuid,
                                    Titulo = texto_Titulo,
                                    Descripcion = texto_Descripcion,
                                    EsPrincipal = true,
                                    Orden = 1,
                                    Status = true,
                                    RutaParcial = "/Content/img/pieza/",
                                    NombreImagen = imgGuid.ToString() + extension,
                                };

                                var rutaGuardar_Original = Server.MapPath(imagenPieza.Ruta);

                                FileImageForm.SaveAs(rutaGuardar_Original);

                                FileImageForm.InputStream.Dispose();
                                FileImageForm.InputStream.Close();
                                GC.Collect();

                                //Generar la mini
                                Thumbnail mini = new Thumbnail()
                                {
                                    OrigenSrc = rutaGuardar_Original,
                                    DestinoSrc = Server.MapPath(imagenPieza.RutaMini),
                                    LimiteAnchoAlto = 250
                                };

                                mini.GuardarThumbnail();

                                //add a la lista de imagenes

                                listaAdd_AttImg.Add(imagenPieza);
                            }

                            break;

                        default:
                            AlertaDanger(String.Format("No se pudo guardar el campo, {0}.", att.NombreAlterno));
                            break;
                    }

                }

            }

            if (ModelState.IsValid)
            {
                //validar el numero de folio
                obra.NumeroFolio = DarFolioValido(obra.LetraFolioID, obra.NumeroFolio);

                //Guardar la obra
                db.Obras.Add(obra);
                db.SaveChanges();

                //Guardar la pieza
                db.Piezas.Add(pieza);
                db.SaveChanges();

                //Guardar sus atributos
                db.AtributoPiezas.AddRange(listaAdd_AttGen);
                db.AutorPiezas.AddRange(listaAdd_AttAutor);
                db.ImagenPiezas.AddRange(listaAdd_AttImg);
                db.TecnicaPiezas.AddRange(listaAdd_AttTec);
                db.MedidaPiezas.AddRange(listaAdd_AttMed);

                db.SaveChanges();

                return RedirectToAction("Detalles", "Obra", new { id = obra.ObraID });

            }

            return Json(new { success = false });
        }