public ViewResult Buy(IEnumerable<PaqueteVM> model)
        {
            Succeed = false;
            var selected = model.Where(x => x.Selected);
            EstadoCuentaBR estadoCuentaBR = new EstadoCuentaBR(repository.context);
            var saldos = estadoCuentaBR.GetSaldosPagoServicio(PayCenterId);
            ViewData["Eventos"] = saldos.EventosDisponibles;
            ViewData["SaldoActual"] = saldos.SaldoDisponible.ToString("C");
            if (selected.Count() == 0)
            {
                AddValidationMessage(enumMessageType.BRException, "No ha seleccionado ningún paquete");
                return View(model);
            }

            decimal totalCompra = 0;
            foreach (var paquete in selected)
            {
                var precioPaquete = repository.GetPrecioByPaqueteId(paquete.PaqueteId);
                totalCompra += precioPaquete;
            }
            if (saldos.SaldoDisponible < totalCompra)
            {
                AddValidationMessage(enumMessageType.BRException, "No cuenta con saldo suficiente para comprar más paquetes");
                return View(model);
            }
            ViewData["TotalCompra"] = totalCompra.ToString("C");
            ViewData["EventosFinales"] = saldos.EventosDisponibles + selected.Sum(x=>x.Creditos);
            ViewData["SaldoActualFinal"] = (saldos.SaldoDisponible - selected.Sum(x => x.Precio)).ToString("C");
            return View("Confirm", selected);
        }
        public ViewResult Buy()
        {
            EstadoCuentaBR estadoCuenta = new EstadoCuentaBR();
            var saldos = estadoCuenta.GetSaldosPagoServicio(PayCenterId);
            ViewData["Eventos"] = saldos.EventosDisponibles;
            ViewData["SaldoActual"] = saldos.SaldoDisponible.ToString("C");

            return View(repository.ListAll().Select(x => new PaqueteVM { Creditos = x.Creditos, PaqueteId = x.PaqueteId, Precio = x.Precio }));
        }
        public ActionResult Create()
        {
            PagoVM pagoVM = new PagoVM();
            pagoVM.PayCenterId = PayCenterId;
            EstadoCuentaBR br = new EstadoCuentaBR();
            if (PayCenterId > 0)
            {
                var saldo = br.GetSaldosPagoServicio(PayCenterId);
                ViewData["Eventos"] = saldo.EventosDisponibles;
                ViewData["SaldoActual"] = saldo.SaldoActual.ToString("C");
                ViewData["SaldoDisponible"] = saldo.SaldoDisponible;
                ViewData["SaldoDisponibleString"] = saldo.SaldoDisponible.ToString("C");

                var comisionFinanciamiento = br.GetComisionFinanciamiento(PayCenterId);
                ViewData["Comision"] = comisionFinanciamiento.Comision;
                ViewData["ComisionString"] = comisionFinanciamiento.Comision.ToString("C");
                //Le resto lo que tiene como saldo negativo al máximo a financiar.
                ViewData["MaximoFinanciar"] = saldo.SaldoDisponible < 0 ? comisionFinanciamiento.Financiamiento + saldo.SaldoDisponible : comisionFinanciamiento.Financiamiento;
            }
            return View(pagoVM);
        }
        public ViewResult Details(EstadoCuentaVM  model)
        {
            var id = model.MovimientoId ;
            var action = model.CambioEstatusVM.Estatus;
            string comentario = model.CambioEstatusVM.Comentario != null ? model.CambioEstatusVM.Comentario.TrimEnd() : string.Empty ;
            AbonoRepository AbonoRepository;
            if (id > 0)
            {
                Movimiento Movimiento = repository.LoadById(id);
                if (Movimiento != null)
                {
                    AbonoRepository = new AbonoRepository(repository.context);//
                    Abono abono = AbonoRepository.LoadById(Movimiento.Id);
                    if (abono != null)
                    {
                        if (Movimiento.IsAbono)
                        {
                            enumEstatusMovimiento nuevoEstatus = (enumEstatusMovimiento)Movimiento.Status;
                            switch (action)
                            {
                                case "Cancelar":
                                    nuevoEstatus = enumEstatusMovimiento.Cancelado;
                                    break;
                                case "Aplicar":
                                    nuevoEstatus = enumEstatusMovimiento.Aplicado;
                                    break;
                                case "Rechazar":
                                    nuevoEstatus = enumEstatusMovimiento.Rechazado;
                                    break;
                            }

                            EstadoCuentaBR estadoCuentaBR = new EstadoCuentaBR(repository.context);

                          //  Movimiento.Status = (Int16)nuevoEstatus;
                            abono.Status = (Int16)nuevoEstatus;

                            estadoCuentaBR.ActualizarMovimiento(Movimiento.MovimientoId, nuevoEstatus, comentario);

                            this.Succeed = estadoCuentaBR.Succeed;
                            this.ValidationMessages = estadoCuentaBR.ValidationMessages;

                            if (Succeed)
                            {
                                Succeed= repository.Save();
                                if (Succeed)
                                {
                                    AddValidationMessage(enumMessageType.Succeed, "El movimiento ha sido " + nuevoEstatus.ToString() + " correctamente");
                                }
                                else
                                {
                                    //TODO: implemtar código que traiga mensajes del repositorio
                                }

                            }
                        }
                        else
                        {
                            //todo: Si no es abono que hacer?
                            AddValidationMessage(enumMessageType.BRException, "No hay lógica para modificar este movimiento");
                        }
                    }
                    else
                    {
                        AddValidationMessage(enumMessageType.BRException, "No se encontró el Abono.");
                    }

                }
                else
                {
                    AddValidationMessage(enumMessageType.BRException, "No se encontró el movimiento.");
                }

            }
            else
            {
                AddValidationMessage(enumMessageType.BRException , "El movimiento no es válido.");
            }

            model = FillEstadoDeCuentaVM(id);
            return View(model);
        }
        private SimpleGridResult<EstadoCuentaVM> getEstadoDeCuenta(ServiceParameterVM Parameters = null)
        {
            IEnumerable<SP_MovimientosSel_Result> movimientos;
            if (PayCenterId == 0)
            {
                //Le paso el 9 para que solome traiga el estado de cuenta de EvolucionaMovil
                movimientos = repository.GetMovimientosList(enumTipoCuenta.Pago_de_Servicios.GetHashCode(), ProveedorId: PROVEEDOR_EVOLUCIONAMOVIL);
            }
            else
            {
                //Julius:Comenté esta línea porque no filtraba solo los de Pago de servicios
                //movimientos = repository.GetMovimientosByPayCenterId(PayCenterId);
                //Le paso el 9 para que solome traiga el estado de cuenta de EvolucionaMovil
                movimientos = repository.GetMovimientosList(enumTipoCuenta.Pago_de_Servicios.GetHashCode(), PayCenterId, PROVEEDOR_EVOLUCIONAMOVIL);
            }

            SimpleGridResult<EstadoCuentaVM> simpleGridResult = new SimpleGridResult<EstadoCuentaVM>();
            var estadosDeCuentaVM = movimientos.Where(x =>
                    ( Parameters == null || (
                                (Parameters.fechaInicio == null || (Parameters.fechaInicio < x.FechaCreacion))
                        && (Parameters.fechaFin == null || Parameters.fechaFin > x.FechaCreacion)
                        && (Parameters.searchString == null || (x.UserName.ContainsInvariant(Parameters.searchString) || x.Clave.ContainsInvariant(Parameters.searchString) || ((enumMotivo)x.Motivo).ToString().ContainsInvariant(Parameters.searchString) || ((enumEstatusMovimiento)x.Status).ToString().ContainsInvariant(Parameters.searchString)))
                        //Se modificó el valor APLICADO por PROCESANDO, debido a que es mas conveniente y no necesita mayor cambio
                        && (Parameters.onlyAplicados?x.Status == enumEstatusMovimiento.Procesando.GetHashCode():true)
                        )
                    )
                ).Select(x => new EstadoCuentaVM
                {
                    PayCenterId = x.PayCenterId,
                    Motivo = ((enumMotivo)x.Motivo).ToString(),
                    CuentaId = x.CuentaId,
                    MovimientoId = x.MovimientoId,
                    Id = x.Id,
                    CuentaOrigenId = x.CuentaOrigenId,
                    Clave = x.Clave,
                    Comentarios =x.Comentarios,
                    Concepto = x.Concepto + " - " + ((enumMotivo)x.Motivo).ToString(),
                    Abono = x.IsAbono ? x.Monto.ToString("C2", ci) : string.Empty,
                    Cargo = !x.IsAbono ? x.Monto.ToString("C2", ci) : string.Empty,
                    Saldo = ((enumEstatusMovimiento)x.Status) == enumEstatusMovimiento.Procesando ||
                        ((enumEstatusMovimiento)x.Status) == enumEstatusMovimiento.Cancelado ||
                        !x.SaldoActual.HasValue ? "-" : ((decimal)x.SaldoActual).ToString("C2", ci),
                    FechaCreacion = x.FechaCreacion.GetCurrentTime().ToString(),
                    Status  = x.Status

                });

            if (PayCenterId > 0)
            {
                EstadoCuentaBR estadoCuentaBR = new EstadoCuentaBR();
                var saldos = estadoCuentaBR.GetSaldosPagoServicio(PayCenterId);
                //todo:Checar que tipo de saldo debo de mostrar
                ViewData["Eventos"] = saldos.EventosDisponibles;
                ViewData["SaldoActual"] = saldos.SaldoActual.ToString("C");
                ViewData["SaldoDisponible"] = saldos.SaldoDisponible.ToString("C");
            }
            if (Parameters != null)
            {
                simpleGridResult.CurrentPage = Parameters.pageNumber;
                simpleGridResult.PageSize = Parameters.pageSize;
                if (Parameters.pageSize > 0)
                {
                    var pageNumber = Parameters.pageNumber >= 0 ? Parameters.pageNumber : 0;
                    simpleGridResult.CurrentPage = pageNumber;
                    simpleGridResult.TotalRows = estadosDeCuentaVM.Count();
                    estadosDeCuentaVM = estadosDeCuentaVM.Skip(pageNumber * Parameters.pageSize).Take(Parameters.pageSize);
                }
            }
            simpleGridResult.Result = estadosDeCuentaVM;

            return simpleGridResult;
        }
        public ViewResult Confirm(IEnumerable<PaqueteVM> model)
        {
            Succeed = false;
            //TODO:Validar que tenga el saldo suficiente. Quiero agregar un campo al PayCenter para determinar su saldo sin tener que recalcularlo
            PaycenterBR payCenterBR = new PaycenterBR();
            var cuentaId = payCenterBR.GetOrCreateCuentaPayCenter(PayCenterId, enumTipoCuenta.Pago_de_Servicios, PROVEEDOR_EVOLUCIONAMOVIL);

            EstadoCuentaBR estadoCuentaBR = new EstadoCuentaBR(repository.context);
            decimal totalCompra = 0;
            List<CompraEvento> paquetesComprados = new List<CompraEvento>();
            foreach (var paquete in model)
            {
                //TODO:Esta validación debería estar en un BR aparte
                var p = repository.LoadById(paquete.PaqueteId);
                if (p == null)
                {
                    AddValidationMessage(enumMessageType.BRException, "No se ha encontrado el paquete de " + paquete.Creditos.ToString() + "créditos");
                    break;
                }
                if (p.FechaVencimiento >= DateTime.UtcNow.GetCurrentTime())
                {
                    totalCompra += p.Creditos;
                    CompraEvento compraEvento = new CompraEvento
                    {
                        Consumidos = 0,
                        Eventos = p.Creditos,
                        FechaCreacion = DateTime.UtcNow.GetCurrentTime(),
                        Monto = p.Precio,
                        PaqueteId = p.PaqueteId,
                        PayCenterId = PayCenterId
                    };
                    //Agrego a la lista de paquetes que se van a agregar
                    paquetesComprados.Add(compraEvento);

                    //Agrego al repositorio
                    repository.Add(compraEvento);
                    var movimiento = estadoCuentaBR.CrearMovimiento(PayCenterId, enumTipoMovimiento.Cargo, 0, cuentaId, p.Precio, enumMotivo.Compra, PayCenterName, enumEstatusMovimiento.Aplicado);

                    //Agrego movimiento de abono para la empresa
                    //TODO: ESTO DEBE DE IR EN EstadoCuentaBR
                    //TODO: Revisar el saldo actual
                    //****************************************************************************************************+
                    var movimientoEmpresaPago = new MovimientoEmpresa
                    {
                        Clave = DateTime.UtcNow.GetCurrentTime().ToString("yyyyMMdd") + "0" + ((Int16)enumMotivo.Financiamiento).ToString() + new Random().Next(0, 99999).ToString(),
                        IsAbono = true,
                        Monto = p.Precio,
                        Motivo = (short)enumMotivo.Compra,
                        Movimiento = movimiento,
                        //SaldoActual = saldoActual,
                        Status = (short)enumEstatusMovimiento.Procesando,
                        UserName = PayCenterName,
                        FechaCreacion = DateTime.UtcNow.GetCurrentTime(),
                        FechaActualizacion = DateTime.UtcNow.GetCurrentTime()
                    };
                    MovimientosEmpresaRepository movimientosEmpresaRepository = new MovimientosEmpresaRepository(repository.context);
                    movimientosEmpresaRepository.Add(movimientoEmpresaPago);
                    //****************************************************************************************************+
                }
                else
                {
                    AddValidationMessage(enumMessageType.BRException, "El paquete seleccionado ha expirado.  Intente con otro paquete o pongase en contacto con soporte");
                    break;
                }
            }
            var saldos = estadoCuentaBR.GetSaldosPagoServicio(PayCenterId);
            if (saldos.SaldoDisponible < totalCompra)
            {
                AddValidationMessage(enumMessageType.BRException, "No cuenta con saldo suficiente para comprar más paquetes");
                return View(model);
            }
            Succeed = repository.Save();
            ViewBag.Succeed = Succeed;
            if (Succeed)
            {
                AddValidationMessage(enumMessageType.Succeed, "Se ha realizado la compra de " + totalCompra + " créditos exitosamente.");

                //Julius: Permite avisar a los emails configurados en el momento que se realizó la compra del paquete
                StringBuilder emailMessage = new StringBuilder();
                emailMessage.AppendLine("<p>El Paycenter <b>" + this.PayCenterName + "</b> ha realizado la compra de:<p>");
                emailMessage.AppendLine("<table>");
                paquetesComprados.ForEach(x =>
                {
                    emailMessage.AppendLine("<tr>");
                    emailMessage.AppendLine("<td>Paquete: <b>PAQ" + x.PaqueteId + "</b></td>");
                    emailMessage.AppendLine("<td>Eventos: <b>" + x.Eventos.ToString() + "</b></td>");
                    emailMessage.AppendLine("<td>Monto: <b>" + x.Monto.ToString("C") + "</b></td>");
                    emailMessage.AppendLine("</tr>");
                });
                emailMessage.AppendLine("<p>Fecha de compra: " + DateTime.Now.GetCurrentTime().ToString() + "</p>");
                emailMessage.AppendLine("</table>");
                var paquetesEmail = ConfigurationManager.AppSettings.Get("PaquetesEmail");
                EmailHelper.Enviar(emailMessage.ToString(), "Compra Paquete - " + this.PayCenterName, paquetesEmail);
            }
            else
            {
                //TODO: Leer de los mensajes que vengan del save
                //ValidationMessages = repository.ValidationMessages
                AddValidationMessage(enumMessageType.UnhandledException, "No fue posible realizar la compra. Intente más tarde");
            }
            return View(model);
        }
        public ActionResult Create(PagoVM model)
        {
            if (PayCenterId == 0)
            {
                model.PayCenterName = string.Empty;
                AddValidationMessage(enumMessageType.DataValidation, "Por favor, seleccione primero un PayCenter.");
                return View(model);
            }

            EstadoCuentaBR br = new EstadoCuentaBR(repository.context);
            var saldo = br.GetSaldosPagoServicio(PayCenterId);
            ViewData["SaldoActual"] = saldo.SaldoActual.ToString("C");
            ViewData["SaldoDisponible"] = saldo.SaldoDisponible.ToString("C");
            ViewData["Eventos"] = saldo.EventosDisponibles;

            if (model.Importe <= 0)
            {
                AddValidationMessage(enumMessageType.DataValidation, "El importe no puede ser menor a $0.00.");
                return View(model);
            }
            if (ModelState.IsValid)
            {

                #region Crear Movimiento Inicial
                Pago pago = new Pago();
                PaycenterBR payCenterBR = new PaycenterBR();
                var cuentaId = payCenterBR.GetOrCreateCuentaPayCenter(PayCenterId, enumTipoCuenta.Pago_de_Servicios, PROVEEDOR_EVOLUCIONAMOVIL);
                //Devuelve si usa evento en el pago
                bool usaEvento = false;
                List<Movimiento> movimientos = br.CrearMovimientosPagoServicios(PayCenterId, (Decimal)model.Importe, PayCenterName, out usaEvento);
                Succeed = br.Succeed;
                ValidationMessages = br.ValidationMessages;

                if (!Succeed)
                {
                    return View(model);
                }

                #endregion

                #region Registro de Pago
                string Referencia = "";
                Mapper.CreateMap<PagoVM, Pago>().ForMember(dest => dest.DetallePagos, opt => opt.Ignore());
                Mapper.Map(model, pago);
                pago.Servicio = model.Servicios.Where(x => x.Value == model.ServicioId).FirstOrDefault().Text;
                pago.PayCenterId = PayCenterId;
                pago.Movimiento = movimientos.Where(x => x.Motivo == (short)enumMotivo.Pago).First();
                pago.UsoEvento = usaEvento;

                var iDetalles = serviciosRepository.LoadDetallesServicioByServicioID(pago.ServicioId);
                foreach (DetalleServicio d in iDetalles)
                {
                    var valor = Request.Form[d.DetalleServicioId.ToString()];
                    if (d.EsReferencia)
                        Referencia = valor;

                    pago.DetallePagos.Add(new DetallePago { Campo = d.Campo, Valor = valor });
                }

                repository.Add(pago);
                repository.Save();
                //Actualizo el Id de referencia del Pago en los movimientos correspondientes
                br.ActualizaReferenciaIdMovimiento(pago.MovimientoId, pago.PagoId);
                repository.Save();

                model.PagoId = pago.PagoId;
                #endregion

                #region Registro Ticket
                try
                {

                    //Verifica si tiene configurada la comisión que mostrará al cliente, se toma el valor para mostrar en el ticket
                    ParametrosRepository parametrosRepository = new ParametrosRepository();
                    var parametrosPayCenter = parametrosRepository.GetParametrosPayCenter(PayCenterId);
                    var parametrosGlobales = parametrosRepository.GetParametrosGlobales();

                    Ticket ticket = new Ticket();
                    ticket.ClienteEmail = "";
                    ticket.ClienteNombre = pago.ClienteNombre;
                    ticket.ClienteTelefono = "";
                    ticket.Comision = (parametrosPayCenter != null && parametrosPayCenter.ComisionCliente != null ? (Decimal)parametrosPayCenter.ComisionCliente : 0); //Comision configurada del paycenter
                    ticket.FechaCreacion = DateTime.UtcNow.GetCurrentTime();
                    ticket.Folio = createFolio(pago.PagoId);
                    ticket.Importe = pago.Importe;
                    ticket.Leyenda = parametrosGlobales != null ? parametrosGlobales.LeyendaTicket : null;
                    ticket.PagoId = pago.PagoId;
                    ticket.PayCenterId = pago.PayCenterId;
                    ticket.TipoServicio = pago.Servicio;
                    ticket.Referencia = Referencia;
                    ticket.PayCenterName = PayCenterName;
                    ticket.FechaVencimiento = pago.FechaVencimiento;

                    tRepository.Add(ticket);
                    Succeed = tRepository.Save();
                    if (!Succeed)
                    {
                        AddValidationMessage(enumMessageType.UnhandledException, "Su pago ha sido Registrado con éxito. Sin embargo, no se pudo generar el ticket, favor de comunicarse con un ejecutivo. ");
                    }

                    //Ejecuta el envío de correo de forma asíncrona
                    EnviarTicketDelegate enviarDelegate = new EnviarTicketDelegate(EnviarTicketEmail);
                    var result = enviarDelegate.BeginInvoke(pago,null, null);

                    return RedirectToAction("Ticket/" + ticket.PagoId.ToString());
                }
                catch (Exception ex)
                {
                    AddValidationMessage(enumMessageType.UnhandledException, "Su pago ha sido Registrado con éxito. Sin embargo, no se pudo generar el ticket, favor de comunicarse con un ejecutivo. ");
                    return View(model);
                }

                #endregion

            }
            else
            {
                AddValidationMessage(enumMessageType.BRException, "Los datos no son válidos");
            }
            return View(model);
        }
        public ViewResult Details(PagoVM model)
        {
            //Aquí van las acciones del PayCenter y Staf para el depósito
            var id = model.PagoId;
            var action = model.CambioEstatusVM.Estatus;
            string comentario = model.CambioEstatusVM.Comentario != null ? model.CambioEstatusVM.Comentario.TrimEnd() : null;
            Pago pago = repository.ListAll().Where(x => x.PagoId == model.PagoId).FirstOrDefault();
            //Reinicio el ModelState porque no valido sus valores
            ModelState.Clear();

            if (id > 0)
            {
                var movimiento = pago.Movimiento;

                //validar que exista el moviento y sino mandar mensaje de error
                if (movimiento != null)
                {
                    EstadoCuentaBR estadoCuentaBR = new EstadoCuentaBR(repository.context);
                    //Asigno valor default en caso de que entre en ningún case de switch
                    enumEstatusMovimiento nuevoEstatus = (enumEstatusMovimiento)movimiento.Status;
                    switch (action)
                    {
                        case "Cancelar":
                            nuevoEstatus = enumEstatusMovimiento.Cancelado;
                            break;
                        case "Aplicar":
                            nuevoEstatus = enumEstatusMovimiento.Aplicado;
                            break;
                        case "Rechazar":
                            nuevoEstatus = enumEstatusMovimiento.Rechazado;
                            break;
                    }

                    movimiento = estadoCuentaBR.ActualizarMovimiento(pago.MovimientoId, nuevoEstatus, comentario);
                    Succeed = estadoCuentaBR.Succeed;
                    ValidationMessages = estadoCuentaBR.ValidationMessages;

                    if (Succeed)
                    {
                        pago.Status = movimiento.Status;
                        Succeed = repository.Save();
                        if (Succeed)
                        {
                            ModelState.Clear();
                            AddValidationMessage(enumMessageType.Succeed, "El reporte de depósito ha sido " + nuevoEstatus.ToString() + " correctamente");
                            var paycenter = pRepository.LoadById(pago.PayCenter.PayCenterId);
                            if (paycenter != null)
                            {
                                //Ejecuta el envío de correo de forma asíncrona
                                EnviarCambioEstatusDelegate enviarDelegate = new EnviarCambioEstatusDelegate(EnviarCambioEstatusEmail);
                                var result = enviarDelegate.BeginInvoke(nuevoEstatus, pago,paycenter, null, null);
                                EnviarCambioEstatusEmail(nuevoEstatus, pago, paycenter);
                            }
                            //No obtuve lo errores por que es una clase estática y va a almacenar los de todas las sesiones
                            //ValidationMessages.AddRange(EmailHelper
                            //AddValidationMessage(enumMessageType.Notification, "No pudo enviarse el email de aviso. Comuníquelo al administrador");
                            //return Details(id);
                        }
                        else
                        {
                            //TODO: implemtar código que traiga mensajes del repositorio
                        }
                    }

                }
                else
                {
                    AddValidationMessage(enumMessageType.BRException, "No se encontró el movimiento para el depósito.");
                }

            }
            else
            {
                AddValidationMessage(enumMessageType.BRException, "No existe el depósito.");
            }

            return Details(id);
        }
        private SimpleGridResult<PagoServicioVM> getPagosServicio(ServiceParameterVM Parameters = null)
        {
            IEnumerable<SP_PagosSel_Result> pagos;
            pagos = repository.GetPagosList(PayCenterId);

            SimpleGridResult<PagoServicioVM> simpleGridResult = new SimpleGridResult<PagoServicioVM>();

            var pagosServicioVM = pagos.Where(x =>
                (Parameters == null || (
                                (Parameters.fechaInicio == null || (Parameters.fechaInicio < x.FechaCreacion))
                        && (Parameters.fechaFin == null || Parameters.fechaFin > x.FechaCreacion)
                        //Se modificó el valor APLICADO por PROCESANDO, debido a que es mas conveniente y no necesita mayor cambio
                        && (Parameters.onlyAplicados ? x.Status == enumEstatusMovimiento.Procesando.GetHashCode() : true)
                        )
                    )
                ).Select(x => new PagoServicioVM
                 {
                     PayCenterId = x.PayCenterId != null ? (int)x.PayCenterId : 0,
                     Folio = x.Folio != null ? x.Folio : "NA",
                     Servicio = x.Servicio,
                     NombreCliente = x.ClienteNombre,
                     PayCenterName = x.Nombre != null ? x.Nombre : "[Desconocido]",
                     PagoId = x.PagoId,
                     //todo:Optimizar esta consulta para que no haga un load por cada registro que levante.
                     Comentarios = x.Comentarios != null? x.Comentarios : "Sin comentarios",
                     Monto = x.Importe.ToString("C"),
                     FechaCreacion = x.FechaCreacion.GetCurrentTime().ToString(),
                     FechaVencimiento = x.FechaVencimiento.GetCurrentTime().ToString(),
                     Status = ((enumEstatusMovimiento)x.Status).ToString()
                 });

            //Filtrar por searchString: Lo puse después del primer filtro porque se complicaba obtener los strings de las tablas referenciadas como bancos, cuenta bancaria, etc.
            if (Parameters != null && !string.IsNullOrEmpty(Parameters.searchString))
            {
                pagosServicioVM = pagosServicioVM.Where(x => Parameters.searchString == null || (
                    x.Comentarios.ContainsInvariant(Parameters.searchString) ||
                    x.Folio.ContainsInvariant(Parameters.searchString) ||
                    x.NombreCliente.ContainsInvariant(Parameters.searchString) ||
                    x.Servicio.ContainsInvariant(Parameters.searchString) ||
                    x.Status.ContainsInvariant(Parameters.searchString)
                    ));
            }

            //Estas líneas están de más, ya que el filtro se aplicó arriba
            //if (Parameters != null && Parameters.onlyAplicados)
            //    //Se modificó el valor APLICADO por PROCESANDO, debido a que es mas conveniente y no necesita mayor cambio
            //    pagosServicioVM = pagosServicioVM.Where(x => x.Status == enumEstatusMovimiento.Procesando.ToString());

            if (Parameters != null && !string.IsNullOrEmpty(Parameters.searchString))
                pagosServicioVM = pagosServicioVM.Where(x => x.NombreCliente.ToLower().Contains(Parameters.searchString.ToLower()) || x.Servicio.ToLower().Contains(Parameters.searchString.ToLower()));

            if (PayCenterId > 0)
            {
                EstadoCuentaBR estadoCuentaBR = new EstadoCuentaBR();
                var saldos = estadoCuentaBR.GetSaldosPagoServicio(PayCenterId);
                //todo:Checar que tipo de saldo debo de mostrar
                ViewData["Eventos"] = saldos.EventosDisponibles;
                ViewData["SaldoActual"] = saldos.SaldoActual.ToString("C");
                ViewData["SaldoDisponible"] = saldos.SaldoDisponible.ToString("C");
            }

            if (Parameters != null)
            {
                simpleGridResult.CurrentPage = Parameters.pageNumber;
                simpleGridResult.PageSize = Parameters.pageSize;
                if (Parameters.pageSize > 0)
                {
                    var pageNumber = Parameters.pageNumber >= 0 ? Parameters.pageNumber : 0;
                    simpleGridResult.CurrentPage = pageNumber;
                    simpleGridResult.TotalRows = pagosServicioVM.Count();
                    pagosServicioVM = pagosServicioVM.Skip(pageNumber * Parameters.pageSize).Take(Parameters.pageSize);
                }
            }
            simpleGridResult.Result = pagosServicioVM;
            return simpleGridResult;
        }
        public ActionResult Confirm(AbonoVM model)
        {
            bool exito = true;

            if (!(validations.IsValidReferenciaDeposito(model.Referencia, model.BancoId)))
            {
                //todo:Preguntar de esta validacion
                AddValidationMessage(enumMessageType.BRException, "La referencia especificada ya existe en el sistema. Favor de verificarla.");
                exito = false;
            }

            if (Convert.ToDateTime(model.FechaPago).CompareTo(DateTime.UtcNow.GetCurrentTime()) == 1)
            {
                AddValidationMessage(enumMessageType.BRException, "La fecha de depósito debe ser menor o igual a la fecha actual.");
                exito = false;
            }

            if (exito)
            {
                if (ModelState.IsValid)
                {
                    PaycenterBR payCenterBR = new PaycenterBR();
                    model.CuentaId=payCenterBR.GetOrCreateCuentaPayCenter(PayCenterId, model.TipoCuenta,model.ProveedorId);
                    Abono abono = new Abono
                    {
                        BancoId = model.BancoId,
                        CuentaBancariaId = model.CuentaBancariaId,
                        CuentaId = model.CuentaId,
                        Status = (Int16)enumEstatusMovimiento.Procesando,
                        FechaCreacion = DateTime.UtcNow.GetCurrentTime(),
                        FechaPago = (DateTime)model.FechaPago,
                        Monto = (Decimal)model.Monto,
                        PayCenterId = PayCenterId,
                        Referencia = model.Referencia,
                        RutaFichaDeposito = model.RutaFichaDeposito,
                        ProveedorId = (short)model.ProveedorId
                    };
                    repository.Add(abono);

                    EstadoCuentaBR estadoCuentaBR = new EstadoCuentaBR(repository.context);
                    var movimiento = estadoCuentaBR.CrearMovimiento(PayCenterId, enumTipoMovimiento.Abono, model.AbonoId, model.CuentaId, (Decimal)model.Monto, enumMotivo.Deposito, PayCenterName);
                    abono.Clave = movimiento.Clave;

                    exito = repository.Save();
                    //Julius: Tuve que guardar otra vez para guardar el abonoId generado en la BD
                    estadoCuentaBR.ActualizaReferenciaIdMovimiento(movimiento.MovimientoId, abono.AbonoId);
                    repository.Save();

                    model.AbonoId = abono.AbonoId;
                    AddValidationMessage(enumMessageType.Succeed, "Se ha registrado su depósito con éxito con clave " + movimiento.Clave + ". En breve será revisado y aplicado.");
                }
            }
            else
            {
                AddValidationMessage(enumMessageType.BRException, "No fue posible guardar el reporte de depósito.");
            }
            model.FechaCreacion = DateTime.UtcNow.GetCurrentTime();
            return View(model);
        }
 public ActionResult Report()
 {
     ReporteDepositoVM model = new ReporteDepositoVM();
     model.PayCenterId = PayCenterId;
     if (PayCenterId > 0)
     {
         EstadoCuentaBR estadoCuenta = new EstadoCuentaBR();
         var saldos = estadoCuenta.GetSaldosPagoServicio(PayCenterId);
         ViewBag.SaldoActual = saldos.SaldoActual.ToString("C");
         ViewBag.SaldoDisponible = saldos.SaldoDisponible.ToString("C");
         ViewBag.Eventos = saldos.EventosDisponibles.ToString();
     }
     LlenarBancos_Cuentas();
     ViewBag.ReferenceCaptions = Newtonsoft.Json.JsonConvert.SerializeObject(new CuentasBancariasRepository().GetReferenceCaptions().Select(x => new { BancoId = x.BancoId, CuentaId = x.CuentaId, ReferenceCaption = x.ReferenceCaption }));
     return View(model);
 }
        public ViewResult Details(AbonoVM model)
        {
            //Aquí van las acciones del PayCenter y Staf para el depósito
            var id = model.AbonoId;
            var action = model.CambioEstatusVM.Estatus;
            string comentario = model.CambioEstatusVM.Comentario != null ? model.CambioEstatusVM.Comentario.TrimEnd() : null;
            Abono abono = repository.LoadById(id);

            if (id > 0)
            {
                var movimiento = abono.CuentaPayCenter.Movimientos.Where(x => x.Motivo == enumMotivo.Deposito.GetHashCode() && x.Id == abono.AbonoId).FirstOrDefault();

                //validar que exista el moviento y sino mandar mensaje de error
                if (movimiento != null)
                {
                    EstadoCuentaBR estadoCuentaBR = new EstadoCuentaBR(repository.context);
                    //Asigno valor default en caso de que entre en ningún case de switch
                    enumEstatusMovimiento nuevoEstatus = (enumEstatusMovimiento)movimiento.Status;
                    switch (action)
                    {
                        case "Cancelar":
                            nuevoEstatus = enumEstatusMovimiento.Cancelado;
                            break;
                        case "Aplicar":
                            nuevoEstatus = enumEstatusMovimiento.Aplicado;
                            break;
                        case "Rechazar":
                            nuevoEstatus = enumEstatusMovimiento.Rechazado;
                            break;
                    }
                    abono.Status = (Int16)nuevoEstatus;
                    movimiento = estadoCuentaBR.ActualizarMovimiento(movimiento.MovimientoId, nuevoEstatus, comentario);
                    this.Succeed = estadoCuentaBR.Succeed;
                    this.ValidationMessages = estadoCuentaBR.ValidationMessages;

                    if (Succeed)
                    {
                        Succeed = repository.Save();
                        if (Succeed)
                        {
                            ModelState.Clear();
                            AddValidationMessage(enumMessageType.Succeed, "El reporte de depósito ha sido " + nuevoEstatus.ToString() + " correctamente");
                            //return Details(id);
                        }
                        else
                        {
                            //TODO: implemtar código que traiga mensajes del repositorio
                        }
                    }
                }
                else
                {
                    this.AddValidationMessage(enumMessageType.BRException, "No se encontró el movimiento para el depósito.");
                }

            }
            else
            {
                this.AddValidationMessage(enumMessageType.BRException, "No existe el depósito.");
            }

            return Details(id);
        }
        private PayCenterVM FillPayCenterVM(int Id)
        {
            PayCenter paycenter = repository.LoadById(Id);

            if (paycenter == null)
            {
                return null;
            }
            PayCenterVM paycenterVM = new PayCenterVM();
            Mapper.Map(paycenter, paycenterVM);

            //<author>Moisés Cauich</author>
            //<comments>Obtener los datos de EstadoCuentaBR</comments>
            //<before>
            ////Cargar los movimientos para calcular el saldo
            //EstadoDeCuentaRepository edoCuentaRepository = new EstadoDeCuentaRepository();
            //var edoCuenta = edoCuentaRepository.GetMovimientosByPayCenterId(paycenterVM.PayCenterId);
            //paycenterVM.SaldoActual = (edoCuenta.Where(x => x.IsAbono).Sum(x => x.Monto) - edoCuenta.Where(x => !x.IsAbono).Sum(x => x.Monto)).ToString("C");
            ////Cargar los eventos
            //PaquetesRepository paquetesRepository = new PaquetesRepository();
            //paycenterVM.Eventos = paquetesRepository.GetEventosByPayCenter(paycenterVM.PayCenterId).ToString();
            ////Asignar pagos realizados
            //paycenterVM.PagosRealizados = paycenter.Pagos.Count.ToString();
            //</before>
            //<after>
            EstadoCuentaBR estadoCuenta = new EstadoCuentaBR();
            var saldos = estadoCuenta.GetSaldosPagoServicio(Id);
            paycenterVM.SaldoActual = saldos.SaldoActual.ToString("C");
            paycenterVM.SaldoDisponible = saldos.SaldoDisponible.ToString("C");
            paycenterVM.Eventos = saldos.EventosDisponibles.ToString();
            paycenterVM.PagosRealizados = paycenter.Pagos.Count(p => p.Status == enumEstatusMovimiento.Aplicado.GetHashCode()).ToString();
            //</after>

            return paycenterVM;
        }
 public string GetSaldosPagoServicio(int PayCenterId)
 {
     EstadoCuentaBR br = new EstadoCuentaBR();
     var saldo = br.GetSaldosPagoServicio(PayCenterId);
     return Newtonsoft.Json.JsonConvert.SerializeObject(saldo);
 }