orochasamuel / fiscalbr-net

Para facilitar seu dia a dia como desenvolvedor \o/
MIT License
91 stars 48 forks source link

System.IndexOutOfRangeException: 'O índice estava fora dos limites da matriz.' #53 #88

Closed RenatoGuarilhaCMCorp closed 1 year ago

RenatoGuarilhaCMCorp commented 1 year ago

Boa noite, segue minha contribuição para análise, referente ao tratamento de leitura de arquivos antigos (fiz somente no EFD, mas é fácil de replicar no SPED Contribuições.

A solução leva em consideração a versão do registro 000 na leitura dos outros registros,

orochasamuel commented 1 year ago

@RenatoGuarilhaCMCorp primeiramente obrigado pela contribuição.

Analisei e não notei nenhuma breaking change na leitura. Caso o dev não informe a versão do layout (ficando 0) não será alterado nada. Mas caso queira a leitura retroativa deverá informar uma versão, correto?

Notei que você não criou nenhum teste para validar a leitura, pode providenciar?

Vou aprovar o PR e deixar disponível para quem quiser usar a feature.

EDIT: @RenatoGuarilhaCMCorp o build de teste do Github falhou. Vou segurar esse merge até que a leitura esteja passando.

Vida longa e próspera 🖖

RenatoGuarilhaCMCorp commented 1 year ago

Obrigado, eu que agradeço bastante trabalho poupado. Ainda estou ajustando algumas coisas que deixo para um próximo pull request.

Na verdade na leitura, pelo menos o método que eu usei, não tinha onde passar a versão, e dai eu pego do próprio bloco 0, e uso nos demais blocos.

Att.,

orochasamuel commented 1 year ago

Obrigado, eu que agradeço bastante trabalho poupado. Ainda estou ajustando algumas coisas que deixo para um próximo pull request.

Na verdade na leitura, pelo menos o método que eu usei, não tinha onde passar a versão, e dai eu pego do próprio bloco 0, e uso nos demais blocos.

Att.,

Entendi. É uma abordagem inteligente pegar diretamente do 000, isso mitiga a necessidade de criar um parâmetro ou mudar a assinatura do método.

orochasamuel commented 1 year ago

@RenatoGuarilhaCMCorp mais uma vez, obrigado pela contribuição.

Resolvi aproveitar o que você havia feito e fiz algumas pequenas modificações, todas estão no commit https://github.com/orochasamuel/fiscalbr-net/commit/2b414aab49e7f2dc2bde11ef7292271459654a0a.

Agora na classe ArquivoSped existe um método chamado ObterVersaoLayout() para identificar a Versão do Layout do arquivo que será lido, pode ser usado na EFDFiscal, bem como na EFDContribuições e em outros arquivos.

Caso seja um arquivo "parcial", sem o Registro 0000, será adotada versão da assinatura do método.

Caso não tenha sido informada a versão na assinatura do método, será adotada a última versão do layout (até o presente momento é a versão 17 para a EFD Fiscal).


Corrigi um erro na leitura do arquivo quando não existiam linhas de assinaturas no final do arquivo, a lib "entendia" que sim. Agora funciona perfeitamente para fazer a leitura parcial do arquivo, exemplo, só os Registros C100, só os D100, etc.


BREAKING CHANGES Alterei algumas tipagens de long, int, decimal, double para string, alguns campos de número de documento estavam com tipagens de valores numéricos, alterei para string.


E criei alguns testes para garantir que a quantidade de propriedades é a correta para a versão requerida.


        [Fact]
        public void Teste_Leitura_Quantidade_Propriedades_EFDFiscal_C500_V2()
        {
            var line = "|C500|1|0|CLIENTE 1 (USAR CPF/CNPJ PREFERENCIALMENTE)|66|00|9999|000|06|123456789|01012009|01012009|99,99|9,99|0,00|0,00|0,00|0,00|90,00|22,50|0,00|0,00|CODINF|1,49|6,84|{Environment.NewLine}";

            // ...

            var propriedades = FiscalBr.Common.Sped.LerCamposSped.ObtemListaComPropriedadesOrdenadas(objectType, 2);

            Assert.Equal(25, propriedades.Count);
        }

        [Fact]
        public void Teste_Leitura_Quantidade_Propriedades_EFDFiscal_C500_V3()
        {
            var line = "|C500|1|0|CLIENTE 1 (USAR CPF/CNPJ PREFERENCIALMENTE)|66|00|9999|000|06|123456789|01012009|01012009|99,99|9,99|0,00|0,00|0,00|0,00|90,00|22,50|0,00|0,00|CODINF|1,49|6,84|1|01|{Environment.NewLine}";

            // ...

            var propriedades = FiscalBr.Common.Sped.LerCamposSped.ObtemListaComPropriedadesOrdenadas(objectType, 3);

            Assert.Equal(27, propriedades.Count);
        }

        [Fact]
        public void Teste_Leitura_Quantidade_Propriedades_EFDFiscal_C500_V10()
        {
            var line = "|C500|1|0|CLIENTE 1 (USAR CPF/CNPJ PREFERENCIALMENTE)|66|00|9999|000|06|123456789|01012009|01012009|99,99|9,99|0,00|0,00|0,00|0,00|90,00|22,50|0,00|0,00|CODINF|1,49|6,84|1|01|{Environment.NewLine}";

            // ...

            var propriedades = FiscalBr.Common.Sped.LerCamposSped.ObtemListaComPropriedadesOrdenadas(objectType, 10);

            Assert.Equal(27, propriedades.Count);
        }

        [Fact]
        public void Teste_Leitura_Quantidade_Propriedades_EFDFiscal_C500_V14()
        {
            var line = "|C500|1|0|CLIENTE 1 (USAR CPF/CNPJ PREFERENCIALMENTE)|66|00|9999|000|06|123456789|01012009|01012009|99,99|9,99|0,00|0,00|0,00|0,00|90,00|22,50|0,00|0,00|CODINF|1,49|6,84|1|01|01234567890123456789012345678901234567890123|1||9|1234|3.1.01.01.001|{Environment.NewLine}";

            // ...

            var propriedades = FiscalBr.Common.Sped.LerCamposSped.ObtemListaComPropriedadesOrdenadas(objectType, 14);

            Assert.Equal(33, propriedades.Count);
        }

        [Fact]
        public void Teste_Leitura_Quantidade_Propriedades_EFDFiscal_C500_V16()
        {
            var line = @"|C500|1|0|CLIENTE 1 (USAR CPF/CNPJ PREFERENCIALMENTE)|66|00|9999|000|06|123456789|01012009|01012009|99,99|9,99|0,00|0,00|0,00|0,00|90,00|22,50|0,00|0,00|CODINF|1,49|6,84|1|01|01234567890123456789012345678901234567890123|1||9|1234|3.1.01.01.001|06|1234|1111|123456789|01012009|1,00|1,00|";

            // ...

            var propriedades = FiscalBr.Common.Sped.LerCamposSped.ObtemListaComPropriedadesOrdenadas(objectType, 16);

            Assert.Equal(40, propriedades.Count);
        }

        [Fact]
        public void Teste_Leitura_Quantidade_Propriedades_EFDFiscal_C500_V17()
        {
            var line = @"|C500|1|0|CLIENTE 1 (USAR CPF/CNPJ PREFERENCIALMENTE)|66|00|9999|000|06|123456789|01012009|01012009|99,99|9,99|0,00|0,00|0,00|0,00|90,00|22,50|0,00|0,00|CODINF|1,49|6,84|1|01|01234567890123456789012345678901234567890123|1||9|1234|3.1.01.01.001|06|1234|1111|123456789|01012009|1,00|1,00|";

            // ...

            var propriedades = FiscalBr.Common.Sped.LerCamposSped.ObtemListaComPropriedadesOrdenadas(objectType, 17);

            Assert.Equal(40, propriedades.Count);
        }

EDIT

Resolvi incluir as alterações direto na branch master pois eram poucas linhas e se o PR tivesse entrado na branch iria quebrar os testes já existentes.

image

Mais uma vez, obrigado pela contribuição.

Vida longa e próspera 🖖