Пример #1
0
        public async Task <ActionResult> Cerrar([Bind(Include = "TicketId,Comentario")] CierreViewModel cierre)
        {
            ApplicationUser user = await UserManager.FindByNameAsync(User.Identity.Name);

            cierre.TecnicoId = user.Id;
            ModelState.Clear();

            if (TryValidateModel(cierre))
            {
                await _ticketService.Cierre(cierre);

                return(RedirectToAction("Asignados", "Tecnico"));
            }

            return(View(cierre));
        }
Пример #2
0
        public async Task <ActionResult> Cerrar(int id)
        {
            var ticket = _ticketService.GetById(id);
            var user   = await UserManager.FindByNameAsync(User.Identity.Name);

            if ((ticket == null || ticket.Estado != Estado.Asignado) && user.Id != ticket.TecnicoId)
            {
                return(HttpNotFound());
            }

            CierreViewModel cierre = new CierreViewModel
            {
                TicketID = ticket.Id,
                Titulo   = ticket.Titulo
            };

            return(View(cierre));
        }
Пример #3
0
        public async Task Cierre(CierreViewModel cierreViewModel)
        {
            var ticketCerrado = await GetTicketAsync(cierreViewModel.TicketID);

            if (ticketCerrado != null)
            {
                Cierre cierre = new Cierre
                {
                    ComentarioCierre = cierreViewModel.Comentario,
                    TecnicoId        = cierreViewModel.TecnicoId,
                    TicketID         = ticketCerrado.Id
                };

                context.Cierres.Add(cierre);
                ticketCerrado.Estado = Estado.Completado;
                await context.SaveChangesAsync();
            }
        }
Пример #4
0
        public Cierre(CierreViewModel cierre)
        {
            InitializeComponent();

            titulo_reporte.Text = "Cierre        " + cierre.Fecha.ToShortDateString();

            efectivoInicial.Text  = String.Format("{0:C}", cierre.EfectivoAnterior);
            ventas.Text           = String.Format("{0:C}", cierre.Ventas);
            barVentas.Text        = String.Format("{0:C}", cierre.CentrosDeCosto.SingleOrDefault(d => d.Nombre == "Bar").Importe);
            restaurantVentas.Text = String.Format("{0:C}", cierre.CentrosDeCosto.SingleOrDefault(d => d.Nombre == "Restaurant").Importe);
            depositos.Text        = String.Format("{0:C}", cierre.Depositos);
            extracciones.Text     = String.Format("{0:C}", cierre.Extracciones);
            extraccionCierre.Text = String.Format("{0:C}", cierre.ExtraccionCierre);
            pagoTrab.Text         = String.Format("{0:C}", cierre.PagoTrabajadores);
            efectivoCaja.Text     = String.Format("{0:C}", 100);

            ventasTotales.Text     = String.Format("{0:C}", cierre.Ventas);
            pagoPorFactura.Text    = String.Format("{0:C}", cierre.VentasPorFactura);
            excentasPorciento.Text = String.Format("{0:C}", cierre.VentasSinPorciento);
            ventasAlCosto.Text     = String.Format("{0:C}", cierre.VentasAlCosto);
            calculaPorciento.Text  = String.Format("{0:C}", cierre.SeLeCalculaPorciento);
            var porCiento = cierre.Porciento;

            porciento.Text = String.Format("{0:C}", porCiento);

            propina.Text = String.Format("{0:C}", cierre.Propinas);
            totalPropinaPorciento.Text = String.Format("{0:C}", porCiento + cierre.Propinas);

            var cuc =
                cierre.Desgloce.Where(d => d.DenominacionDeMoneda.Moneda.Sigla == "CUC")
                .Sum(d => d.Cantidad * d.DenominacionDeMoneda.Valor);

            var cup =
                cierre.Desgloce.Where(d => d.DenominacionDeMoneda.Moneda.Sigla == "CUP")
                .Sum(d => d.Cantidad * d.DenominacionDeMoneda.Valor);

            CUCReport.DataSource = cierre.Desgloce.Where(d => d.DenominacionDeMoneda.Moneda.Sigla == "CUC").Select(d => new
            {
                Valor    = d.DenominacionDeMoneda.Valor,
                Cantidad = d.Cantidad,
                Importe  = d.Cantidad * d.DenominacionDeMoneda.Valor
            }).OrderByDescending(d => d.Valor);

            this.denominacionCuc.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
                new DevExpress.XtraReports.UI.XRBinding("Text", null, "Valor")
            });

            this.cantidadCuc.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
                new DevExpress.XtraReports.UI.XRBinding("Text", null, "Cantidad")
            });

            this.valorCuc.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
                new DevExpress.XtraReports.UI.XRBinding("Text", null, "Importe", "{0:C}")
            });

            totalCuc.Text = String.Format("{0:C}", cuc);

            CUPReport.DataSource = cierre.Desgloce.Where(d => d.DenominacionDeMoneda.Moneda.Sigla == "CUP").Select(d => new
            {
                Valor    = d.DenominacionDeMoneda.Valor,
                Cantidad = d.Cantidad,
                Importe  = d.Cantidad * d.DenominacionDeMoneda.Valor
            }).OrderByDescending(d => d.Valor);

            this.denominacionCup.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
                new DevExpress.XtraReports.UI.XRBinding("Text", null, "Valor")
            });

            this.cantidadCup.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
                new DevExpress.XtraReports.UI.XRBinding("Text", null, "Cantidad")
            });

            this.valorCup.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
                new DevExpress.XtraReports.UI.XRBinding("Text", null, "Importe", "{0:C}")
            });

            totalCup.Text           = String.Format("{0:C}", cup);
            cupEnCucTotal.Text      = String.Format("{0:C}", cup / 25);
            totalConvertidoCuc.Text = String.Format("{0:C}", cuc + (cup / 25));
        }
Пример #5
0
        public CierreViewModel VerResumen(int id)
        {
            var dia    = _periodoContableService.BuscarDiaContable(id);
            var cierre = _db.Set <CierreDeCaja>().SingleOrDefault(c => c.DiaContableId == id);

            var porcientos = _db.Set <PorcientoMenu>().ToList();

            var totalVentas        = 0m;
            var ventasSinPorciento = 0m;
            var ventasAlCosto      = 0m;
            var ventasPorFacturas  = 0m;
            var centrosDeCosto     = new List <ResumenCentroCosto>();

            if (_db.Set <Venta>().Any(v => v.DiaContableId == dia.Id && (v.EstadoDeVenta == EstadoDeVenta.PagadaEnEfectivo || v.EstadoDeVenta == EstadoDeVenta.PagadaPorTarjeta || v.EstadoDeVenta == EstadoDeVenta.PagadaPorFactura)))
            {
                var ventas = _db.Set <Venta>()
                             .Where(
                    v =>
                    v.DiaContableId == dia.Id &&
                    (v.EstadoDeVenta == EstadoDeVenta.PagadaEnEfectivo ||
                     v.EstadoDeVenta == EstadoDeVenta.PagadaPorTarjeta ||
                     v.EstadoDeVenta == EstadoDeVenta.PagadaPorFactura)).ToList();
                totalVentas = ventas.Where(v => v.EstadoDeVenta == EstadoDeVenta.PagadaEnEfectivo ||
                                           v.EstadoDeVenta == EstadoDeVenta.PagadaPorTarjeta).Sum(v => v.Importe);
                ventasPorFacturas  = ventas.Where(v => v.EstadoDeVenta == EstadoDeVenta.PagadaPorFactura).Sum(v => v.Importe);
                ventasSinPorciento =
                    ventas.Sum(
                        v =>
                        v.Elaboraciones.Where(
                            e => porcientos.Any(p => p.ElaboracioId == e.ElaboracionId && !p.SeCalcula) && e.Venta.Observaciones != "Venta al costo")
                        .Sum(s => s.ImporteTotal));
                ventasAlCosto =
                    ventas.Where(v => v.Observaciones == "Venta al costo")
                    .Sum(
                        v =>
                        v.Importe);
                centrosDeCosto = ventas.Where(v => v.EstadoDeVenta == EstadoDeVenta.PagadaEnEfectivo ||
                                              v.EstadoDeVenta == EstadoDeVenta.PagadaPorTarjeta).SelectMany(vw => vw.Elaboraciones.GroupBy(e => e.Elaboracion.CentroDeCosto).Select(v => new ResumenCentroCosto()
                {
                    Nombre = v.Key.Nombre, Importe = v.Sum(ve => ve.ImporteTotal)
                })).GroupBy(e => e.Nombre).Select(e => new ResumenCentroCosto()
                {
                    Nombre = e.Key, Importe = e.Sum(s => s.Importe)
                }).ToList();
            }

            var extracciones =
                _cuentasServices.GetMovimientosDeCuenta("Caja")
                .Where(m => m.Asiento.DiaContableId == dia.Id && (m.Asiento.Detalle.StartsWith("Extracción") || m.Asiento.Detalle.StartsWith("Pago") || m.Asiento.Detalle.StartsWith("Compra"))).Sum(m => m.Importe);

            var extraccionCierre =
                _cuentasServices.GetMovimientosDeCuenta("Caja")
                .Where(m => m.Asiento.DiaContableId == dia.Id && (m.Asiento.Detalle.StartsWith("Cierre"))).Sum(m => m.Importe);

            var pagoTrabajadores =
                _cuentasServices.GetMovimientosDeCuenta("Caja")
                .Where(m => m.Asiento.DiaContableId == dia.Id && (m.Asiento.Detalle.StartsWith("Trabajadores"))).Sum(m => m.Importe);

            var depositos =
                _cuentasServices.GetMovimientosDeCuenta("Caja")
                .Where(m => m.Asiento.DiaContableId == dia.Id && m.TipoDeOperacion == TipoDeOperacion.Debito && m.Asiento.Detalle.StartsWith("Deposito")).Sum(m => m.Importe);

            var propinas = _db.Set <Propina>().Any(v => v.Venta.DiaContableId == dia.Id)
                ? _db.Set <Propina>().Where(v => v.Venta.DiaContableId == dia.Id).Sum(c => c.Importe)
                : 0;
            var resumen = new CierreViewModel()
            {
                Fecha                                              = dia.Fecha,
                EfectivoAnterior                                   = 100,
                Ventas                                             = totalVentas,
                VentasPorFactura                                   = ventasPorFacturas,
                VentasSinPorciento                                 = ventasSinPorciento,
                VentasAlCosto                                      = ventasAlCosto,
                Depositos                                          = depositos,
                Extracciones                                       = extracciones,
                Propinas                                           = propinas,
                ExtraccionCierre                                   = extraccionCierre,
                PagoTrabajadores                                   = pagoTrabajadores,
                Desgloce                                           = cierre != null?cierre.Desglose.ToList() : null,
                                                    CentrosDeCosto = centrosDeCosto
            };

            return(resumen);
        }
Пример #6
0
        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));
            }
        }
Пример #7
0
        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));
            }
        }