public ActionResult Edit(Finiquito model, HttpPostedFileBase[] files, string[] documento)
        {
            try
            {
                var id_reg = model.id_baja;
                var id_nov = _db.Finiquito.FirstOrDefault(x => x.id_baja == id_reg).id_novedad;

                var novedad = _db.Novedad.FirstOrDefault(x => x.id_novedad == id_nov);
                novedad.fecha_mod   = DateTime.Now;
                novedad.estado      = "P";
                novedad.usuario_mod = SesionLogin().id;
                var    usu   = _db.Usuario.FirstOrDefault(x => x.id == model.id_usu);
                Avisos aviso = _db.Avisos.FirstOrDefault(x => x.id_novedad == novedad.id_novedad);
                aviso.titulo_aviso = "Baja";
                aviso.desc_aviso   = usu.Nom_usu;
                aviso.fecha_aviso  = model.fecha_fin;
                _db.Avisos.Attach(aviso);
                _db.Entry(aviso).State = System.Data.Entity.EntityState.Modified;
                _db.Set <Finiquito>().AddOrUpdate(model);
                //_db.Finiquito.Attach(model);
                //_db.Entry(model).State = System.Data.Entity.EntityState.Modified;
                _db.SaveChanges();
                if (files[0] == null)
                {
                    return(JsonExito());
                }
                else
                {
                    int i = 0;
                    foreach (var item in files)// TODO
                    {
                        Documento documento_ = new Documento();
                        documento_.Novedad              = novedad;
                        documento_.Cliente              = _db.Cliente.FirstOrDefault(x => x.id_cliente == novedad.id_cliente);
                        documento_.id_novedad           = model.id_novedad;
                        documento_.categoria            = documento[i];
                        documento_.id_usu               = SesionLogin().id;
                        documento_.Novedad.Tipo_novedad = _db.Tipo_novedad.FirstOrDefault(x => x.id_tipo == novedad.tipo_nov);
                        try { helper.createFile(item, documento_); } catch (Exception e) { App_Start.ErrorService.LogError(e); }
                        i++;
                    }
                    return(JsonExito());
                }
            }
            catch (Exception e)
            {
                return(JsonError(e.Message, e));
            }
        }
        public async System.Threading.Tasks.Task <ActionResult> ProcesaDocumentoPendiente(Finiquito model, HttpPostedFileBase[] files, int id_novedad)
        {
            try
            {
                var novedad   = _db.Novedad.FirstOrDefault(x => x.id_novedad == id_novedad);
                var finiquito = _db.Finiquito.Where(x => x.id_novedad == id_novedad);
                novedad.estado           = "P";
                novedad.fecha_mod        = DateTime.Now;
                novedad.usuario_mod      = SesionLogin().id;
                _db.Entry(novedad).State = System.Data.Entity.EntityState.Modified;
                _db.SaveChanges();
                var clien = _db.Cliente.FirstOrDefault(x => x.id_cliente == novedad.id_cliente);
                if (files[0] == null)
                {
                    throw new Exception("Debe Ingresar un documento");
                }
                else
                {
                    int i = 0;
                    foreach (var item in files)// TODO
                    {
                        Documento documento_ = new Documento();
                        documento_.Novedad              = novedad;
                        documento_.Cliente              = _db.Cliente.FirstOrDefault(x => x.id_cliente == novedad.id_cliente);
                        documento_.id_novedad           = id_novedad;
                        documento_.categoria            = finiquito.First().causal;
                        documento_.id_usu               = SesionLogin().id;
                        documento_.Novedad.Tipo_novedad = _db.Tipo_novedad.FirstOrDefault(x => x.id_tipo == novedad.tipo_nov);
                        try { helper.createFile(item, documento_); } catch (Exception e) { App_Start.ErrorService.LogError(e); }
                        i++;
                    }
                    //return JsonExito();
                }

                var usuarios_payroll = (from u in _db.Usuario
                                        join uc in _db.Usuario_Cliente on u.id equals uc.id_usu
                                        where uc.id_cliente == novedad.id_cliente && u.id_tipo_usu == 2 && u.estado == 1
                                        select u).ToList();
                if (!usuarios_payroll.Any())
                {
                    throw new Exception(App_GlobalResources.Pay_Lenguaje.no_hay_contraparte);
                }

                var list_usu = (from f in _db.Finiquito
                                join u in _db.Usuario on f.id_usu equals u.id
                                where f.id_novedad == novedad.id_novedad
                                select u).ToList();

                List <Task> sendTask = new List <Task>();
                foreach (var item in usuarios_payroll)
                {
                    var mensaje_esp = "";
                    //var mensaje_ing = "";
                    foreach (var f in list_usu)//Recorre todos lo finiquitos asociados a una novedad.
                    {
                        mensaje_esp = mensaje_esp + "</br></br>Nombre completo: " + f.Nom_usu + " " + " .</br> Rut: " + f.rut + ".";
                        //mensaje_ing = mensaje_ing + "</br></br>Full Name: " + f.Nom_usu + " " + " .</br> ID Card: " + f.rut + " .</br>";
                    }
                    //string detalle = "Dear" + item.Nom_usu + ",</br></br>Please be informed that " + SesionLogin().Nom_usu + "received information from " + clien.nom_emp + " regarding the following employment termination(s): " + mensaje_ing + "</br></br>Kind regards and thanks, </br></br>*Please note that this email is an automated notification, which is unable to receive replies. If you have any questions please contact your Payroll team.</br></br>-----------------------</br>";
                    string detalle = "";
                    string mensaje = "Estimado(a): " + item.Nom_usu + ",</br>Te informamos que con fecha " + novedad.fecha_novedad.ToLongDateString() + " " + SesionLogin().Nom_usu + " ha cargado información en el Portal Payroll correspondiente al siguiente finiquito: " + mensaje_esp + "</br></br>Favor no olvide considerar esta información para el proceso de remuneraciones para " + clien.nom_emp + "</br></br>Saludos y gracias, </br></br>Este correo es informativo, favor no responder a esta dirección de correo, ya que no se encuentra habilitada para recibir mensajes.</br>";
                    await Helper.SendEmail("*****@*****.**", item.email, clien.Nom_cor_emp + " | Información de Finiquitos", mensaje, detalle);

                    helper.registraEmail(item.id, "*****@*****.**", item.email, clien.Nom_cor_emp + " | Información de Finiquitos", mensaje + " " + detalle);
                    await Task.WhenAll(sendTask);
                }
                return(JsonExito());
            }
            catch (Exception err)
            {
                return(JsonError(err.Message, err));
            }
        }
        public async System.Threading.Tasks.Task <ActionResult> finiquitarMasivo(int?[] listado_usuarios, HttpPostedFileBase[] files, int?id_cliente /*, string causal*/, string comentarios /*,DateTime fecha_fin*/)
        {
            try
            {
                if (listado_usuarios == null)
                {
                    throw new Exception("Debe seleccionar a un colaborador.");
                }

                Novedad novedad = new Novedad();
                novedad.id_cliente    = (int)id_cliente;
                novedad.fecha_mod     = DateTime.Now;
                novedad.tipo_nov      = 6;
                novedad.fecha_novedad = DateTime.Now;
                novedad.usuario_mod   = SesionLogin().id;
                novedad.estado        = "P";
                novedad.comentario    = comentarios;
                _db.Novedad.Add(novedad);
                _db.SaveChanges();
                Finiquito finiquito = new Finiquito();
                Documento docu      = new Documento();

                foreach (var usuario in listado_usuarios)// TODO
                {
                    finiquito.Novedad    = novedad;
                    finiquito.fecha_fin  = DateTime.Now;    //Debo ingresar una fecha
                    finiquito.causal     = "CAUSAFORTUITO"; //Debo ingresar una causa (Cambios a revisas post revision de nick y philip)
                    finiquito.id_novedad = novedad.id_novedad;
                    finiquito.id_usu     = (int)usuario;
                    _db.Finiquito.Add(finiquito);
                    _db.SaveChanges();
                }

                docu.Novedad              = novedad;
                docu.Cliente              = _db.Cliente.FirstOrDefault(x => x.id_cliente == novedad.id_cliente);
                docu.categoria            = "CAUSAFORTUITO";
                docu.id_novedad           = novedad.id_novedad;
                docu.id_usu               = SesionLogin().id;
                docu.estado_aprov         = "P";
                docu.id_cliente           = (int)id_cliente;
                docu.Novedad.Tipo_novedad = _db.Tipo_novedad.FirstOrDefault(x => x.id_tipo == novedad.tipo_nov);
                var clien = _db.Cliente.FirstOrDefault(x => x.id_cliente == novedad.id_cliente);
                _db.SaveChanges();

                try { helper.createFile(files[0], docu); } catch (Exception e) { App_Start.ErrorService.LogError(e); }

                var usuarios_payroll = (from u in _db.Usuario
                                        join uc in _db.Usuario_Cliente on u.id equals uc.id_usu
                                        where uc.id_cliente == novedad.id_cliente && u.id_tipo_usu == 2 && u.estado == 1
                                        select u).ToList();
                if (!usuarios_payroll.Any())
                {
                    throw new Exception(App_GlobalResources.Pay_Lenguaje.no_hay_contraparte);
                }

                var list_usu = (from f in _db.Finiquito
                                join u in _db.Usuario on f.id_usu equals u.id
                                where f.id_novedad == novedad.id_novedad
                                select u).ToList();

                List <Task> sendTask = new List <Task>();
                foreach (var item in usuarios_payroll)
                {
                    var mensaje_esp = "";
                    //var mensaje_ing = "";
                    foreach (var f in list_usu)//Recorre todos lo finiquitos asociados a una novedad.
                    {
                        mensaje_esp = mensaje_esp + "</br></br>Nombre completo: " + f.Nom_usu + " " + " .</br> Rut: " + f.rut + ".";
                        //mensaje_ing = mensaje_ing + "</br></br>Full Name: " + f.Nom_usu + " " + " .</br> ID Card: " + f.rut + " .</br>";
                    }
                    //string detalle = "Dear" + item.Nom_usu + ",</br></br>Please be informed that " + SesionLogin().Nom_usu + "received information from " + clien.nom_emp + " regarding the following employment termination(s): " + mensaje_ing + "</br></br>Kind regards and thanks, </br></br>*Please note that this email is an automated notification, which is unable to receive replies. If you have any questions please contact your Payroll team.</br></br>-----------------------</br>";
                    string detalle = "";
                    string mensaje = "Estimado(a): " + item.Nom_usu + ",</br>Te informamos que con fecha " + novedad.fecha_novedad.ToLongDateString() + " " + SesionLogin().Nom_usu + " ha cargado información en el Portal Payroll correspondiente al siguiente finiquito: " + mensaje_esp + "</br></br>Favor no olvide considerar esta información para el proceso de remuneraciones para " + clien.nom_emp + "</br></br>Saludos y gracias, </br></br>Este correo es informativo, favor no responder a esta dirección de correo, ya que no se encuentra habilitada para recibir mensajes.</br>";
                    await Helper.SendEmail("*****@*****.**", item.email, clien.Nom_cor_emp + " | Información de Finiquitos", mensaje, detalle);

                    helper.registraEmail(item.id, "*****@*****.**", item.email, clien.Nom_cor_emp + " | Información de Finiquitos", mensaje + " " + detalle);
                    await Task.WhenAll(sendTask);
                }
                return(JsonExitoMsg("Registro cursado con éxito!", "Mensaje"));
            }
            catch (Exception e)
            {
                return(JsonError(e.Message, e));
            }
        }
        public async System.Threading.Tasks.Task <ActionResult> Create(Finiquito model, HttpPostedFileBase[] files, string[] documento, int id_cliente_, int id_usuario_)
        {
            try
            {
                var     clie    = _db.Cliente.FirstOrDefault(x => x.id_cliente == id_cliente_);
                Novedad novedad = new Novedad();
                novedad.usuario_mod   = SesionLogin().id;
                novedad.id_cliente    = clie.id_cliente;
                novedad.fecha_mod     = DateTime.Now;
                novedad.tipo_nov      = 6;
                novedad.fecha_novedad = DateTime.Now;
                novedad.estado        = "P";
                novedad.comentario    = model.Novedad.comentario;
                model.Novedad         = novedad;
                model.id_usu          = id_usuario_;
                model.fecha_fin       = DateTime.Now;    //Debo ingresar una fecha
                model.causal          = "CAUSAFORTUITO"; //Debo ingresar una causa (Cambios a revisas post revision de nick y philip)
                var usu = _db.Usuario.FirstOrDefault(x => x.id == model.id_usu);
                _db.Novedad.Add(novedad);
                _db.SaveChanges();
                model.id_novedad = novedad.id_novedad;
                _db.Finiquito.Add(model);
                _db.SaveChanges();
                if (files[0] == null)
                {
                    return(JsonExito());
                }
                int i = 0;
                foreach (var item in files)// TODO
                {
                    if (item == null || documento[i] == "")
                    {
                        break;
                    }
                    else
                    {
                        Documento documento_ = new Documento();
                        documento_.Novedad              = novedad;
                        documento_.Cliente              = _db.Cliente.FirstOrDefault(x => x.id_cliente == novedad.id_cliente);
                        documento_.id_novedad           = model.id_novedad;
                        documento_.categoria            = documento[i];
                        documento_.id_usu               = SesionLogin().id;
                        documento_.Novedad.Tipo_novedad = _db.Tipo_novedad.FirstOrDefault(x => x.id_tipo == novedad.tipo_nov);
                        try { helper.createFile(item, documento_); } catch (Exception e) { App_Start.ErrorService.LogError(e); }
                        i++;
                    }
                }
                int id_nov = model.id_novedad;

                //var casillas = (from nov in _db.Novedad join uc in _db.Usuario_Cliente on nov.id_cliente equals uc.id_cliente
                //                join u in _db.Usuario on uc.id_usu equals u.id where u.id_tipo_usu == 2 && nov.id_novedad == id_nov
                //                select u).ToList();

                var usuarios_payroll = (from u in _db.Usuario
                                        join uc in _db.Usuario_Cliente on u.id equals uc.id_usu
                                        where uc.id_cliente == novedad.id_cliente && u.id_tipo_usu == 2 && u.estado == 1
                                        select u).ToList();
                if (!usuarios_payroll.Any())
                {
                    throw new Exception(App_GlobalResources.Pay_Lenguaje.no_hay_contraparte);
                }

                List <Task> sendTask = new List <Task>();
                foreach (var item in usuarios_payroll)
                {
                    string mensaje = "Estimado(a) :" + item.Nom_usu + ",</br></br>Te informamos que en nuestro Payroll Portal, se ha generado una solicitud de finiquito con fecha de hoy " + DateTime.Now.ToShortDateString() + ", a continuación la informacion del colaborador, </br></br>Nombre completo: " + usu.Nom_usu + ".</ br > Rut: " + usu.rut + ".</ br > Empresa: " + clie.nom_emp + ".</br></br>Agradeceríamos que lo revisaras. </br></br>Saludos y gracias, </br></br></br></br>Este correo es informativo, favor no responder a esta dirección de correo, ya que no se encuentra habilitada para recibir mensajes. </br></br>";
                    string detalle = "</br></br> Dear Mr./ Ms. " + item.Nom_usu + ",</br></br>We inform you that in our Payroll Portal, A settlement request has been generated with today's date" + DateTime.Now.ToShortDateString() + ", below the information of the collaborator, </br></br>Full name:  " + usu.Nom_usu + ".</ br > Card Id: " + usu.rut + ".</ br > Company: " + clie.nom_emp + ".</br></br>We would appreciate it if you would review it. </br></br>Greetings and thank you, </br></br>This email is informative, please do not reply to this email address, as it´s not able to receive messages. </br></br>";
                    sendTask.Add(App_Start.Helper.SendEmail("*****@*****.**", item.email, "Solicitud de finiquito terminada / Completed settlement request", mensaje, detalle));
                    helper.registraEmail(item.id, "*****@*****.**", item.email, "Solicitud de finiquito terminada / Completed settlement request", mensaje + " " + detalle);
                }
                await Task.WhenAll(sendTask);

                return(JsonExito());
                //if (!helper.ValidaIngresoNovedad(id_cliente_))
                //{
                //    return JsonExitoMsg("Este registro se proceso pero conlleva un SNR ", "SNR");
                //}
                //else
                //{
                //    return JsonExito();
                //}
            }
            catch (Exception err)
            {
                return(JsonError(err.Message, err));
            }
        }
        public async System.Threading.Tasks.Task <ActionResult> aprobacion(int id, int[] ArregloIds)
        {
            try
            {
                var fini_aprobados               = (from f in _db.Finiquito where ArregloIds.Contains(f.id_baja) && f.id_novedad == id select f).ToList();
                var fini_no_aprobados            = (from f in _db.Finiquito where !ArregloIds.Contains(f.id_baja) && f.id_novedad == id select f).ToList();
                var usuarios_no_acuse_recivo_esp = "";
                var usuarios_no_acuse_recivo_ing = "";
                var finiquito = _db.Finiquito.FirstOrDefault(item => item.id_novedad == id);
                var novedad   = _db.Novedad.FirstOrDefault(x => x.id_novedad == finiquito.id_novedad);
                var clie      = _db.Cliente.FirstOrDefault(x => x.id_cliente == novedad.id_cliente);
                var doc       = finiquito.id_novedad;
                var documento = _db.Documento.FirstOrDefault(item => item.id_novedad == doc);

                if (fini_no_aprobados.Any())
                {
                    var     id_cliente    = fini_no_aprobados.First().Novedad.id_cliente;
                    Novedad nueva_novedad = new Novedad();
                    nueva_novedad.id_cliente    = id_cliente;
                    nueva_novedad.fecha_mod     = fini_no_aprobados.First().Novedad.fecha_mod;
                    nueva_novedad.tipo_nov      = 6;
                    nueva_novedad.fecha_novedad = fini_no_aprobados.First().Novedad.fecha_novedad;
                    nueva_novedad.usuario_mod   = SesionLogin().id;
                    nueva_novedad.estado        = "R";
                    nueva_novedad.comentario    = fini_no_aprobados.First().Novedad.comentario;
                    _db.Novedad.Add(nueva_novedad);
                    _db.SaveChanges();

                    List <Finiquito> lista_fini = new List <Finiquito>();
                    foreach (var fini in fini_no_aprobados)// TODO
                    {
                        var nuevo_finiquito = new Finiquito();
                        nuevo_finiquito.Novedad    = nueva_novedad;
                        nuevo_finiquito.fecha_fin  = fini.fecha_fin;
                        nuevo_finiquito.causal     = fini.causal;
                        nuevo_finiquito.id_novedad = nueva_novedad.id_novedad;
                        nuevo_finiquito.id_usu     = fini.id_usu;
                        lista_fini.Add(nuevo_finiquito);
                    }

                    foreach (var f in fini_no_aprobados)//Recorre todos lo finiquitos asociados a una novedad.
                    {
                        usuarios_no_acuse_recivo_esp = usuarios_no_acuse_recivo_esp + "</br></br> Nombre completo: " + f.Usuario.Nom_usu + " " + " .</br> Rut: " + f.Usuario.rut + ".";
                        usuarios_no_acuse_recivo_ing = usuarios_no_acuse_recivo_ing + "</br></br>Full name: " + f.Usuario.Nom_usu + " " + " .</br>ID Card: " + f.Usuario.rut + ".";
                    }
                    _db.Finiquito.AddRange(lista_fini);
                    _db.Finiquito.RemoveRange(fini_no_aprobados);
                    _db.SaveChanges();
                }

                finiquito.Novedad.estado      = "A";
                finiquito.Novedad.fecha_mod   = DateTime.Now;
                finiquito.Novedad.usuario_mod = SesionLogin().id;
                _db.Entry(finiquito).State    = System.Data.Entity.EntityState.Modified;
                _db.SaveChanges();
                var usu_contraparte = (from u in _db.Usuario
                                       join uc in _db.Usuario_Cliente on u.id equals uc.id_usu
                                       where uc.id_cliente == novedad.id_cliente &&
                                       u.id_tipo_usu == 1 && u.estado == 1 && u.id_cliente == novedad.id_cliente
                                       select u).ToList();

                if (!usu_contraparte.Any())
                {
                    throw new Exception(App_GlobalResources.Pay_Lenguaje.no_hay_contraparte);
                }

                List <Task> sendTask = new List <Task>();
                foreach (var item in usu_contraparte)
                {
                    var mensaje_esp = ""; var mensaje_ing = "";
                    foreach (var f in fini_aprobados)//Recorre todos lo finiquitos asociados a una novedad.
                    {
                        mensaje_esp = mensaje_esp + "</br></br>Nombre completo: " + f.Usuario.Nom_usu + " " + " .</br> Rut: " + f.Usuario.rut + ".";
                        mensaje_ing = mensaje_ing + "</br></br>Full name: " + f.Usuario.Nom_usu + " " + " .</br>ID Card: " + f.Usuario.rut + " .";
                    }

                    if (fini_no_aprobados.Any())
                    {
                        //Email OK
                        string mensaje = "Dear " + item.Nom_usu + ",</br></br> Please be informed that " + SesionLogin().Nom_usu + ", received information from" + clie.nom_emp + " regarding the following employment termination(s):" + mensaje_ing + "</br></br>We have not yet received the termination Agreement(s) for the following individuals: " + usuarios_no_acuse_recivo_ing + " </br></br>Best regards, </br></br>*Please note that this email is an automated notification, which is unable to receive replies. If you have any questions please contact your Payroll team.</br></br>-----------------------</br>";
                        string detalle = "</br></br> Estimado(a) " + item.Nom_usu + ",</br> </br>Te informamos que " + SesionLogin().Nom_usu + ", ha recibido la información de la empresa " + clie.nom_emp + " sobre el/los siguiente(s) finiquit(os): " + mensaje_esp + "</br></br>Con respecto a los siguientes trabajadores el documento de respaldo adjunto no venía" + usuarios_no_acuse_recivo_esp + "</br>Saludos y gracias,</br></br>Este correo es informativo, favor no responder a esta dirección de correo, ya que no se encuentra habilitada para recibir mensajes. </br></br>";
                        await Helper.SendEmail("*****@*****.**", item.email, "Information Received | Información Recibida", mensaje, detalle);

                        helper.registraEmail(item.id, "*****@*****.**", item.email, "Information Received | Información Recibida", mensaje + " " + detalle);
                    }
                    else
                    {
                        // Email OK
                        string mensaje = "Dear " + item.Nom_usu + ",</br></br> Please be informed that " + SesionLogin().Nom_usu + ", received information from" + clie.nom_emp + " regarding the following employment termination(s):" + mensaje_ing + "</br></br>Best regards, </br></br>*Please note that this email is an automated notification, which is unable to receive replies. If you have any questions please contact your Payroll team.</br></br>-----------------------</br>";
                        string detalle = "</br></br> Estimado(a) " + item.Nom_usu + ",</br> </br>Te informamos que " + SesionLogin().Nom_usu + ", ha recibido la información de la empresa " + clie.nom_emp + " sobre el/los siguiente(s) finiquit(os): " + mensaje_esp + "</br>Saludos y gracias,</br></br>Este correo es informativo, favor no responder a esta dirección de correo, ya que no se encuentra habilitada para recibir mensajes. </br></br>";
                        await Helper.SendEmail("*****@*****.**", item.email, "Information Received | Información Recibida", mensaje, detalle);

                        helper.registraEmail(item.id, "*****@*****.**", item.email, "Information Received | Información Recibida", mensaje + " " + detalle);
                    }
                }
                await Task.WhenAll(sendTask);

                _db.SaveChanges();
                return(JsonExitoMsg("Aprobado", "Finiquito"));
            }
            catch (Exception e)
            {
                return(JsonError(e.Message, e));
            }
        }