public RetornoModel SalvarIndicacao(Historia historia)
        {
            RetornoModel retorno = null;

            retorno = Validar(historia);
            if (retorno.Sucesso)
            {
                historia.IndicadoAprovacao            = enumAprovacao.pendente;
                historia.IndicadoAprovacaoOriginal    = enumAprovacao.pendente;
                historia.IndicadoAprovacaoResponsavel = enumAprovacao.semNecessidade;
                historia.TriagemAprovacao             = enumAprovacao.semNecessidade;
                historia.TriagemAprovacaoAbuso        = enumAprovacao.semNecessidade;
                historia.TriagemAprovacaoNormal       = enumAprovacao.semNecessidade;
                historia.TriagemAprovacaoSupervisor   = enumAprovacao.semNecessidade;
                historia.AlteracaoOrigem = enumAlteracaoOrigem.Indicacao;
                historia.DataCadastro    = DateTime.Now;
                historia.DataModificacao = DateTime.Now;

                if (!string.IsNullOrEmpty(historia.IndicadorFacebookToken))
                {
                    historia.IndicadorFotoArquivoNome = Guid.NewGuid().ToString() + ".jpg";
                }
                historia.DataEmailAguardandoAprovacao = DateTime.Now;
                historia.CodigoIndicado = GeraCodigo();

                EnviarEmailConfirmacao(historia);
                EnviarEmailIndicado(historia);

                historia.ID = Salvar(historia);

                HistoriaMidiaService service = new HistoriaMidiaService();
                foreach (var midia in historia.Midias) //salvando as midias
                {
                    midia.AdicionadoOrigem = enumAlteracaoOrigem.Indicacao;
                    midia.HistoriaID       = historia.ID;
                    midia.DataCadastro     = DateTime.Now;
                    midia.InativoOrigem    = enumAlteracaoOrigem.Nenhum;
                    service.Salvar(midia);
                }

                if (!string.IsNullOrEmpty(historia.IndicadorFacebookToken))
                {
                    Task.Run(() => FacebookGetImagem(historia));
                }
            }

            return(retorno);
        }
        public RetornoModel ConfirmarIndicacao(IndicadoModel model)
        {
            RetornoModel retorno = new RetornoModel();

            retorno = ValidaDados(model);
            if (retorno.Sucesso)
            {
                HistoriaService      historiaService      = new HistoriaService();
                HistoriaMidiaService historiaMidiaService = new HistoriaMidiaService();
                Historia             historiaTela         = model.Historia;
                Indicado             indicadoTela         = model.Indicado;
                model.Historia        = historiaService.Carregar(model.Codigo);
                model.Historia.Midias = historiaMidiaService.Listar(model.Historia.ID, true);
                model.Responsavel     = (model.Historia.CodigoIndicadoResponsavel == model.Codigo);

                if (model.Historia.ID != historiaTela.ID)
                {
                    return(new RetornoModel()
                    {
                        Sucesso = false, Mensagem = "Você não pode manipular um ID diferente do seu código."
                    });
                }
                model.Historia.ComentarioIndicado = historiaTela.ComentarioIndicado;
                if (model.Responsavel)
                {
                    if ((model.Historia.IndicadoAprovacaoOriginal != enumAprovacao.aprovado) || (model.Historia.IndicadoAprovacaoResponsavel != enumAprovacao.pendente))
                    {
                        return(new RetornoModel {
                            Mensagem = "Não existe nenhuma pendência vinculada a este código.", Sucesso = false
                        });
                    }
                    model.Historia.ComentarioIndicadoResponsavel = historiaTela.ComentarioIndicado;
                }
                else
                {
                    if (model.Historia.IndicadoAprovacaoOriginal != enumAprovacao.pendente)
                    {
                        return(new RetornoModel {
                            Mensagem = "Não existe nenhuma pendência vinculada a este código.", Sucesso = false
                        });
                    }
                    model.Historia.ComentarioIndicadoOriginal = historiaTela.ComentarioIndicado;
                }
                if (historiaTela.Midias != null)
                {
                    if (model.Historia.Midias == null)
                    {
                        model.Historia.Midias = new List <HistoriaMidia>();
                    }
                    foreach (var htm in historiaTela.Midias)
                    {
                        if (htm.ID == 0)
                        {
                            htm.AdicionadoOrigem = ((model.Responsavel) ? enumAlteracaoOrigem.IndicadoResponsavel : enumAlteracaoOrigem.Indicado);
                            htm.InativoOrigem    = enumAlteracaoOrigem.Nenhum;
                            htm.DataCadastro     = DateTime.Now;
                            htm.HistoriaID       = model.Historia.ID;
                            htm.ArquivoTipo      = htm.ArquivoTipo;
                            model.Historia.Midias.Add(htm);
                            historiaMidiaService.Salvar(htm);
                        }
                        else if (htm.Inativo)
                        {
                            var midia = model.Historia.Midias.FirstOrDefault(t => t.ID == htm.ID);
                            if (midia != null)
                            {
                                midia.InativoOrigem = ((model.Responsavel) ? enumAlteracaoOrigem.IndicadoResponsavel : enumAlteracaoOrigem.Indicado);
                                midia.Inativo       = true;
                                historiaMidiaService.Salvar(midia);
                                model.Historia.Midias.Remove(midia);
                            }
                        }
                    }
                }
                if (model.Responsavel)
                {
                    model.Indicado = dal.Carregar(model.Historia.IndicadoID.Value);

                    if (model.Indicado.ID != indicadoTela.ID)
                    {
                        return(new RetornoModel()
                        {
                            Sucesso = false, Mensagem = "Você não pode manipular um ID diferente do seu código"
                        });
                    }

                    ConfirmarIndicacaoUpdateIndicado(indicadoTela, model.Indicado);

                    model.Historia.TriagemAprovacao             = enumAprovacao.pendente;
                    model.Historia.TriagemAprovacaoNormal       = enumAprovacao.pendente;
                    model.Historia.IndicadoAprovacaoResponsavel = enumAprovacao.aprovado;
                    model.Historia.IndicadoAprovacao            = enumAprovacao.aprovado;
                    model.Historia.AlteracaoOrigem = enumAlteracaoOrigem.IndicadoResponsavel;

                    model.Indicado.AlteracaoOrigem = enumAlteracaoOrigem.IndicadoResponsavel;
                }
                else
                {
                    if (model.Estrangeiro)
                    {
                        // Salva o RNE no DocumentoNumero e o Passaport no DocumentoNumeroComplemento
                        indicadoTela.DocumentoTipoID = enumDocumentoTipoNome.outro;
                    }
                    else
                    {
                        indicadoTela.DocumentoTipoID = enumDocumentoTipoNome.cpf;
                    }

                    model.Indicado = CarregarIndicadoPorDocumento(indicadoTela);
                    model.Historia.AlteracaoOrigem = enumAlteracaoOrigem.Indicado;

                    if (model.Indicado == null)
                    {
                        model.Indicado = indicadoTela;
                        model.Indicado.DataCadastro = DateTime.Now;
                    }
                    else
                    {
                        ConfirmarIndicacaoUpdateIndicado(indicadoTela, model.Indicado);
                    }

                    model.Indicado.AlteracaoOrigem = enumAlteracaoOrigem.Indicado;

                    if (MenorIdade(model.Indicado))
                    {
                        model.Historia.TriagemAprovacao             = enumAprovacao.semNecessidade;
                        model.Historia.TriagemAprovacaoNormal       = enumAprovacao.semNecessidade;
                        model.Historia.IndicadoAprovacaoResponsavel = enumAprovacao.pendente;
                        model.Historia.IndicadoAprovacaoOriginal    = enumAprovacao.aprovado;
                        model.Historia.IndicadoAprovacao            = enumAprovacao.pendente;
                        model.Historia.CodigoIndicadoResponsavel    = historiaService.GeraCodigo();
                        //zera os dados do robo para disparo para o responsavel
                        model.Historia.DataEmailAguardandoAprovacao       = DateTime.Now;
                        model.Historia.QuantidadeEmailAguardandoAprovacao = 0;
                    }
                    else // indicado maior de idade
                    {
                        model.Historia.TriagemAprovacao             = enumAprovacao.pendente;
                        model.Historia.TriagemAprovacaoNormal       = enumAprovacao.pendente;
                        model.Historia.IndicadoAprovacaoResponsavel = enumAprovacao.semNecessidade;
                        model.Historia.IndicadoAprovacaoOriginal    = enumAprovacao.aprovado;
                        model.Historia.IndicadoAprovacao            = enumAprovacao.aprovado;
                    }
                }

                //calculando cidade onde irá carregar a tocha
                CidadeParticipanteService cpService = new CidadeParticipanteService();
                model.Indicado.CidadeParticipanteID = cpService.CarregarPorCidade(model.Indicado.CidadeID).ID;
                model.Indicado.DataModificacao      = DateTime.Now;
                model.Historia.DataModificacao      = DateTime.Now;

                if (!String.IsNullOrEmpty(model.Indicado.FotoArquivoNome))
                {
                    model.IndicadoFotoInfo.file    = model.Indicado.FotoArquivoNome;
                    model.Indicado.FotoArquivoNome = GerarFotoArquivoNome(model.IndicadoFotoInfo);
                }

                //insere Indicado no banco se nao existir com mesmo documento senao atualiza
                if (model.Responsavel)
                {
                    SalvarResponsavelAprovacao(model.Indicado);
                }
                else
                {
                    model.Indicado.ID = SalvarConfirmarIndicacaoIndicado(model.Indicado);
                }
                model.Historia.IndicadoID = model.Indicado.ID;
                historiaService.Salvar(model.Historia);

                try
                {
                    //enviar emails
                    if (model.Responsavel)
                    {
                        EnviarEmailsConfirmacaoResponsavel(model);
                    }
                    else
                    {
                        EnviarEmailsConfirmacaoIndicado(model);
                    }
                }
                catch (Exception ex)
                {
                    LogUtil.Error(ex);
                }
            }
            else
            {
                return(retorno);
            }

            return(new RetornoModel {
                Sucesso = true, Mensagem = "Ok"
            });
        }
        public RetornoModel <IndicadoModel> CarregarConfirmarIndicacao(string Codigo)
        {
            IndicadoModel        model   = new IndicadoModel();
            HistoriaService      sc      = new HistoriaService();
            HistoriaMidiaService scMidia = new HistoriaMidiaService();

            model.Codigo   = Codigo;
            model.Historia = sc.Carregar(Codigo); //buscando historia a partir do codigo do indicado OU RESPONSAVEL
            if (model.Historia == null)           // se a historia existe, monta o model
            {
                return(new RetornoModel <IndicadoModel> {
                    Mensagem = "Código inválido!", Sucesso = false
                });
            }
            model.Historia.Midias = scMidia.Listar(model.Historia.ID, true);
            model.Responsavel     = (Codigo == model.Historia.CodigoIndicadoResponsavel);
            if (model.Responsavel)
            {
                if ((model.Historia.IndicadoAprovacaoOriginal != enumAprovacao.aprovado) || (model.Historia.IndicadoAprovacaoResponsavel != enumAprovacao.pendente))
                {
                    string mensagem = "Não existe nenhuma pendência vinculada a este código.";
                    if (model.Historia.IndicadoAprovacaoResponsavel == enumAprovacao.aprovado)
                    {
                        mensagem = "Essa indicação já foi aprovada.";
                    }
                    else if (model.Historia.IndicadoAprovacaoResponsavel == enumAprovacao.naoAprovado)
                    {
                        mensagem = "Essa indicação já foi recusada.";
                    }
                    return(new RetornoModel <IndicadoModel> {
                        Mensagem = mensagem, Sucesso = false
                    });
                }
                model.Indicado           = dal.Carregar(model.Historia.IndicadoID.Value);
                model.Estrangeiro        = (model.Indicado.DocumentoTipoID != enumDocumentoTipoNome.cpf);
                model.Indicado.UsuarioID = 0;
            }
            else
            {
                if (model.Historia.IndicadoAprovacaoOriginal != enumAprovacao.pendente)
                {
                    string mensagem = "Não existe nenhuma pendência vinculada a este código.";
                    if (model.Historia.IndicadoAprovacaoOriginal == enumAprovacao.aprovado)
                    {
                        mensagem = "Essa indicação já foi aprovada.";
                    }
                    else if (model.Historia.IndicadoAprovacaoOriginal == enumAprovacao.naoAprovado)
                    {
                        mensagem = "Essa indicação já foi recusada.";
                    }
                    return(new RetornoModel <IndicadoModel> {
                        Mensagem = mensagem, Sucesso = false
                    });
                }
                model.Indicado       = new Indicado();
                model.Indicado.Nome  = model.Historia.IndicadoNome;
                model.Indicado.Email = model.Historia.IndicadoEmail;
            }
            model.Historia.CodigoIndicado            = null;
            model.Historia.CodigoIndicadoResponsavel = null;

            HistoriaCategoriaService categoriaService = new HistoriaCategoriaService();

            model.Categoria = categoriaService.Carregar(model.Historia.HistoriaCategoriaID);
            //buscando os estados
            EstadoService service = new EstadoService();

            model.Estados = service.Listar();

            ParentescoService parentescoService = new ParentescoService();

            model.Parentesco = parentescoService.Listar(true);

            model.IndicadoFotoInfo = CarregarFotoInfo(model.Indicado.FotoArquivoNome);
            if (model.IndicadoFotoInfo == null)
            {
                model.IndicadoFotoInfo = new UploadFotoModel();
            }

            return(new RetornoModel <IndicadoModel> {
                Retorno = model, Mensagem = "Código confirmado com sucesso!", Sucesso = true
            });
        }