public ModeloDeFormulario GravarModeloFormulario(ModeloFormularioDTO modeloDTO, string UsuarioID) { ModeloDeFormulario modelo; using (IRepository <ModeloDeFormulario> repo = factory.Get().GetRepository <ModeloDeFormulario>()) { if (modeloDTO.ModeloFormularioID > 0) { modelo = BuscarModeloDeFormulario().Single(c => c.ModeloFormularioID == modeloDTO.ModeloFormularioID); } else { modelo = repo.Insert(CreateInstance <ModeloDeFormulario>()); } modelo.Descricao = modeloDTO.Descricao; modelo.Html = modeloDTO.Html; modelo.ControleAtualizacao = ControleUsuario.Criar(UsuarioID); modeloDTO.Perguntas.AtribuirUsuarioID(UsuarioID); //Perguntas novas foreach (PerguntaDTO perguntaDTO in modeloDTO.Perguntas.Where(c => c.PerguntaID <= 0 || !modelo.Perguntas.Any(d => d.PerguntaID == c.PerguntaID))) { Pergunta pergunta = GravarPergunta(perguntaDTO, UsuarioID); pergunta.ModeloDeFormulario = modelo; modelo.Perguntas.Add(pergunta); if (perguntaDTO.PerguntaCondicional != null) { Pergunta perguntaOrigem = modelo.Perguntas.Single(c => c.PerguntaID == perguntaDTO.PerguntaCondicional.PerguntaID); PerguntaCondicional pCondicional = GravarPerguntaCondicional(perguntaDTO.PerguntaCondicional, perguntaOrigem, UsuarioID); pergunta.PerguntaCondicional = pCondicional; } foreach (LeiautePerguntaDTO leiautePerguntaDTO in perguntaDTO.LeiautesPergunta.ToList()) { LeiautePergunta leiautePergunta = CriarLeiautePergunta(leiautePerguntaDTO); //grava o leiaute vinculado à pergunta GravarLeiautePergunta(leiautePergunta, UsuarioID); } if (perguntaDTO.LeiautesPergunta.Any() == false) { GravarLeiautePergunta(LeiautePergunta.LeiautePadrao(pergunta), UsuarioID); } } //Perguntas atualizadas foreach (Pergunta pergunta in modelo.Perguntas.ToList()) { pergunta.ModeloDeFormulario = modelo; //tracking changes PerguntaDTO perguntaDTO = modeloDTO.Perguntas.SingleOrDefault(d => d.PerguntaID == pergunta.PerguntaID); if (perguntaDTO.Deleted) { List <Pergunta> perguntasCondicionais = modelo.Perguntas.Where(c => c.PerguntaCondicionalID == perguntaDTO.PerguntaID).ToList(); foreach (Pergunta pCondicional in perguntasCondicionais) { //remove o vínculo, operações e valor de ativação pCondicional.RemoverCondicional(); } foreach (LeiautePergunta leiautePergunta in pergunta.LeiautePerguntas.ToList()) { //remove o leiaute vinculado à pergunta ExcluirLeiautePergunta(leiautePergunta.LeiautePerguntaID); } //Remove a pergunta do modelo (Caso não tenha nenhuma resposta) ExcluirPergunta(perguntaDTO.PerguntaID); } else { //Atualização pergunta.AtribuirPergunta(perguntaDTO); //Pergunta condicinoal removida if (pergunta.PerguntaCondicionalID.HasValue && perguntaDTO.PerguntaCondicionalID.HasValue == false) { pergunta.RemoverCondicional(); ExcluirPerguntaCondicional(pergunta.PerguntaCondicionalID.Value); } else if (perguntaDTO.PerguntaCondicionalID.HasValue) { PerguntaCondicional condicional = GravarPerguntaCondicional(perguntaDTO.PerguntaCondicional, pergunta, UsuarioID); } foreach (LeiautePergunta leiautePergunta in pergunta.LeiautePerguntas.ToList()) { //grava o leiaute vinculado à pergunta GravarLeiautePergunta(leiautePergunta, UsuarioID); } } } } return(modelo); }