public HttpResponseMessage CancelarPlanoMembro(HttpRequestMessage request, int?mensalidadeId)
        {
            return(CreateHttpResponse(request, () =>
            {
                HttpResponseMessage response;
                bool cancelouPlano = false;

                var usuario = _usuarioRep.GetSingle(int.Parse(HttpContext.Current.User.Identity.GetUserId()));
                Membro membro = _membroRep.FindBy(m => m.Pessoa.Id == usuario.Pessoa.Id).FirstOrDefault();


                if (mensalidadeId != null && mensalidadeId.Value > 0)
                {
                    cancelouPlano = _pagamentoService.CancelarPlano(mensalidadeId.Value);
                }

                if (mensalidadeId.Value == 0)
                {
                    var mensalidade = _mensalidadeRep.FindBy(x => x.MembroId == membro.Id && x.Status == StatusMensalidade.Recebido)
                                      .OrderByDescending(o => o.Id).FirstOrDefault();

                    cancelouPlano = _pagamentoService.CancelarPlano(mensalidade.Id);
                }

                response = request.CreateResponse(HttpStatusCode.OK, cancelouPlano);


                return response;
            }));
        }
Пример #2
0
        public HttpResponseMessage CancelarAssinatura(HttpRequestMessage request)
        {
            return(CreateHttpResponse(request, () =>
            {
                if (!ModelState.IsValid)
                {
                    var response = request.CreateResponse(HttpStatusCode.BadRequest,
                                                          ModelState.Keys.SelectMany(k => ModelState[k].Errors)
                                                          .Select(m => m.ErrorMessage).ToArray());
                    return response;
                }
                else
                {
                    HttpResponseMessage response;

                    var usuario = _usuarioRep.GetSingle(int.Parse(HttpContext.Current.User.Identity.GetUserId()));

                    var fornecedor = _fornecedorRep.FirstOrDefault(x => x.PessoaId == usuario.PessoaId);
                    var membro = _membroRep.FirstOrDefault(x => x.PessoaId == usuario.PessoaId);

                    if (fornecedor != null)
                    {
                        // Atualizar usuário como inativo caso não se tenha fatura em aberto
                        // No Client deve-se verificar se voltou faturas, se sim mostrar pop'up falando que assinatura
                        // só será cancelada quando se quitar as dívidas, direcionando usuário para tela de faturas para o mesmo imprimir o boleto.
                        // Quando se pagar a dívida, na notificação enviada pela GerenciaNet deve-se verificar
                        // a tabela de usuário cancelado e mudar o campo ativo do usuário e membro para false.

                        var usuarioCanceladoFornecedor = _usuarioCanceladoRep.FirstOrDefault(u => u.Usuario.PessoaId == fornecedor.PessoaId) != null;

                        if (usuario.FlgMaster)
                        {
                            if (!usuarioCanceladoFornecedor)
                            {
                                var faturas = _faturaRep
                                              .GetAll().Where(x => x.FornecedorId == fornecedor.Id &&
                                                              (x.Status != StatusFatura.Recebido && x.Status != StatusFatura.Link &&
                                                               x.Status != StatusFatura.Cancelado && x.Status != StatusFatura.Devolvido)).ToList();

                                if (faturas.Count == 0)
                                {
                                    var _usuariosDesativados = _usuarioRep.GetAll().Where(x => x.PessoaId == usuario.PessoaId).ToList();

                                    for (int i = 0; i < _usuariosDesativados.Count; i++)
                                    {
                                        _usuariosDesativados[i].Ativo = false;
                                        _usuarioRep.Edit(_usuariosDesativados[i]);
                                    }

                                    fornecedor.Ativo = false;
                                    _fornecedorRep.Edit(fornecedor);

                                    _usuarioCanceladoRep.Add(new UsuarioCancelado
                                    {
                                        UsuarioId = usuario.Id,
                                        DataCancelamento = DateTime.Now,
                                        UsuarioCriacaoId = usuario.Id,
                                        DtCriacao = DateTime.Now,
                                        Ativo = true
                                    });

                                    _unitOfWork.Commit();

                                    var faturasVM = Mapper.Map <IEnumerable <Fatura>, IEnumerable <FaturaViewModel> >(faturas);

                                    response = request.CreateResponse(HttpStatusCode.OK, faturasVM);

                                    return response;
                                }
                                else
                                {
                                    var faturasVM = Mapper.Map <IEnumerable <Fatura>, IEnumerable <FaturaViewModel> >(faturas);

                                    response = request.CreateResponse(HttpStatusCode.OK, faturasVM);

                                    return response;
                                }
                            }
                        }
                        else
                        {
                            var usuarioMaster = _usuarioRep.FirstOrDefault(x => x.PessoaId == usuario.PessoaId && !x.FlgMaster);

                            response = request.CreateResponse(HttpStatusCode.OK, "Somente o usuário " + usuarioMaster.UsuarioNome + " pode cancelar a assinatura, pois o mesmo é usuário Master!");

                            return response;
                        }
                    }
                    else if (membro != null)
                    {
                        // Inserir na tabela de usuário cancelado para se ter histórico de cancelamento, caso
                        // membro esteja em dia e esteja no mês corrente mostrar mensagem no client que a assinatura estara ativa até o dia anterior ao fechar a mensalidade para próximo mês.
                        // Colocar data na mensagem do client Ex: (sua assinatura estara ativa até o dia tal, somente para consultar de pedidos)
                        //colocar data de desabilitação para robô passar e mudar usuário para inativo
                        // na data estipulada no campo desta tabela.

                        // No Client deve-se verificar se voltou mensalidades, se sim mostrar pop'up falando que assinatura
                        // só será cancelada quando se quitar as dívidas, direcionando usuário para tela de mensalidades para o mesmo imprimir o boleto.
                        // Quando se pagar a dívida, na notificação enviada pela GerenciaNet deve-se verificar
                        // a tabela de usuário cancelado e mudar o campo ativo do usuário e membro para false.

                        var usuarioCanceladoMembro = _usuarioCanceladoRep.FirstOrDefault(u => u.Usuario.PessoaId == membro.PessoaId) != null;

                        if (!usuarioCanceladoMembro)
                        {
                            if (usuario.FlgMaster)
                            {
                                var mens = _mensalidadeRep.FindBy(x => x.Membro.PessoaId == usuario.PessoaId &&
                                                                  x.Status == StatusMensalidade.Recebido ||
                                                                  x.Status == StatusMensalidade.AguardandoPagamento)
                                           .OrderByDescending(x => x.Id)
                                           .FirstOrDefault();


                                if (mens != null && mens.Status == StatusMensalidade.Recebido)
                                {
                                    // Cancelar Plano
                                    _pagamentoService.CancelarPlano(mens.Id);

                                    var dataFimAcesso = mens.DtRecebimento != null ?
                                                        mens.DtRecebimento.Value.AddMonths(membro.PlanoMensalidade.QtdMeses) : DateTime.Now;

                                    var _usuariosDesativados = _usuarioRep.FindBy(x => x.PessoaId == usuario.PessoaId).ToList();

                                    if (dataFimAcesso < DateTime.Now)
                                    {
                                        for (int i = 0; i < _usuariosDesativados.Count; i++)
                                        {
                                            _usuariosDesativados[i].Ativo = false;
                                            _usuarioRep.Edit(_usuariosDesativados[i]);
                                        }

                                        membro.Ativo = false;
                                        _membroRep.Edit(membro);
                                    }


                                    _usuarioCanceladoRep.Add(new UsuarioCancelado
                                    {
                                        UsuarioId = usuario.Id,
                                        DataCancelamento = dataFimAcesso,
                                        UsuarioCriacaoId = usuario.Id,
                                        DtCriacao = DateTime.Now,
                                        Ativo = true
                                    });

                                    mens.Ativo = false;
                                    _mensalidadeRep.Edit(mens);

                                    _unitOfWork.Commit();

                                    response = request.CreateResponse(HttpStatusCode.OK,
                                                                      $"Você ainda terá até o dia {dataFimAcesso.ToShortDateString()} para acessar a plataforma, depois deste prazo sua conta será desativada automaticamente.");

                                    return response;
                                }
                                else
                                {
                                    if (!usuarioCanceladoMembro)
                                    {
                                        // Cancelar plano
                                        if (mens != null)
                                        {
                                            _pagamentoService.CancelarPlano(mens.Id);
                                        }

                                        var _usuariosDesativados = _usuarioRep.FindBy(x => x.PessoaId == usuario.PessoaId).ToList();

                                        for (int i = 0; i < _usuariosDesativados.Count; i++)
                                        {
                                            _usuariosDesativados[i].Ativo = false;
                                            _usuarioRep.Edit(_usuariosDesativados[i]);
                                        }

                                        membro.Ativo = false;
                                        _membroRep.Edit(membro);

                                        _usuarioCanceladoRep.Add(new UsuarioCancelado
                                        {
                                            UsuarioId = usuario.Id,
                                            DataCancelamento = DateTime.Now,
                                            UsuarioCriacaoId = usuario.Id,
                                            DtCriacao = DateTime.Now,
                                            Ativo = true
                                        });

                                        _unitOfWork.Commit();

                                        response = request.CreateResponse(HttpStatusCode.Created, "Assinatura cancelada com sucesso!");

                                        return response;
                                    }
                                }
                            }
                            else
                            {
                                var usuarioMaster = _usuarioRep.FirstOrDefault(x => x.PessoaId == usuario.PessoaId && x.FlgMaster);

                                response = request.CreateResponse(HttpStatusCode.OK, "Somente o usuário ''" + usuarioMaster.UsuarioNome + "'' poderá cancelar a assinatura, pois o mesmo é usuário Master!");

                                return response;
                            }
                        }
                    }

                    response = request.CreateResponse(HttpStatusCode.NoContent);

                    return response;
                }
            }));
        }