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); }