public ActionResult Editar(MovimientoTemp movimientoTemp, List<Item_MovPieza> ListaPiezas, string Motivo, bool ForzarMovimiento = false)
        {
            db = new RecordFCSContext();

            #region Validaciones previas

            if (movimientoTemp.EstadoMovimiento == EstadoMovimientoTemp.Concluido_SinValidar && movimientoTemp.EsValido)
                movimientoTemp.EstadoMovimiento = EstadoMovimientoTemp.Concluido;

            ////cambiar el estado del movimiento dependiendo la fecha y hora
            //if (movimientoTemp.EstadoMovimiento != EstadoMovimientoTemp.Cancelado)
            //{
            //    if (movimientoTemp.FechaSalida < DateTime.Now)
            //    {
            //        movimientoTemp.EstadoMovimiento = EstadoMovimientoTemp.Concluido;
            //    }
            //    else
            //    {
            //        movimientoTemp.EstadoMovimiento = EstadoMovimientoTemp.Procesando;
            //    }
            //}

            //Separar en listas las piezas

            //lista de piezas existentes en el movimiento
            var listaGuidActual = db.MovimientoTempPiezas.Where(a => a.MovimientoTempID == movimientoTemp.MovimientoTempID).Select(a => a.PiezaID).ToList();
            //lista de piezas que se agregaran al movimiento
            var listaAdd = new List<MovimientoTempPieza>();
            //lista de piezas que se editaran
            var listaEdit = new List<MovimientoTempPieza>();

            ListaPiezas = ListaPiezas == null ? new List<Item_MovPieza>() : ListaPiezas;

            foreach (var item in ListaPiezas)
            {
                var existeEnMov = listaGuidActual.Where(a => a == item.PiezaID).Count() > 0 ? true : false;

                var temp = new MovimientoTempPieza()
                {
                    Comentario = item.Comentario,
                    EnError = item.EnError,
                    EsPendiente = item.EsPendiente,
                    MovimientoTempID = movimientoTemp.MovimientoTempID,
                    PiezaID = item.PiezaID,
                    SeMovio = item.SeMovio,
                    FolioPieza = item.FolioPieza
                };

                temp.Comentario = item.EnError ? item.Comentario : "";

                if (!existeEnMov)
                {
                    // C R E A R
                    temp.EsPendiente = true;
                    temp.SeMovio = false;
                    listaAdd.Add(temp);
                }
                else
                {
                    // E D I T A R
                    listaEdit.Add(temp);

                    //quitarlo de la lista existente
                    listaGuidActual.Remove(item.PiezaID);
                }
            }

            #endregion

            //las piezas que no estuvieron eliminarlas
            //y buscar el movimiento anterior donde fueron validas
            //para regresar el estatus.
            if (ModelState.IsValid)
            {
                var fechaEdicion = DateTime.Now;

                movimientoTemp.FechaUltimaEjecucion = fechaEdicion;

                #region Crear el historial del movimiento

                //------ Logica HISTORIAL

                #region Generar el historial

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

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

                #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

                //------

                #endregion

                AlertaSuccess("Se edito el movimiento: <b>" + movimientoTemp.Folio + "</b>", true);

                //Crear el historial de las piezas del movimiento
                //Agregar, Editar y Eliminar las piezas
                //No se cambiara el estatus a las piezas ya que esto se hara automaticamente o mediante permisos especiales

                //Agregar
                #region Lista Agregar

                db = new RecordFCSContext();
                db.Configuration.LazyLoadingEnabled = false;

                foreach (var item in listaAdd)
                {

                    var ordenActual = db.MovimientoTempPiezas.Where(a => a.PiezaID == item.PiezaID).Count() > 0 ? db.MovimientoTempPiezas.Where(a => a.PiezaID == item.PiezaID).OrderByDescending(a => a.Orden).FirstOrDefault().Orden : 0;

                    item.Orden = item.EnError ? 0 : ordenActual + 1;

                    var temp = ListaPiezas.FirstOrDefault(a => a.PiezaID == item.PiezaID);

                    db.MovimientoTempPiezas.Add(item);

                    //------ Logica HISTORIAL

                    #region Generar el historial

                    //generar el historial
                    var historialLogAdd = HistorialLogica.CrearEntidad(
                        item,
                        "MovimientoTempPieza",
                        item.MovimientoTempID + "," + item.PiezaID,
                        User.UsuarioID,
                        db,
                        fechaEdicion
                        );

                    #endregion

                    #region Agrega el historial

                    if (historialLogAdd != null)
                    {
                        //Guardar el historial
                        db.HistorialLogs.Add(historialLogAdd);
                        AlertaSuccess("Se agrego la pieza [<b>" + temp.FolioPieza + "</b>]", true);
                    }
                    else
                    {
                        AlertaSuccess("No se pudo agregar la pieza [<b>" + temp.FolioPieza + "</b>]", true);
                    }
                    #endregion

                    //------

                }

                #region Guardar el historial y la entidad

                //Guardar todo
                db.SaveChanges();

                #endregion

                #endregion

                //Editar
                #region Lista Editar

                db = new RecordFCSContext();
                db.Configuration.LazyLoadingEnabled = false;

                foreach (var item in listaEdit.ToList())
                {

                    //Piezas SeMovio = no se pueden edita

                    //buscar la pieza
                    //var pieza = db.Piezas.Find(item.PiezaID);
                    var piezaMovOriginal = db.MovimientoTempPiezas.FirstOrDefault(a => a.PiezaID == item.PiezaID && a.MovimientoTempID == movimientoTemp.MovimientoTempID);

                    if (piezaMovOriginal.SeMovio)
                    {
                        listaEdit.Remove(item);
                    }
                    else
                    {
                        //saber si la pieza cambio en el campo error
                        //valor original - valor nuevo
                        bool ConCambios = piezaMovOriginal.EnError != item.EnError;

                        if (ConCambios)
                        {
                            //Sufrio cambios
                            if (item.EnError)
                            {
                                //ahora con errores
                                //item.Orden = 0;
                                item.EnError = true;
                                item.EsPendiente = true;
                                item.SeMovio = false;
                            }
                            else
                            {
                                //ahora sin errores
                                if (piezaMovOriginal.Orden == 0)
                                {
                                    //generar un orden
                                    var ordenActual = db.MovimientoTempPiezas.Where(a => a.PiezaID == item.PiezaID).Count() > 0 ? db.MovimientoTempPiezas.Where(a => a.PiezaID == item.PiezaID).OrderByDescending(a => a.Orden).FirstOrDefault().Orden : 0;
                                    item.Orden = item.EnError ? 0 : ordenActual + 1;
                                }

                                item.Comentario = "";
                                item.EnError = false;
                                item.EsPendiente = true;
                                item.SeMovio = false;
                            }
                        }
                        else
                        {
                            item.Comentario = piezaMovOriginal.Comentario;
                            item.EnError = piezaMovOriginal.EnError;
                            item.EsPendiente = piezaMovOriginal.EsPendiente;
                            item.Orden = piezaMovOriginal.Orden;
                            item.SeMovio = piezaMovOriginal.SeMovio;
                        }

                        piezaMovOriginal = null;

                        //buscar el objeto
                        var itemTemp = db.MovimientoTempPiezas.Find(item.MovimientoTempID, item.PiezaID);
                        itemTemp.Comentario = item.Comentario;
                        itemTemp.EnError = item.EnError;
                        itemTemp.EsPendiente = item.EsPendiente;
                        itemTemp.Orden = item.Orden;
                        itemTemp.SeMovio = item.SeMovio;
                        itemTemp.FolioPieza = item.FolioPieza;

                        //------ Logica HISTORIAL

                        #region Generar el historial

                        //objeto del formulario
                        var objetoEdit = itemTemp;
                        //Objeto de la base de datos
                        var objetoDBEdit = db.MovimientoTempPiezas.Find(itemTemp.MovimientoTempID, itemTemp.PiezaID);
                        //tabla o clase a la que pertenece
                        var tablaNombreEdit = "MovimientoTempPieza";
                        //llave primaria del objeto
                        var llavePrimariaEdit = objetoDBEdit.MovimientoTempID + "," + objetoDBEdit.PiezaID;

                        //generar el historial
                        var historialLogEdit = HistorialLogica.EditarEntidad(
                            objetoEdit,
                            objetoDBEdit,
                            tablaNombreEdit,
                            llavePrimariaEdit,
                            User.UsuarioID,
                            db,
                            Motivo,
                            fechaEdicion
                            );

                        #endregion

                        #region Agrega el historial

                        if (historialLogEdit != null)
                        {
                            //Cambiar el estado a la entidad a modificada
                            db.Entry(objetoDBEdit).State = EntityState.Modified;

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

                        #endregion

                        //------

                    }
                }

                #region Guardar el historial y la entidad

                //Guardar todo
                db.SaveChanges();

                #endregion

                #endregion

                //Eliminar
                #region ListaEliminar

                db = new RecordFCSContext();
                //db.Configuration.LazyLoadingEnabled = false;

                foreach (var PiezaIDDel in listaGuidActual)
                {

                    var item = db.MovimientoTempPiezas.FirstOrDefault(a => a.PiezaID == PiezaIDDel && a.MovimientoTempID == movimientoTemp.MovimientoTempID);

                    bool esEliminable = false;
                    string Folio = "";
                    bool RegresarHistorial = false;

                    //saber si es eliminable y si se puede regresar el estado
                    if (item != null)
                    {
                        bool esUltimo = db.MovimientoTempPiezas.Where(a => a.PiezaID == item.PiezaID && a.Orden > item.Orden && !a.EnError).Count() > 0 ? false : true;
                        bool conPendientes = db.MovimientoTempPiezas.Where(a => a.PiezaID == item.PiezaID && a.EsPendiente && a.MovimientoTempID != movimientoTemp.MovimientoTempID && !a.EnError).Count() > 0 ? true : false;

                        Folio = item.Pieza.ImprimirFolio();

                        if (item.SeMovio)
                        {
                            if (esUltimo)
                            {
                                esEliminable = true;
                                RegresarHistorial = true;
                            }
                        }
                        else
                        {
                            if (item.EsPendiente)
                            {
                                esEliminable = true;
                            }
                        }
                    }

                    //es eliminable
                    if (esEliminable)
                    {
                        db.MovimientoTempPiezas.Remove(item);

                        //------ Logica HISTORIAL

                        #region Generar el historial

                        // Generar el historial
                        var historialLogDel =
                            HistorialLogica.EliminarEntidad(
                            item,
                            "MovimientoTempPieza",
                            item.MovimientoTempID + "," + item.PiezaID,
                            User.UsuarioID,
                            db,
                            fechaEdicion);

                        #endregion

                        #region Guardar el historial

                        //Guardar cambios si todo salio correcto
                        if (historialLogDel != null)
                        {
                            //Guardar el historial
                            db.HistorialLogs.Add(historialLogDel);

                            AlertaDanger("Se elimino la pieza [<b>" + Folio + "</b>]", true);

                        }

                        #endregion

                        //------

                        //Regresar el estado de la pieza
                        if (RegresarHistorial)
                        {
                            item = null;
                            var pieza = db.Piezas.Find(PiezaIDDel);
                            if (pieza != null)
                            {
                                if (pieza.UbicacionID == movimientoTemp.UbicacionDestinoID)
                                {
                                    pieza.UbicacionID = movimientoTemp.UbicacionOrigenID;

                                    //------ Logica HISTORIAL

                                    #region Generar el historial

                                    //objeto del formulario
                                    var objetoDelUbi = pieza;
                                    //Objeto de la base de datos
                                    var objetoDBDelUbi = db.Piezas.Find(pieza.PiezaID);
                                    //tabla o clase a la que pertenece
                                    var tablaNombreDelUbi = "Pieza";
                                    //llave primaria del objeto
                                    var llavePrimariaDelUbi = objetoDBDelUbi.PiezaID.ToString();

                                    //generar el historial
                                    var historialLogDelUbi = HistorialLogica.EditarEntidad(
                                        objetoDelUbi,
                                        objetoDBDelUbi,
                                        tablaNombreDelUbi,
                                        llavePrimariaDelUbi,
                                        User.UsuarioID,
                                        db,
                                        "Retornar Movimiento: " + movimientoTemp.Folio,
                                        fechaEdicion
                                        );

                                    #endregion

                                    #region Guardar el historial

                                    if (historialLogDelUbi != null)
                                    {
                                        //Cambiar el estado a la entidad a modificada
                                        db.Entry(objetoDBDelUbi).State = EntityState.Modified;

                                        //Guardar el historial
                                        db.HistorialLogs.Add(historialLogDelUbi);

                                    }

                                    #endregion

                                    //------

                                }
                            }
                        }
                    }
                }

                #region Guardar el historial

                //Guardar todo
                db.SaveChanges();

                #endregion

                #endregion

                if (ForzarMovimiento)
                {
                    //Logica para forzar el movimiento
                    db = new RecordFCSContext();

                    var mov = db.MovimientosTemp.Find(movimientoTemp.MovimientoTempID);

                    var EstadoActual = mov.EstadoMovimiento.Value;

                    //Solo acepta movimientos que no esten cancelados o que tengan retorno
                    if (mov.MovimientoTempPiezas.Where(a => !a.SeMovio && !a.EnError && a.EsPendiente).Count() > 0)
                    {
                        if (EstadoActual == EstadoMovimientoTemp.Concluido ||
                            EstadoActual == EstadoMovimientoTemp.Concluido_SinValidar ||
                            EstadoActual == EstadoMovimientoTemp.Procesando)
                        {
                            //Sirve para cambiar la ubicacion a las piezas

                            //Elegir el estado al cual pasara
                            //Ignorando la fecha
                            switch (EstadoActual)
                            {
                                case EstadoMovimientoTemp.Concluido_SinValidar:
                                    //Comprobar si el movimiento ya es valido
                                    if (mov.EsValido)
                                        EstadoActual = EstadoMovimientoTemp.Concluido;
                                    break;
                                case EstadoMovimientoTemp.Procesando:
                                    //Comprobar si el movimiento ya es valido
                                    if (mov.EsValido)
                                        EstadoActual = EstadoMovimientoTemp.Concluido;
                                    else
                                        EstadoActual = EstadoMovimientoTemp.Concluido_SinValidar;
                                    break;
                            }

                            mov.EstadoMovimiento = EstadoActual;

                            EjecutarMovimiento(mov, EstadoActual, fechaEdicion);

                        }

                    }

                }

                return Json(new { success = true, url = Url.Action("Detalles", new { id = movimientoTemp.MovimientoTempID }) });
            }

            //Si Error
            #region Logica si ocurre un error

            var listaUbicaciones = db.Ubicaciones.Where(a => a.Status).Select(a => new { a.Nombre, a.UbicacionID }).OrderBy(a => a.Nombre);

            //Ubicacion destino no puede editarse si se encuentra por lo menos una Pieza Procesada
            ViewBag.UbiDestinoEnabled = movimientoTemp.MovimientoTempPiezas.Where(a => a.SeMovio).Count() == 0 ? true : false;

            ViewBag.UbicacionDestinoID = new SelectList(listaUbicaciones, "UbicacionID", "Nombre", movimientoTemp.UbicacionDestinoID);

            #region Validar navegacion de movimientos

            // 1 2 3 4 [5] 6 7 8 9 10
            // [1] 2 3 4 5 6 7 8 9 10
            // 1 2 3 4 5 6 7 8 9 9 [10]

            MovimientoTemp movTemp = null;
            movTemp = db.MovimientosTemp.Where(a => a.Folio < movimientoTemp.Folio).OrderByDescending(a => a.Folio).FirstOrDefault();
            ViewBag.MovAnterior = movTemp == null ? Guid.Empty : movTemp.MovimientoTempID;

            movTemp = db.MovimientosTemp.Where(a => a.Folio > movimientoTemp.Folio).OrderBy(a => a.Folio).FirstOrDefault();
            ViewBag.MovSiguiente = movTemp == null ? Guid.Empty : movTemp.MovimientoTempID;

            #endregion

            #endregion

            return View(movimientoTemp);
        }
        public ActionResult Crear(MovimientoTemp movimientoTemp)
        {
            db = new RecordFCSContext();

            //Validacion
            if (movimientoTemp.FechaSalida == null)
                ModelState.AddModelError("FechaSalida", "Ingrese una fecha.");

            if (movimientoTemp.UbicacionOrigenID == null)
                ModelState.AddModelError("UbicacionOrigenID", "Seleccione la ubicación.");

            if (movimientoTemp.UbicacionDestinoID == null)
                ModelState.AddModelError("UbicacionDestinoID", "Seleccione la ubicación.");

            var fechaCreacion = DateTime.Now;

            movimientoTemp.FechaUltimaEjecucion = fechaCreacion;
            //Validar ultimo Folioº
            try
            {
                if (ModelState.IsValid)
                {
                    //Crear la entidad
                    movimientoTemp.Folio = db.MovimientosTemp.Select(a => a.Folio).OrderByDescending(a => a).FirstOrDefault() + 1;

                    movimientoTemp.EstadoMovimiento = EstadoMovimientoTemp.Procesando;
                    movimientoTemp.UsuarioID = User.UsuarioID;
                    movimientoTemp.MovimientoTempID = Guid.NewGuid();
                    db.MovimientosTemp.Add(movimientoTemp);

                    //------ Logica HISTORIAL

                    #region Generar el historial

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

                    #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

                    //------

                    //Logica para terminar la instruccion
                    AlertaSuccess("Se registro el movimiento: <b>" + movimientoTemp.Folio + "</b>", true);

                    return Json(new { success = true, url = Url.Action("Detalles", new { id = movimientoTemp.MovimientoTempID }) });
                }
            }
            catch (Exception)
            {
                ModelState.AddModelError("", "Error desconocido.");
            }

            //Regresar la vista
            var tipoMov = db.TipoMovimientos.Find(movimientoTemp.TipoMovimientoID);

            if (tipoMov == null) return HttpNotFound();

            movimientoTemp.TipoMovimiento = tipoMov;
            movimientoTemp.TipoMovimientoID = tipoMov.TipoMovimientoID;
            movimientoTemp.EsValido = false;
            movimientoTemp.EstadoMovimiento = EstadoMovimientoTemp.Procesando;

            movimientoTemp.Folio = db.MovimientosTemp.Select(a => a.Folio).OrderByDescending(a => a).FirstOrDefault() + 1;

            var listaUbicaciones = db.Ubicaciones.Where(a => a.Status).Select(a => new { a.Nombre, a.UbicacionID }).OrderBy(a => a.Nombre);

            ViewBag.UbicacionDestinoID = new SelectList(listaUbicaciones, "UbicacionID", "Nombre", movimientoTemp.UbicacionDestinoID);
            ViewBag.UbicacionOrigenID = new SelectList(listaUbicaciones, "UbicacionID", "Nombre", movimientoTemp.UbicacionOrigenID);

            return View(movimientoTemp);
        }
        private bool EjecutarMovimiento(MovimientoTemp mov, EstadoMovimientoTemp Estado, DateTime Fecha, string Motivo = null)
        {
            bool bandera = false;

            try
            {
                db = new RecordFCSContext();

                Motivo = Motivo ?? "Ejecución del movimiento.";
                //Revalidar las piezas del movimiento que fueron validas y que no se hayan movido y sean pendientes
                int contadorPMovidas = 0;

                foreach (var PiezaID in mov.MovimientoTempPiezas.Where(a => !a.EnError && !a.SeMovio && a.EsPendiente).Select(a => a.PiezaID).ToList())
                {

                    #region Buscar la pieza con su movimiento

                    //Buscar la pieza y la pieza en el movimiento
                    var pieza = db.Piezas.Find(PiezaID);
                    var piezaEnMovReal = pieza.MovimientoTempPiezas.FirstOrDefault(a => a.MovimientoTempID == mov.MovimientoTempID);

                    #endregion

                    #region Declaracion y asignaciones

                    piezaEnMovReal.EnError = false;
                    piezaEnMovReal.EsPendiente = true;
                    piezaEnMovReal.SeMovio = false;

                    string comentario = "";

                    #endregion

                    #region Validacion 1: Asignada en movimientos

                    #region Buscar donde sea Pendiente y sin errores

                    //lista de movimientos ID
                    //Buscar la pieza en todos los movimientos excepto este, donde sea pendiente y no tenga errrores.

                    List<int> listaMov_ID =
                        db.MovimientoTempPiezas
                        .Where(a =>
                            a.PiezaID == PiezaID &&
                            a.MovimientoTempID != mov.MovimientoTempID &&
                            a.EsPendiente && !a.EnError
                            )
                            .Select(a => a.MovimientoTemp.Folio).ToList();

                    #endregion

                    #region Buscar en Concluido sin validar

                    listaMov_ID.AddRange(
                        db.MovimientoTempPiezas.Where(a => a.PiezaID == PiezaID && a.MovimientoTempID != mov.MovimientoTempID &&
                        a.MovimientoTemp.EstadoMovimiento == EstadoMovimientoTemp.Concluido_SinValidar &&
                        a.SeMovio).Select(a => a.MovimientoTemp.Folio).ToList()
                        );

                    #endregion

                    #region Buscar en Cancelado

                    listaMov_ID.AddRange(
                        db.MovimientoTempPiezas.Where(a => a.PiezaID == PiezaID && a.MovimientoTempID != mov.MovimientoTempID &&
                        a.MovimientoTemp.EstadoMovimiento == EstadoMovimientoTemp.Cancelado &&
                        a.SeMovio).Select(a => a.MovimientoTemp.Folio).ToList()
                        );

                    #endregion

                    #region Buscar en Retornado

                    listaMov_ID.AddRange(
                        db.MovimientoTempPiezas.Where(a => a.PiezaID == PiezaID && a.MovimientoTempID != mov.MovimientoTempID &&
                        a.MovimientoTemp.EstadoMovimiento == EstadoMovimientoTemp.Retornado &&
                        a.SeMovio).Select(a => a.MovimientoTemp.Folio).ToList()
                        );

                    #endregion

                    //Si existe con estas condiciones entonces no es disponible
                    foreach (var Folio in listaMov_ID)
                        comentario += " [" + Folio + "]";

                    //Comprobar que no haya estado en algun movimiento
                    if (!string.IsNullOrWhiteSpace(comentario))
                    {
                        piezaEnMovReal.Comentario = "Asignada en:" + comentario + ". ";
                        piezaEnMovReal.EnError = true;
                    }

                    #endregion

                    #region Validacion 2: Ubicacion

                    //validar que la ubicacion de la pieza sea la misma que este movimiento

                    //puede haber piezas que UbicacionID sea null y en este caso se concidera valida.
                    if (pieza.UbicacionID != null)
                    {
                        //Validar que la ubicacion Origen sea igual a la de la pieza
                        if (mov.UbicacionOrigenID != pieza.UbicacionID)
                        {
                            piezaEnMovReal.Comentario += "No comparte la misma ubicación origen. ";
                            piezaEnMovReal.EnError = true;
                        }
                    }

                    #endregion

                    #region Validacion 3: En ultimo movimiento

                    if (pieza.MovimientoTempPiezas.Where(a => a.Orden > piezaEnMovReal.Orden && !a.EnError).Count() > 0)
                    {
                        piezaEnMovReal.Comentario += "No esta en su último movimiento. ";
                        piezaEnMovReal.EnError = true;
                    }

                    #endregion

                    //Sin errores entoces proceder a realizar el cambio de ubicacion

                    #region Cambio de Ubicacion

                    if (!piezaEnMovReal.EnError)
                    {
                        //Sin errores

                        #region Asignar un orden al movimiento de la pieza

                        if (piezaEnMovReal.Orden == 0)
                        {
                            var ordenActual = pieza.MovimientoTempPiezas.Count > 0 ? pieza.MovimientoTempPiezas.OrderByDescending(a => a.Orden).FirstOrDefault().Orden : 0;
                            piezaEnMovReal.Orden = piezaEnMovReal.EnError ? 0 : ordenActual + 1;
                        }

                        #endregion

                        //Ejecutar el cambio de ubicacion
                        pieza.UbicacionID = mov.UbicacionDestinoID;

                        //------ Logica HISTORIAL

                        #region Generar el historial

                        //objeto del formulario
                        var objeto = pieza;
                        //Objeto de la base de datos
                        var objetoDB = db.Piezas.Find(pieza.PiezaID);
                        //tabla o clase a la que pertenece
                        var tablaNombre = "Pieza";
                        //llave primaria del objeto
                        var llavePrimaria = objetoDB.PiezaID.ToString();

                        //generar el historial
                        var historialLog = HistorialLogica.EditarEntidad(
                            objeto,
                            objetoDB,
                            tablaNombre,
                            llavePrimaria,
                            User.UsuarioID,
                            db,
                            Motivo + "[Forzado]",
                            Fecha
                            );

                        #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();

                            contadorPMovidas++;

                            piezaEnMovReal.SeMovio = true;
                            piezaEnMovReal.EsPendiente = false;
                            piezaEnMovReal.EnError = false;
                            piezaEnMovReal.Comentario = "";
                        }
                        else
                        {
                            throw new Exception();
                        }
                        #endregion

                        //------

                    }
                    else
                    {
                        //Con errores
                        piezaEnMovReal.Orden = 0;
                    }

                    pieza = null;

                    #endregion

                    #region Asignacion de nuevos valores

                    //buscar el objeto
                    var itemTemp = db.MovimientoTempPiezas.Find(mov.MovimientoTempID, PiezaID);
                    itemTemp.Comentario = piezaEnMovReal.Comentario;
                    itemTemp.EnError = piezaEnMovReal.EnError;
                    itemTemp.EsPendiente = piezaEnMovReal.EsPendiente;
                    itemTemp.Orden = piezaEnMovReal.Orden;
                    itemTemp.SeMovio = piezaEnMovReal.SeMovio;

                    piezaEnMovReal = null;

                    #endregion

                    //------ Logica HISTORIAL

                    #region Generar el historial

                    //objeto del formulario
                    var objeto2 = itemTemp;
                    //Objeto de la base de datos
                    var objetoDB2 = db.MovimientoTempPiezas.Find(mov.MovimientoTempID, PiezaID);
                    //tabla o clase a la que pertenece
                    var tablaNombre2 = "MovimientoTempPieza";
                    //llave primaria del objeto
                    var llavePrimaria2 = objetoDB2.MovimientoTempID + "," + objetoDB2.PiezaID;

                    //generar el historial
                    var historialLog2 = HistorialLogica.EditarEntidad(
                        objeto2,
                        objetoDB2,
                        tablaNombre2,
                        llavePrimaria2,
                        User.UsuarioID,
                        db,
                        Motivo + "[Forzado]",
                        Fecha
                        );

                    #endregion

                    #region Guardar el historial

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

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

                    }
                    else
                    {
                        throw new Exception();
                    }
                    #endregion

                    //------

                }

                //Cambio del estatus
                //Solo si se actualizo la ubicacion de por lo menos 1 pieza

                if (contadorPMovidas > 0)
                {
                    //saber cual sera el estatus Concluido ó Concluido_SinValidar
                    if (mov.EsValido)
                        mov.EstadoMovimiento = EstadoMovimientoTemp.Concluido;
                    else
                        mov.EstadoMovimiento = EstadoMovimientoTemp.Concluido_SinValidar;
                }

                //------ Logica HISTORIAL

                #region Generar el historial

                //objeto del formulario
                var objeto3 = mov;
                //Objeto de la base de datos
                var objetoDB3 = db.MovimientosTemp.Find(mov.MovimientoTempID);
                //tabla o clase a la que pertenece
                var tablaNombre3 = "MovimientoTemp";
                //llave primaria del objeto
                var llavePrimaria3 = objetoDB3.MovimientoTempID.ToString();

                //generar el historial
                var historialLog3 = HistorialLogica.EditarEntidad(
                    objeto3,
                    objetoDB3,
                    tablaNombre3,
                    llavePrimaria3,
                    User.UsuarioID,
                    db,
                    Motivo + "[Forzado]",
                    Fecha
                    );

                #endregion

                #region Guardar el historial

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

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

                //------

            }
            catch (Exception)
            {
                bandera = false;
            }

            return bandera;
        }
        private bool Cancelar(MovimientoTemp mov, bool Executar)
        {
            db = new RecordFCSContext();

            bool bandera = false;

            DateTime Fecha = DateTime.Now;
            mov.FechaUltimaEjecucion = Fecha;

            string Motivo = "Cancelar movimiento.";

            try
            {
                bandera = true;

                //Validar que el movimiento se pueda cancelar, comprobando las piezas en estado SeMovio sean las ultimas en su mov
                #region Validacion 3: En ultimo movimiento

                int totalMovidas = mov.MovimientoTempPiezas.Where(a => a.SeMovio).Count();
                int totalMovidasSonUltimas = 0;

                foreach (var piezaEnMovReal in mov.MovimientoTempPiezas.Where(a => a.SeMovio && a.Pieza.UbicacionID == mov.UbicacionDestinoID).ToList())
                    if ((piezaEnMovReal.Pieza.MovimientoTempPiezas.Where(a => a.Orden > piezaEnMovReal.Orden && !a.EnError).Count() > 0))
                        totalMovidasSonUltimas = 0;
                    else
                        totalMovidasSonUltimas++;

                if (totalMovidas != totalMovidasSonUltimas)
                    throw new Exception("No se pueden cancelar las piezas");

                #endregion

                //Revertir todas las piezas
                foreach (var PiezaIDDel in mov.MovimientoTempPiezas.Select(a => a.PiezaID).ToList())
                {
                    bandera = false;
                    //la pieza en el movimiento
                    var item = db.MovimientoTempPiezas.FirstOrDefault(a => a.PiezaID == PiezaIDDel && a.MovimientoTempID == mov.MovimientoTempID);

                    bool RegresarHistorial = false;

                    //saber si es eliminable y si se puede regresar el estado
                    if (item != null)
                    {
                        if (item.SeMovio)
                        {
                            bool esUltimo = item.Pieza.MovimientoTempPiezas.Where(a => a.Orden > item.Orden && !a.EnError).Count() > 0 ? false : true;
                            bool conPendientes = item.Pieza.MovimientoTempPiezas.Where(a => a.EsPendiente && a.MovimientoTempID != mov.MovimientoTempID && !a.EnError).Count() > 0 ? true : false;

                            if (esUltimo)
                                RegresarHistorial = true;
                        }
                        else
                        {
                            RegresarHistorial = true;
                        }
                    }

                    if (RegresarHistorial)
                    {
                        //Regresar la ubicacion original
                        if (item.SeMovio)
                        {
                            var pieza = db.Piezas.Find(PiezaIDDel);

                            RegresarHistorial = false;

                            if (pieza != null)
                            {
                                if (pieza.UbicacionID == mov.UbicacionDestinoID)
                                {
                                    pieza.UbicacionID = mov.UbicacionOrigenID;

                                    //------ Logica HISTORIAL

                                    #region Generar el historial

                                    //objeto del formulario
                                    var objetoDelUbi = pieza;
                                    //Objeto de la base de datos
                                    var objetoDBDelUbi = db.Piezas.Find(pieza.PiezaID);
                                    //tabla o clase a la que pertenece
                                    var tablaNombreDelUbi = "Pieza";
                                    //llave primaria del objeto
                                    var llavePrimariaDelUbi = objetoDBDelUbi.PiezaID.ToString();

                                    //generar el historial
                                    var historialLogDelUbi = HistorialLogica.EditarEntidad(
                                        objetoDelUbi,
                                        objetoDBDelUbi,
                                        tablaNombreDelUbi,
                                        llavePrimariaDelUbi,
                                        User.UsuarioID,
                                        db,
                                        "Cancelar Movimiento: " + mov.Folio,
                                        mov.FechaUltimaEjecucion
                                        );

                                    #endregion

                                    #region Guardar el historial

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

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

                                        RegresarHistorial = true;
                                    }

                                    #endregion

                                    //------

                                }

                            }

                        }

                        if (RegresarHistorial)
                        {

                            item.SeMovio = false;
                            item.EsPendiente = true;
                            item.EnError = true;
                            item.Comentario = "Validar de nuevo [Movimiento Cancelado].";

                            //------ Logica HISTORIAL

                            #region Generar el historial

                            //objeto del formulario
                            var objetoEdit = item;
                            //Objeto de la base de datos
                            var objetoDBEdit = db.MovimientoTempPiezas.Find(item.MovimientoTempID, item.PiezaID);
                            //tabla o clase a la que pertenece
                            var tablaNombreEdit = "MovimientoTempPieza";
                            //llave primaria del objeto
                            var llavePrimariaEdit = objetoDBEdit.MovimientoTempID + "," + objetoDBEdit.PiezaID;

                            //generar el historial
                            var historialLogEdit = HistorialLogica.EditarEntidad(
                                objetoEdit,
                                objetoDBEdit,
                                tablaNombreEdit,
                                llavePrimariaEdit,
                                User.UsuarioID,
                                db,
                                Motivo,
                                Fecha
                                );

                            #endregion

                            #region Guardar el historial

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

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

                                bandera = true;
                            }
                            else
                            {
                                bandera = true;
                            }

                            #endregion

                            //------

                        }

                    }

                }

                if (bandera)
                {
                    //Como todas las piezas que tenia se revertieron
                    //Regresar el Estatus

                    mov.EstadoMovimiento = EstadoMovimientoTemp.Cancelado;

                    //------ Logica HISTORIAL

                    #region Generar el historial

                    //objeto del formulario
                    var objeto3 = mov;
                    //Objeto de la base de datos
                    var objetoDB3 = db.MovimientosTemp.Find(mov.MovimientoTempID);
                    //tabla o clase a la que pertenece
                    var tablaNombre3 = "MovimientoTemp";
                    //llave primaria del objeto
                    var llavePrimaria3 = objetoDB3.MovimientoTempID.ToString();

                    //generar el historial
                    var historialLog3 = HistorialLogica.EditarEntidad(
                        objeto3,
                        objetoDB3,
                        tablaNombre3,
                        llavePrimaria3,
                        User.UsuarioID,
                        db,
                        Motivo,
                        Fecha
                        );

                    #endregion

                    #region Guardar el historial

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

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

                    //------

                }
            }
            catch (Exception)
            {
                bandera = false;
            }

            if (bandera)
                AlertaDefault("Se Cancelo el moviento");
            else
                AlertaDefault("No se pudo cancelar el movimiento");

            return bandera;
        }
        public ActionResult RevertirMovimientoConfirmado(Guid MovimientoTempID, bool Executar)
        {
            db = new RecordFCSContext();

            bool bandera = false;

            if (Executar)
            {
                try
                {
                    //Buscar el movimiento

                    MovimientoTemp mov = db.MovimientosTemp.Find(MovimientoTempID);

                    if (mov != null && Executar)
                    {
                        var Fecha = DateTime.Now;
                        var Motivo = "Revertir movimiento.";
                        //Cambiar el estado del movimiento
                        mov.EstadoMovimiento = EstadoMovimientoTemp.Procesando;
                        mov.FechaUltimaEjecucion = Fecha;

                        //------ Logica HISTORIAL

                        #region Generar el historial

                        //objeto del formulario
                        var objeto3 = mov;
                        //Objeto de la base de datos
                        var objetoDB3 = db.MovimientosTemp.Find(mov.MovimientoTempID);
                        //tabla o clase a la que pertenece
                        var tablaNombre3 = "MovimientoTemp";
                        //llave primaria del objeto
                        var llavePrimaria3 = objetoDB3.MovimientoTempID.ToString();

                        //generar el historial
                        var historialLog3 = HistorialLogica.EditarEntidad(
                            objeto3,
                            objetoDB3,
                            tablaNombre3,
                            llavePrimaria3,
                            User.UsuarioID,
                            db,
                            Motivo,
                            Fecha
                            );

                        #endregion

                        #region Guardar el historial

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

                            //Guardar el historial
                            db.HistorialLogs.Add(historialLog3);
                            db.SaveChanges();
                            bandera = true;

                        }
                        else
                        {
                            throw new Exception();
                        }
                        #endregion

                        //------

                    }
                    else
                    {
                        bandera = false;
                    }
                }
                catch (Exception)
                {

                    bandera = false;
                }
            }

            if (bandera)
                AlertaDefault("Se Revertio el moviento a " + EstadoMovimientoTemp.Procesando);
            else
                AlertaDefault("No se pudo revertir el movimiento");

            var url = Url.Action("Detalles", "MovimientoTemp", new { id = MovimientoTempID });

            return Json(new { success = bandera, url = url });
        }
        public ActionResult IniciarMigracion()
        {
            int NumFol = 0; //ultima registrada

            RecordFCSContext dbx = new RecordFCSContext();

            int bloqueGuardar = 500;

            Guid TipoObraID = new Guid("375ead18-18db-4a8e-bfbf-7d55ee08ff80");
            TipoObra tipoObra = dbx.TipoObras.Find(TipoObraID);

            Guid TipoPiezaID = new Guid("c84ed502-20d8-4691-9a17-2d739c2bf4da");
            TipoPieza tipoPieza = tipoObra.TipoPiezas.FirstOrDefault(a => a.TipoPiezaID == TipoPiezaID);

            LetraFolio letra = dbx.LetraFolios.SingleOrDefault(a => a.Nombre == "A");

            if (tipoObra != null && tipoPieza != null && letra != null)
            {

                //Extraer los atributos requeridos.
                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();

                //extraer
                con1.Open();
                string textSql1 = string.Format("SELECT * FROM [{0}]", "ArchivoFondo");
                SqlCommand sql1 = new SqlCommand(textSql1, con1);
                SqlDataReader leer1 = sql1.ExecuteReader();

                List<RowArchivo> listaArchivoCEHM = new List<RowArchivo>();

                int i = NumFol;

                while (leer1.Read())
                {
                    i++;
                    var rowArchivo = new RowArchivo()
                    {
                        ArchivoID = Convert.ToInt32(i),
                        Asunto1 = Regex.Replace(leer1["Asunto1"].ToString().Trim(), @"\s+", " "),
                        Asunto2 = Regex.Replace(leer1["Asunto2"].ToString().Trim(), @"\s+", " "),
                        Caja = Regex.Replace(leer1["Caja"].ToString().Trim(), @"\s+", " "),
                        Carpeta = Regex.Replace(leer1["Carpeta"].ToString().Trim(), @"\s+", " "),
                        Clasificacion = Regex.Replace(leer1["Clasificacion"].ToString().Trim(), @"\s+", " "),
                        Documento = Regex.Replace(leer1["Documento"].ToString().Trim(), @"\s+", " "),
                        FICHA_NO = Convert.ToInt32(leer1["FICHA_NO"]),
                        Firmadopor = Regex.Replace(leer1["Firmadopor"].ToString().Trim(), @"\s+", " "),
                        Fojas = Regex.Replace(leer1["Fojas"].ToString().Trim(), @"\s+", " "),
                        Fondo = Regex.Replace(leer1["Fondo"].ToString().Trim(), @"\s+", " "),
                        Legajo = Regex.Replace(leer1["Legajo"].ToString().Trim(), @"\s+", " "),
                        LugaryFecha = Regex.Replace(leer1["LugaryFecha"].ToString().Trim(), @"\s+", " "),
                        NoImag = Convert.ToInt32(leer1["NoImag"].ToString() == "" ? 0 : leer1["NoImag"]),
                        Nombredelfondo = Regex.Replace(leer1["Nombredelfondo"].ToString().Trim(), @"\s+", " "),
                        Tipodedocumento = Regex.Replace(leer1["Tipodedocumento"].ToString().Trim(), @"\s+", " "),
                        URLFicha = Regex.Replace(leer1["URLFicha"].ToString().Trim(), @"\s+", " "),
                        URLImagen = Regex.Replace(leer1["URLImagen"].ToString().Trim(), @"\s+", " "),
                        Tema = Regex.Replace(leer1["Tema"].ToString().Trim(), @"\s+", " "),
                        Dirigidoa = Regex.Replace(leer1["Dirigidoa"].ToString().Trim(), @"\s+", " ")

                    };

                    if (rowArchivo.ArchivoID > 0)
                        listaArchivoCEHM.Add(rowArchivo);

                }
                con1.Close();
                leer1 = null;

                int numeroRow = 0;
                List<AtributoPieza> listaAdd_AttGen = new List<AtributoPieza>();
                List<AutorPieza> listaAdd_AttAutor = new List<AutorPieza>();

                foreach (var row in listaArchivoCEHM)
                {

                    if(numeroRow == bloqueGuardar)
                    {
                        //guardar los atributos
                        dbx.AtributoPiezas.AddRange(listaAdd_AttGen);
                        dbx.AutorPiezas.AddRange(listaAdd_AttAutor);
                        dbx.SaveChanges();

                        dbx.Dispose();
                        dbx = new RecordFCSContext();
                        dbx.Configuration.AutoDetectChangesEnabled = false;

                        numeroRow = 0;
                        listaAdd_AttAutor = new List<AutorPieza>();
                        listaAdd_AttGen = new List<AtributoPieza>();

                    }

                    //tratar los att de la pieza
                    var obra = new Obra()
                    {
                        ObraID = Guid.NewGuid(),
                        FechaRegistro = DateTime.Now,
                        TipoObraID = tipoObra.TipoObraID,
                        LetraFolioID = letra.LetraFolioID,
                        Status = false,
                        NumeroFolio = row.ArchivoID
                    };
                    dbx.Obras.Add(obra);

                    //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
                    };
                    dbx.Piezas.Add(pieza);

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

                        if (tipoAtt.EsGenerico)
                        {

                            if (tipoAtt.EsLista)
                            {
                                /*
                                 * GENERICO LISTA
                                 * Fondo - Fondo_CEHM - Fondo
                                 * Colección - Coleccion_Clave - Nombredelfondo
                                 * Legajo - Legajo_CEHM - Legajo
                                 * Fecha de ejecución - FechaEjecucion_Clave - Fecha de ejecucion
                                 */
                                var addOK = true;
                                string valorText = "";
                                switch (tipoAtt.Temp)
                                {
                                    case "Fondo_CEHM":
                                        addOK = row.Fondo == null || row.Fondo == "" ? false : true;
                                        valorText = addOK ? row.Fondo : "";
                                        break;
                                    case "Coleccion_Clave":
                                        addOK = row.Nombredelfondo == null || row.Nombredelfondo == "" ? false : true;
                                        valorText = addOK ? row.Nombredelfondo : "";
                                        break;
                                    case "Legajo_CEHM":
                                        addOK = row.Legajo == null || row.Legajo == "" ? false : true;
                                        valorText = addOK ? row.Legajo : "";
                                        break;
                                    case "FechaEjecucion_Clave":
                                        addOK = row.LugaryFecha == null || row.LugaryFecha == "" ? false : true;
                                        valorText = addOK ? row.LugaryFecha : "";
                                        break;
                                    default:
                                        addOK = false;
                                        break;
                                }

                                if (addOK)
                                {
                                    var listaValor = dbx.ListaValores.SingleOrDefault(a => a.TipoAtributoID == tipoAtt.TipoAtributoID && a.Valor == valorText);

                                    if (listaValor == null)
                                    {
                                        listaValor = new ListaValor()
                                        {
                                            ListaValorID = Guid.NewGuid(),
                                            Status = true,
                                            TipoAtributoID = tipoAtt.TipoAtributoID,
                                            Valor = valorText
                                        };
                                        dbx.ListaValores.Add(listaValor);
                                        dbx.SaveChanges();
                                    }

                                    listaAdd_AttGen.Add(new AtributoPieza()
                                    {
                                        AtributoPiezaID = Guid.NewGuid(),
                                        AtributoID = att.AtributoID,
                                        PiezaID = pieza.PiezaID,
                                        Status = true,
                                        ListaValorID = listaValor.ListaValorID
                                    });
                                }

                            }
                            else
                            {
                                if (tipoAtt.EsMultipleValor)
                                {
                                    /*
                                     * GENERICO TEXTO MULTIPLE
                                     * Descripción - descripcion
                                     *
                                     *
                                     * Se forma con : Asunto1, Asunto2, Tema

                                     */

                                    var addOK = true;
                                    string valorText = "";

                                    switch (tipoAtt.Temp)
                                    {
                                        case "descripcion":
                                            // Tema
                                            addOK = true;
                                            valorText = "";
                                            addOK = row.Tema == null || row.Tema == "" ? false : true;

                                            valorText = addOK ? row.Tema : "";

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

                                            // Asunto1
                                            addOK = true;
                                            valorText = "";
                                            addOK = row.Asunto1 == null || row.Asunto1 == "" ? false : true;

                                            valorText = addOK ? row.Asunto1 : "";
                                            if (addOK)
                                            {
                                                listaAdd_AttGen.Add(new AtributoPieza()
                                                {
                                                    AtributoPiezaID = Guid.NewGuid(),
                                                    AtributoID = att.AtributoID,
                                                    PiezaID = pieza.PiezaID,
                                                    Status = true,
                                                    Valor = valorText
                                                });
                                            }

                                            // Asunto2
                                            addOK = true;
                                            valorText = "";
                                            addOK = row.Asunto2 == null || row.Asunto2 == "" ? false : true;

                                            valorText = addOK ? row.Asunto2 : "";
                                            if (addOK)
                                            {
                                                listaAdd_AttGen.Add(new AtributoPieza()
                                                {
                                                    AtributoPiezaID = Guid.NewGuid(),
                                                    AtributoID = att.AtributoID,
                                                    PiezaID = pieza.PiezaID,
                                                    Status = true,
                                                    Valor = valorText
                                                });
                                            }

                                            break;
                                        default:
                                            addOK = false;
                                            break;
                                    }

                                }
                                else
                                {
                                    /*
                                     * GENERICOS TEXTO
                                     * No ficha CEHM            - NoFicha_CEHM
                                     * Clasificacion CEHM       - Clasificacion_CEHM
                                     * No de caja o carpeta     - NoCajaOCarpeta_Cehm
                                     * No de documento o fojas  - NoDocFojas_CEHM
                                     * Título descriptivo       - titulo
                                     * Enlace ficha             - UrlFicha_CEHM
                                     * No de imagenes           - NoImagen_CEHM
                                     * Enlace Imagenes          - URLImagen_CEHM
                                     */

                                    var addOK = true;
                                    string valorText = "";

                                    switch (tipoAtt.Temp)
                                    {
                                        case "NoFicha_CEHM":
                                            addOK = row.FICHA_NO == 0 ? false : true;
                                            valorText = addOK ? row.FICHA_NO.ToString() : "0";
                                            break;

                                        case "Clasificacion_CEHM":
                                            addOK = row.Clasificacion == null || row.Clasificacion == "" ? false : true;
                                            valorText = addOK ? row.Clasificacion : "";
                                            break;

                                        case "NoCajaOCarpeta_Cehm":
                                            // se forma con:  caja y carpeta
                                            // queda: Caja: 1 / Carpeta: 1
                                            // queda: Caja: 1
                                            // queda: Carpeta : 1
                                            var cajaOk = false;
                                            addOK = row.Caja == null || row.Caja == "" ? false : true;
                                            valorText += addOK? "" + row.Caja : "";
                                            cajaOk = addOK;
                                            addOK = row.Carpeta == null || row.Carpeta == "" ? false : true;
                                            valorText += cajaOk && addOK? " / " : "";
                                            valorText += addOK ? "" + row.Carpeta : "";
                                            addOK = addOK || cajaOk ? true : false;
                                            break;

                                        case "NoDocFojas_CEHM":
                                            // se forma con Fojas, Documento
                                            var fojaOk = false;
                                            addOK = row.Fojas == null || row.Fojas == "" ? false : true;
                                            valorText += addOK? "" + row.Fojas : "";
                                            fojaOk = addOK;
                                            addOK = row.Documento == null || row.Documento == "" ? false : true;
                                            valorText += fojaOk && addOK? " / " : "";
                                            valorText += addOK ? "" + row.Documento : "";
                                            addOK = addOK || fojaOk ? true : false;
                                            break;

                                        case "titulo":
                                            // Tipodedocumento, Dirigidoa

                                            var tipoDocOk = false;
                                            addOK = row.Tipodedocumento == null || row.Tipodedocumento == "" ? false : true;
                                            valorText += addOK? row.Tipodedocumento : "";
                                            tipoDocOk = addOK;
                                            addOK = row.Dirigidoa == null || row.Dirigidoa == "" ? false : true;
                                            valorText += tipoDocOk && addOK ? " / " : "";
                                            valorText += addOK ? row.Dirigidoa : "";
                                            addOK = addOK || tipoDocOk ? true : false;
                                            break;
                                        case "UrlFicha_CEHM":
                                            addOK = row.URLFicha == null || row.URLFicha == "" ? false : true;
                                            valorText = addOK ? row.URLFicha : "";
                                            break;
                                        case "NoImagen_CEHM":
                                            addOK = row.NoImag == 0 ? false : true;
                                            valorText = addOK ? row.NoImag.ToString() : "0";
                                            addOK = true;
                                            break;
                                        case "URLImagen_CEHM":
                                            addOK = row.URLImagen == null || row.URLImagen == "" ? false : true;
                                            valorText = addOK ? row.URLImagen : "";
                                            break;

                                        default:
                                            addOK = false;
                                            break;
                                    }

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

                                    }

                                }
                            }

                        }
                        else
                        {
                            /*
                             * AUTOR LISTA MULTIPLE
                             * Firmado por
                             */

                            var addOK = true;
                            string valorText = "";

                            addOK = row.Firmadopor == null || row.Firmadopor == "" ? false : true;
                            valorText = addOK ? row.Firmadopor : "";

                            if (addOK)
                            {
                                var autor = dbx.Autores.SingleOrDefault(a => a.Nombre == valorText);

                                if (autor == null)
                                {
                                    autor = new Autor()
                                    {
                                        AutorID = Guid.NewGuid(),
                                        Status = true,
                                        Nombre = valorText
                                    };
                                    dbx.Autores.Add(autor);
                                    dbx.SaveChanges();
                                }

                                listaAdd_AttAutor.Add(new AutorPieza()
                                    {
                                        AutorID = autor.AutorID,
                                        esPrincipal = true,
                                        PiezaID = pieza.PiezaID,
                                        Status = true,
                                        Prefijo = "Principal"
                                    });

                            }

                        }

                    }

                    numeroRow++;
                }

                    //guardar los atributos
                    dbx.AtributoPiezas.AddRange(listaAdd_AttGen);
                    dbx.AutorPiezas.AddRange(listaAdd_AttAutor);
                    dbx.SaveChanges();

                    dbx.Dispose();
                    dbx = new RecordFCSContext();
                    dbx.Configuration.AutoDetectChangesEnabled = false;

            }

            return View();
        }