public void InsertOrUpdate(ApoliceIsento apolice)
 {
     if (apolice.apoliceIsentoId == default(int))
     {
         context.ApolicesIsentos.Add(apolice);
     }
     else
     {
         context.Entry(apolice).State = EntityState.Modified;
     }
 }
        public static void processaFicheiroIsentos(FicheiroIsentos ficheiro)
        {
            //FicheiroIsentosRepository ficheirosIsentosRepository = new FicheiroIsentosRepository();
            ValorSistemaRepository valoresSistemaRepository = new ValorSistemaRepository();
            ApoliceIsentoRepository apolicesIsentoRepository = new ApoliceIsentoRepository();
            NotificacaoRepository notificacoesRepository = new NotificacaoRepository();
            
            //List<ValorSistema> valoresSistema = valoresSistemaRepository.All.Where(v => v.tipologia == "TIPO_AVISO" || v.tipologia == "ESTADO_FICHEIRO").ToList();
            //ValorSistema tipoNotificacao = valoresSistema.Where(v => v.tipologia == "TIPO_AVISO" && v.valor == "GENERICO").Single();
            //ValorSistema valErroFicheiro = valoresSistema.Where(v => v.tipologia == "ESTADO_FICHEIRO" && v.valor == "ERRO").Single();
            //ValorSistema valProcessadoFicheiro = valoresSistema.Where(v => v.tipologia == "ESTADO_FICHEIRO" && v.valor == "PROCESSADO").Single();

            ValorSistema tipoNotificacao = valoresSistemaRepository.GetPorTipologia("TIPO_AVISO").Where(v => v.valor == "GENERICO").Single();
            ValorSistema valErroFicheiro = valoresSistemaRepository.GetPorTipologia("ESTADO_FICHEIRO").Where(v => v.valor == "ERRO").Single();
            ValorSistema valProcessadoFicheiro = valoresSistemaRepository.GetPorTipologia("ESTADO_FICHEIRO").Where(v => v.valor == "PROCESSADO").Single();

            //Insere os novos registos de períodos isentos que são reportados no ficheiro
            bool erroFicheiro = false;
            DateTime dataRegisto = DateTime.Now;
            DateTime dataInicioTemp;
            DateTime? dataFimTemp;
            DateTime dataAux;
            var excel = new ExcelQueryFactory(ficheiro.localizacao);
            excel.AddMapping<RegistoExcelMatriculaIsenta>(x => x.matricula, "MATRICULA"); // ou excel.AddMapping("matricula", "MATRICULA");
            excel.AddMapping<RegistoExcelMatriculaIsenta>(x => x.mensagem, "MENSAGEM");
            excel.AddMapping<RegistoExcelMatriculaIsenta>(x => x.entidadeResponsavel, "ENTIDADE");
            excel.AddMapping<RegistoExcelMatriculaIsenta>(x => x.dataInicio, "DATA_INICIO");
            excel.AddMapping<RegistoExcelMatriculaIsenta>(x => x.dataFim, "DATA_FIM");
            excel.AddMapping<RegistoExcelMatriculaIsenta>(x => x.confidencial, "CONFIDENCIAL"); 
            
            var matriculasIsentas = from m in excel.Worksheet<RegistoExcelMatriculaIsenta>("Resultados")
                                   select m;
            
            foreach (RegistoExcelMatriculaIsenta mat in matriculasIsentas)
            {
                if (mat.matricula == null || mat.matricula == string.Empty || ! DateTime.TryParseExact(mat.dataInicio, "yyyyMMdd", new CultureInfo("pt-PT"), DateTimeStyles.None, out dataInicioTemp))
                {
                    erroFicheiro = true;
                    break;
                }
                
                if (DateTime.TryParseExact(mat.dataFim, "yyyyMMdd", new CultureInfo("pt-PT"), DateTimeStyles.None, out dataAux))
                    dataFimTemp = dataAux;
                else
                    dataFimTemp = null;

                ApoliceIsento isento = new ApoliceIsento()
                {
                    entidadeId = ficheiro.entidadeId.Value,
                    matricula = mat.matricula,
                    matriculaCorrigida = mat.matricula.Replace("-",""),
                    entidadeResponsavel = mat.entidadeResponsavel,
                    mensagem = mat.mensagem,
                    dataInicio = dataInicioTemp,
                    dataFim = dataFimTemp,
                    confidencial = mat.confidencial,
                    origemFicheiro = true,
                    arquivo = false,
                    dataReporte = ficheiro.dataUpload,
                    dataCriacao = dataRegisto,
                    dataModificacao = dataRegisto,
                };

                ficheiro.apolicesIsentos.Add(isento);
            }

            Notificacao notif = new Notificacao();
            if (!erroFicheiro)
            {

                //Coloca para arquivo todos os registos de períodos isentos que foram inseridos via ficheiro.
                List<ApoliceIsento> periodosAtivos = apolicesIsentoRepository.All.Where(m => m.arquivo == false && m.origemFicheiro == true && m.dataCriacao < dataRegisto).ToList();
                if (periodosAtivos != null && periodosAtivos.Count > 0)
                {
                    foreach(ApoliceIsento isento in periodosAtivos)
                    {
                        isento.arquivo = true;
                        apolicesIsentoRepository.InsertOrUpdate(isento);
                    }
                }

                apolicesIsentoRepository.Save();

                string mensagemNotificacao = string.Format("O ficheiro de reporte e matriculas isentas de seguro com o nome {0} e submetido na data {1}, " +
                                                            "foi processado com sucesso sendo registados {2} matriculas.",
                                                            ficheiro.nomeFicheiro, 
                                                            ficheiro.dataUpload.ToString(),
                                                            ficheiro.apolicesIsentos.Count);

                notif.dataCriacao = DateTime.Now;
                notif.email = false;
                notif.entidadeId = ficheiro.entidadeId;
                notif.mensagem = mensagemNotificacao;
                notif.tipologiaId = tipoNotificacao.valorSistemaId;
                ficheiro.estadoId = valProcessadoFicheiro.valorSistemaId;
            }
            else
            {
                string mensagemNotificacao = string.Format("O ficheiro de reporte e matriculas isentas de seguro com o nome {0} e submetido na data {1}, " +
                                                            "não foi processado devido a um erro da informação relativa ao número de matrícula ou à data de início do período.",
                                                            ficheiro.nomeFicheiro, ficheiro.dataUpload.ToString());
                
                notif.dataCriacao = DateTime.Now;
                notif.email = false;
                notif.entidadeId = ficheiro.entidadeId;
                notif.mensagem = mensagemNotificacao;
                notif.tipologiaId = tipoNotificacao.valorSistemaId;
                               
                ficheiro.estadoId = valErroFicheiro.valorSistemaId;
            }

            notificacoesRepository.InsertOrUpdate(notif);
            notificacoesRepository.Save();
            //ficheirosIsentosRepository.InsertOrUpdate(ficheiro);
            //ficheirosIsentosRepository.Save();
        }
        public ActionResult Create(ApoliceIsento apolice)
        {
            UserProfile user = usersRepository.Find(WebSecurity.CurrentUserId);

            if (ModelState.IsValid)
            {
                apolice.dataReporte = DateTime.Now;
                apolice.dataCriacao = DateTime.Now;
                apolice.dataModificacao = DateTime.Now;
                apolice.entidadeId = user.entidadeId;

                if (apolice.matricula != null)
                {
                    apolice.matriculaCorrigida = apolice.matricula.Replace("-", "");
                }

                apoliceIsentosRepository.InsertOrUpdate(apolice);
                apoliceIsentosRepository.Save();

                this.Alerts.Success("Período Isento criado com sucesso.");
                return RedirectToAction("Index");
            }

            this.Alerts.Danger("Erro na criação de Período Isento.");
            return this.View(apolice);
        }
        public ActionResult Edit(ApoliceIsento editedApolice)
        {
            UserProfile user = usersRepository.Find(WebSecurity.CurrentUserId);
            //TODO: Verificar acesso ao recurso.
            ApoliceIsento apolice = apoliceIsentosRepository.Find(editedApolice.apoliceIsentoId);

            if (apolice == null)
            {
                return this.HttpNotFound();
            }

            if (ModelState.IsValid)
            {
                editedApolice.apoliceIsentoId = default(int);
                editedApolice.entidadeId = apolice.entidadeId;
                editedApolice.dataCriacao = apolice.dataCriacao;
                editedApolice.dataReporte = apolice.dataReporte;
                editedApolice.dataModificacao = DateTime.Now;
                editedApolice.arquivo = false;

                if (editedApolice.matricula != null)
                {
                    editedApolice.matriculaCorrigida = editedApolice.matricula.Replace("-", "");
                }

                apolice.arquivo = true;

                apoliceIsentosRepository.InsertOrUpdate(editedApolice);
                apoliceIsentosRepository.InsertOrUpdate(apolice);

                apoliceIsentosRepository.Save();

                this.Alerts.Success("Período Isento editado com sucesso.");
                return RedirectToAction("Index");
            }

                this.Alerts.Danger("Erro na edição de Período Isento.");
            return this.View(editedApolice);
        }
        public ActionResult Create()
        {
            ApoliceIsento view = new ApoliceIsento();
            view.dataInicio = DateTime.Now;

            return View(view);
        }