private void ValidaCapturaParcial(ref PayCenterVM paycenterVM)
 {
     if (paycenterVM.Celular == null)
     {
         paycenterVM.Celular = string.Empty;
     }
     if (paycenterVM.Email == null)
     {
         paycenterVM.Email = string.Empty;
     }
     if (paycenterVM.Email2 == null)
     {
         paycenterVM.Email2 = string.Empty;
     }
     if (paycenterVM.Domicilio == null)
     {
         paycenterVM.Domicilio = string.Empty;
     }
     if (paycenterVM.CP == null)
     {
         paycenterVM.CP = string.Empty;
     }
     if (paycenterVM.FechaIngreso == null)
     {
         paycenterVM.FechaIngreso = new DateTime(1900, 1, 1);
     }
 }
        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;
        }
 /// <summary>
 /// Valida que esten capturados los campos necesarios para activar al paycenter
 /// </summary>
 /// <param name="paycenterVM"></param>
 /// <returns></returns>
 private bool ValidaActivacion(ref PayCenterVM paycenterVM)
 {
     if (HttpContext.User.IsInRole(enumRoles.Administrator.ToString()))
     {
         return true;
     }
     if (string.IsNullOrWhiteSpace(paycenterVM.Nombre) || string.IsNullOrWhiteSpace(paycenterVM.Representante) ||
         string.IsNullOrWhiteSpace(paycenterVM.UserName) || string.IsNullOrWhiteSpace(paycenterVM.Telefono) ||
         string.IsNullOrWhiteSpace(paycenterVM.Email) || // || string.IsNullOrWhiteSpace(paycenterVM.Email2) ||
         string.IsNullOrWhiteSpace(paycenterVM.Domicilio) || string.IsNullOrWhiteSpace(paycenterVM.CP) ||
         string.IsNullOrWhiteSpace(paycenterVM.IFE) || string.IsNullOrWhiteSpace(paycenterVM.Comprobante)
         )
     {
         return false;
     }
     else
     {
         return true;
     }
 }
        public ActionResult Registrar(PayCenterVM paycenterVM)
        {
            Succeed = true;
            //Esto es para que no me marque requerido al validar cuando es actualización
            if (paycenterVM.PayCenterId > 0)
            {
                ModelState.Remove("Password");
                ModelState.Remove("RepeatPassword");
                ModelState.Remove("UserName");
            }

            if (ModelState.IsValid)
            {
                if (paycenterVM.IFE == null)
                {
                    paycenterVM.IFE = string.Empty;
                }
                if (paycenterVM.Comprobante == null)
                {
                    paycenterVM.Comprobante = string.Empty;
                }
                paycenterVM.ThumbnailIFE = paycenterVM.IFE.Replace("UploadImages", "UploadImages/Thumbnails");
                paycenterVM.ThumbnailComprobante = paycenterVM.Comprobante.Replace("UploadImages", "UploadImages/Thumbnails");

                //llenar los campos faltantes si estan nulos
                ValidaCapturaParcial(ref paycenterVM);

                #region "crear prospecto comentado"
                ////Crear prospecto o cargar el prospecto relacionado
                //if (paycenterVM.ProspectoId > 0)
                //{
                //      //ProspectosRepository repositoryProspecto = new ProspectosRepository();
                //      //Prospecto prospecto = repositoryProspecto.LoadById(paycenterVM.ProspectoId);
                //      //paycenterVM.Prospecto = prospecto;
                //}
                //else
                //{
                //    Prospecto prospecto = new Prospecto() {
                //        Baja=false,
                //        Celular=paycenterVM.Celular,
                //        Comentario=string.Empty,
                //        Email=paycenterVM.Email,
                //        Empresa=paycenterVM.Empresa,
                //        FechaCreacion=paycenterVM.FechaCreacion,
                //        Nombre=paycenterVM.Nombre,
                //        Telefono=paycenterVM.Telefono,
                //        ProspectoId=0
                //    };
                //    paycenterVM.Prospecto = prospecto;
                //}
                #endregion

                //Validar si existe el usuario si el paycenter está siendo editado y actualizarlo
                AspNetMembershipProviderWrapper membership = new AspNetMembershipProviderWrapper();
                if (paycenterVM.PayCenterId > 0 && !string.IsNullOrWhiteSpace(paycenterVM.UserName)) //&& !string.IsNullOrWhiteSpace(paycenterVM.Password))
                {
                    try
                    {
                        MembershipUser usuario = membership.Get(paycenterVM.UserName);

                        if (usuario != null)
                        {
                            if (!usuario.IsApproved)
                            {
                                usuario.Email = paycenterVM.Email;
                                membership.Update(usuario);
                                //membership.ChangePassword(usuario, paycenterVM.Password);
                            }
                            else
                            {
                                paycenterVM.Activo = true;
                                Succeed = false;
                                AddValidationMessage(enumMessageType.UnhandledException, "El PayCenter ya se encuentra aprobado y activo, no es posible ser modificado por el Prospecto. Por favor, ingresa al sistema con tu usuario y contraseña.");
                            }
                        }
                        else
                        {
                            Succeed = false;
                            AddValidationMessage(enumMessageType.UnhandledException, "No se encontró el usuario del PayCenter.");
                        }
                    }
                    catch (Exception ex)
                    {
                        Succeed = false;
                        AddValidationMessage(enumMessageType.UnhandledException, "Se ha producido un error al actualizar el usuario del PayCenter. " + ex.Message);
                    }
                }
                else if (!(string.IsNullOrWhiteSpace(paycenterVM.UserName) || string.IsNullOrWhiteSpace(paycenterVM.Password)))
                {
                    try
                    {
                        var user = membership.Create(paycenterVM.UserName, paycenterVM.Password, paycenterVM.Email, null, null, false);
                        AspNetRoleProviderWrapper membershipRole = new AspNetRoleProviderWrapper();
                        membershipRole.AddToRole(user, "paycenter");
                    }
                    catch (Exception ex)
                    {
                        Succeed = false;
                        AddValidationMessage(enumMessageType.UnhandledException, "Se ha producido un error al crear el usuario del PayCenter. " + ex.Message);
                    }
                }

                if (Succeed)
                {
                    PayCenter paycenter;
                    bool modificando = paycenterVM.PayCenterId > 0;
                    if (paycenterVM.PayCenterId > 0)
                    {
                        paycenter = repository.LoadById(paycenterVM.PayCenterId);
                        paycenterVM.MaximoAFinanciar = paycenter.Parametros != null && paycenter.Parametros.MaximoAFinanciar != null ? paycenter.Parametros.MaximoAFinanciar.ToString() : string.Empty;
                        Mapper.Map(paycenterVM, paycenter);
                    }
                    else
                    {
                        paycenter = new PayCenter();
                        Mapper.Map(paycenterVM, paycenter);
                        if (paycenterVM.PayCenterPadreId == 0)
                        {
                            paycenter.PayCenterPadreId = null;
                            paycenter.PayCenterPadre = null;
                        }
                        repository.Add(paycenter);
                    }
                    Succeed = repository.Save();
                    if (!Succeed)
                    {
                        var mensaje = modificando ? "crear" : "actualizar";
                        AddValidationMessage(enumMessageType.UnhandledException, "No fue posible " + mensaje + " el paycenter. Favor de intentar más tarde o comunicarse con servicio a cliente.");
                        if (!modificando)
                        {
                            try
                            {
                                //Elimino el usuario en caso de haber fallado la creación del PayCenter
                                var user = Membership.GetUser(paycenter.UserName);
                                if (user != null)
                                {
                                    membership.Delete(user);
                                }
                            }
                            catch (Exception ex)
                            {
                                Succeed = false;
                                AddValidationMessage(enumMessageType.Notification, "El usuario creado no pudo ser eliminado");
                            }
                        }
                    }
                    else
                    {
                        paycenterVM.Activo = true; //Esto es sólo para que se deshabiliten los campos
                        AddValidationMessage(enumMessageType.Succeed, "El PayCenter se ha guardado con éxito. Si deseas modificar o terminar de completar tu información deberás acceder mediante el enlace que recibiste en tu correo o contactar al equipo de Evoluciona Móvil. En breve tu registro como PayCenter quedará activado.");
                    }
                }
            }
            return View(paycenterVM);
        }
        //
        // GET: /PayCenters/Create
        //public ActionResult Create()
        //{
        //    //ViewBag.ProspectoId = new SelectList(repository.LoadProspectos().ToListOfDestination<ProspectoVM>(), "ProspectoId", "Email");
        //    //ViewBag.UsuarioId = new SelectList(repository.LoadUsuarios().ToListOfDestination<UsuarioVM>(), "UsuarioId", "Email");
        //    return View();
        //}
        // GET: /PayCenters/Create ProspectoId
        public ActionResult Registrar(Guid? id)
        {
            //Validar si no tiene usuario logueado, obligatoriamente debe pasar un Id
            if ((!HttpContext.User.Identity.IsAuthenticated) && (id == null))
            {
                return RedirectToAction("Authorization", "Error");
            }
            else if (HttpContext.User.Identity.IsAuthenticated && HttpContext.User.IsInRole(enumRoles.PayCenter.ToString())) //Si esta logueado un paycenter, no puede modificar sus datos porque ya está activo
            {
                return RedirectToAction("Authorization", "Error");
            }
            PayCenter paycenter = null;
            PayCenterVM paycenterVM = new PayCenterVM();

            ProspectosRepository repositoryProspecto = new ProspectosRepository();
            int ProspectoId = id != null ? repositoryProspecto.GetProspectoIdByGUID((Guid)id) : 0;

            if (ProspectoId > 0)
            {

                paycenter = repository.LoadByProspectoId(ProspectoId);
                if (paycenter != null)
                {
                    if (paycenter.Activo)
                    {
                        AddValidationMessage(enumMessageType.BRException, "El PayCenter ya se encuentra aprobado y activo, no es posible ser modificado por el Prospecto. Por favor, ingresa al sistema con tu usuario y contraseña.");
                    }
                    else
                    {
                        AddValidationMessage(enumMessageType.Notification, "Es necesario terminar de capturar la información correspondiente a su alta como PayCenter. Por favor, termine de capturar la información que se le solicita.");
                    }
                }
            }

            paycenterVM.ProspectoId = 0;
            if (id != null)
            {

                //en Modificación de Paycenter NO Activo dice que si no se encuentra paycenter debe redireccionar a un view NotFound, pero si es la primera vez que el prospecto se da de alta no aplica, entonces se hizo para cuando el prospecto no exista
                if (paycenter == null)
                {
                    Prospecto prospecto = repositoryProspecto.LoadById(ProspectoId);
                    if (prospecto != null)
                    {
                        paycenterVM.Celular = prospecto.Celular;
                        paycenterVM.Email = prospecto.Email;
                        paycenterVM.Nombre = prospecto.Empresa;
                        //paycenterVM.UserName = prospecto.Nombre;
                        paycenterVM.Telefono = prospecto.Telefono;
                        paycenterVM.ProspectoId = prospecto.ProspectoId;
                        paycenterVM.Representante = prospecto.Nombre;
                    }
                    else
                    {
                        return RedirectToAction("NotFound");
                    }
                }
                else
                {
                    Mapper.Map(paycenter, paycenterVM);
                    if (paycenter.PayCenterPadre != null)
                    {
                        paycenterVM.PayCenterPadre = paycenter.PayCenterPadre.UserName;
                    }
                }
            }

            return View(paycenterVM);
        }
        public string GetPayCenterRecomienda(StringParameterVM parameter)
        {
            PayCenter paycenter = repository.LoadByIdName(parameter.searchString);

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

            return Newtonsoft.Json.JsonConvert.SerializeObject(paycenterVM);
        }
        public ActionResult Edit(PayCenterVM paycenterVM)
        {
            //Esto es para que no me marque requerido al validar cuando es actualización
            ModelState.Remove("Password");
            ModelState.Remove("RepeatPassword");
            ModelState.Remove("UserName");

            if (ModelState.IsValid)
            {
                //<author>Moisés Cauich</author>
                //<comments>Ya se traen los valores correspondientes del view.</comments>
                //<before>
                //paycenterVM.Comprobante = "";
                //paycenterVM.IFE = "";
                //</before>
                //<after>

                //<author>Moisés Cauich</author>
                //<comments>Se corrigieron las relaciones en el Entity Model</comments>
                //<before>
                //paycenterVM.UsuarioId = 1;
                //if (paycenterVM.ProspectoId == 0)
                //{
                //    paycenterVM.ProspectoId = 1;
                //}
                //</before>
                //<after />

                //Esto es para cuando se edita los datos de un paycenter que no tiene imagenes, no marque error
                if (paycenterVM.IFE == null)
                {
                    paycenterVM.IFE = string.Empty;
                }
                if (paycenterVM.Comprobante == null)
                {
                    paycenterVM.Comprobante = string.Empty;
                }

                //llenar los campos faltantes si estan nulos
                ValidaCapturaParcial(ref paycenterVM);

                Succeed = true;

                //Validar los datos necesarios para activar el usuario
                if (paycenterVM.Activo)
                {
                    Succeed = ValidaActivacion(ref paycenterVM);
                }

                //Validar si existe el usuario si el paycenter está siendo editado y actualizarlo
                if (Succeed)
                {
                    AspNetMembershipProviderWrapper membership = new AspNetMembershipProviderWrapper();
                    if (!string.IsNullOrWhiteSpace(paycenterVM.UserName))
                    {
                        try
                        {
                            MembershipUser usuario = membership.Get(paycenterVM.UserName);

                            if (usuario != null)
                            {
                                usuario.Email = paycenterVM.Email;
                                usuario.IsApproved = paycenterVM.Activo;
                                membership.Update(usuario);
                            }
                            else
                            {
                                Succeed = false;
                                AddValidationMessage(enumMessageType.UnhandledException ,"No se encontró el usuario del PayCenter.");
                            }
                        }
                        catch (Exception ex)
                        {
                            Succeed = false;
                            AddValidationMessage(enumMessageType.UnhandledException ,"Se ha producido un error al actualizar el usuario del PayCenter. " + ex.Message);
                        }
                    }
                    else if (paycenterVM.Activo)
                    {
                        Succeed = false;
                        AddValidationMessage(enumMessageType.UnhandledException ,"No se ha creado el usuario del PayCenter, no se puede activar. desmarque la casilla de activo y guarde.");
                    }

                    if (Succeed)
                    {
                        PayCenter paycenter = repository.LoadById(paycenterVM.PayCenterId);
                        Mapper.Map(paycenterVM, paycenter);
                        if (paycenterVM.PayCenterPadreId <= 0)
                        {
                            paycenter.PayCenterPadre = null;
                        }

                        //Agregar valor del parámetro máximo a financiar
                        if (paycenter.Parametros != null)
                        {
                            paycenter.Parametros.MaximoAFinanciar = Convert.ToDecimal(paycenterVM.MaximoAFinanciar);
                        }
                        else
                        {
                            ParametrosPayCenter parametros = new ParametrosPayCenter() {
                                PayCenterId = paycenterVM.PayCenterId,
                                MaximoAFinanciar = Convert.ToDecimal(paycenterVM.MaximoAFinanciar),
                            };
                            repository.context.ParametrosPayCenters.AddObject(parametros);
                        }

                        repository.Save();

                        AddValidationMessage(enumMessageType.Succeed ,"El PayCenter se ha actualizado con éxito.");
                    }
                }
                else
                {
                    AddValidationMessage(enumMessageType.UnhandledException ,"Es necesario capturar todos los datos para activar al PayCenter. capture los datos faltantes o desmarque la casilla de activo y guarde.");
                }
                //PayCenter paycenter = repository.LoadById(paycenterVM.PayCenterId);
                //Mapper.Map(paycenterVM, paycenter);
                //Mapper.Map(paycenterVM.Cuentas, paycenter.Cuentas);
                //Mapper.Map(paycenterVM.Abonos, paycenter.Abonos);
                //repository.Save();
                //return RedirectToAction("Index");
            }

            //ViewBag.ProspectoId = new SelectList(repository.LoadProspectos(), "ProspectoId", "Email", paycenterVM.ProspectoId);
            //ViewBag.UsuarioId = new SelectList(repository.LoadUsuarios(), "UsuarioId", "Email", paycenterVM.UsuarioId);
            return View(paycenterVM);
        }
        public ActionResult Edit(int id)
        {
            PayCenter paycenter = repository.LoadById(id);

            if (paycenter != null)
            {
                //Si el usuario logueado es un paycenter solo puede modificar sus datos
                if (HttpContext.User.IsInRole(enumRoles.PayCenter.ToString()) && paycenter.UserName != HttpContext.User.Identity.Name)
                {
                    return RedirectToAction("Authorization", "Error");
                }

                PayCenterVM paycenterVM = new PayCenterVM();
                Mapper.Map(paycenter, paycenterVM);
                //<author>Julio Avila</author>
                //<comments>Se cambió el nombre de la propiedad PayCenters2 a PayCenterPadre</comments>
                //<before>
                //paycenterVM.PayCenterPadre = paycenter.PayCenters2.UserName;
                //</before>
                //<after>

                //<author>Moisés Cauich</author>
                //<comments>Faltó esta linea, en el map esta ligando la propiedad PayCenterPadre del VM que es una cadena con la propiedad PayCenterPadre de la entidad que antes era PayCenters2</comments>
                //<before>
                //<after>
                paycenterVM.PayCenterPadre = paycenter.PayCenterPadre != null ? paycenter.PayCenterPadre.UserName : string.Empty;
                //</after>

                ////Buscar usuario para determinar si está activo
                //AspNetMembershipProviderWrapper membership = new AspNetMembershipProviderWrapper();
                //MembershipUser usuario = membership.Get(paycenterVM.Nombre);
                //if (usuario != null)
                //{
                //    paycenterVM.Activo = usuario.IsApproved;
                //    paycenterVM.UserName = usuario.UserName;
                //}
                //else
                //{
                //    paycenterVM.Activo = false;
                //    paycenterVM.UserName = string.Empty;
                //}

                //ViewBag.ProspectoId = new SelectList(repository.LoadProspectos(), "ProspectoId", "Email", paycenter.ProspectoId);
                //ViewBag.UsuarioId = new SelectList(repository.LoadUsuarios(), "UsuarioId", "Email", paycenter.UsuarioId);

                return View(paycenterVM);
            }
            else
            {
                return RedirectToAction("NotFound");
            }
        }