public HttpResponseMessage Put([FromBody] CierreViewModel gastos)
        {
            G.AbrirConexionAPP(out db);
            var t = db.Database.BeginTransaction();

            try
            {
                //      G.GuardarTxt("BitLlegada.txt", gastos.ToString());
                if (db.EncCierre.Where(a => a.idCierre == gastos.EncCierre.idCierre).FirstOrDefault() != null)
                {
                    var Cierre = db.EncCierre.Where(a => a.idCierre == gastos.EncCierre.idCierre).FirstOrDefault();


                    db.Entry(Cierre).State   = EntityState.Modified;
                    Cierre.Periodo           = Cierre.Periodo;//gastos.EncCierre.Periodo;
                    Cierre.FechaInicial      = gastos.EncCierre.FechaInicial;
                    Cierre.FechaFinal        = gastos.EncCierre.FechaFinal;
                    Cierre.idLogin           = gastos.EncCierre.idLogin;
                    Cierre.SubTotal          = gastos.EncCierre.SubTotal;
                    Cierre.Total             = gastos.EncCierre.Total;
                    Cierre.CantidadRegistros = 0;
                    Cierre.Descuento         = gastos.EncCierre.Descuento;
                    Cierre.FechaCierre       = Cierre.FechaCierre;//DateTime.Now;
                    Cierre.Impuestos         = gastos.EncCierre.Impuestos;
                    Cierre.Impuesto1         = gastos.EncCierre.Impuesto1;
                    Cierre.Impuesto2         = gastos.EncCierre.Impuesto2;
                    Cierre.Impuesto4         = gastos.EncCierre.Impuesto4;
                    Cierre.Impuesto8         = gastos.EncCierre.Impuesto8;
                    Cierre.Impuesto13        = gastos.EncCierre.Impuesto13;
                    var login = db.Login.Where(a => a.id == Cierre.idLogin).FirstOrDefault();
                    Cierre.idLoginAceptacion = login.idLoginAceptacion;
                    Cierre.Estado            = gastos.EncCierre.Estado;
                    Cierre.Observacion       = Cierre.Observacion;
                    Cierre.CodMoneda         = gastos.EncCierre.CodMoneda;
                    Cierre.TotalOtrosCargos  = gastos.EncCierre.TotalOtrosCargos;
                    Cierre.Observacion       = gastos.EncCierre.Observacion;
                    db.SaveChanges();

                    var FecInicial = Cierre.FechaInicial.AddMonths(-1);
                    var FechaFinal = Cierre.FechaFinal.AddMonths(1);
                    var Facturas   = db.EncCompras.Where(a => a.FecFactura >= FecInicial && a.FecFactura <= FechaFinal).ToList();
                    var Logins     = db.Login.ToList();
                    var Normas     = db.NormasReparto.ToList();


                    var Detalle = db.DetCierre.Where(a => a.idCierre == Cierre.idCierre).ToList();

                    foreach (var item in Detalle)
                    {
                        var Factura = Facturas.Where(a => a.id == item.idFactura).FirstOrDefault();
                        db.Entry(Factura).State = EntityState.Modified;
                        Factura.idLoginAsignado = 0;
                        Factura.FecAsignado     = null;


                        Factura.Comentario     = "";
                        Factura.idNormaReparto = 0;
                        Factura.idCierre       = 0;

                        db.DetCierre.Remove(item);
                        db.SaveChanges();
                    }



                    int i = 1;
                    foreach (var item in gastos.DetCierre)
                    {
                        DetCierre det = new DetCierre();
                        det.idCierre   = Cierre.idCierre;
                        det.NumLinea   = i;
                        det.idFactura  = item.idFactura;
                        det.Comentario = item.Comentario;
                        i++;
                        db.DetCierre.Add(det);
                        var Factura = Facturas.Where(a => a.id == item.idFactura).FirstOrDefault();
                        db.Entry(Factura).State = EntityState.Modified;
                        Factura.idLoginAsignado = Cierre.idLogin;
                        Factura.FecAsignado     = DateTime.Now;

                        if (Normas.Where(a => a.idLogin == Cierre.idLogin).FirstOrDefault() == null)
                        {
                            throw new Exception("Este usuario no contiene una norma de reparto asignada");
                        }

                        Factura.idNormaReparto = Normas.Where(a => a.idLogin == Cierre.idLogin).FirstOrDefault().id;
                        Factura.idCierre       = det.idCierre;
                        Factura.idTipoGasto    = item.idTipoGasto;
                        Factura.Comentario     = item.Comentario;
                        db.SaveChanges();
                    }
                    db.SaveChanges();

                    db.Entry(Cierre).State   = EntityState.Modified;
                    Cierre.CantidadRegistros = i - 1;
                    db.SaveChanges();


                    if (gastos.EncCierre.Estado == "E")
                    {
                        SendGridEmail.EmailSender emailsender = new SendGridEmail.EmailSender();
                        //var Roles = db.Roles.Where(a => a.NombreRol.ToUpper().Contains("APROBADOR")).FirstOrDefault();

                        var Login          = db.Login.Where(a => a.id == login.idLoginAceptacion).FirstOrDefault();
                        var AsignadoCierre = db.Login.Where(a => a.id == Cierre.idLogin).FirstOrDefault();
                        var parametros     = db.Parametros.FirstOrDefault();

                        var html = "<h3 style='text-align: center; '><strong>Liquidaci&oacute;n pendiente de revisi&oacute;n</strong></h3>";
                        html += "<p style='text-align: justify; '>Se ha recibido una nueva liquidaci&oacute;n de gastos, a continuaci&oacute;n los detalles:</p>";
                        html += "<ul>";
                        html += "<li style = 'text-align: justify;' ><strong> ID Cierre </strong>: " + Cierre.idCierre + "</li>";
                        html += "<li style = 'text-align: justify;' ><strong> Nombre </strong>: " + AsignadoCierre.Nombre + "</li>";
                        html += "<li style='text-align: justify; '><strong>Periodo</strong>: " + Cierre.Periodo + "</li>";
                        html += "<li style='text-align: justify; '><strong>Cantidad de Facturas: </strong>" + Cierre.CantidadRegistros + "</li>";
                        html += "<li style='text-align: justify; '><strong>Total</strong>: " + decimal.Round(Cierre.Total.Value, 2) + "</li>";
                        html += "</ul><p></p> ";
                        html += "<p>Favor revisar en la plataforma <a href='" + parametros.UrlSitioPublicado + "'>" + parametros.UrlSitioPublicado + "</a>&nbsp;para aceptar o denegar dicha liquidaci&oacute;n.</p>";



                        emailsender.SendV2(Login.Email, parametros.RecepcionEmail, "", parametros.RecepcionEmail, "Liquidación", "Liquidación pendiente de revisión", html, parametros.RecepcionHostName, parametros.EnvioPort, parametros.RecepcionUseSSL.Value, parametros.RecepcionEmail, parametros.RecepcionPassword);
                    }

                    if (gastos.EncCierre.Estado == "A" || gastos.EncCierre.Estado == "R")
                    {
                        SendGridEmail.EmailSender emailsender = new SendGridEmail.EmailSender();
                        //var Roles = db.Roles.Where(a => a.NombreRol.ToUpper().Contains("APROBADOR")).FirstOrDefault();

                        var AR = gastos.EncCierre.Estado;

                        var Login          = db.Login.Where(a => a.id == login.id).FirstOrDefault();
                        var AsignadoCierre = db.Login.Where(a => a.id == Cierre.idLogin).FirstOrDefault();
                        var parametros     = db.Parametros.FirstOrDefault();
                        //&oacute; -> Tilde
                        var html = "";
                        if (AR == "A")
                        {
                            var LoginAceptacion = db.Login.Where(a => a.id == Cierre.idLoginAceptacion).FirstOrDefault();
                            html  = "<h3 style='text-align: center; '><strong>Liquidaci&oacute;n  Aprobada</strong></h3>";
                            html += "<p style='text-align: justify; '>Se ha aprobado tú liquidaci&oacute;n de gastos, a continuaci&oacute;n los detalles:</p>";
                            html += "<ul>";
                            html += "<li style = 'text-align: justify;' ><strong> ID Cierre </strong>: " + Cierre.idCierre + "</li>";
                            html += "<li style = 'text-align: justify;' ><strong> Nombre </strong>: " + AsignadoCierre.Nombre + "</li>";
                            html += "<li style='text-align: justify; '><strong>Periodo</strong>: " + Cierre.Periodo + "</li>";
                            html += "<li style='text-align: justify; '><strong>Cantidad de Facturas: </strong>" + Cierre.CantidadRegistros + "</li>";
                            html += "<li style='text-align: justify; '><strong>Total</strong>: " + decimal.Round(Cierre.Total.Value, 2) + "</li>";
                            html += "<li style='text-align: justify; '><strong>Usuario Aprobador</strong>: " + LoginAceptacion == null ? "" : LoginAceptacion.Nombre + "</li>";
                            html += "<li style='text-align: justify; '><strong>Comentarios de la Liquidación</strong>: " + Cierre.Observacion + "</li>";
                            html += "</ul><p></p> ";
                            html += "<p>Favor revisar en la plataforma <a href='" + parametros.UrlSitioPublicado + "'>" + parametros.UrlSitioPublicado + "</a>&nbsp;para ver más detalles de dicha liquidaci&oacute;n.</p>";
                        }
                        else
                        {
                            var LoginAceptacion = db.Login.Where(a => a.id == Cierre.idLoginAceptacion).FirstOrDefault();
                            html  = "<h3 style='text-align: center; '><strong>Liquidaci&oacute;n  Rechazada</strong></h3>";
                            html += "<p style='text-align: justify; '>Se ha rechazado tú liquidaci&oacute;n de gastos, a continuaci&oacute;n los detalles:</p>";
                            html += "<ul>";
                            html += "<li style = 'text-align: justify;' ><strong> ID Cierre </strong>: " + Cierre.idCierre + "</li>";
                            html += "<li style = 'text-align: justify;' ><strong> Nombre </strong>: " + AsignadoCierre.Nombre + "</li>";
                            html += "<li style='text-align: justify; '><strong>Periodo</strong>: " + Cierre.Periodo + "</li>";
                            html += "<li style='text-align: justify; '><strong>Cantidad de Facturas: </strong>" + Cierre.CantidadRegistros + "</li>";
                            html += "<li style='text-align: justify; '><strong>Total</strong>: " + decimal.Round(Cierre.Total.Value, 2) + "</li>";
                            html += "<li style='text-align: justify; '><strong>Usuario Aprobador</strong>: " + LoginAceptacion == null ? "" : LoginAceptacion.Nombre + "</li>";
                            html += "<li style='text-align: justify; '><strong>Comentarios de la Liquidación</strong>: " + Cierre.Observacion + "</li>";
                            html += "</ul><p></p> ";
                            html += "<p>Favor revisar en la plataforma <a href='" + parametros.UrlSitioPublicado + "'>" + parametros.UrlSitioPublicado + "</a>&nbsp;para ver más detalles de dicha liquidaci&oacute;n.</p>";
                        }



                        emailsender.SendV2(Login.Email, parametros.RecepcionEmail, "", parametros.RecepcionEmail, "Liquidación", "Respuesta de la liquidación", html, parametros.RecepcionHostName, parametros.EnvioPort, parametros.RecepcionUseSSL.Value, parametros.RecepcionEmail, parametros.RecepcionPassword);
                    }



                    t.Commit();
                    G.CerrarConexionAPP(db);
                    return(Request.CreateResponse(HttpStatusCode.OK));
                }
                else
                {
                    throw new Exception("Este cierre no existe");
                }
            }
            catch (Exception ex)
            {
                t.Rollback();
                G.GuardarTxt("ErrorCierre" + DateTime.Now.Day + "" + DateTime.Now.Month + "" + DateTime.Now.Year + ".txt", ex.ToString());

                BitacoraErrores be = new BitacoraErrores();

                be.Descripcion = ex.Message;
                be.StackTrace  = (string.IsNullOrEmpty(ex.InnerException.Message) ? ex.StackTrace : ex.InnerException.Message);
                be.Metodo      = "Actualizacion de Cierre";
                be.Fecha       = DateTime.Now;
                db.BitacoraErrores.Add(be);
                db.SaveChanges();

                G.CerrarConexionAPP(db);
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex));
            }
        }
        public HttpResponseMessage Post([FromBody] CierreViewModel gastos)
        {
            G.AbrirConexionAPP(out db);
            var t = db.Database.BeginTransaction();

            try
            {
                var Candado = db.EncCierre.Where(a => a.Periodo.ToUpper().Contains(gastos.EncCierre.Periodo.ToUpper()) && a.Estado != "A" && a.CodMoneda == gastos.EncCierre.CodMoneda && a.FechaInicial <= gastos.EncCierre.FechaCierre && a.FechaFinal >= gastos.EncCierre.FechaCierre && a.idLogin == gastos.EncCierre.idLogin).FirstOrDefault();
                if (Candado != null)
                {
                    throw new Exception("Ya existe una liquidacion con la moneda " + gastos.EncCierre.CodMoneda + " en este periodo " + gastos.EncCierre.Periodo + " idlogin: "******"No se puede insertar una liquidacion con ninguna factura");
                }
                var Cierre = new EncCierre();
                Cierre.Periodo           = gastos.EncCierre.Periodo;
                Cierre.FechaInicial      = gastos.EncCierre.FechaInicial;
                Cierre.FechaFinal        = gastos.EncCierre.FechaFinal;
                Cierre.idLogin           = gastos.EncCierre.idLogin;
                Cierre.SubTotal          = gastos.EncCierre.SubTotal;
                Cierre.Total             = gastos.EncCierre.Total;
                Cierre.CantidadRegistros = 0;
                Cierre.Descuento         = gastos.EncCierre.Descuento;
                Cierre.FechaCierre       = DateTime.Now;
                Cierre.Impuestos         = gastos.EncCierre.Impuestos;
                Cierre.Impuesto1         = gastos.EncCierre.Impuesto1;
                Cierre.Impuesto2         = gastos.EncCierre.Impuesto2;
                Cierre.Impuesto4         = gastos.EncCierre.Impuesto4;
                Cierre.Impuesto8         = gastos.EncCierre.Impuesto8;
                Cierre.Impuesto13        = gastos.EncCierre.Impuesto13;
                var login = db.Login.Where(a => a.id == Cierre.idLogin).FirstOrDefault();
                Cierre.idLoginAceptacion = login.idLoginAceptacion;
                Cierre.Estado            = gastos.EncCierre.Estado;
                Cierre.Observacion       = "";
                Cierre.CodMoneda         = gastos.EncCierre.CodMoneda;
                Cierre.TotalOtrosCargos  = gastos.EncCierre.TotalOtrosCargos;
                Cierre.ProcesadaSAP      = false;
                Cierre.Observacion       = gastos.EncCierre.Observacion;

                db.EncCierre.Add(Cierre);
                db.SaveChanges();

                var FecIni = Cierre.FechaInicial.AddDays(-1);
                var FecFin = Cierre.FechaFinal.AddDays(1);

                var Facturas = db.EncCompras.Where(a => a.FecFactura >= FecIni && a.FecFactura <= FecFin).ToList();
                var Logins   = db.Login.ToList();
                var Normas   = db.NormasReparto.ToList();



                int i = 1;
                foreach (var item in gastos.DetCierre)
                {
                    DetCierre det = new DetCierre();
                    det.idCierre   = Cierre.idCierre;
                    det.NumLinea   = i;
                    det.idFactura  = item.idFactura;
                    det.Comentario = item.Comentario;
                    i++;
                    db.DetCierre.Add(det);
                    var Factura = Facturas.Where(a => a.id == item.idFactura).FirstOrDefault();
                    if (Normas.Where(a => a.idLogin == Cierre.idLogin).FirstOrDefault() == null)
                    {
                        throw new Exception("Este usuario " + login.Nombre + "  no contiene una norma de reparto asignada");
                    }
                    db.Entry(Factura).State = EntityState.Modified;
                    Factura.idLoginAsignado = Cierre.idLogin;
                    Factura.FecAsignado     = DateTime.Now;



                    Factura.idNormaReparto = Normas.Where(a => a.idLogin == Cierre.idLogin).FirstOrDefault().id;
                    Factura.idCierre       = det.idCierre;
                    Factura.idTipoGasto    = item.idTipoGasto;
                    Factura.Comentario     = item.Comentario;
                    db.SaveChanges();
                }
                db.SaveChanges();

                db.Entry(Cierre).State   = EntityState.Modified;
                Cierre.CantidadRegistros = i - 1;
                db.SaveChanges();


                if (gastos.EncCierre.Estado == "E")
                {
                    SendGridEmail.EmailSender emailsender = new SendGridEmail.EmailSender();
                    //var Roles = db.Roles.Where(a => a.NombreRol.ToUpper().Contains("APROBADOR")).FirstOrDefault();

                    var Login          = db.Login.Where(a => a.id == login.idLoginAceptacion).FirstOrDefault();
                    var AsignadoCierre = db.Login.Where(a => a.id == Cierre.idLogin).FirstOrDefault();
                    var parametros     = db.Parametros.FirstOrDefault();

                    var html = "<h3 style='text-align: center; '><strong>Liquidaci&oacute;n pendiente de revisi&oacute;n</strong></h3>";
                    html += "<p style='text-align: justify; '>Se ha recibido una nueva liquidaci&oacute;n de gastos, a continuaci&oacute;n los detalles:</p>";
                    html += "<ul>";
                    html += "<li style = 'text-align: justify;' ><strong> ID Cierre </strong>: " + Cierre.idCierre + "</li>";
                    html += "<li style = 'text-align: justify;' ><strong> Nombre </strong>: " + AsignadoCierre.Nombre + "</li>";
                    html += "<li style='text-align: justify; '><strong>Periodo</strong>: " + Cierre.Periodo + "</li>";
                    html += "<li style='text-align: justify; '><strong>Cantidad de Facturas: </strong>" + Cierre.CantidadRegistros + "</li>";
                    html += "<li style='text-align: justify; '><strong>Total</strong>: " + decimal.Round(Cierre.Total.Value, 2) + "</li>";
                    html += "</ul><p></p> ";
                    html += "<p>Favor revisar en la plataforma <a href='" + parametros.UrlSitioPublicado + "'>" + parametros.UrlSitioPublicado + "</a>&nbsp;para aceptar o denegar dicha liquidaci&oacute;n.</p>";



                    emailsender.SendV2(Login.Email, parametros.RecepcionEmail, "", parametros.RecepcionEmail, "Liquidación", "Liquidación pendiente de revisión", html, parametros.RecepcionHostName, parametros.EnvioPort, parametros.RecepcionUseSSL.Value, parametros.RecepcionEmail, parametros.RecepcionPassword);
                }



                t.Commit();
                G.CerrarConexionAPP(db);
                return(Request.CreateResponse(HttpStatusCode.OK));
            }
            catch (Exception ex)
            {
                t.Rollback();
                G.GuardarTxt("ErrorCierre" + DateTime.Now.Day + "" + DateTime.Now.Month + "" + DateTime.Now.Year + ".txt", ex.ToString());

                BitacoraErrores be = new BitacoraErrores();
                be.Descripcion = ex.Message;
                be.StackTrace  = ex.StackTrace;
                be.Metodo      = "Insercion de Cierre";
                be.Fecha       = DateTime.Now;
                db.BitacoraErrores.Add(be);
                db.SaveChanges();

                G.CerrarConexionAPP(db);
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex));
            }
        }