public static List <MercadoFinanceiro.Entities.ContaCorrente> CastExcel(string excelFilePath)
        {
            Console.WriteLine("ContaCorrente Excel file path: {0}", excelFilePath);

            var ret         = new List <MercadoFinanceiro.Entities.ContaCorrente>();
            var xlApp       = new Application();
            var xlWorkbook  = xlApp.Workbooks.Open(excelFilePath);
            var xlWorksheet = xlWorkbook.Sheets[1];
            var xlRange     = xlWorksheet.UsedRange;

            var row        = 3;
            var liquidacao = ((string)xlRange.Cells[row, 1].Value2).GetValueOrNull <DateTime>();

            while (liquidacao.HasValue)
            {
                var liquidacaoDate = liquidacao.Value;
                var movimentacao   = Convert.ToDateTime(xlRange.Cells[row, 2].Value2);
                var descricao      = ((string)xlRange.Cells[row, 3].Value2).Trim().RemoveDuplicateSpaces();
                var saldo          = ((string)xlRange.Cells[row, 6].Value2).Replace(".", "").GetValueOrNull <decimal>();

                var debito  = ((string)xlRange.Cells[row, 4].Value2).GetValueOrNull <decimal>();
                var credito = ((string)xlRange.Cells[row, 5].Value2).GetValueOrNull <decimal>();

                if (!debito.HasValue && !credito.HasValue || (debito.Value > 0 && credito < 0))
                {
                    throw new NotImplementedException();
                }

                var valor = credito.HasValue && credito > 0 ? credito.Value : debito.Value;

                var newCC = new MercadoFinanceiro.Entities.ContaCorrente(liquidacaoDate,
                                                                         movimentacao,
                                                                         valor,
                                                                         saldo.Value,
                                                                         descricao);
                ret.Add(newCC);

                row++;
                liquidacao = ((string)xlRange.Cells[row, 1].Value2).GetValueOrNull <DateTime>();
            }

            return(ret);
        }
 public static IEnumerable <ContaCorrente <T> > PossibleReverse <T>(this IEnumerable <ContaCorrente <T> > ccs, MercadoFinanceiro.Entities.ContaCorrente estorno)
     where T : ContaCorrentes.Descricao
 => PossibleReverse <ContaCorrente <T>, T>(ccs, estorno);
 public static IEnumerable <T> PossibleReverse <T, Y>(this IEnumerable <T> ccs, MercadoFinanceiro.Entities.ContaCorrente estorno)
     where T : ContaCorrente <Y>
     where Y : ContaCorrentes.Descricao
 => PossibleReverse <T, Y>(ccs, estorno.DataLiquidacao, estorno.Valor);