public string GuardarCambioDePersonal(List <CAMBIO_PERSONAL> pListCambioPersonal /*,List<BITACORA_CAMBIO_PERSONAL> Bitacora*/, string tipo)
        {
            List <String>           listCedulas          = new List <String>();
            string                  psLinea              = pListCambioPersonal.FirstOrDefault().CodLinea;
            string                  psCentroCosto        = pListCambioPersonal.FirstOrDefault().CentroCosto;
            string                  psRecurso            = pListCambioPersonal.FirstOrDefault().Recurso;
            string                  psCargo              = pListCambioPersonal.FirstOrDefault().CodCargo;
            DateTime?               psfecha              = pListCambioPersonal.FirstOrDefault().Fecha;
            TimeSpan?               psHora               = pListCambioPersonal.FirstOrDefault().HoraInicio;
            string                  psusuario            = pListCambioPersonal.FirstOrDefault().UsuarioIngresoLog;
            string                  psterminal           = pListCambioPersonal.FirstOrDefault().TerminalIngresoLog;
            List <RespuestaGeneral> RespuestaGeneral     = new List <RespuestaGeneral>();
            DateTime                FechaActual          = DateTime.Now;
            List <string>           NoSePudieornMover    = new List <string>();
            List <string>           NoSePudieornRegresar = new List <string>();
            string                  psTurno              = string.Empty;
            EMPLEADO_TURNO          poTurnoEmpleado      = null;
            spConsutaEmpleados      Empleado             = null;

            using (ASIS_PRODEntities db = new ASIS_PRODEntities())
            {
                using (var transaction = db.Database.BeginTransaction())
                {
                    if (tipo == "prestar")
                    {
                        //**Buscar En Asistencia EstadoFalta para no permitir mover
                        ASISTENCIA BuscarEnAsistencia = null;
                        foreach (var item in pListCambioPersonal.ToArray())
                        {
                            BuscarEnAsistencia = db.ASISTENCIA.Where(x => x.Cedula == item.Cedula && x.Fecha == item.Fecha && x.EstadoAsistencia == clsAtributos.EstadoFalta && x.EstadoRegistro == clsAtributos.EstadoRegistroActivo).FirstOrDefault();
                            if (BuscarEnAsistencia != null)
                            {
                                pListCambioPersonal.Remove(item);
                                Empleado = db.spConsutaEmpleados(item.Cedula).FirstOrDefault();
                                NoSePudieornMover.Add(Empleado.NOMBRES + " con cédula N°:  " + item.Cedula + ": No se puede mover, por que su asistencia ya fue generada en la fecha indicada y tiene estado falta.");
                            }
                        }
                        //**
                        if (pListCambioPersonal.Count > 0)//si es un CAMBIO_PERSONAL(nuevo) que no está en la tabla CAMBIO_PERSONAL, hay que crearlo
                        {
                            //**verificar si esta en movimiento_personal_diario

                            MOVIMIENTO_PERSONAL_DIARIO BuscarMovimientoPersonalDiario;
                            CAMBIO_PERSONAL            BuscarPerCambioPersonal;
                            CAMBIO_PERSONAL            BuscarCPFalse;
                            DateTime?FechaIngresada;
                            DateTime?ptFechaInicioCP = null;
                            foreach (var item in pListCambioPersonal.ToArray())
                            {
                                Empleado       = db.spConsutaEmpleados(item.Cedula).FirstOrDefault();
                                FechaIngresada = item.HoraInicio == null ? item.Fecha : item.Fecha.Value.Add(item.HoraInicio.Value);
                                //busco si la persona esta en CAMBIO_PERSONAL con Vigente false(osea que ya ha sido regresado)
                                BuscarCPFalse = db.CAMBIO_PERSONAL.Where(z => z.Cedula == item.Cedula && z.EstadoRegistro == clsAtributos.EstadoRegistroActivo).OrderByDescending(x => x.IdCambioPersonal).FirstOrDefault();

                                BuscarPerCambioPersonal = db.CAMBIO_PERSONAL.Where(x => x.Cedula == item.Cedula && !x.Vigente.Value && x.EstadoRegistro == clsAtributos.EstadoRegistroActivo).OrderByDescending(z => z.IdCambioPersonal).FirstOrDefault();

                                if (BuscarPerCambioPersonal != null && !BuscarCPFalse.Vigente.Value && (FechaIngresada <= BuscarPerCambioPersonal.FechaFin.Value.Add(BuscarPerCambioPersonal.Horafin.Value)))
                                {
                                    pListCambioPersonal.Remove(item);
                                    NoSePudieornMover.Add(Empleado.NOMBRES + " con cédula N°:  " + item.Cedula + ": No se puede mover, por que ya habia sido movido en una fecha menor a la indicada.");
                                }
                                //**agregado 04-06-2020 requerimiento de prestar personal sin necesidad de regresar

                                BuscarPerCambioPersonal = db.CAMBIO_PERSONAL.Where(x => x.Cedula == item.Cedula && x.Vigente.Value && x.EstadoRegistro == clsAtributos.EstadoRegistroActivo).OrderByDescending(x => x.IdCambioPersonal).FirstOrDefault();
                                if (BuscarPerCambioPersonal != null)
                                {
                                    ptFechaInicioCP = BuscarPerCambioPersonal.HoraInicio != null?BuscarPerCambioPersonal.Fecha.Value.Add(BuscarPerCambioPersonal.HoraInicio.Value) : BuscarPerCambioPersonal.Fecha.Value;
                                }
                                if (BuscarPerCambioPersonal != null && (FechaIngresada <= ptFechaInicioCP))
                                {
                                    pListCambioPersonal.Remove(item);
                                    NoSePudieornMover.Add(Empleado.NOMBRES + " con cédula N°:  " + item.Cedula + ": No se puede mover, por que ya habia sido movido en una fecha menor a la indicada.");
                                }
                                if (BuscarPerCambioPersonal != null && (BuscarPerCambioPersonal.RecursoOrigen == psRecurso && BuscarPerCambioPersonal.CodLineaOrigen == psLinea && BuscarPerCambioPersonal.CentroCostoOrigen == psCentroCosto && BuscarPerCambioPersonal.CodCargo == psCargo))
                                {
                                    pListCambioPersonal.Remove(item);
                                    NoSePudieornMover.Add(Empleado.NOMBRES + " con cédula N°:  " + item.Cedula + ": No puede ser prestado al mismo centro de costo, recurso, línea y cargo al que pertenece, debe ir a la opción regresar empleados.");
                                }
                                else if (BuscarPerCambioPersonal != null && (FechaIngresada > ptFechaInicioCP))
                                {
                                    BuscarPerCambioPersonal.Vigente  = false;
                                    BuscarPerCambioPersonal.FechaFin = FechaIngresada;
                                    BuscarPerCambioPersonal.Horafin  = psHora == null?TimeSpan.Parse("00:00") : psHora;

                                    BuscarPerCambioPersonal.FechaModificacionLog    = DateTime.Now;
                                    BuscarPerCambioPersonal.UsuarioModificacionLog  = psusuario;
                                    BuscarPerCambioPersonal.TerminalModificacionLog = psterminal;
                                    db.SaveChanges();
                                }
                                //**
                                if (item.HoraInicio == null)                                                                                                                                                                                                                                                       //si la hora ingresada es "Inicio Jornada(null)", entonces busco si esa persona no tiene estado presente de asistencia
                                {
                                    BuscarMovimientoPersonalDiario = db.MOVIMIENTO_PERSONAL_DIARIO.Where(x => x.Cedula == item.Cedula && x.FechaInicio == psfecha && x.EstadoRegistro == clsAtributos.EstadoRegistroActivo /*&& x.Asistencia.Value*/).OrderByDescending(x => x.IdCambioPersonal).FirstOrDefault(); //busco el registro en movimiento_personal_diario
                                    if (BuscarMovimientoPersonalDiario != null)
                                    {
                                        pListCambioPersonal.Remove(item);
                                        NoSePudieornMover.Add(Empleado.NOMBRES + " con cédula N°:  " + item.Cedula + ": No se pudo mover a Inicio de Jornada por que la asistencia ya fue marcada en la Línea donde pertenece.");
                                    }
                                    //validar que no haya sido generada la asistencia en la linea a la que pertenece el empleado en el dia que se lo piensa mover(por que es a inicio de jornada
                                    var buscarasistencia = db.ASISTENCIA.Where(x => x.Cedula == item.Cedula && x.Fecha == item.Fecha && x.EstadoRegistro == clsAtributos.EstadoRegistroActivo).ToList();
                                    if (buscarasistencia.Count > 0)
                                    {
                                        pListCambioPersonal.Remove(item);
                                        NoSePudieornMover.Add(Empleado.NOMBRES + " con cédula N°:  " + item.Cedula + ": No se pudo mover a inicio de jornada por que la asistencia ya habia sido generada en su linea. ");
                                    }
                                }
                                else//significa que el usuario si ingreso una hora para mover al empleado
                                {
                                    //BuscarMovimientoPersonalDiario = db.MOVIMIENTO_PERSONAL_DIARIO.Where(x => x.Cedula == item.Cedula && x.FechaInicio == psfecha
                                    //                                                                     && x.Asistencia.Value).FirstOrDefault();
                                    BuscarMovimientoPersonalDiario = db.MOVIMIENTO_PERSONAL_DIARIO.Where(x => x.Cedula == item.Cedula && x.FechaInicio == psfecha &&
                                                                                                         x.EstadoRegistro == clsAtributos.EstadoRegistroActivo).OrderByDescending(x => x.IdCambioPersonal).FirstOrDefault();
                                    //Si la hora ingresada es menor a la hora de la asistencia(presente) de ese empleado entonces no se lo puede mover a otra línea
                                    if (BuscarMovimientoPersonalDiario != null)
                                    {
                                        //si la hora de Cambio de Personal es Mejor a la HoraInicio de Movimiento_Personal entonces no se puede mover al empleado
                                        if (BuscarMovimientoPersonalDiario.HoraFin != null)//valido si se finalizo asistencia, que no lo pueda mover en una hora menor a la que se finalizo(siempre deberá ser mayor a la hora de finalización de la asistencia)
                                        {
                                            if (psHora <= BuscarMovimientoPersonalDiario.HoraFin)
                                            {
                                                pListCambioPersonal.Remove(item);
                                                NoSePudieornMover.Add(Empleado.NOMBRES + " con cédula N°:  " + item.Cedula + ": No se pudo mover por que la hora ingresada es menor a la hora en que ya marco asistencia en la Línea a la que pertenece.");
                                            }
                                        }
                                        else if (psHora < BuscarMovimientoPersonalDiario.HoraInicio) // && psHora>x.HoraInicio
                                        {
                                            pListCambioPersonal.Remove(item);
                                            NoSePudieornMover.Add(Empleado.NOMBRES + " con cédula N°:  " + item.Cedula + ": No se pudo mover por que la hora ingresada es menor a la hora en que ya marco asistencia en la Línea a la que pertenece.");
                                        }
                                        else
                                        {
                                            BuscarMovimientoPersonalDiario.HoraFin  = psHora;
                                            BuscarMovimientoPersonalDiario.FechaFin = psfecha;
                                            BuscarMovimientoPersonalDiario.TerminalModificacionLog = psterminal;
                                            BuscarMovimientoPersonalDiario.FechaModificacionLog    = DateTime.Now;
                                            BuscarMovimientoPersonalDiario.UsuarioModificacionLog  = psusuario;

                                            poTurnoEmpleado = db.EMPLEADO_TURNO.Where(x => x.Cedula == item.Cedula).FirstOrDefault();
                                            psTurno         = poTurnoEmpleado == null ? clsAtributos.TurnoUno : poTurnoEmpleado.Turno;//consulto el turno al que pertenece el empleado

                                            db.MOVIMIENTO_PERSONAL_DIARIO.Add(new MOVIMIENTO_PERSONAL_DIARIO {
                                                Cedula          = item.Cedula, CodLinea = psLinea, CentroCosto = psCentroCosto,
                                                CodCargo        = psCargo, Recurso = psRecurso, FechaInicio = psfecha, HoraInicio = psHora, EstadoRegistro = clsAtributos.EstadoRegistroActivo,
                                                FechaIngresoLog = DateTime.Now, UsuarioIngresoLog = psusuario, TerminalIngresoLog = psterminal, Asistencia = false, Turno = psTurno
                                            });
                                            db.SaveChanges();
                                        }
                                    }
                                }
                            }
                            //**
                            db.CAMBIO_PERSONAL.AddRange(pListCambioPersonal);
                        }
                        db.SaveChanges();
                        transaction.Commit();
                        if (NoSePudieornMover.Count > 0)
                        {
                            string Mensaje = string.Empty;
                            foreach (var item in NoSePudieornMover)
                            {
                                Mensaje += item + "<br>";
                            }
                            //return "Los empleados: " + Mensaje + " No se pudieron mover a la fecha indicada por que la asistencia fue generada";

                            return(Mensaje);
                        }
                        if (NoSePudieornMover.Count == 0)
                        {
                            return("1000"); //Empleados movidos con éxito
                        }
                    }
                    else if (tipo == "regresar")
                    {
                        CAMBIO_PERSONAL BuscarEnCambioPersonal = null;
                        string          LineaDesc = string.Empty;
                        DateTime        ValidaFecha;

                        //**CONSULTO LA ASISTENCIA, si tiene asistencia falta, no le permito regresarlo(tiene que ir a marcarle presente y de ahi le permitira regresarlo) agregado 2020-01-15
                        ASISTENCIA buscaEnAsistencia = null;
                        foreach (var item in pListCambioPersonal.ToArray())
                        {
                            buscaEnAsistencia = db.ASISTENCIA.Where(x => x.Cedula == item.Cedula && x.Fecha == item.Fecha && x.EstadoRegistro == clsAtributos.EstadoRegistroActivo && x.EstadoAsistencia == clsAtributos.EstadoFalta).FirstOrDefault();
                            if (buscaEnAsistencia != null)
                            {
                                pListCambioPersonal.Remove(item);
                                Empleado  = db.spConsutaEmpleados(item.Cedula).FirstOrDefault();
                                LineaDesc = db.spConsultaLinea(buscaEnAsistencia.Linea).FirstOrDefault().Descripcion;
                                NoSePudieornRegresar.Add(Empleado.NOMBRES + " con cédula N°: " + item.Cedula + ", No se pudo regresar por que tiene asistencia con estado de falta en la fecha indicada en la línea: " + LineaDesc + ". <br>");
                            }
                        }
                        //*
                        foreach (var item in pListCambioPersonal.ToArray())
                        {
                            BuscarEnCambioPersonal = db.CAMBIO_PERSONAL.Where(x => x.Cedula == item.Cedula && x.EstadoRegistro == clsAtributos.EstadoRegistroActivo && x.Vigente.Value).FirstOrDefault();//correcion 2020-02-20 traer solo Vigente=1
                            //Para validar que la fechafin y hora fin de regreso no pueda ser menor o igual a la fecha y hora inicio
                            ValidaFecha = BuscarEnCambioPersonal.HoraInicio == null ? BuscarEnCambioPersonal.Fecha.Value : BuscarEnCambioPersonal.Fecha.Value.Add(BuscarEnCambioPersonal.HoraInicio.Value);
                            if (ValidaFecha < (psfecha.Value.Add(psHora.Value)))
                            {
                                listCedulas.Add(item.Cedula);
                            }
                            else
                            {
                                Empleado = db.spConsutaEmpleados(item.Cedula).FirstOrDefault();
                                NoSePudieornRegresar.Add(Empleado.NOMBRES + " con cédula N°: " + item.Cedula + ":  No se pudo regresar por que la fecha de Fin debe ser mayor a la Fecha de inicio. <br>");
                            }
                        }
                        //**
                        foreach (var item in listCedulas.ToArray())
                        {
                            buscaEnAsistencia = db.ASISTENCIA.Where(x => x.Cedula == item && x.Fecha == psfecha && x.FechaFin != null).FirstOrDefault();
                            if (buscaEnAsistencia != null)
                            {
                                if (buscaEnAsistencia.FechaFin.Value.Add(buscaEnAsistencia.HoraSalida.Value) >= psfecha.Value.Add(psHora.Value))
                                {
                                    listCedulas.Remove(item);
                                    Empleado = db.spConsutaEmpleados(item).FirstOrDefault();
                                    NoSePudieornRegresar.Add(Empleado.NOMBRES + " con cédula N°: " + item + ": No se pudo regresar por que la hora de finalización de asistencia es mayor o igual a la fecha en la que se lo va a regresar. <br>");
                                }
                            }
                        }
                        //**
                        //verifica si esta en movimiento: personal: diario
                        MOVIMIENTO_PERSONAL_DIARIO BuscarMovimientoPersonalDiario;
                        clsDEmpleado ClsdEmpleado = new clsDEmpleado();
                        spConsultaEspecificaEmpleadosxCedula BuscarEmpleadoDataL;

                        //List<MOVIMIENTO_PERSONAL_DIARIO> ListMovimientopersonalDiario = new List<MOVIMIENTO_PERSONAL_DIARIO>();

                        foreach (var item in listCedulas.ToArray())
                        {
                            BuscarMovimientoPersonalDiario = db.MOVIMIENTO_PERSONAL_DIARIO.Where(x => x.Cedula == item && x.FechaInicio == psfecha && x.EstadoRegistro == clsAtributos.EstadoRegistroActivo /*&& !x.Asistencia.Value*/).OrderByDescending(x => x.IdCambioPersonal).FirstOrDefault();
                            BuscarEmpleadoDataL            = ClsdEmpleado.ConsultarEmpleadoxCedula(item);

                            if (BuscarMovimientoPersonalDiario != null)
                            {
                                if (BuscarMovimientoPersonalDiario.FinalizaAsistencia == null)
                                {
                                    //modifico el registro de asistencia, lo actualizo con fecha y hora fin
                                    BuscarMovimientoPersonalDiario.HoraFin  = psHora;
                                    BuscarMovimientoPersonalDiario.FechaFin = psfecha;
                                    BuscarMovimientoPersonalDiario.UsuarioModificacionLog  = psusuario;
                                    BuscarMovimientoPersonalDiario.FechaModificacionLog    = DateTime.Now;
                                    BuscarMovimientoPersonalDiario.TerminalModificacionLog = psterminal;
                                    //Creo un nuevo registro en movimiento_personal para poder generar la finalizacion de la asistencia de la linea a la que retorno el empleado
                                    poTurnoEmpleado = db.EMPLEADO_TURNO.Where(x => x.Cedula == item).FirstOrDefault();
                                    psTurno         = poTurnoEmpleado == null ? clsAtributos.TurnoUno : poTurnoEmpleado.Turno;//consulto el turno al que pertenece el empleado
                                    db.MOVIMIENTO_PERSONAL_DIARIO.Add(new MOVIMIENTO_PERSONAL_DIARIO
                                    {
                                        Cedula             = item,
                                        CodLinea           = BuscarEmpleadoDataL.LINEA,//le pongo la linea, recurso, cargo y centro de costo del registro que encontro en Movimiento personal por que esta regresando a donde pertenecia
                                        CentroCosto        = BuscarEmpleadoDataL.CENTRO_COSTOS,
                                        CodCargo           = BuscarEmpleadoDataL.CARGO,
                                        Recurso            = BuscarEmpleadoDataL.RECURSO,
                                        FechaInicio        = psfecha,
                                        HoraInicio         = psHora,
                                        EstadoRegistro     = clsAtributos.EstadoRegistroActivo,
                                        FechaIngresoLog    = DateTime.Now,
                                        UsuarioIngresoLog  = psusuario,
                                        TerminalIngresoLog = psterminal,
                                        Asistencia         = false,
                                        Turno = psTurno
                                    });

                                    //, Recurso=psRecurso});
                                    //ListMovimientopersonalDiario.Add(new MOVIMIENTO_PERSONAL_DIARIO {Cedula=item,CodLinea=psLinea, CentroCosto=psCentroCosto, CodCargo=psCargo
                                    //, Recurso=psRecurso});
                                }
                            }
                            db.SaveChanges();
                        }

                        //**
                        string[] CedulasArray = listCedulas.ToArray();
                        //Traigo la lista de Cambio_personal que hay que actualizar para regresar
                        var ActualizarCambioPersonal = db.CAMBIO_PERSONAL.Where(p => CedulasArray.Contains(p.Cedula) && p.Vigente.Value && p.EstadoRegistro == clsAtributos.EstadoRegistroActivo).ToList();
                        foreach (var item in ActualizarCambioPersonal)
                        {
                            //if (psfecha.Value.Add(psHora.Value) > item.Fecha.Value.Add(item.HoraInicio.Value))
                            //{
                            //item.Fecha = psfecha;
                            //item.HoraInicio = psHora;
                            item.Vigente                 = false;
                            item.FechaFin                = psfecha;
                            item.Horafin                 = psHora;
                            item.FechaModificacionLog    = DateTime.Now;
                            item.UsuarioModificacionLog  = psusuario;
                            item.TerminalModificacionLog = psterminal;
                            //}
                            //else
                            //{
                            //    item.Fecha = item.Fecha;
                            //    item.Vigente = false;
                            //    item.UsuarioModificacionLog = psusuario;
                            //    item.TerminalModificacionLog = psterminal;
                            //}
                        }
                        db.SaveChanges();
                        transaction.Commit();
                        if (NoSePudieornRegresar.Count == 0)
                        {
                            return("Empleado(s) regresado(s) con éxito");
                        }
                        else
                        {
                            string mensaje = string.Empty;
                            foreach (var item in NoSePudieornRegresar)
                            {
                                //mensaje += item + " No se pudo regresar por que la fecha de Fin debe ser mayor a la Fecha de inicio \n";
                                mensaje += item;
                            }
                            return(mensaje);
                        }
                    }
                    return("Debe seleccionar, prestar o regresar");
                }
            }
        }