public ActionResult PagarReserva(VenderEntradaModel model)
        {
            int codVenta = model.idVenta;
            if (validacionVenta(model))
            {
                DateTime hoy = DateTime.Now;
                //buscamos la venta
                Ventas venta = db.Ventas.Find(model.idVenta);
                venta.montoDev = 0;
                //asignamos el vendedor
                venta.vendedor = User.Identity.Name;
                //estado y la fecha de pago
                venta.Estado = MagicHelpers.Compra;
                venta.fecha = hoy;
                //monto usados al pagar
                //venta.montoEfectivoSoles = model.MontoDolares * db.TipoDeCambio.Where(c => c.estado == "Activo").ToList().Last().valor.Value / MagicHelpers.ConstanteTipoCambio + model.MontoEfe - model.Vuelto;
                venta.montoEfectivoDolares = model.MontoDolares;
                double dolarsoles = (double)model.MontoDolares * db.TipoDeCambio.Where(c => c.estado == "Activo").ToList().Last().valor.Value / MagicHelpers.ConstanteTipoCambio;
                if (model.MontoEfe > dolarsoles)
                {
                    venta.montoEfectivoSoles = model.MontoEfe - model.Vuelto;
                }
                else
                {
                    venta.montoEfectivoSoles = model.MontoEfe;
                    venta.montoEfectivoDolares = (dolarsoles - model.Vuelto) / (db.TipoDeCambio.Where(c => c.estado == "Activo").ToList().Last().valor.Value / MagicHelpers.ConstanteTipoCambio);
                }
                venta.montoCreditoSoles = model.MontoTar;
                venta.MontoTotalSoles = model.MontoPagar;
                //modalidad de pago
                if (venta.montoCreditoSoles > 0 && venta.montoEfectivoSoles == 0 && venta.montoEfectivoDolares == 0) venta.modalidad = "T";
                if (venta.montoCreditoSoles == 0 && (venta.montoEfectivoDolares + venta.montoEfectivoSoles) > 0) venta.modalidad = "E";
                if ((venta.montoCreditoSoles + venta.montoEfectivoDolares) > 0 && venta.montoEfectivoDolares > 0) venta.modalidad = "M";
                //buscamos la ventaxfuncion
                VentasXFuncion vxf = db.VentasXFuncion.Where(c => c.codVen == venta.codVen).First();
                vxf.subtotal = model.Importe;
                double? porcDescuento = 0;
                //default es mixto
                vxf.descuento = (int)model.Descuento;
                //--
                if (venta.modalidad == "T")
                {
                    if (model.idPromociones[0] != -1)
                    {
                        int idPromocion = model.idPromociones[0];
                        Promociones promocion = db.Promociones.Where(c => c.codPromo == idPromocion && c.codEvento == model.idEvento).First();
                        porcDescuento = promocion.descuento / 100;
                    }
                    vxf.descuento = (int?)(vxf.subtotal * porcDescuento);
                }
                if (venta.modalidad == "E")
                {
                    vxf.descuento = (int?)model.Descuento;
                }
                vxf.total = model.Importe - model.Descuento;
                Eventos evento = db.Eventos.Find(vxf.Funcion.codEvento);
                DetalleVenta detalle = db.DetalleVenta.Where(c => c.codVen == venta.codVen && c.codFuncion == vxf.Funcion.codFuncion).First();
                //aumantemos el monto adeduado del organizador
                evento.monto_adeudado += evento.montoFijoVentaEntrada.Value + evento.porccomision.Value * detalle.total.Value / 100;
                //si es que tiene asientos, debo cambiar el estado de todos los asientos que ha comprado
                if (db.AsientosXFuncion.Any(c => c.codFuncion == vxf.Funcion.codFuncion && c.codDetalleVenta == detalle.codDetalleVenta))
                {
                    List<AsientosXFuncion> axf = db.AsientosXFuncion.Where(c => c.codFuncion == vxf.Funcion.codFuncion && c.codDetalleVenta == detalle.codDetalleVenta).ToList();
                    foreach (AsientosXFuncion asientoxf in axf)
                    {
                        asientoxf.estado = MagicHelpers.Ocupado;
                        asientoxf.PrecioPagado = model.MontoPagar;
                    }
                }
                //busco al cliente y le aumento los puntos correspondientes
                CuentaUsuario cuenta = db.CuentaUsuario.Where(c => c.codDoc == model.Dni).First();
                cuenta.puntos += db.Eventos.Find(vxf.Funcion.codEvento).puntosAlCliente * (int)detalle.cantEntradas;
                try
                {
                    db.SaveChanges();
                    Session["ReservaBusca"] = null;
                }
                catch (Exception ex)
                {
                    TempData["tipo"] = "alert alert-warning";
                    TempData["message"] = "Error en el pago.";
                    return Redirect("~/Ventas/PagarReserva?reserva=" + model.idVenta);
                }
                TempData["tipo"] = "alert alert-success";
                TempData["message"] = "Reserva Pagada. Muchas Gracias.";
                //le envio el correo al cliente de que la reserva ha sido pagada
                EmailController.EnviarCorreoCompra(model.idVenta, cuenta.correo);
                //return RedirectToAction("BuscarReserva","Ventas");
                return RedirectToAction("Index2", "Home");
            }
            //si hay un error volver a rellenar todo
            Ventas queryVentas = db.Ventas.Where(c => c.codVen == codVenta).First();
            VentasXFuncion queryVF = db.VentasXFuncion.Where(c => c.codVen == codVenta).First();
            int codFun = queryVF.codFuncion;
            Funcion queryF = db.Funcion.Where(c => c.codFuncion == codFun).First();
            int codEvento2 = queryF.codEvento;
            double? precio = queryVF.subtotal;
            //lista de bancos
            List<Banco> bancos = db.Banco.ToList();
            ViewBag.Bancos = new SelectList(bancos, "codigo", "nombre", model.idBanco);
            //lista de tarjetas
            List<TipoTarjeta> tipoTarjeta = db.TipoTarjeta.ToList();
            ViewBag.TipoTarjeta = new SelectList(tipoTarjeta, "idTipoTar", "nombre", model.idTipoTarjeta);
            List<Promociones> listaPromociones = new List<Promociones>();
            List<Promociones> listaPromocionesEfectivo = new List<Promociones>();
            double? descuento = 0;
            double? descuentoE = 0;
            double? total = 0;
            total += precio;
            Promociones promocion2 = PromocionController.CalculaMejorPromocionTarjeta(model.idEvento, bancos.First().codigo, tipoTarjeta.First().idTipoTar);
            if (promocion2 == null)
            {
                Promociones dummy = new Promociones();
                dummy.codPromo = -1;
                listaPromociones.Add(dummy);
            }
            else
            {
                descuento += precio * promocion2.descuento.Value / 100;
                listaPromociones.Add(promocion2);
            }
            promocion2 = PromocionController.CalculaMejorPromocionEfectivo(model.idEvento);
            if (promocion2 != null)
            {
                if (queryVF.cantEntradas >= promocion2.cantAdq)
                {
                    descuentoE += 1.0 * promocion2.cantAdq * precio * (1 - (promocion2.cantComp.Value * 1.0 / promocion2.cantAdq.Value));
                    listaPromocionesEfectivo.Add(promocion2);
                }
                else
                {
                    Promociones dummy = new Promociones();
                    dummy.codPromo = -1;
                    listaPromocionesEfectivo.Add(dummy);
                }
            }
            else
            {
                Promociones dummy = new Promociones();
                dummy.codPromo = -1;
                listaPromocionesEfectivo.Add(dummy);
            }
            ViewBag.PromocionesEfectivo = listaPromocionesEfectivo;
            ViewBag.Promociones = listaPromociones;
            ViewBag.Funciones = model.idFunciones;
            ViewBag.Total = total;
            //efectivo
            if (model.MontoTar == 0 && model.MontoEfe >= 0 && model.MontoDolares >= 0)
            {
                ViewBag.DescuentoE = model.Descuento;
                ViewBag.MontoPagarE = model.MontoPagar;
                ViewBag.MontoSE = model.MontoEfe;
                ViewBag.MontoDE = model.MontoDolares;
                ViewBag.VueltoE = model.Vuelto;
                //tarjeta
                ViewBag.Descuento = descuento;
                ViewBag.MontoPagarT = total - descuento;
                ViewBag.MontoTarjeta = total - descuento;
                //mixto
                ViewBag.MontoPagarM = total;
                ViewBag.MontoSM = 0;
                ViewBag.MontoDM = 0;
                ViewBag.MontoTarjetaM = 0;
                ViewBag.VueltoM = 0;
                model.modalidad = 1;
            }
            //tarjeta
            if (model.MontoTar > 0 && model.MontoEfe == 0 && model.MontoDolares == 0)
            {
                ViewBag.DescuentoE = descuentoE;
                ViewBag.MontoPagarE = total - descuentoE;
                ViewBag.MontoSE = 0;
                ViewBag.MontoDE = 0;
                ViewBag.VueltoE = 0;
                //tarjeta
                ViewBag.Descuento = model.Descuento;
                ViewBag.MontoPagarT = model.MontoPagar;
                ViewBag.MontoTarjeta = model.MontoTar;
                //mixto
                ViewBag.MontoPagarM = total;
                ViewBag.MontoSM = 0;
                ViewBag.MontoDM = 0;
                ViewBag.MontoTarjetaM = 0;
                ViewBag.VueltoM = 0;
                model.modalidad = 2;
            }

            if (model.MontoTar >= 0 && model.MontoEfe >= 0 && model.MontoDolares >= 0)
            {
                ViewBag.DescuentoE = descuentoE;
                ViewBag.MontoPagarE = total - descuentoE;
                ViewBag.MontoSE = 0;
                ViewBag.MontoDE = 0;
                ViewBag.VueltoE = 0;
                //tarjeta
                ViewBag.Descuento = descuento;
                ViewBag.MontoPagarT = total - descuento;
                ViewBag.MontoTarjeta = total - descuento;
                //mixto
                ViewBag.MontoPagarM = model.MontoPagar;
                ViewBag.MontoSM = model.MontoEfe;
                ViewBag.MontoDM = model.MontoDolares;
                ViewBag.MontoTarjetaM = model.MontoTar;
                ViewBag.VueltoM = model.Vuelto;
                model.modalidad = 3;
            }
            ViewBag.Mes = Fechas.Mes();
            ViewBag.AnVen = Fechas.Anio();
            return View(model);
        }
 public ActionResult PagarReserva(string reserva)
 {
     VenderEntradaModel model = new VenderEntradaModel();
     if (reserva != "" && reserva != null)
     {
         int id = int.Parse(reserva);
         Ventas queryVentas = db.Ventas.Where(c => c.codVen == id).First();
         VentasXFuncion queryVF = db.VentasXFuncion.Where(c => c.codVen == id).First();
         int codFun = queryVF.codFuncion;
         model.Nombre = queryVentas.CuentaUsuario.nombre + " " + queryVentas.CuentaUsuario.apellido;
         model.Dni = queryVentas.CuentaUsuario.codDoc;
         Funcion queryF = db.Funcion.Where(c => c.codFuncion == codFun).First();
         model.idVenta = id;
         int codEvento = queryF.codEvento;
         double? precio = queryVF.subtotal;
         //lista de bancos
         List<Banco> bancos = db.Banco.ToList();
         ViewBag.Bancos = new SelectList(bancos, "codigo", "nombre");
         //lista de tarjetas
         List<TipoTarjeta> tipoTarjeta = db.TipoTarjeta.ToList();
         ViewBag.TipoTarjeta = new SelectList(tipoTarjeta, "idTipoTar", "nombre");
         List<Promociones> listaPromociones = new List<Promociones>();
         List<Promociones> listaPromocionesEfectivo = new List<Promociones>();
         double? descuento = 0;
         double? descuentoE = 0;
         Promociones promocion = PromocionController.CalculaMejorPromocionTarjeta(codEvento, bancos.First().codigo, tipoTarjeta.First().idTipoTar);
         if (promocion == null)
         {
             Promociones dummy = new Promociones();
             dummy.codPromo = -1;
             listaPromociones.Add(dummy);
         }
         else
         {
             descuento += precio * promocion.descuento.Value / 100;
             listaPromociones.Add(promocion);
         }
         promocion = PromocionController.CalculaMejorPromocionEfectivo(codEvento);
         if (promocion != null)
         {
             if (queryVF.cantEntradas >= promocion.cantAdq)
             {
                 descuentoE += 1.0 * promocion.cantAdq / queryVF.cantEntradas * precio * (1 - (promocion.cantComp.Value * 1.0 / promocion.cantAdq.Value));
                 listaPromocionesEfectivo.Add(promocion);
             }
             else
             {
                 Promociones dummy = new Promociones();
                 dummy.codPromo = -1;
                 listaPromocionesEfectivo.Add(dummy);
             }
         }
         else
         {
             Promociones dummy = new Promociones();
             dummy.codPromo = -1;
             listaPromocionesEfectivo.Add(dummy);
         }
         model.idEventos = new List<int>();
         model.idEventos.Add(codEvento);
         ViewBag.PromocionesEfectivo = listaPromocionesEfectivo;
         ViewBag.Promociones = listaPromociones;
         ViewBag.Total = precio;
         //efectivo
         ViewBag.DescuentoE = descuentoE;
         ViewBag.MontoPagarE = precio - descuentoE;
         ViewBag.MontoSE = 0;
         ViewBag.MontoDE = 0;
         ViewBag.VueltoE = 0;
         //tarjeta
         ViewBag.Descuento = descuento;
         ViewBag.MontoPagarT = precio - descuento;
         ViewBag.MontoTarjeta = precio - descuento;
         //mixto
         ViewBag.MontoPagarM = precio;
         ViewBag.MontoSM = 0;
         ViewBag.MontoDM = 0;
         ViewBag.MontoTarjetaM = 0;
         ViewBag.VueltoM = 0;
         ViewBag.Mes = Fechas.Mes();
         ViewBag.AnVen = Fechas.Anio();
         model.idEvento = codEvento;
         //modalidad
         model.modalidad = 1;
         return View(model);
     }
     TempData["tipo"] = "alert alert-warning";
     TempData["message"] = "No ha seleccionado una reserva.";
     return RedirectToAction("BuscaReserva");
 }
        public ActionResult VenderEntrada(VenderEntradaModel model)
        {
            if (Session["CarritoItemVentas"] != null)
            {
                if (validacionVenta(model))
                {
                    if (verificaSiCompra(model.idFunciones, model.Dni))
                    {
                        int idVenta = 0;
                        DateTime hoy = DateTime.Now;
                        CuentaUsuario cuenta = new CuentaUsuario();
                        using (var context = new inf245netsoft())
                        {
                            try
                            {
                                List<CarritoItem> carrito = (List<CarritoItem>)Session["CarritoItemVentas"];
                                Ventas ve = new Ventas();
                                int cantidadEntradasTotales = carrito.Sum(c => c.cantidad);
                                try
                                {//si es un usuario registrado busco la cuenta y la asigno luego a la venta
                                    cuenta = context.CuentaUsuario.Where(c => c.codDoc.CompareTo(model.Dni) == 0).First();
                                }
                                catch (Exception ex)
                                {//si no es un cliente registrado guardo la venta como si fuera anonima
                                    cuenta = context.CuentaUsuario.Find(MagicHelpers.AnonimoUniversal);
                                }
                                ve.fecha = DateTime.Now;
                                ve.cantAsientos = cantidadEntradasTotales;
                                //de todas maneras en la venta se registra el nombre, dni y tipo de documento del que esta comprando.
                                ve.cliente = model.Nombre;
                                ve.CuentaUsuario = cuenta;
                                ve.codDoc = model.Dni;
                                //--
                                ve.Estado = MagicHelpers.Compra;
                                ve.tipoDoc = 1;
                                ve.montoEfectivoDolares = model.MontoDolares;
                                ve.MontoTotalSoles = model.MontoPagar;
                                ve.montoCreditoSoles = model.MontoTar;
                                double dolarsoles = (double)model.MontoDolares * db.TipoDeCambio.Where(c => c.estado == "Activo").ToList().Last().valor.Value / MagicHelpers.ConstanteTipoCambio;
                                if (model.MontoEfe > dolarsoles)
                                {
                                    ve.montoEfectivoSoles = model.MontoEfe - model.Vuelto;
                                }
                                else
                                {
                                    ve.montoEfectivoSoles = model.MontoEfe;
                                    ve.montoEfectivoDolares = (dolarsoles - model.Vuelto) / (db.TipoDeCambio.Where(c => c.estado == "Activo").ToList().Last().valor.Value / MagicHelpers.ConstanteTipoCambio);
                                }
                                //--vendedor, guardo el correo del vendedor en la venta
                                ve.vendedor = User.Identity.Name;
                                //
                                if (model.MontoTar > 0 && model.MontoEfe == 0)
                                {//para compra solo en tarjeta
                                    ve.modalidad = "T";
                                }
                                if (model.MontoEfe > 0 && model.MontoTar > 0)
                                {//mixto
                                    ve.modalidad = "M";
                                }
                                if (model.MontoTar == 0)
                                {//solo efectivo
                                    ve.modalidad = "E";
                                }
                                context.Ventas.Add(ve);
                                try
                                {
                                    context.SaveChanges();
                                    idVenta = ve.codVen;
                                }
                                catch (DbEntityValidationException dbEx)
                                {
                                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                                    {
                                        foreach (var validationError in validationErrors.ValidationErrors)
                                        {
                                            Trace.TraceInformation("Property: {0} Error: {1}",
                                                                    validationError.PropertyName,
                                                                    validationError.ErrorMessage);
                                        }
                                    }
                                }
                                //para cada item del carrito
                                for (int w = 0; w < carrito.Count; w++)
                                {
                                    CarritoItem paquete = carrito[w];
                                    //zona del evento
                                    ZonaEvento zo = context.ZonaEvento.Find(paquete.idZona);
                                    //en que perdiodo de venta estamos
                                    PeriodoVenta per = context.PeriodoVenta.Where(c => c.codEvento == paquete.idEvento && c.fechaInicio <= hoy && c.fechaFin >= hoy).ToList().First();
                                    PrecioEvento pr = context.PrecioEvento.Where(c => c.codZonaEvento == paquete.idZona && c.codPeriodoVenta == per.idPerVent).ToList().First();
                                    //la venta x funcion requerida
                                    VentasXFuncion vf = new VentasXFuncion();
                                    //si ya existe una venta x funcion de esta venta
                                    if (context.VentasXFuncion.Any(c => c.codVen == ve.codVen && c.codFuncion == paquete.idFuncion))
                                    {
                                        vf = context.VentasXFuncion.Where(c => c.codVen == ve.codVen && c.codFuncion == paquete.idFuncion).First();
                                        vf.cantEntradas += paquete.cantidad;
                                        vf.subtotal += paquete.cantidad * pr.precio;
                                        float? porcDescuento = 0;
                                        //default es para pago mixto
                                        vf.descuento += (int)model.Descuento;
                                        //vuelvo a modificar los descuentos si es tarjeta o efectivo
                                        if (ve.modalidad == "T")
                                        {
                                            if (model.idPromociones[w] != -1)
                                            {
                                                int idPromocion = model.idPromociones[w];
                                                Promociones promocion = context.Promociones.Where(c => c.codPromo == idPromocion && c.codEvento == paquete.idEvento).First();
                                                porcDescuento = promocion.descuento / 100;
                                            }
                                            vf.descuento = (int?)(vf.subtotal * porcDescuento);
                                        }
                                        if (ve.modalidad == "E")
                                        {
                                            vf.descuento = (int?)model.Descuento;
                                        }
                                        vf.total += vf.subtotal - vf.descuento;
                                    }
                                    else
                                    {
                                        //creo una nueva ventaxfuncion
                                        vf.codVen = ve.codVen;
                                        vf.cantEntradas = paquete.cantidad;
                                        vf.codFuncion = paquete.idFuncion;
                                        vf.Ventas = ve;
                                        vf.Funcion = context.Funcion.Find(paquete.idFuncion);
                                        vf.hanEntregado = false;
                                        vf.subtotal = paquete.cantidad * pr.precio;
                                        float? porcDescuento = 0;
                                        //default es para pago mixto
                                        vf.descuento = (int)model.Descuento;
                                        //solo registro la promocion si es una venta solo con tarjeta o solo con efectivo
                                        if (ve.modalidad == "T")
                                        {
                                            if (model.idPromociones[w] != -1)
                                            {
                                                int idPromocion = model.idPromociones[w];
                                                Promociones promocion = context.Promociones.Where(c => c.codPromo == idPromocion && c.codEvento == paquete.idEvento).First();
                                                porcDescuento = promocion.descuento / 100;
                                            }
                                            vf.descuento = (int?)(vf.subtotal * porcDescuento);
                                        }
                                        if (ve.modalidad == "E")
                                        {
                                            vf.descuento = (int?)model.Descuento;
                                        }
                                        vf.total = vf.subtotal - vf.descuento;
                                        context.VentasXFuncion.Add(vf);
                                    }
                                    context.SaveChanges();
                                    //detalle de venta
                                    DetalleVenta dt = new DetalleVenta();
                                    dt.cantEntradas = paquete.cantidad;
                                    dt.codFuncion = paquete.idFuncion;
                                    dt.codPrecE = pr.codPrecioEvento;
                                    dt.total = vf.total;
                                    dt.entradasDev = 0;
                                    dt.descTot = vf.descuento;
                                    dt.codVen = vf.codVen;
                                    context.DetalleVenta.Add(dt);
                                    if (paquete.filas != null && paquete.filas.Count > 0) paquete.tieneAsientos = true;
                                    //actualizo el mondo adeudado
                                    Eventos evento = context.Eventos.Find(paquete.idEvento);
                                    evento.monto_adeudado += (double)(paquete.cantidad * pr.precio * evento.porccomision / 100 + evento.montoFijoVentaEntrada);
                                    context.SaveChanges();
                                    //si tengo asientos, actualizo los asientos a ocupado
                                    if (paquete.tieneAsientos)
                                    {
                                        for (int i = 0; i < paquete.cantidad; i++)
                                        {
                                            int col = paquete.columnas[i];
                                            int fil = paquete.filas[i];
                                            List<Asientos> listasiento = context.Asientos.Where(x => x.codZona == paquete.idZona && x.fila == fil && x.columna == col).ToList();
                                            AsientosXFuncion actAsiento = context.AsientosXFuncion.Find(listasiento.First().codAsiento, paquete.idFuncion);
                                            if (actAsiento.estado != "libre")
                                            {
                                                throw new OptimisticConcurrencyException();
                                            }
                                            actAsiento.estado = MagicHelpers.Ocupado;
                                            actAsiento.codDetalleVenta = dt.codDetalleVenta;
                                            actAsiento.PrecioPagado = pr.precio;
                                        }
                                    }
                                    else
                                    {
                                        //si no tiene asientos es una zonax funcion
                                        ZonaxFuncion ZXF = context.ZonaxFuncion.Find(paquete.idFuncion, paquete.idZona);
                                        if (ZXF.cantLibres < paquete.cantidad)
                                        {
                                            //genero una exception para detener la compra?
                                            throw new OptimisticConcurrencyException();
                                        }
                                        else
                                            ZXF.cantLibres -= paquete.cantidad;
                                    }
                                    try
                                    {
                                        CuentaUsuario dbCuenta = context.CuentaUsuario.Find(cuenta.correo);
                                        dbCuenta.puntos += context.Eventos.Find(paquete.idEvento).puntosAlCliente * paquete.cantidad;
                                    }
                                    catch (Exception ex)
                                    {
                                        //usuario anonimo
                                    }

                                }
                                context.SaveChanges();
                            }
                            catch (OptimisticConcurrencyException ex)
                            {
                                //hubo un problema con la compra, remuevo el item
                                if (idVenta != 0)
                                {
                                    context.Dispose();
                                    Ventas remover = db.Ventas.Find(idVenta);
                                    db.Ventas.Remove(remover);
                                    db.SaveChanges();
                                }
                                TempData["tipo"] = "alert alert-warning";
                                TempData["message"] = "Error en la venta.";
                                return RedirectToAction("CarritoVentas");
                            }
                        }
                        TempData["tipo"] = "alert alert-success";
                        TempData["message"] = "Venta Realizada";
                        //si toda la compra se procesa de manera correcta eliminamos los session
                        Session["CarritoItemVentas"] = null;
                        Session["CarritoVendedor"] = null;
                        //enviamos un correo al cliente que lo compro - no funcionara con un anonimo
                        EmailController.EnviarCorreoCompra(idVenta, cuenta.correo);
                        return RedirectToAction("Index2", "Home");
                    }
                }
                //saco el carrito del session
                List<CarritoItem> carrito2 = (List<CarritoItem>)Session["CarritoItemVentas"];
                //lista de bancos
                List<Banco> bancos = db.Banco.ToList();
                ViewBag.Bancos = new SelectList(bancos, "codigo", "nombre");
                //lista de tarjetas
                List<TipoTarjeta> tipoTarjeta = db.TipoTarjeta.ToList();
                ViewBag.TipoTarjeta = new SelectList(tipoTarjeta, "idTipoTar", "nombre");
                List<Promociones> listaPromociones = new List<Promociones>();
                List<Promociones> listaPromocionesEfectivo = new List<Promociones>();
                double total = 0;
                double descuento = 0;
                double? descuentoE = 0;
                foreach (CarritoItem item in carrito2)
                {
                    total += item.precio;
                    Promociones promocion = PromocionController.CalculaMejorPromocionTarjeta(item.idEvento, bancos.First().codigo, tipoTarjeta.First().idTipoTar);
                    if (promocion == null)
                    {
                        Promociones dummy = new Promociones();
                        dummy.codPromo = -1;
                        listaPromociones.Add(dummy);
                    }
                    else
                    {
                        descuento += item.precio * promocion.descuento.Value / 100;
                        listaPromociones.Add(promocion);
                    }
                    promocion = PromocionController.CalculaMejorPromocionEfectivo(item.idEvento);
                    if (promocion != null)
                    {
                        if (item.cantidad >= promocion.cantAdq)
                        {
                            descuentoE += 1.0 * promocion.cantAdq * (item.precio / item.cantidad) * (1 - (promocion.cantComp.Value * 1.0 / promocion.cantAdq.Value));
                            listaPromocionesEfectivo.Add(promocion);
                        }
                        else
                        {
                            Promociones dummy = new Promociones();
                            dummy.codPromo = -1;
                            listaPromocionesEfectivo.Add(dummy);
                        }
                    }
                    else
                    {
                        Promociones dummy = new Promociones();
                        dummy.codPromo = -1;
                        listaPromocionesEfectivo.Add(dummy);
                    }
                }
                ViewBag.PromocionesEfectivo = listaPromocionesEfectivo;
                ViewBag.Promociones = listaPromociones;
                ViewBag.Funciones = model.idFunciones;
                ViewBag.Total = total;
                //efectivo
                if (model.MontoTar == 0 && model.MontoEfe >= 0 && model.MontoDolares >= 0)
                {
                    ViewBag.DescuentoE = model.Descuento;
                    ViewBag.MontoPagarE = model.MontoPagar;
                    ViewBag.MontoSE = model.MontoEfe;
                    ViewBag.MontoDE = model.MontoDolares;
                    ViewBag.VueltoE = model.Vuelto;
                    //tarjeta
                    ViewBag.Descuento = descuento;
                    ViewBag.MontoPagarT = total - descuento;
                    ViewBag.MontoTarjeta = total - descuento;
                    //mixto
                    ViewBag.MontoPagarM = total;
                    ViewBag.MontoSM = 0;
                    ViewBag.MontoDM = 0;
                    ViewBag.MontoTarjetaM = 0;
                    ViewBag.VueltoM = 0;
                    model.modalidad = 1;
                }
                //tarjeta
                if (model.MontoTar > 0 && model.MontoEfe == 0 && model.MontoDolares == 0)
                {
                    ViewBag.DescuentoE = descuentoE;
                    ViewBag.MontoPagarE = total - descuentoE;
                    ViewBag.MontoSE = 0;
                    ViewBag.MontoDE = 0;
                    ViewBag.VueltoE = 0;
                    //tarjeta
                    ViewBag.Descuento = model.Descuento;
                    ViewBag.MontoPagarT = model.MontoPagar;
                    ViewBag.MontoTarjeta = model.MontoTar;
                    //mixto
                    ViewBag.MontoPagarM = total;
                    ViewBag.MontoSM = 0;
                    ViewBag.MontoDM = 0;
                    ViewBag.MontoTarjetaM = 0;
                    ViewBag.VueltoM = 0;
                    model.modalidad = 2;
                }

                if (model.MontoTar >= 0 && model.MontoEfe >= 0 && model.MontoDolares >= 0)
                {
                    ViewBag.DescuentoE = descuentoE;
                    ViewBag.MontoPagarE = total - descuentoE;
                    ViewBag.MontoSE = 0;
                    ViewBag.MontoDE = 0;
                    ViewBag.VueltoE = 0;
                    //tarjeta
                    ViewBag.Descuento = descuento;
                    ViewBag.MontoPagarT = total - descuento;
                    ViewBag.MontoTarjeta = total - descuento;
                    //mixto
                    ViewBag.MontoPagarM = model.MontoPagar;
                    ViewBag.MontoSM = model.MontoEfe;
                    ViewBag.MontoDM = model.MontoDolares;
                    ViewBag.MontoTarjetaM = model.MontoTar;
                    ViewBag.VueltoM = model.Vuelto;
                    model.modalidad = 3;
                }
                ViewBag.Mes = Fechas.Mes();
                ViewBag.AnVen = Fechas.Anio();
                return View(model);
            }
            TempData["tipo"] = "alert alert-warning";
            TempData["message"] = "No hay items en el carrito.";
            return RedirectToAction("CarritoVentas");
        }
 private bool validacionVenta(VenderEntradaModel model)
 {
     bool indicador = true;
     Politicas montoMinTarjeta = db.Politicas.Find(3);
     double montoMin = montoMinTarjeta.valor.Value;
     //si se utiliza tarjeta, tiene que ser mayor al monto minimo segun las politicas
     if (model.MontoTar == 0) return true;
     if (model.MontoTar >= montoMin)
     {
         //usa tarjeta, verificar que hayan datos de la tarjeta
         if (String.IsNullOrEmpty(model.NumeroTarjeta))
         {//reviso si no hay una tarjeta seleccionadad
             ModelState.AddModelError("NumeroTarjeta", "El campo Nro. de Tarjeta: es obligatorio.");
             indicador = false;
         }
         else
         {//si hay una tarjeta tengo que ver si pertenece al banco
             ComprarEntradaModel compra = new ComprarEntradaModel();
             compra.idBanco = (int)model.idBanco;
             compra.NumeroTarjeta = model.NumeroTarjeta;
             compra.Mes = model.Mes;
             compra.AnioVen = model.AnioVen;
             indicador = ValidacionesCompra(compra);
         }
         if (String.IsNullOrEmpty(model.CodCcv))
         {//reviso si no hay codigo ccv
             ModelState.AddModelError("CodCcv", "El campo CCV: es obligatorio.");
             indicador = false;
         }
     }
     else
     {
         TempData["tipo"] = "alert alert-warning";
         TempData["message"] = "Se debe pagar como mínimo " + montoMin + " soles.";
         indicador = false;
     }
     return indicador;
 }
        public ActionResult VenderEntrada()
        {
            if (Session["CarritoItemVentas"] != null)
            {
                //saco el carrito del session
                List<CarritoItem> carrito = (List<CarritoItem>)Session["CarritoItemVentas"];
                if (carrito.Count != 0)
                {
                    //lista de bancos
                    List<Banco> bancos = db.Banco.ToList();
                    ViewBag.Bancos = new SelectList(bancos, "codigo", "nombre");
                    //lista de tarjetas
                    List<TipoTarjeta> tipoTarjeta = db.TipoTarjeta.ToList();
                    ViewBag.TipoTarjeta = new SelectList(tipoTarjeta, "idTipoTar", "nombre");
                    List<Promociones> listaPromociones = new List<Promociones>();
                    List<Promociones> listaPromocionesEfectivo = new List<Promociones>();
                    List<int> idFunciones = new List<int>();
                    double total = 0;
                    double? descuento = 0;
                    double? descuentoE = 0;
                    foreach (CarritoItem item in carrito)
                    {
                        idFunciones.Add(item.idFuncion);
                        total += item.precio;
                        Promociones promocion = PromocionController.CalculaMejorPromocionTarjeta(item.idEvento, bancos.First().codigo, tipoTarjeta.First().idTipoTar);
                        if (promocion == null)
                        {
                            Promociones dummy = new Promociones();
                            dummy.codPromo = -1;
                            listaPromociones.Add(dummy);
                        }
                        else
                        {
                            descuento += item.precio * promocion.descuento.Value / 100;
                            listaPromociones.Add(promocion);
                        }
                        promocion = PromocionController.CalculaMejorPromocionEfectivo(item.idEvento);
                        if (promocion != null)
                        {
                            if (item.cantidad >= promocion.cantAdq)
                            {
                                descuentoE += 1.0 * promocion.cantAdq * (item.precio / item.cantidad) * (1 - (promocion.cantComp.Value * 1.0 / promocion.cantAdq.Value));
                                listaPromocionesEfectivo.Add(promocion);
                            }
                            else
                            {
                                Promociones dummy = new Promociones();
                                dummy.codPromo = -1;
                                listaPromocionesEfectivo.Add(dummy);
                            }
                        }
                        else
                        {
                            Promociones dummy = new Promociones();
                            dummy.codPromo = -1;
                            listaPromocionesEfectivo.Add(dummy);
                        }

                    }
                    ViewBag.Total = total;
                    ViewBag.Funciones = idFunciones;
                    //efectivo
                    ViewBag.DescuentoE = descuentoE;
                    ViewBag.MontoPagarE = total - descuentoE;
                    ViewBag.MontoSE = 0;
                    ViewBag.MontoDE = 0;
                    ViewBag.VueltoE = 0;
                    //tarjeta
                    ViewBag.Descuento = descuento;
                    ViewBag.MontoPagarT = total - descuento;
                    ViewBag.MontoTarjeta = total - descuento;
                    //mixto
                    ViewBag.MontoPagarM = total;
                    ViewBag.MontoSM = 0;
                    ViewBag.MontoDM = 0;
                    ViewBag.MontoTarjetaM = 0;
                    ViewBag.VueltoM = 0;
                    ViewBag.PromocionesEfectivo = listaPromocionesEfectivo;
                    ViewBag.Promociones = listaPromociones;
                    ViewBag.Mes = Fechas.Mes();
                    ViewBag.AnVen = Fechas.Anio();
                    VenderEntradaModel model = new VenderEntradaModel();
                    model.modalidad = 1;
                    return View(model);
                }
            }
            TempData["tipo"] = "alert alert-warning";
            TempData["message"] = "No hay items en el carrito.";
            return RedirectToAction("CarritoVentas");
        }