public InformacoesIndicadoModel CarregaInformacoesIndicado(int indicadoID)
        {
            InformacoesIndicadoModel retorno = new InformacoesIndicadoModel();

            retorno.Indicado = dal.Carregar(indicadoID);

            retorno.TotalIndicacoes = dal.QtdeHistorias(indicadoID);
            retorno.Aprovadas       = dal.QtdeHistoriasAprovadas(indicadoID);
            retorno.Recusadas       = dal.QtdeHistoriasNaoAprovadas(indicadoID);
            retorno.Moderadas       = dal.QtdeHistoriasModeradas(indicadoID);

            HistoriaCategoriaService servHistoriaCategoria = new HistoriaCategoriaService();

            retorno.Qualidades = servHistoriaCategoria.Listar(indicadoID).ToList();

            CidadeParticipanteService servCidadeParticipante = new CidadeParticipanteService();

            retorno.CidadesParticipantes = servCidadeParticipante.ListarAtivas().ToList();
            //if (dal.EstaNaGaleria(indicadoID, historiaID))
            //    retorno.LinkGaleria = "http://google.com";

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