public async Task <ActionResult> Importar(AcoesImportarViewModel viewModel) { if (viewModel.Arquivo == null || viewModel.Arquivo.ContentLength <= 0) { ModelState.AddModelError("", "Selecione um arquivo!"); } if (ModelState.IsValid) { using (TextReader textReader = new StreamReader(viewModel.Arquivo.InputStream)) { var motor = new MultiRecordEngine(typeof(ViewModels.Bovespa.Header), typeof(ViewModels.Bovespa.Detail), typeof(ViewModels.Bovespa.Trailer)) { ErrorMode = ErrorMode.SaveAndContinue, RecordSelector = new RecordTypeSelector(Infraestrura.Bovespa.BovespaSelector.Selector) }; var registros = motor.ReadStream(textReader); foreach (var erro in motor.ErrorManager.Errors) { ModelState.AddModelError("", $"Linha {erro.LineNumber}, {erro.ExceptionInfo}."); } if (ModelState.IsValid) { var detalhes = registros.Where(a => a is ViewModels.Bovespa.Detail).Select(a => a as ViewModels.Bovespa.Detail).ToList(); foreach (var detalhe in detalhes) { var acao = await db.Acoes.FirstOrDefaultAsync(a => a.CodigoIsin == detalhe.CodIsi && a.CodigoNegociacao == detalhe.CodNeg); if (acao != null) { var ultimoHistorico = await db.AcoesHistoricos.Where(a => a.AcaoId == acao.AcaoId).OrderByDescending(a => a.DataHora).FirstOrDefaultAsync(); db.AcoesHistoricos.Add(new AcaoHistorico() { AcaoHistoricoId = Guid.NewGuid(), AcaoId = acao.AcaoId, DataHora = detalhe.DataDoPregao, Preco = detalhe.PreUlt, ValorVariacao = detalhe.PreUlt - ultimoHistorico?.Preco ?? 0, PercentualVariacao = detalhe.PreUlt * 100 / ultimoHistorico?.Preco - 100 ?? 0, }); } } await db.SaveChangesAsync(); return(RedirectToAction("Index", "AcoesHistoricos", new ViewModels.AcoesHistoricosViewModel { DataOperacao = detalhes.FirstOrDefault()?.DataDoPregao })); } } } return(View(viewModel)); }
public AbaFile Read(TextReader stream) { var records = _engine.ReadStream(stream); var file = new AbaFile(); foreach (var r in records) { if (r is DescriptiveRecord) { file.DescriptiveRecord = (DescriptiveRecord)r; } else if (r is DetailRecord) { file.DetailRecords.Add((DetailRecord)r); } else if (r is FileTotalRecord) { file.FileTotalRecord = (FileTotalRecord)r; } } return(file); }