public void InsertOrUpdate(FicheiroIsentos ficheiro)
 {
     if (ficheiro.ficheiroIsentosId == default(int))
     {
         context.FicheirosIsentos.Add(ficheiro);
     }
     else
     {
         context.Entry(ficheiro).State = EntityState.Modified;
     }
 }
 public bool Update(FicheiroIsentos ficheiro)
 {
     try
     {
         context.Entry(ficheiro).State = EntityState.Modified;
         return true;
     }
     catch (Exception ex)
     {
         return false;
     }
 }
        public ActionResult Upload(HttpPostedFileBase file)
        {
            //List<ValorSistema> paramSistema = valoresSistemaRepository.All.Where(v => v.tipologia == "ESTADO_FICHEIRO"
            //                                                                    || v.tipologia == "PARAM_PASTA_FICHEIROS_ISENTOS").ToList();
            //List<ValorSistema> estadosFicheiro = paramSistema.Where(v => v.tipologia == "ESTADO_FICHEIRO").ToList();
            //ValorSistema pastaUploadIsentos = paramSistema.Where(v => v.tipologia == "PARAM_PASTA_FICHEIROS_ISENTOS").Single();

            List<ValorSistema> estadosFicheiro = valoresSistemaRepository.GetPorTipologia("ESTADO_FICHEIRO");
            ValorSistema pastaUploadIsentos = valoresSistemaRepository.GetPorTipologia("PARAM_PASTA_FICHEIROS_ISENTOS").Single();
            
                
            if (file != null && file.ContentLength > 0)
            {
                DateTime dataSubmissao = DateTime.Now;
                var filename = Path.GetFileNameWithoutExtension(file.FileName);
                var fileExtension = Path.GetExtension(file.FileName);
                var newFilename = filename + "_" + dataSubmissao.ToString("yyyyMMddHHmmssfff") + fileExtension;
                var destination = pastaUploadIsentos.valor;
                //var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), filename);
                var path = Path.Combine(destination, newFilename);
                file.SaveAs(path);

                UserProfile user = usersRepository.GetUserByIDIncludeEntidade(WebSecurity.CurrentUserId);
                Entidade entidadeAssociada = user.entidade;

                FicheiroIsentos newFicheiro = new FicheiroIsentos
                { 
                    nomeFicheiro = filename,
                    localizacao = path,
                    dataUpload = dataSubmissao,
                    dataAlteracao = dataSubmissao,
                    //entidade = entidadeAssociada,
                    entidadeId = entidadeAssociada.entidadeId,
                    estadoId = estadosFicheiro.Where(f => f.valor == "SUBMETIDO").Single().valorSistemaId,
                    userName = user.UserName
                };

                ficheirosIsentosRepository.Insert(newFicheiro);
                ficheirosIsentosRepository.Save();

            }

            return RedirectToAction("Index");            
        }
        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 FicheiroIsentos Insert(FicheiroIsentos ficheiro)
 {
     ficheiro.ficheiroIsentosId = default(int);
     context.FicheirosIsentos.Add(ficheiro);
     return ficheiro;
 }