public override ChamadoViewModel BeforeInsert(ChamadoViewModel value)
        {
            try
            {
                value                      = GetUsuario(value);
                value.empresaId            = SessaoLocal.empresaId;
                value.DataChamado          = Funcoes.Brasilia();
                value.CondominioID         = SessaoLocal.empresaId;
                value.ChamadoStatusID      = 0;
                value.DataRedirecionamento = Funcoes.Brasilia();

                // Se a fila de atendimento destino for a fila do condômino, então preencher o responsável pelo chamado (UsuarioID, Nome e Login)
                if (value.FilaAtendimentoID == DWMSessaoLocal.FilaCondominoID(sessaoCorrente, db))
                {
                    int     UsuarioCondominoID = db.Condominos.Find(value.CondominoID).UsuarioID.Value;
                    Usuario u = seguranca_db.Usuarios.Find(UsuarioCondominoID);
                    value.UsuarioFilaID    = u.usuarioId;
                    value.NomeUsuarioFila  = u.nome;
                    value.LoginUsuarioFila = u.login;
                    value.ChamadoFilaViewModel.UsuarioID = u.usuarioId; // login e nome do usuário serão recuperados do método beforeinsert do ChamadoFilaModel.
                }

                #region Executa o método BeforeInsert do ChamadoFila
                ChamadoFilaModel ChamadoFilaModel = new ChamadoFilaModel();
                ChamadoFilaModel.Create(this.db, this.seguranca_db, SessaoLocal.sessaoId);
                value.ChamadoFilaViewModel = ChamadoFilaModel.BeforeInsert(value.ChamadoFilaViewModel);
                value.Rotas = new List <ChamadoFilaViewModel>();
                ((List <ChamadoFilaViewModel>)value.Rotas).Add(value.ChamadoFilaViewModel);
                #endregion

                #region Executa o método BeforeInsert do ChamadoAnexo para cada elemento da coleção
                ChamadoAnexoModel ChamadoAnexoModel = new ChamadoAnexoModel();
                ChamadoAnexoModel.Create(this.db, this.seguranca_db, SessaoLocal.sessaoId);
                int index = 0;
                while (index <= value.Anexos.Count() - 1)
                {
                    ChamadoAnexoViewModel ChamadoAnexoViewModel = ChamadoAnexoModel.BeforeInsert(value.Anexos.ElementAt(index));
                    value.Anexos.ElementAt(index).UsuarioID = ChamadoAnexoViewModel.UsuarioID;
                    value.Anexos.ElementAt(index).Nome      = ChamadoAnexoViewModel.Nome;
                    value.Anexos.ElementAt(index).Login     = ChamadoAnexoViewModel.Login;
                    index++;
                }
                #endregion
            }
            catch (Exception ex)
            {
                value.mensagem = new Validate()
                {
                    Code        = 999,
                    Message     = "Ocorreu um erro no evento interno que antecede a  inclusão do chamado. Favor entrar em contato com o administrador do sistema",
                    MessageBase = ex.Message
                };
            }

            return(value);
        }
        public override ChamadoViewModel AfterInsert(ChamadoViewModel value)
        {
            // Enviar e-mail ao destinatário
            try
            {
                #region Passo único: Executa o método AfterInsert do ChamadoAnexo para cada elemento da coleção
                ChamadoAnexoModel ChamadoAnexoModel = new ChamadoAnexoModel();
                ChamadoAnexoModel.Create(this.db, this.seguranca_db, SessaoLocal.sessaoId);
                int index = 0;
                while (index <= value.Anexos.Count() - 1)
                {
                    ChamadoAnexoViewModel ChamadoAnexoViewModel = ChamadoAnexoModel.AfterInsert(value.Anexos.ElementAt(index));
                    index++;
                }
                #endregion
            }
            catch (ArgumentException ex)
            {
                value.mensagem = new Validate()
                {
                    Code = 997, Message = MensagemPadrao.Message(997).ToString(), MessageBase = ex.Message
                };
            }
            catch (App_DominioException ex)
            {
                value.mensagem = ex.Result;

                if (ex.InnerException != null)
                {
                    value.mensagem.MessageBase = new App_DominioException(ex.InnerException.Message ?? ex.Message, GetType().FullName).Message;
                }
                else
                {
                    value.mensagem.MessageBase = new App_DominioException(ex.Result.Message, GetType().FullName).Message;
                }
            }
            catch (DbUpdateException ex)
            {
                value.mensagem.MessageBase = ex.InnerException.InnerException.Message ?? ex.Message;
                if (value.mensagem.MessageBase.ToUpper().Contains("REFERENCE") || value.mensagem.MessageBase.ToUpper().Contains("FOREIGN"))
                {
                    if (value.mensagem.MessageBase.ToUpper().Contains("DELETE"))
                    {
                        value.mensagem.Code        = 16;
                        value.mensagem.Message     = MensagemPadrao.Message(16).ToString();
                        value.mensagem.MessageType = MsgType.ERROR;
                    }
                    else
                    {
                        value.mensagem.Code        = 28;
                        value.mensagem.Message     = MensagemPadrao.Message(28).ToString();
                        value.mensagem.MessageType = MsgType.ERROR;
                    }
                }
                else if (value.mensagem.MessageBase.ToUpper().Contains("PRIMARY"))
                {
                    value.mensagem.Code        = 37;
                    value.mensagem.Message     = MensagemPadrao.Message(37).ToString();
                    value.mensagem.MessageType = MsgType.WARNING;
                }
                else if (value.mensagem.MessageBase.ToUpper().Contains("UNIQUE KEY"))
                {
                    value.mensagem.Code        = 54;
                    value.mensagem.Message     = MensagemPadrao.Message(54).ToString();
                    value.mensagem.MessageType = MsgType.WARNING;
                }
                else
                {
                    value.mensagem.Code        = 44;
                    value.mensagem.Message     = MensagemPadrao.Message(44).ToString();
                    value.mensagem.MessageType = MsgType.ERROR;
                }
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException ex)
            {
                value.mensagem = new Validate()
                {
                    Code = 42, Message = MensagemPadrao.Message(42).ToString(), MessageBase = ex.EntityValidationErrors.Select(m => m.ValidationErrors.First().ErrorMessage).First()
                };
            }
            catch (Exception ex)
            {
                value.mensagem.Code        = 17;
                value.mensagem.Message     = MensagemPadrao.Message(17).ToString();
                value.mensagem.MessageBase = new App_DominioException(ex.InnerException.InnerException.Message ?? ex.Message, GetType().FullName).Message;
                value.mensagem.MessageType = MsgType.ERROR;
            }
            return(value);
        }
        public override Validate Validate(ChamadoViewModel value, Crud operation)
        {
            value.mensagem = new Validate()
            {
                Code = 0, Message = MensagemPadrao.Message(0).ToString()
            };

            if (value.CondominioID == 0)
            {
                value.mensagem.Code        = 5;
                value.mensagem.Message     = MensagemPadrao.Message(5, "Condomínio").ToString();
                value.mensagem.MessageBase = "Condomínio deve ser informado";
                value.mensagem.MessageType = MsgType.WARNING;
                return(value.mensagem);
            }

            if (value.empresaId == 0)
            {
                value.mensagem.Code        = 35;
                value.mensagem.Message     = MensagemPadrao.Message(35).ToString();
                value.mensagem.MessageBase = "Sua sessão expirou. Faça um novo login no sistema";
                value.mensagem.MessageType = MsgType.WARNING;
                return(value.mensagem);
            }

            if (value.ChamadoMotivoID == 0)
            {
                value.mensagem.Code        = 5;
                value.mensagem.Message     = MensagemPadrao.Message(5, "Motivo").ToString();
                value.mensagem.MessageBase = "Motivo do chamado deve ser informado";
                value.mensagem.MessageType = MsgType.WARNING;
                return(value.mensagem);
            }

            if (value.ChamadoStatusID != 0 && operation == Crud.INCLUIR)
            {
                value.mensagem.Code        = 5;
                value.mensagem.Message     = MensagemPadrao.Message(5, "Situação").ToString();
                value.mensagem.MessageBase = "Situação do chamado deve ser informada";
                value.mensagem.MessageType = MsgType.WARNING;
                return(value.mensagem);
            }

            // Se a fila solicitante ou a fila para atendimento for a fila do condômino
            // é preciso então que o ID do condômino ou do Credenciado estejam preenchidos
            // é preciso também que a Edificação e a Unidade também estejam preenchidas
            if (DWMSessaoLocal.FilaCondominoID(sessaoCorrente, db) == value.FilaSolicitanteID ||
                DWMSessaoLocal.FilaCondominoID(sessaoCorrente, db) == value.FilaAtendimentoID)
            {
                if (value.CondominoID == 0)
                {
                    value.mensagem.Code        = 5;
                    value.mensagem.Message     = MensagemPadrao.Message(5, "Condômino").ToString();
                    value.mensagem.MessageBase = "Condômino deve ser informado";
                    value.mensagem.MessageType = MsgType.WARNING;
                    return(value.mensagem);
                }
                if (SessaoLocal.CredenciadoID > 0 && value.CredenciadoID == 0)
                {
                    value.mensagem.Code        = 5;
                    value.mensagem.Message     = MensagemPadrao.Message(5, "Residente").ToString();
                    value.mensagem.MessageBase = "Dependente deve ser informado";
                    value.mensagem.MessageType = MsgType.WARNING;
                    return(value.mensagem);
                }
                if (value.EdificacaoID == 0)
                {
                    value.mensagem.Code        = 5;
                    value.mensagem.Message     = MensagemPadrao.Message(5, "Edificação").ToString();
                    value.mensagem.MessageBase = "Edificação deve ser informada";
                    value.mensagem.MessageType = MsgType.WARNING;
                    return(value.mensagem);
                }
                if (value.UnidadeID == 0)
                {
                    value.mensagem.Code        = 5;
                    value.mensagem.Message     = MensagemPadrao.Message(5, "Unidade").ToString();
                    value.mensagem.MessageBase = "Unidade deve ser informada";
                    value.mensagem.MessageType = MsgType.WARNING;
                    return(value.mensagem);
                }
            }

            if (String.IsNullOrEmpty(value.Assunto) || value.Assunto.Trim().Length <= 10)
            {
                value.mensagem.Code        = 5;
                value.mensagem.Message     = MensagemPadrao.Message(5, "Assunto").ToString();
                value.mensagem.MessageBase = "Assunto deve ser informado e deve ter mais de 10 caracteres";
                value.mensagem.MessageType = MsgType.WARNING;
                return(value.mensagem);
            }

            if (value.UsuarioID == 0)
            {
                value.mensagem.Code        = 5;
                value.mensagem.Message     = MensagemPadrao.Message(5, "ID do Usuário").ToString();
                value.mensagem.MessageBase = "Código identificador do Usuário que abriu o chamado deve ser informado";
                value.mensagem.MessageType = MsgType.WARNING;
                return(value.mensagem);
            }

            if (String.IsNullOrEmpty(value.NomeUsuario))
            {
                value.mensagem.Code        = 5;
                value.mensagem.Message     = MensagemPadrao.Message(5, "Nome do Usuário").ToString();
                value.mensagem.MessageBase = "Nome do Usuário que abriu o chamado deve ser informado";
                value.mensagem.MessageType = MsgType.WARNING;
                return(value.mensagem);
            }

            if (String.IsNullOrEmpty(value.LoginUsuario))
            {
                value.mensagem.Code        = 5;
                value.mensagem.Message     = MensagemPadrao.Message(5, "Login do Usuário").ToString();
                value.mensagem.MessageBase = "Login do Usuário que abriu o chamado deve ser informado";
                value.mensagem.MessageType = MsgType.WARNING;
                return(value.mensagem);
            }

            if (String.IsNullOrEmpty(value.Prioridade))
            {
                value.mensagem.Code        = 5;
                value.mensagem.Message     = MensagemPadrao.Message(5, "Prioridade").ToString();
                value.mensagem.MessageBase = "Prioridade do chamado deve ser informada";
                value.mensagem.MessageType = MsgType.WARNING;
                return(value.mensagem);
            }

            if (String.IsNullOrEmpty(value.MensagemOriginal))
            {
                value.mensagem.Code        = 5;
                value.mensagem.Message     = MensagemPadrao.Message(5, "Mensagem").ToString();
                value.mensagem.MessageBase = "Mensagem do chamado deve ser informada";
                value.mensagem.MessageType = MsgType.WARNING;
                return(value.mensagem);
            }

            if (value.FilaAtendimentoID == 0)
            {
                value.mensagem.Code        = 5;
                value.mensagem.Message     = MensagemPadrao.Message(5, "Fila de atendimento").ToString();
                value.mensagem.MessageBase = "Fila de atendimento deve ser informada";
                value.mensagem.MessageType = MsgType.WARNING;
                return(value.mensagem);
            }

            if (value.FilaAtendimentoID == value.FilaSolicitanteID)
            {
                value.mensagem.Code        = 49;
                value.mensagem.Message     = MensagemPadrao.Message(49, "Solicitante", "Encaminhado para").ToString();
                value.mensagem.MessageBase = "Fila do Solicitante dever ser diferente da Fila de Atendimento";
                value.mensagem.MessageType = MsgType.WARNING;
                return(value.mensagem);
            }

            // Valida o ChamadoFila
            if (operation == Crud.INCLUIR)
            {
                ChamadoFilaModel ChamadoFilaModel = new ChamadoFilaModel();
                ChamadoFilaModel.Create(this.db, this.seguranca_db, SessaoLocal.sessaoId);
                value.mensagem = ChamadoFilaModel.Validate(value.ChamadoFilaViewModel, Crud.INCLUIR);
            }

            // Validar Anexos
            ChamadoAnexoModel ChamadoAnexoModel = new ChamadoAnexoModel();

            ChamadoAnexoModel.Create(this.db, this.seguranca_db, SessaoLocal.sessaoId);
            foreach (ChamadoAnexoViewModel cha in value.Anexos)
            {
                value.mensagem = ChamadoAnexoModel.Validate(cha, Crud.INCLUIR);
                if (value.mensagem.Code > 0)
                {
                    break;
                }
            }
            ;

            return(value.mensagem);
        }
        public override ChamadoViewModel MapToRepository(Chamado entity)
        {
            ChamadoViewModel value = new ChamadoViewModel()
            {
                ChamadoID                = entity.ChamadoID,
                ChamadoMotivoID          = entity.ChamadoMotivoID,
                DescricaoChamadoMotivo   = db.ChamadoMotivos.Find(entity.ChamadoMotivoID, sessaoCorrente.empresaId).Descricao,
                ChamadoStatusID          = entity.ChamadoStatusID,
                DescricaoChamadoStatus   = db.ChamadoStatuss.Find(entity.ChamadoStatusID, sessaoCorrente.empresaId).Descricao,
                FilaSolicitanteID        = entity.FilaSolicitanteID,
                DescricaoFilaSolicitante = db.FilaAtendimentos.Find(entity.FilaSolicitanteID).Descricao,
                FilaCondominoID          = DWMSessaoLocal.FilaCondominoID(sessaoCorrente, this.db),
                CondominioID             = entity.CondominioID,
                CondominoID              = entity.CondominoID,
                NomeCondomino            = entity.CondominoID.HasValue ? db.Condominos.Find(entity.CondominoID).Nome : "",
                NomeCredenciado          = entity.CredenciadoID.HasValue ? db.Credenciados.Find(entity.CredenciadoID).Nome : "",
                CredenciadoID            = entity.CredenciadoID,
                EdificacaoID             = entity.EdificacaoID,
                UnidadeID                = entity.UnidadeID,
                DescricaoEdificacao      = entity.UnidadeID.HasValue ? db.Edificacaos.Find(entity.EdificacaoID).Descricao : "",
                DataChamado              = entity.DataChamado,
                Assunto                  = entity.Assunto,
                UsuarioID                = entity.UsuarioID,
                NomeUsuario              = entity.NomeUsuario,
                LoginUsuario             = entity.LoginUsuario,
                Prioridade               = entity.Prioridade,
                DataUltimaAnotacao       = entity.DataUltimaAnotacao,
                MensagemOriginal         = entity.MensagemOriginal,
                FilaAtendimentoID        = entity.FilaAtendimentoID,
                DescricaoFilaAtendimento = db.FilaAtendimentos.Find(entity.FilaAtendimentoID).Descricao,
                DataRedirecionamento     = entity.DataRedirecionamento,
                UsuarioFilaID            = entity.UsuarioFilaID,
                NomeUsuarioFila          = entity.NomeUsuarioFila,
                LoginUsuarioFila         = entity.LoginUsuarioFila,
                mensagem                 = new Validate()
                {
                    Code = 0, Message = "Registro incluído com sucesso", MessageBase = "Registro incluído com sucesso", MessageType = MsgType.SUCCESS
                }
            };

            if (entity.CondominoID.HasValue)
            {
                value.UsuarioCondominoViewModel = new UsuarioViewModel()
                {
                    empresaId = SessaoLocal.empresaId,
                    usuarioId = db.Condominos.Find(entity.CondominoID).UsuarioID.Value
                };
            }
            else if (entity.CredenciadoID.HasValue)
            {
                value.UsuarioCondominoViewModel = new UsuarioViewModel()
                {
                    empresaId = SessaoLocal.empresaId,
                    usuarioId = db.Credenciados.Find(entity.CredenciadoID).UsuarioID.Value
                };
            }

            ListViewChamadoFila     listChamadoFila     = new ListViewChamadoFila(this.db, this.seguranca_db, sessaoCorrente.sessaoId);
            ListViewChamadoAnotacao listChamadoAnotacao = new ListViewChamadoAnotacao(this.db, this.seguranca_db, sessaoCorrente.sessaoId);
            ListViewChamadoAnexo    listChamadoAnexo    = new ListViewChamadoAnexo(this.db, this.seguranca_db, sessaoCorrente.sessaoId);

            if (entity.ChamadoID > 0)
            {
                value.Rotas     = listChamadoFila.Bind(0, 200, value.ChamadoID);
                value.Anotacoes = listChamadoAnotacao.Bind(0, 200, value.ChamadoID);
                value.Anexos    = listChamadoAnexo.Bind(0, 100, value.ChamadoID);
            }
            else
            {
                #region Rotas
                value.Rotas = new List <ChamadoFilaViewModel>();
                ChamadoFilaModel ChamadoFilaModel = new ChamadoFilaModel();
                ChamadoFilaModel.Create(this.db, this.seguranca_db, sessaoCorrente.sessaoId);
                foreach (ChamadoFila fila in entity.Rotas)
                {
                    ChamadoFilaViewModel ChamadoFilaViewModel = ChamadoFilaModel.MapToRepository(fila);
                    ((List <ChamadoFilaViewModel>)value.Rotas).Add(ChamadoFilaViewModel);
                }
                #endregion

                #region Anexos
                value.Anexos = new List <ChamadoAnexoViewModel>();
                ChamadoAnexoModel ChamadoAnexoModel = new ChamadoAnexoModel();
                ChamadoAnexoModel.Create(this.db, this.seguranca_db, sessaoCorrente.sessaoId);
                foreach (ChamadoAnexo anexo in entity.Anexos)
                {
                    ChamadoAnexoViewModel ChamadoAnexoViewModel = ChamadoAnexoModel.MapToRepository(anexo);
                    ((List <ChamadoAnexoViewModel>)value.Anexos).Add(ChamadoAnexoViewModel);
                }
                #endregion
            }

            #region Verifica se o usuário corrente é um usuário da Fila de atendimento atual
            value.IsUsuarioFila = false;

            if (value.UsuarioFilaID.HasValue && value.UsuarioFilaID.Value == SessaoLocal.usuarioId)
            {
                value.IsUsuarioFila = true;
            }
            else if (value.FilaAtendimentoID != DWMSessaoLocal.FilaCondominoID(sessaoCorrente, db))
            {
                value.IsUsuarioFila = (from f in db.FilaAtendimentos
                                       join fu in db.FilaAtendimentoUsuarios on f.FilaAtendimentoID equals fu.FilaAtendimentoID
                                       where f.CondominioID == SessaoLocal.empresaId &&
                                       f.FilaAtendimentoID == value.FilaAtendimentoID &&
                                       fu.UsuarioID == SessaoLocal.usuarioId
                                       select fu.UsuarioID).Count() > 0;
            }
            #endregion

            #region Verifica se o usuário corrente é um condômino/credenciado
            value.IsCondomino = (SessaoLocal.CondominoID > 0 || SessaoLocal.CredenciadoID.HasValue);
            #endregion

            return(value);
        }
        public override Chamado MapToEntity(ChamadoViewModel value)
        {
            Chamado entity = null;

            if (value.ChamadoID > 0)
            {
                entity = Find(value);
            }
            else
            {
                entity = new Chamado();
            }

            entity.ChamadoID            = value.ChamadoID;
            entity.ChamadoMotivoID      = value.ChamadoMotivoID;
            entity.ChamadoStatusID      = value.ChamadoStatusID;
            entity.FilaSolicitanteID    = value.FilaSolicitanteID;
            entity.CondominioID         = value.CondominioID;
            entity.CondominoID          = value.CondominoID == 0 ? null : value.CondominoID;
            entity.CredenciadoID        = value.CredenciadoID == 0 ? null : value.CredenciadoID;
            entity.EdificacaoID         = value.EdificacaoID;
            entity.UnidadeID            = value.UnidadeID;
            entity.DataChamado          = value.DataChamado;
            entity.Assunto              = value.Assunto;
            entity.MensagemOriginal     = value.MensagemOriginal;
            entity.UsuarioID            = value.UsuarioID;
            entity.NomeUsuario          = value.NomeUsuario;
            entity.LoginUsuario         = value.LoginUsuario;
            entity.Prioridade           = value.Prioridade;
            entity.DataUltimaAnotacao   = value.DataUltimaAnotacao;
            entity.FilaAtendimentoID    = value.FilaAtendimentoID;
            entity.DataRedirecionamento = value.DataRedirecionamento;
            entity.UsuarioFilaID        = value.UsuarioFilaID;
            entity.NomeUsuarioFila      = value.NomeUsuarioFila;
            entity.LoginUsuarioFila     = value.LoginUsuarioFila;

            // Executa o MapToEntity do ChamadoFila
            if (value.ChamadoFilaViewModel != null)
            {
                ChamadoFilaModel ChamadoFilaModel = new ChamadoFilaModel();
                ChamadoFilaModel.Create(this.db, this.seguranca_db, SessaoLocal.sessaoId);
                entity.Rotas = new List <ChamadoFila>();
                entity.Rotas.Add(ChamadoFilaModel.MapToEntity(value.ChamadoFilaViewModel));
            }

            // Mapear anexos
            if (entity.Anexos == null || entity.Anexos.Count == 0)
            {
                ChamadoAnexoModel ChamadoAnexoModel = new ChamadoAnexoModel();
                ChamadoAnexoModel.Create(this.db, this.seguranca_db, SessaoLocal.sessaoId);
                entity.Anexos = new List <ChamadoAnexo>();
                foreach (ChamadoAnexoViewModel cha in value.Anexos)
                {
                    ChamadoAnexo ChamadoAnexo = ChamadoAnexoModel.MapToEntity(cha);
                    entity.Anexos.Add(ChamadoAnexo);
                }
                ;
            }

            return(entity);
        }