Exemplo n.º 1
0
 private bool verificaSiCompra(List<int> idFunciones, string cliente)
 {
     bool ind = true;
     CuentaUsuario cuenta = new CuentaUsuario();
     try
     {//si es un usuario registrado busco la cuenta y la asigno luego a la venta
         cuenta = db.CuentaUsuario.Where(c => c.codDoc.CompareTo(cliente) == 0).First();
         for (int i = 0; i < idFunciones.Count; i++)
         {
             List<VentasXFuncion> listVXF = db.VentasXFuncion.Where(x => x.codFuncion == idFunciones[i]).ToList();
             Funcion funcion = db.Funcion.Find(idFunciones[i]);
             int limEntradas = funcion.Eventos.maxReservas;
             int actualEntradas = 0;
             foreach (VentasXFuncion VXF in listVXF)
             {
                 if (VXF.Ventas.codDoc.CompareTo(cuenta.codDoc) == 0)
                 {
                     actualEntradas += VXF.cantEntradas;
                 }
             }
             if (actualEntradas > limEntradas)
             {
                 ind = false;
             }
         }
     }
     catch (Exception ex)
     {
         //por que es un comprador anonimo
         return ind;
     }
     return ind;
 }
Exemplo n.º 2
0
        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");
        }
Exemplo n.º 3
0
        public async Task<ActionResult> RegisterClient(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                int errorr = 0;
                if (model.tipoDoc == 1)
                {
                    if (model.codDoc.Length != 8)
                    {
                        ModelState.AddModelError("codDoc", "El DNI debe tener 8 dígitos");
                        errorr = 1;
                    }
                    List<CuentaUsuario> lcu = db.CuentaUsuario.Where(c => c.tipoDoc == model.tipoDoc && c.codDoc == model.codDoc).ToList();
                    if (lcu.Count > 0)
                    {
                        ModelState.AddModelError("codDoc", "DNI ya utilizado");
                        errorr = 1;
                    }
                    if (model.fechaNac > DateTime.Today || model.fechaNac < Convert.ToDateTime("01/01/1900"))
                    {
                        ModelState.AddModelError("fechaNac", "La fecha con rango inválido");
                        errorr = 1;
                    }
                }
                else
                {
                    if (model.codDoc.Length != 12)
                    {
                        ModelState.AddModelError("codDoc", "El Pasaporte debe tener 12 dígitos");
                        errorr = 1;
                    }
                    List<CuentaUsuario> lcu = db.CuentaUsuario.Where(c => c.tipoDoc == model.tipoDoc && c.codDoc == model.codDoc).ToList();
                    if (lcu.Count > 0)
                    {
                        ModelState.AddModelError("codDoc", "Pasaporte ya utilizado");
                        errorr = 1;
                    }
                    if (model.fechaNac > DateTime.Today || model.fechaNac < Convert.ToDateTime("01/01/1900"))
                    {
                        ModelState.AddModelError("fechaNac", "La fecha con rango inválido");
                        errorr = 1;
                    }
                }

                if (errorr != 1)
                {
                    var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
                    var result = await UserManager.CreateAsync(user, model.Password);
                    if (result.Succeeded)
                    {
                        var currentUser = UserManager.FindByName(user.UserName);
                        UserManager.AddToRole(user.Id, "Cliente");
                        CuentaUsuario cuentausuario = new CuentaUsuario();

                        cuentausuario.correo = model.Email;
                        cuentausuario.apellido = model.apellido;
                        cuentausuario.codDoc = model.codDoc;
                        cuentausuario.codPerfil = 1;
                        cuentausuario.contrasena = model.Password;
                        cuentausuario.direccion = model.direccion;
                        cuentausuario.estado = true;
                        cuentausuario.fechaNac = model.fechaNac;
                        cuentausuario.nombre = model.nombre;
                        cuentausuario.puntos = 0;
                        cuentausuario.sexo = model.sexo;
                        cuentausuario.telefono = model.telefono;
                        cuentausuario.telMovil = model.telMovil;
                        cuentausuario.tipoDoc = model.tipoDoc;
                        cuentausuario.usuario = model.Email;

                        db.CuentaUsuario.Add(cuentausuario);
                        db.SaveChanges();
                        Session["UsuarioLogueado"] = cuentausuario;
                        EmailController.EnviarCorreoRegistro(model.Email);
                        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);

                        // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
                        // Send an email with this link
                        // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                        // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                        // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");
                        TempData["tipo"] = "alert alert-success";
                        TempData["message"] = "Registro Exitoso!";
                        return RedirectToAction("Index", "Home");
                        //return View("~/Views/Home/Index.cshtml");
                    }

                    foreach (var error in result.Errors)
                    {
                        if (!error.Contains("nombre"))
                            ModelState.AddModelError("", error);
                    }
                }
                else
                    return View(model);

            }
            // If we got this far, something failed, redisplay form
            return View(model);
        }
Exemplo n.º 4
0
        public async Task<ActionResult> RegisterPromotor(RegisterViewModel model)
        {
            CuentaUsuario cue = null;
            cue = db.CuentaUsuario.Find(model.Email);
            if (cue != null)
            {
                TempData["MessageErrorPromotor"] = "Ya existe una cuenta con ese correo";
                return RedirectToAction("Index", "Empleado");
            }
            List<CuentaUsuario> lcu = db.CuentaUsuario.Where(c => c.tipoDoc == model.tipoDoc && c.codDoc == model.codDoc).ToList();
            if (lcu == null || lcu.Count > 0)
            {
                TempData["MessageErrorPromotor"] = "Ya existe un cuenta registrada con ese DNI";
                return RedirectToAction("Index", "Empleado");
            }
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
                var result = await UserManager.CreateAsync(user, model.Password);

                if (result.Succeeded)
                {
                    var currentUser = UserManager.FindByName(user.UserName);
                    UserManager.AddToRole(user.Id, "Promotor");
                    CuentaUsuario cuentausuario = new CuentaUsuario();

                    cuentausuario.correo = model.Email;
                    cuentausuario.apellido = model.apellido;
                    cuentausuario.codDoc = model.codDoc;
                    cuentausuario.codPerfil = 3;
                    //cuentausuario.contrasena = user.PasswordHash;
                    cuentausuario.direccion = model.direccion;
                    cuentausuario.estado = true;
                    cuentausuario.fechaNac = model.fechaNac;
                    cuentausuario.nombre = model.nombre;
                    cuentausuario.puntos = 0;
                    cuentausuario.sexo = model.sexo;
                    cuentausuario.telefono = model.telefono;
                    cuentausuario.telMovil = model.telMovil;
                    cuentausuario.tipoDoc = model.tipoDoc;
                    cuentausuario.usuario = model.Email;
                    db.CuentaUsuario.Add(cuentausuario);
                    db.SaveChanges();
                    // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
                    // Send an email with this link
                    // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                    // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                    // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");
                    return RedirectToAction("Index", "Empleado");
                    //return View("~/Views/Home/Index.cshtml");
                }
                AddErrors(result);
            }
            // If we got this far, something failed, redisplay form
            return RedirectToAction("Index", "Empleado");
        }
        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);
        }