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;
 }
 private bool ValidacionesCompra(ComprarEntradaModel model)
 {
     bool ind = true;
     //Verficar que la tarjeta pertenezca al banco
     Banco banco = db.Banco.Find(model.idBanco);
     string identificador = "" + banco.identificador;
     string tarjeta = model.NumeroTarjeta;
     string comparador = tarjeta.Substring(0, identificador.Length);
     int pertenece = comparador.CompareTo(identificador);
     if (pertenece != 0)
     {
         ind = false;
         ModelState.AddModelError("NumeroTarjeta", "El numero de tarjeta no pertenece al banco indicado.");
     }
     //verificar que no haya vencido la tarjeta
     int mes = model.Mes;
     int anio = model.AnioVen;
     DateTime hoy = DateTime.Today;
     if ((mes < hoy.Month && anio == hoy.Year))
     {
         ind = false;
         ModelState.AddModelError("AnioVen", "La tarjeta ya venció.");
     }
     return ind;
 }
        public ActionResult ComprarEntrada(ComprarEntradaModel model)
        {
            if (ModelState.IsValid)
            {
                if (ValidacionesCompra(model))
                {
                    int idVenta = 0;
                    DateTime hoy = DateTime.Today;
                    CuentaUsuario cuenta = new CuentaUsuario();
                    using (var context = new inf245netsoft())
                    {
                        try
                        {
                            List<CarritoItem> carrito = (List<CarritoItem>)Session["CarritoItem"];
                            Ventas ve = new Ventas();
                            int cantidadEntradasTotales = carrito.Sum(c => c.cantidad);

                            if (Session["UsuarioLogueado"] != null)
                            {
                                cuenta = (CuentaUsuario)Session["UsuarioLogueado"];
                                ve.CuentaUsuario = context.CuentaUsuario.Find(cuenta.usuario);
                                ve.cliente = cuenta.usuario;
                            }
                            else
                            {
                                ve.CuentaUsuario = context.CuentaUsuario.Find(MagicHelpers.AnonimoUniversal);
                                ve.cliente = model.Nombre;
                            }
                            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.codDoc = model.Dni;
                            //--
                            ve.Estado = MagicHelpers.Compra;
                            ve.tipoDoc = 1;
                            ve.montoCreditoSoles = model.MontoPagar;
                            ve.montoDev = 0;
                            ve.montoEfectivoDolares = 0;
                            ve.montoEfectivoSoles = 0;
                            ve.MontoTotalSoles = model.MontoPagar;
                            ve.entradasDev = 0;
                            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;
                                    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);
                                    vf.total += paquete.cantidad * pr.precio - 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;
                                    float? porcDescuento = 0;
                                    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.subtotal = paquete.cantidad * pr.precio;
                                    vf.descuento = (int?)(vf.subtotal * porcDescuento);
                                    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;
                                }
                                if (User.Identity.IsAuthenticated)
                                {//si es u usuario registrado le aumento los puntos que tiene
                                    try
                                    {
                                        CuentaUsuario dbCuenta = context.CuentaUsuario.Find(cuenta.correo);
                                        dbCuenta.puntos += context.Eventos.Find(paquete.idEvento).puntosAlCliente * paquete.cantidad;
                                    }
                                    catch (Exception ex)
                                    {
                                        //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 compra.";
                            return RedirectToAction("MiCarrito");
                        }
                    }
                    TempData["tipo"] = "alert alert-success";
                    TempData["message"] = "Compra Realizada. Muchas Gracias.";
                    //si toda la compra se procesa de manera correcta eliminamos los session
                    Session["CarritoItem"] = null;
                    Session["Carrito"] = null;
                    if (Request.IsAuthenticated)
                    {
                        EmailController.EnviarCorreoCompra(idVenta, User.Identity.Name);
                    }
                    return RedirectToAction("Index", "Home");
                }
            }
            //saco el carrito del session
            List<CarritoItem> carrito2 = (List<CarritoItem>)Session["CarritoItem"];
            //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>();
            double total = 0;
            double descuento = 0;
            foreach (CarritoItem item in carrito2)
            {
                total += item.precio;
                Promociones promocion = PromocionController.CalculaMejorPromocionTarjeta(item.idEvento, model.idBanco, model.idTipoTarjeta);
                if (promocion == null)
                {
                    Promociones dummy = new Promociones();
                    dummy.codPromo = -1;
                    listaPromociones.Add(dummy);
                }
                else
                {
                    descuento += item.precio * promocion.descuento.Value / 100;
                    listaPromociones.Add(promocion);
                }
            }
            ViewBag.Descuento = descuento;
            ViewBag.Promociones = listaPromociones;
            ViewBag.Total = total;
            ViewBag.Pagar = total - descuento;
            ViewBag.Mes = Fechas.Mes();
            ViewBag.AnVen = Fechas.Anio();
            return View(model);
        }
 private bool ValidacionesCompra(ComprarEntradaModel model)
 {
     bool ind = true;
     //Verficar que la tarjeta pertenezca al banco
     Banco banco = db.Banco.Find(model.idBanco);
     //
     Politicas montoMinTarjeta = db.Politicas.Find(3);
     double montoMin = montoMinTarjeta.valor.Value;
     //
     if (model.MontoPagar < montoMin)
     {
         TempData["tipo"] = "alert alert-warning";
         TempData["message"] = "Se debe pagar como mínimo " + montoMin + " soles.";
         return false;
     }
     string identificador = "" + banco.identificador;
     string tarjeta = model.NumeroTarjeta;
     string comparador = tarjeta.Substring(0, identificador.Length);
     int pertenece = comparador.CompareTo(identificador);
     if (pertenece != 0)
     {
         ind = false;
         ModelState.AddModelError("NumeroTarjeta", "El numero de tarjeta no pertenece al banco indicado.");
     }
     //verificar que no haya vencido la tarjeta
     int mes = model.Mes;
     int anio = model.AnioVen;
     DateTime hoy = DateTime.Today;
     if ((mes < hoy.Month && anio == hoy.Year))
     {
         ind = false;
         ModelState.AddModelError("AnioVen", "La tarjeta ya venció.");
     }
     return ind;
 }
        public ActionResult PagarReserva(ComprarEntradaModel model)
        {
            if (ModelState.IsValid)
            {
                if (ValidacionesCompra(model))
                {
                    Ventas venta = db.Ventas.Find(model.idVenta);
                    venta.montoEfectivoSoles = 0;
                    venta.montoEfectivoDolares = 0;
                    venta.montoCreditoSoles = model.MontoPagar;
                    venta.MontoTotalSoles = model.MontoPagar;
                    venta.montoDev = 0;
                    venta.Estado = MagicHelpers.Compra;
                    venta.entradasDev = 0;
                    venta.modalidad = "T";
                    venta.fecha = DateTime.Now;
                    VentasXFuncion vxf = db.VentasXFuncion.Where(c => c.codVen == venta.codVen).First();
                    vxf.montoDev = 0;
                    vxf.cantEntradas = venta.cantAsientos.Value;
                    vxf.hanEntregado = false;
                    vxf.descuento = (int)model.Descuento;
                    vxf.subtotal = model.Importe;
                    vxf.total = vxf.subtotal - vxf.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();
                    detalle.descTot = (int)model.Descuento;
                    detalle.entradasDev = 0;
                    detalle.montoDev = 0;
                    detalle.Subtotal = model.Importe;
                    detalle.total = model.MontoPagar - model.Descuento;
                    evento.monto_adeudado += evento.montoFijoVentaEntrada.Value + evento.porccomision.Value * detalle.cantEntradas.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;
                        }
                    }
                    CuentaUsuario cuenta = db.CuentaUsuario.Find(User.Identity.Name);
                    cuenta.puntos += db.Eventos.Find(vxf.Funcion.codEvento).puntosAlCliente * (int)detalle.cantEntradas;
                    try
                    {
                        db.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                        TempData["tipo"] = "alert alert-warning";
                        TempData["message"] = "Error en el pago.";
                        return RedirectToAction("MiCuenta");
                    }
                    TempData["tipo"] = "alert alert-success";
                    TempData["message"] = "Reserva Pagada. Muchas Gracias.";

                    EmailController.EnviarCorreoCompra(model.idVenta, User.Identity.Name);
                    return RedirectToAction("MiCuenta");
                }
            }
            Ventas venta2 = db.Ventas.Where(c => c.codVen == model.idVenta).First();
            //sacamos el detalle de venta
            VentasXFuncion vxf2 = db.VentasXFuncion.Where(c => c.codVen == model.idVenta).First();
            //llenamos el model
            model.Importe = (double)vxf2.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);
            //Vemos el descuento del evento
            int codEvento = vxf2.Funcion.codEvento;
            model.idEventos = new List<int>();
            model.idPromociones = new List<int>();
            model.idEventos.Add(codEvento);
            Promociones promocion = PromocionController.CalculaMejorPromocionTarjeta(codEvento, model.idBanco, model.idTipoTarjeta);
            if (promocion == null)
            {
                model.Descuento = 0;
                model.idPromociones.Add(-1);
            }
            else
            {
                model.Descuento = promocion.descuento.Value * model.Importe / 100;
                model.idPromociones.Add(promocion.codPromo);
            }
            ViewBag.Promociones = promocion;
            model.MontoPagar = (double)vxf2.total - model.Descuento;
            ViewBag.Mes = Fechas.Mes();
            ViewBag.AnVen = Fechas.Anio();
            return View(model);
        }
        public ActionResult PagarReserva(string reserva)
        {
            //model
            ComprarEntradaModel model = new ComprarEntradaModel();
            //venta involucrada
            int codVenta = int.Parse(reserva);
            Ventas venta = db.Ventas.Where(c => c.codVen == codVenta).First();
            //sacamos el detalle de venta
            VentasXFuncion vxf = db.VentasXFuncion.Where(c => c.codVen == codVenta).First();
            //llenamos el model
            model.Importe = (double)vxf.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");
            //Vemos el descuento del evento
            int codEvento = vxf.Funcion.codEvento;
            model.idEventos = new List<int>();
            model.idPromociones = new List<int>();
            model.idEventos.Add(codEvento);
            Promociones promocion = PromocionController.CalculaMejorPromocionTarjeta(codEvento, bancos.First().codigo, tipoTarjeta.First().idTipoTar);
            if (promocion == null)
            {
                model.Descuento = 0;
                model.idPromociones.Add(-1);
            }
            else
            {
                model.Descuento = promocion.descuento.Value * model.Importe / 100;
                model.idPromociones.Add(promocion.codPromo);
            }
            ViewBag.Promociones = promocion;
            model.MontoPagar = (double)vxf.total - model.Descuento;
            model.idVenta = codVenta;
            ViewBag.Mes = Fechas.Mes();
            ViewBag.AnVen = Fechas.Anio();

            //destacados
            List<Eventos> listaDestacados = new List<Eventos>(0);
            try
            {
                listaDestacados = db.Eventos.AsNoTracking().Where(c => (c.ImagenDestacado != null && c.estado != null && c.estado.CompareTo("Activo") == 0)).ToList();
            }
            catch (Exception ex)
            {

            }
            ViewBag.ListaDestacados = listaDestacados;            
            return View(model);
        }