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));
        }
Ejemplo n.º 2
0
        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);
        }