public void DeleteRespostaRelatorio(int negociacaoId, int respostaId)
        {
            RespostaRelatorio resposta = _db.RespostasRelatorio.Find(respostaId);

            if (resposta == null)
            {
                throw new NotFoundException();
            }
            _db.Entry(resposta).Reference(r => r.GrupoPergunta).Load();
            _db.Entry(resposta.GrupoPergunta).Reference(g => g.Relatorio).Load();
            if (resposta.GrupoPergunta.Relatorio.NegociacaoId != negociacaoId)
            {
                throw new Exception($"A pergunta de ID {respostaId} não pertence ao relatório da negociação {negociacaoId}!");
            }
            _db.RespostasRelatorio.Remove(resposta);
            _db.SaveChanges();
        }
        public void SaveRelatorio(int negociacaoId, Relatorio relatorio)
        {
            relatorio.NegociacaoId = negociacaoId;
            Relatorio oldRelatorio = _db.Relatorios.Find(relatorio.Id);

            if (oldRelatorio != null)
            {
                foreach (GrupoPergunta grupo in relatorio.GruposPerguntas)
                {
                    IEnumerable <RespostaRelatorio> respostas = grupo.Respostas;
                    grupo.Respostas = null;
                    GrupoPergunta oldGrupo = _db.GruposPerguntas.Find(grupo.Id);
                    if (oldGrupo == null)
                    {
                        _db.GruposPerguntas.Add(grupo);
                        _db.SaveChanges();
                    }
                    else
                    {
                        _db.Entry(oldGrupo).CurrentValues.SetValues(grupo);
                    }
                    foreach (RespostaRelatorio resposta in respostas)
                    {
                        resposta.GrupoPerguntaId = grupo.Id;
                        RespostaRelatorio oldResposta = _db.RespostasRelatorio.Find(resposta.Id);
                        if (oldResposta == null)
                        {
                            _db.RespostasRelatorio.Add(resposta);
                        }
                        else
                        {
                            _db.Entry(oldResposta).CurrentValues.SetValues(resposta);
                        }
                    }
                }
                relatorio.GruposPerguntas = null;
                _db.Entry(oldRelatorio).CurrentValues.SetValues(relatorio);
                _db.SaveChanges();
            }
        }
        public Relatorio GenerateRelatorioFinal(int negociacaoId)
        {
            Negociacao negociacao = Find(negociacaoId);

            if (negociacao == null)
            {
                throw new NotFoundException();
            }

            Relatorio relatorio = _db.Relatorios.FirstOrDefault(r => r.NegociacaoId == negociacaoId);

            if (relatorio == null)
            {
                using (var transaction = _db.Database.BeginTransaction())
                {
                    try
                    {
                        relatorio = new Relatorio
                        {
                            NegociacaoId = negociacaoId,
                            Titulo       = "Relatório - Acordo Coletivo Algar"
                        };
                        _db.Relatorios.Add(relatorio);
                        _db.SaveChanges();

                        List <GrupoPerguntaPadrao> gruposPerguntasPadrao = _db.GruposPerguntasPadrao
                                                                           .Include(g => g.Perguntas).ToList();

                        foreach (GrupoPerguntaPadrao grupoPadrao in gruposPerguntasPadrao)
                        {
                            GrupoPergunta grupo = new GrupoPergunta
                            {
                                RelatorioId = relatorio.Id,
                                Ordem       = grupoPadrao.Ordem,
                                Texto       = grupoPadrao.Texto
                            };
                            _db.GruposPerguntas.Add(grupo);
                            _db.SaveChanges();

                            foreach (PerguntaPadrao perguntaPadrao in grupoPadrao.Perguntas)
                            {
                                RespostaRelatorio resposta = new RespostaRelatorio
                                {
                                    GrupoPerguntaId = grupo.Id,
                                    Ordem           = perguntaPadrao.Ordem,
                                    Pergunta        = perguntaPadrao.Texto,
                                    Resposta        = RespostaPadrao(perguntaPadrao.Texto, negociacao),
                                    NumColunas      = perguntaPadrao.NumColunas
                                };
                                _db.RespostasRelatorio.Add(resposta);
                            }
                            _db.SaveChanges();
                        }

                        transaction.Commit();
                    }
                    catch (Exception e)
                    {
                        transaction.Rollback();
                        throw e;
                    }
                }
            }
            return(relatorio);
        }