public List <Apolice> ListarPorCarroId(int carroId)
        {
            SqlCommand cmd = new SqlCommand("SELECT id, dt_inicio, dt_fim, vl_franquia, vl_premio from apolice " +
                                            "WHERE carro_id = @carro_id");

            cmd.Parameters.Add(new SqlParameter("@carro_id", carroId));

            ConexaoBanco banco = new ConexaoBanco();

            banco.AbrirConexao();
            SqlDataReader reader = banco.Pesquisar(cmd);

            List <Apolice> lstRetorno = new List <Apolice>();

            while (reader.Read())
            {
                Apolice obj = new Apolice();

                obj.Id            = reader.GetInt32(0);
                obj.DtInicio      = reader.GetDateTime(1);
                obj.DtFim         = reader.GetDateTime(2);
                obj.ValorFranquia = reader.GetDecimal(3);
                obj.ValorPremio   = reader.GetDecimal(4);

                lstRetorno.Add(obj);
            }

            reader.Close();
            banco.FecharConexao();

            return(lstRetorno);
        }
Example #2
0
        public ServiceReturn Incluir(Apolice apolice)
        {
            try
            {
                var check = ObterPorNumero(apolice.Numero, false);
                if (check == null)
                {
                    apoliceRepository.Incluir(apolice);
                    apoliceRepository.Salvar();

                    return(new ServiceReturn()
                    {
                        success = true, title = "Sucesso", message = "Apólice cadastrada com sucesso!"
                    });
                }

                return(new ServiceReturn()
                {
                    success = false, title = "Erro", message = "Não foi possível cadastrar a apólice pois já existe um registro com o mesmo número!"
                });
            }
            catch (Exception ex)
            {
                return(new ServiceReturn()
                {
                    success = false, title = "Erro", message = string.Format("Um erro do tipo {0} foi disparado ao cadastrar a apólice! Mensagem: {1}", ex.GetType(), ex.Message)
                });
            }
        }
Example #3
0
        public Retorno <object> Add(Apolice model)
        {
            Retorno <object> oRet = new Retorno <object>();

            try
            {
                if (String.IsNullOrEmpty(model.CPFCNPJ))
                {
                    throw new Exception("Informe o CPF/CNPJ");
                }
                if (String.IsNullOrEmpty(model.Placa))
                {
                    throw new Exception("Informe a placa");
                }
                if (model.ValorPremio <= 0)
                {
                    throw new Exception("Informe um valor válido");
                }

                _seguroDBContext.Add(model);
                _seguroDBContext.SaveChanges();
                oRet.setSuccesso();
                oRet.Object = model;
            }
            catch (System.Exception ex)
            {
                oRet.setErro(ex.Message);
            }
            return(oRet);
        }
        public Apolice Selecionar(Apolice objEntrada)
        {
            SqlCommand cmd;

            ConexaoBanco banco = new ConexaoBanco();

            banco.AbrirConexao();

            cmd = new SqlCommand("SELECT id, dt_inicio, dt_fim, vl_franquia, vl_premio from apolice " +
                                 "WHERE id = @id");

            cmd.Parameters.Add(new SqlParameter("@id", objEntrada.Id));

            SqlDataReader reader = banco.Pesquisar(cmd);

            reader.Read();

            Apolice obj = new Apolice();

            obj.Id            = reader.GetInt32(0);
            obj.DtInicio      = reader.GetDateTime(1);
            obj.DtFim         = reader.GetDateTime(2);
            obj.ValorFranquia = reader.GetDecimal(3);
            obj.ValorPremio   = reader.GetDecimal(4);

            reader.Close();
            banco.FecharConexao();

            return(obj);
        }
Example #5
0
        public ActionResult DeleteConfirmed(int id)
        {
            Apolice apolice = db.Apolice.Find(id);

            db.Apolice.Remove(apolice);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
Example #6
0
        public IActionResult Put(int id, [FromBody] Apolice model)
        {
            Retorno oRet = new Retorno();

            oRet = _apoliceNegocio.Update(id, model);

            return(Ok(oRet));
        }
Example #7
0
        public IActionResult Post([FromBody] Apolice model)
        {
            Retorno <object> oRet = new Retorno <object>();

            oRet = _apoliceNegocio.Add(model);

            return(Ok(oRet));
        }
Example #8
0
 public IActionResult EditApolice(int id, Apolice apolice)
 {
     if (id != apolice.Id)
     {
         return(BadRequest());
     }
     _apoliceService.Update(apolice);
     return(RedirectToAction(nameof(Index)));
 }
        public void InsertOrUpdate(Apolice apolice){
            if (apolice.Id == default(int))
            {
                context.Apolices.Add(apolice);
>>>>>>> 6bef4ea7199f182f1dcc5a1156a157494ff9f29c
            }
            else
            {
                context.Entry(apolice).State = EntityState.Modified;
            }
        }
Example #10
0
        // GET: Apolice/Create
        public ActionResult Create(int?propostaId)
        {
            Apolice apolice = new Apolice();

            PropostaDAO propostaDao = new PropostaDAO();

            apolice.Proposta      = propostaDao.GetProposta(propostaId);
            apolice.Seguradoras   = db.Seguradora.ToList();
            apolice.ValorContrato = 0;
            return(View(apolice));
        }
Example #11
0
        public Apolice Obter(int id)
        {
            Apolice apolice = null;

            try
            {
                apolice = apoliceRepository.ObterPorId(id);
            }
            catch (Exception ex)
            { }

            return(apolice);
        }
Example #12
0
        public Apolice ObterPorNumero(string numero, bool withTracking)
        {
            Apolice apolice = null;

            try
            {
                apolice = apoliceRepository.ObterPorNumero(numero, withTracking);
            }
            catch (Exception ex)
            { }

            return(apolice);
        }
Example #13
0
        // GET: Apolice/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            Apolice apolice = db.Apolice.Find(id);

            if (apolice == null)
            {
                return(HttpNotFound());
            }
            return(View(apolice));
        }
Example #14
0
        // GET: Apolice/Details/5
        public ActionResult Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            Apolice apolice = Service.Obter(id.Value);

            if (apolice == null)
            {
                return(HttpNotFound());
            }
            return(PartialView(apolice));
        }
Example #15
0
        public ActionResult SendForm(Apolice apolice)
        {
            //if (ModelState.IsValid)
            //{
            db.Comissao.Add(apolice.Comissao);
            db.SaveChanges();
            apolice.CodigoComissao = apolice.Comissao.Id;
            db.Apolice.Add(apolice);
            db.SaveChanges();

            PropostaDAO propostaDao = new PropostaDAO();
            Proposta    proposta    = propostaDao.GetProposta(apolice.CodigoProposta);

            //Mudando Status para fins de organização
            propostaDao.MudarStatus(proposta.Id, (int)StatusProposta.ATENDIDO);

            //criando valor da proposta do condutor
            ValorProposta valorProposta = new ValorProposta();

            valorProposta.Valor          = apolice.ValorContrato;
            valorProposta.CodigoCondutor = proposta.Segurado.Id;
            valorProposta.DataVencimento = new DateTime(2016, 05, 12);
            valorProposta.CodigoApolice  = apolice.Id;

            db.ValorProposta.Add(valorProposta);
            db.SaveChanges();
            //}

            Usuario usuario = (Usuario)Session["UsuarioLogado"];

            //PREPARANDO EMAIL
            apolice.Seguradora            = db.Seguradora.Find(apolice.CodigoSeguradora);
            apolice.formularioApoliceHtml = apolice.formularioApoliceHtml.Replace("#seguradoraEmail", apolice.Seguradora.NomeSeguradora.ToString());
            apolice.formularioApoliceHtml = apolice.formularioApoliceHtml.Replace("#valorContratoEmail", apolice.ValorContrato.ToString());
            apolice.formularioApoliceHtml = apolice.formularioApoliceHtml.Replace("#corretorEmail", "Seu Corretor - " + usuario.Nome);
            string url = Request.Url.AbsoluteUri.Replace(Request.Url.AbsolutePath, "");

            apolice.formularioApoliceHtml = apolice.formularioApoliceHtml.Replace("#EnderecoConfirmaEmail", url + "/Proposta/AceitarProposta?" +
                                                                                  "email=" + proposta.Segurado.Email +
                                                                                  "&codigoProposta=" + apolice.CodigoProposta +
                                                                                  "&codigoApolice=" + apolice.Id);


            UtilEmailMessage utilEmail = new UtilEmailMessage();

            utilEmail.EnviarEmail("[BUSCA SEGUROS] Sua Proposta de Cotação de Seguro", proposta.Segurado.Email, apolice.formularioApoliceHtml);

            return(View(apolice));
        }
Example #16
0
        // GET: Apolice/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            Apolice apolice = Service.Obter(id.Value);

            ViewBag.Empresas = new SelectList(EmpresaService.ObterTodos(), "IdEmpresa", "NomeFantasia", apolice.Empresa?.IdEmpresa);
            if (apolice == null)
            {
                return(HttpNotFound());
            }
            return(PartialView(apolice));
        }
Example #17
0
 //Metodo de Editar um Apolice po ID
 public void Update(Apolice obj)
 {
     if (!_context.Apolice.Any(x => x.Id == obj.Id))
     {
         throw new NotFoundException("Id nao existe");
     }
     try
     {
         _context.Update(obj);
         _context.SaveChanges();
     }
     catch (DbConcurrencyException e)
     {
         throw new DbConcurrencyException(e.Message);
     }
 }
Example #18
0
        public ActionResult Edit([Bind(Include = "IdApolice,Numero,DataValidade,Observacao,Criacao,Criador,Atualizacao,Atualizador,Ativo,EmpresaId,Seguradora,Seguro,DataInicioVigencia")] Apolice apolice, FormCollection form)
        {
            if (ModelState.IsValid)
            {
                apolice.Atualizacao = DateTime.Now;
                apolice.Atualizador = User.Identity.Name;

                #region
                //apolice.Empresa = EmpresaService.ObterPorId(int.Parse(form["Empresa.IdEmpresa"]));
                #endregion

                var check = Service.Atualizar(apolice);
                return(Json(check, JsonRequestBehavior.AllowGet));
            }
            return(PartialView(apolice));
        }
        public void Alterar(Apolice objEntrada)
        {
            SqlCommand cmd = new SqlCommand("UPDATE apolice SET dt_inicio = @dt_inicio, dt_fim = @dt_fim, vl_franquia = @vl_franquia, vl_premio = @vl_premio " +
                                            "WHERE id = @id");

            cmd.Parameters.Add(new SqlParameter("@id", objEntrada.Id));
            cmd.Parameters.Add(new SqlParameter("@dt_inicio", objEntrada.DtInicio));
            cmd.Parameters.Add(new SqlParameter("@dt_fim", objEntrada.DtFim));
            cmd.Parameters.Add(new SqlParameter("@vl_franquia", objEntrada.ValorFranquia));
            cmd.Parameters.Add(new SqlParameter("@vl_premio", objEntrada.ValorPremio));

            ConexaoBanco banco = new ConexaoBanco();

            banco.AbrirConexao();
            banco.Executar(cmd);
            banco.FecharConexao();
        }
Example #20
0
        public ActionResult Create([Bind(Include = "IdApolice,Numero,DataValidade,Observacao,Criacao,Criador,Atualizacao,Atualizador,Ativo,EmpresaId,Seguradora,Seguro,DataInicioVigencia")] Apolice apolice, FormCollection form)
        {
            if (ModelState.IsValid)
            {
                apolice.Criador         =
                    apolice.Atualizador = User.Identity.Name;

                #region
                //apolice.Empresa = EmpresaService.ObterPorId(int.Parse(form["Empresa.IdEmpresa"]));
                #endregion

                var check = Service.Incluir(apolice);
                return(Json(check, JsonRequestBehavior.AllowGet));
            }

            ViewBag.Empresas = new SelectList(EmpresaService.ObterTodos(), "IdEmpresa", "NomeFantasia");
            return(PartialView(apolice));
        }
        public void Inserir(Apolice objEntrada)
        {
            SqlCommand cmd = new SqlCommand("INSERT INTO apolice(carro_id, dt_inicio, dt_fim, vl_franquia, vl_premio) " +
                                            "VALUES (@carro_id, @dt_inicio, @dt_fim, @vl_franquia, @vl_premio)");


            cmd.Parameters.Add(new SqlParameter("@carro_id", objEntrada.Carro.Id));
            cmd.Parameters.Add(new SqlParameter("@dt_inicio", objEntrada.DtInicio));
            cmd.Parameters.Add(new SqlParameter("@dt_fim", objEntrada.DtFim));
            cmd.Parameters.Add(new SqlParameter("@vl_franquia", objEntrada.ValorFranquia));
            cmd.Parameters.Add(new SqlParameter("@vl_premio", objEntrada.ValorPremio));

            ConexaoBanco banco = new ConexaoBanco();

            banco.AbrirConexao();
            banco.Executar(cmd);
            banco.FecharConexao();
        }
Example #22
0
        private void btnAlterar_Click(object sender, EventArgs e)
        {
            try
            {
                Apolice apolice = new Apolice();

                apolice.Id = Convert.ToInt32(dgvApolices.SelectedRows[0].Cells[0].Value);

                frmIncluirAlterarApolice janela = new frmIncluirAlterarApolice(apolice);
                if (janela.ShowDialog() == DialogResult.OK)
                {
                    AtualizarDgv();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 void Consistir(Apolice objEntrada)
 {
     if (objEntrada.DtInicio >= objEntrada.DtFim)
     {
         throw new ConsistenciaException("Por favor, Início da vigência deve ser menor que o campo Fim da vigência");
     }
     if (objEntrada.ValorFranquia == 0)
     {
         throw new ConsistenciaException("Por favor, preencha o campo Valor da Franquia de forma correta");
     }
     if (objEntrada.ValorPremio == 0)
     {
         throw new ConsistenciaException("Por favor, preencha o campo Valor da Prêmio de forma correta");
     }
     if (objEntrada.ValorPremio <= objEntrada.ValorFranquia)
     {
         throw new ConsistenciaException("O valor do prêmio deve ser maior que o valor da franquia");
     }
 }
Example #24
0
        // GET: Apolice/Details/5
        public ActionResult Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            Apolice     apolice     = db.Apolice.Find(id);
            PropostaDAO propostaDao = new PropostaDAO();

            propostaDao.GetProposta(apolice.CodigoProposta);
            apolice.Proposta   = propostaDao.GetProposta(apolice.CodigoProposta);
            apolice.Comissao   = db.Comissao.Find(apolice.CodigoComissao);
            apolice.Seguradora = db.Seguradora.Find(apolice.CodigoSeguradora);
            if (apolice == null)
            {
                return(HttpNotFound());
            }
            return(View(apolice));
        }
Example #25
0
        public Retorno <object> Get(int id)
        {
            Retorno <object> oRet = new Retorno <object>();
            var apolice           = new Apolice();

            try
            {
                apolice = (from p in _seguroDBContext.Apolice
                           where p.NumApolice == id
                           select p).FirstOrDefault();

                oRet.setSuccesso();
                oRet.Object = apolice;
            }
            catch (System.Exception ex)
            {
                oRet.setErro(ex.Message);
            }
            return(oRet);
        }
Example #26
0
        private void AlterarApolice()
        {
            Apolice apolice = new Apolice();

            apolice.Id = _apolice.Id;

            #region Prepara a apolice a ser inserida

            apolice.DtFim    = dtpFimVigencia.Value;
            apolice.DtInicio = dtpInicioVigencia.Value;

            decimal.TryParse(txtVlFranquia.Text, out decimal valorFranquia);
            decimal.TryParse(txtVlPremio.Text, out decimal valorPremio);
            apolice.ValorFranquia = valorFranquia;
            apolice.ValorPremio   = valorPremio;

            #endregion

            new ApoliceController().Alterar(apolice);
        }
Example #27
0
        private void btnNovaApolice_Click(object sender, EventArgs e)
        {
            try
            {
                Apolice apolice = new Apolice();
                apolice.Carro = new Carro();

                //carro que vai ter a apolice inserida
                apolice.Carro.Id = _carro.Id;

                frmIncluirAlterarApolice janela = new frmIncluirAlterarApolice(apolice);
                if (janela.ShowDialog() == DialogResult.OK)
                {
                    AtualizarDgv();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        public async Task <Unit> Handle(CriarApoliceCommand request, CancellationToken cancellationToken)
        {
            var segurado = await _seguradoRepository.Obter(request.CodigoSegurado);

            if (segurado == null)
            {
                await _mediatorHandler.RaiseAppEvent(this, "Não foi encontrado o segurado com o código informado.");

                return(Unit.Value);
            }

            var numeroApolice = NumeroApolice.Create(request.Apolice);
            var vigencia      = PeriodoVigencia.Create(request.InicioVigencia, request.FinalVigencia);
            var premioTotal   = PremioApolice.Create(request.PremioTotal);
            var premioLiquido = PremioApolice.Create(request.PremioLiquido);

            var result = Result.Combine(numeroApolice, vigencia, premioLiquido, premioTotal);

            if (result.IsFailure)
            {
                await _mediatorHandler.RaiseAppEvents(this, result.Errors);

                return(Unit.Value);
            }

            var apolice = new Apolice(
                numeroApolice.Value,
                vigencia.Value,
                premioTotal.Value,
                premioLiquido.Value,
                segurado.Codigo
                );

            await _apoliceRepository.Adicionar(apolice);

            await _apoliceRepository.Salvar();

            return(Unit.Value);
        }
Example #29
0
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var serialized = Request.Form["apolice"];

            if (serialized != null)
            {
                // Form was posted containing serialized data
                _apolice = (Apolice) new MvcSerializer().Deserialize(serialized);
                try
                {
                    TryUpdateModel(_apolice);
                }
                catch (Exception)
                {
                    _apolice = (Apolice)TempData["apolice"] ?? new Apolice();
                }
            }
            else
            {
                _apolice = (Apolice)TempData["apolice"] ?? new Apolice();
            }
        }
Example #30
0
        public Retorno Update(int id, Apolice model)
        {
            Retorno oRet = new Retorno();

            try
            {
                if (String.IsNullOrEmpty(model.CPFCNPJ))
                {
                    throw new Exception("Informe o CPF/CNPJ");
                }
                if (String.IsNullOrEmpty(model.Placa))
                {
                    throw new Exception("Informe a placa");
                }
                if (model.ValorPremio <= 0)
                {
                    throw new Exception("Informe um valor válido");
                }

                var apolice = (from p in _seguroDBContext.Apolice
                               where p.NumApolice == id
                               select p).FirstOrDefault();
                if (apolice != null)
                {
                    apolice.CPFCNPJ     = model.CPFCNPJ;
                    apolice.Placa       = model.Placa;
                    apolice.ValorPremio = model.ValorPremio;

                    _seguroDBContext.Update(apolice);
                    _seguroDBContext.SaveChanges();
                    oRet.setSuccesso();
                }
            }
            catch (System.Exception ex)
            {
                oRet.setErro(ex.Message);
            }
            return(oRet);
        }
Example #31
0
        public ServiceReturn Excluir(int id)
        {
            Apolice apolice = null;

            try
            {
                apolice = Obter(id);
                apoliceRepository.Remover(apolice);
                apoliceRepository.Salvar();

                return(new ServiceReturn()
                {
                    success = true, title = "Sucesso", message = "Apólice deletada com sucesso!"
                });
            }
            catch (Exception ex)
            {
                return(new ServiceReturn()
                {
                    success = false, title = "Erro", message = string.Format("Um erro do tipo {0} foi disparado ao deletar a apólice! Mensagem: {1}", ex.GetType(), ex.Message)
                });
            }
        }
        public void Worker()
        {
            EventoStaggingRepository eventosStaggingRepository = new EventoStaggingRepository();
            ConcelhoRepository concelhosRepository = new ConcelhoRepository();
            CategoriaRepository categoriasRepository = new CategoriaRepository();
            ApoliceRepository apolicesRepository = new ApoliceRepository();
            AvisoRepository avisosRepository = new AvisoRepository();
            ApoliceHistoricoRepository apolicesHistoricoRepository = new ApoliceHistoricoRepository();
            EntidadeRepository entidadesRepository = new EntidadeRepository();
            NotificacaoRepository notificacoesRepository = new NotificacaoRepository();
            ValorSistemaRepository valoresSistemaRepository = new ValorSistemaRepository();
            UserProfileRepository userProfileRepository = new UserProfileRepository();

            List<ValorSistema> estadosEvento = valoresSistemaRepository.GetPorTipologia("ESTADO_EVENTO_STAGGING", cacheMutex);
            List<ValorSistema> estadosFicheiro = valoresSistemaRepository.GetPorTipologia("ESTADO_FICHEIRO", cacheMutex);
            List<ValorSistema> tipoNotificacao = valoresSistemaRepository.GetPorTipologia("TIPO_NOTIFICACAO", cacheMutex);
            List<ValorSistema> operacoesEvento = valoresSistemaRepository.GetPorTipologia("OPERACAO_EVENTO", cacheMutex);
            List<Concelho> listaConcelhos = concelhosRepository.All.ToList();
            List<Categoria> listaCategorias = categoriasRepository.All.ToList();


            int horaLimiteSLA = int.Parse(valoresSistemaRepository.GetPorTipologia("PARAM_HORA_LIMITE_SLA", cacheMutex).Single().valor);
            int horaExtensaoSLA = int.Parse(valoresSistemaRepository.GetPorTipologia("PARAM_HORA_EXTENSAO_SLA", cacheMutex).Single().valor);

            int estadoEmProcessamento = estadosEvento.Where(e => e.valor == "EM_PROCESSAMENTO").Single().valorSistemaId;
            int estadoPendente = estadosEvento.Where(e => e.valor == "PENDENTE").Single().valorSistemaId;
            int estadoErro = estadosEvento.Where(e => e.valor == "ERRO").Single().valorSistemaId;
            int estadoProcessado = estadosEvento.Where(e => e.valor == "PROCESSADO").Single().valorSistemaId;
            int estadoFicheiroProcessado = estadosFicheiro.Where(e => e.valor == "PROCESSADO").Single().valorSistemaId;

            EventoStagging eventoPendente = null;
            int eventoPendenteId = default(int);

            while ((eventoPendenteId = adquireEventoPendente(estadoPendente, estadoEmProcessamento)) != default(int))
            {
                eventoPendente = eventosStaggingRepository.Find(eventoPendenteId);

                if (isAgentStopping)
                {
                    releaseEventoPendente();
                    return;
                }

                eventoPendente.estadoEventoId = estadoEmProcessamento;    
                eventosStaggingRepository.InsertOrUpdate(eventoPendente);
                

                EventoStagging evento = EventoStaggingFactory.criarEventoStagging(eventoPendente, cacheMutex);
                EventoStagging eventoProcessar = null;

                if (evento.errosEventoStagging.Count == 0)
                {
                    try
                    {
                        eventoProcessar = EventoStaggingFactory.duplicarEventoProducao(evento.matricula, (int)evento.entidadeId, evento.dataInicioCobertura, evento.horaInicioCobertura, cacheMutex);
                        eventoProcessar.esmagaDados(evento);
                    }
                    catch (ErroEventoStaggingException e)
                    {

                        foreach (ErroEventoStagging erro in e.errosEventoStagging)
                        {
                            evento.errosEventoStagging.Add(new ErroEventoStagging { campo = erro.campo, descricao = erro.descricao, tipologiaId = erro.tipologiaId, eventoStaggingId = erro.eventoStaggingId });
                        }
                    }
                }

                if (eventoProcessar == null || !ValidacaoEventos.validarEvento(eventoProcessar, cacheMutex))
                {
                    //if (evento.CodigoOperacao == EventoStagging.operacaoEventoStagging.A)
                    //{
                    //    //anulação foi testada em producao e falhou.
                    //    //esmaga evento em stagging e adiciona-se como erro.
                    //    evento = EventoStaggingFactory.duplicarEventoStagging(eventoPendente.matricula, (int)eventoPendente.entidadeId, eventoPendente.dataInicioCobertura, eventoPendente.horaInicioCobertura);
                    //    if (evento == null)
                    //    {
                    //        evento = new EventoStagging();
                    //        evento.CodigoOperacao = EventoStagging.operacaoEventoStagging.A;
                    //    }
                    //    evento.esmagaDados(eventoPendente);
                    //    ValidacaoEventos.validarEvento(evento); //reconstruir avisos e erros. Sabemos que vai falhar.
                    //}
                    // validação falhou definitivamente

                    evento.estadoEventoId = estadoErro;

                    if (eventoProcessar != null)
                    {
                        foreach (ErroEventoStagging e in eventoProcessar.errosEventoStagging)
                        {
                            evento.errosEventoStagging.Add(new ErroEventoStagging { campo = e.campo, descricao = e.descricao, tipologiaId = e.tipologiaId, eventoStaggingId = e.eventoStaggingId });
                        }
                        eventoProcessar.errosEventoStagging.Clear();

                        if (eventoProcessar.codigoOperacao != "A")
                        {
                            foreach (Aviso a in eventoProcessar.avisosEventoStagging)
                            {
                                evento.avisosEventoStagging.Add(new Aviso { campo = a.campo, descricao = a.descricao, tipologiaId = a.tipologiaId, eventoStaggingId = a.eventoStaggingId });
                            }
                        }
                        eventoProcessar.avisosEventoStagging.Clear();
                    }

                    evento.totalAvisosCumulativo += evento.totalAvisosCumulativo + evento.avisosEventoStagging.Count;
                    evento.totalErrosCumulativo += evento.totalErrosCumulativo + evento.errosEventoStagging.Count;

                    List<EventoStagging> errosStagging = eventosStaggingRepository.All.Include("estadoEvento").Where(e => e.entidadeId == evento.entidadeId && e.dataInicioCobertura == evento.dataInicioCobertura &&
                    e.horaInicioCobertura == evento.horaInicioCobertura && e.matricula == evento.matricula && e.estadoEvento.valor == "ERRO"
                    && e.codigoOperacao == evento.codigoOperacao && e.arquivado == false).ToList();

                    foreach (EventoStagging erro in errosStagging)
                    {
                        erro.arquivado = true;
                        eventosStaggingRepository.InsertOrUpdate(erro);
                    }

                    eventosStaggingRepository.InsertOrUpdate(evento);                      
                }
                else
                {
                    Concelho concelho = listaConcelhos.Where(c => c.codigoConcelho == eventoProcessar.codigoConcelhoCirculacao).FirstOrDefault();
                    Categoria categoria = listaCategorias.Where(c => c.codigoCategoriaVeiculo == eventoProcessar.codigoCategoriaVeiculo).FirstOrDefault();
                    int? concelhoId = concelho == null ? (int?)null : concelho.concelhoId;
                    int? categoriaId = categoria == null ? (int?)null : categoria.categoriaId;

                    ValorSistema operacao = operacoesEvento.Single(c => c.valor == eventoProcessar.codigoOperacao);

                    Apolice apoliceValidada = new Apolice(eventoProcessar, concelhoId, categoriaId, operacao.valorSistemaId, horaLimiteSLA, horaExtensaoSLA);

                    List<Apolice> apoliceAnterior = apolicesRepository.All.Include("avisosApolice").Where(a => a.dataInicio == apoliceValidada.dataInicio &&
                                            a.entidadeId == apoliceValidada.entidadeId &&
                                            a.veiculo.numeroMatricula == apoliceValidada.veiculo.numeroMatricula).ToList();

                    foreach (Apolice a in apoliceAnterior)
                    {
                        int avisosNum = a.avisosApolice.Count;

                        foreach (Aviso aviso in a.avisosApolice)
                        {
                            avisosRepository.Delete(aviso.avisoId);
                        }
                        //a.avisosApolice.Clear();

                        ApoliceHistorico historico = new ApoliceHistorico(a);
                        historico.dataArquivo = DateTime.Now;
                        historico.utilizadorArquivo = apoliceValidada.utilizadorReporte;

                        apolicesHistoricoRepository.InsertOrUpdate(historico);
                        apolicesHistoricoRepository.Save();

                        int idApoliceHistorico = historico.apoliceId;
                        a.avisosApolice.ForEach(aviso => aviso.apoliceHistoricoId = idApoliceHistorico);

                        apolicesRepository.Delete(a.apoliceId);
                    }

                    apolicesRepository.InsertOrUpdate(apoliceValidada);
                    apolicesRepository.Save();
             
                    List<EventoStagging> errosStagging = eventosStaggingRepository.All.Include("estadoEvento").Where(e => e.entidadeId == evento.entidadeId && e.dataInicioCobertura == evento.dataInicioCobertura &&
                    e.horaInicioCobertura == evento.horaInicioCobertura && e.matricula == evento.matricula && e.estadoEvento.valor == "ERRO"
                    && e.codigoOperacao == eventoProcessar.codigoOperacao && e.arquivado == false).ToList();

                    foreach (EventoStagging erro in errosStagging)
                    {
                        erro.dataCorrecaoErro = DateTime.Now;
                        erro.arquivado = true;
                        eventosStaggingRepository.InsertOrUpdate(erro);
                    }   
                    
                    verificaOutrasOperacoes(eventoProcessar);

                }


                eventoPendente.estadoEventoId = estadoProcessado;
                eventosStaggingRepository.InsertOrUpdate(eventoPendente);
                eventosStaggingRepository.Save();

                FicheiroRepository ficheirosRepository = null;
                Ficheiro ficheiro = null;
                if (eventoPendente.ficheiroID != null)
                {
                    fileMutex.WaitOne();
                    try
                    {
                        ficheirosRepository = new FicheiroRepository();
                        ficheiro = ficheirosRepository.Find((int)eventoPendente.ficheiroID);

                        if (evento.errosEventoStagging.Count > 0)
                        {
                            ficheiro.numEventosErro++;
                        }
                        if (eventoPendente == null || eventoPendente.avisosEventoStagging.Count > 0 || evento.avisosEventoStagging.Count > 0)
                        {
                            ficheiro.numEventosAviso++;
                        }
                        ficheiro.totalRegistosProcessados++;
                        //int theadNumber = threadPool.IndexOf(Thread.CurrentThread);
                        if (ficheiro.totalRegistos == ficheiro.totalRegistosProcessados)
                        {
                            ficheiro.estadoId = estadoFicheiroProcessado;

                            int tipoNotificacaoId;
                            string mensagemNotificacao;

                            if (ficheiro.numEventosErro > 0)
                            {
                                tipoNotificacaoId = tipoNotificacao.Where(t => t.valor == "ERRO_PROCESSAMENTO_FICHEIRO").Single().valorSistemaId;
                                mensagemNotificacao = "O 'Ficheiro Nacional de Matrículas do Parque Automóvel Seguro' com nome '" + ficheiro.nomeFicheiro + "' e data de reporte '" +
                                    ficheiro.dataUpload.ToShortDateString() + "' foi processado com  " +
                                    ficheiro.numEventosErro + " ocorrências de erro e " + ficheiro.numEventosAviso + " de aviso " +
                                    "num total de " + ficheiro.totalRegistos + " registos.";
                            }
                            else
                            {
                                if (ficheiro.numEventosAviso > 0)
                                {
                                    tipoNotificacaoId = tipoNotificacao.Where(t => t.valor == "AVISO_PROCESSAMENTO_FICHEIRO").Single().valorSistemaId;

                                    mensagemNotificacao = "O 'Ficheiro Nacional de Matrículas do Parque Automóvel Seguro' com nome '" + ficheiro.nomeFicheiro + "' e data de reporte '" +
                                    ficheiro.dataUpload.ToShortDateString() + "' foi processado com  " +
                                    ficheiro.numEventosAviso + " ocorrências de aviso " +
                                    "num total de " + ficheiro.totalRegistos + " registos.";
                                }
                                else
                                {
                                    tipoNotificacaoId = tipoNotificacao.Where(t => t.valor == "SUCESSO_PROCESSAMENTO_FICHEIRO").Single().valorSistemaId;

                                    mensagemNotificacao = "O 'Ficheiro Nacional de Matrículas do Parque Automóvel Seguro' com nome '" + ficheiro.nomeFicheiro + "' e data de reporte '" +
                                    ficheiro.dataUpload.ToShortDateString() + "' foi processado com sucesso em " +
                                    ficheiro.totalRegistos + " ocorrências.";
                                }
                            }


                            Notificacao notificacao = new Notificacao
                            {
                                dataCriacao = DateTime.Now,
                                email = true,
                                entidadeId = ficheiro.entidadeId,
                                tipologiaId = tipoNotificacaoId,
                                mensagem = mensagemNotificacao,
                            };

                            Entidade entidade = entidadesRepository.Find((int)notificacao.entidadeId);
                            entidade.notificacoes.Add(notificacao);
                            entidadesRepository.InsertOrUpdate(entidade);



                            UserProfile utilizadorFicheiro = userProfileRepository.All.Single(u => u.UserName == ficheiro.userName);
                            if (utilizadorFicheiro.entidadeId != ficheiro.entidadeId)
                            {
                                Notificacao notificacao2 = new Notificacao()
                                {
                                    dataCriacao = DateTime.Now,
                                    email = true,
                                    entidadeId = utilizadorFicheiro.entidadeId,
                                    tipologiaId = tipoNotificacaoId,
                                    mensagem = mensagemNotificacao,
                                };

                                notificacoesRepository.InsertOrUpdate(notificacao2);
                            }


                            entidadesRepository.Save();
                            notificacoesRepository.Save();
                                                       
                        }

                        ficheirosRepository.InsertOrUpdate(ficheiro);
                        ficheirosRepository.Save();
                    }
                    finally
                    {
                        fileMutex.ReleaseMutex();
                    }
                }

                releaseEventoPendente();
            }
        }
        public ApoliceHistorico(Apolice apolice)
        {
            //Foreign Key interna para entidade
            this.entidadeId = apolice.entidadeId; 
            
            //Foreign Key para Tomador
            this.tomadorId = apolice.tomadorId; 
            
            //Foreign Key para Veiculo
            this.veiculoId = apolice.veiculoId;
            
            //Foreign Key para Concelho
            this.concelhoCirculacaoId = apolice.concelhoCirculacaoId; 
            
            //Atributos da Apolice
            this.numeroApolice = apolice.numeroApolice;
            this.numeroCertificadoProvisorio = apolice.numeroCertificadoProvisorio; 
            
            this.dataInicio = apolice.dataInicio;
            this.dataFim = apolice.dataFim;
            this.dataFimPlaneada  = apolice.dataFimPlaneada;

            this.dataReporte = apolice.dataReporte;
            this.utilizadorReporte = apolice.utilizadorReporte;

            this.dataArquivo = DateTime.Now;

            this.SLA = apolice.SLA;

            //ForeignKey interna para Eventos
            this.eventoHistoricoId = apolice.eventoHistoricoId;
        }
        public void InsertOrUpdate(Apolice apolice){
            if (apolice.apoliceId == default(int))
            {
                apolice = context.Apolices.Add(apolice);
=======