orochasamuel / fiscalbr-net

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

Erro Registro C170 #37

Closed ThalisonSantos closed 1 year ago

ThalisonSantos commented 3 years ago

ao gerar o sped Fiscal no campo registroC170.IndApur que deveria passar 0 ou 1 ele passa para o arquivo a letra M

orochasamuel commented 3 years ago

Fala @ThalisonSantos tudo na paz?

Está usando a lib pelo Nuget ou DLL referenciada diretamente?

Vida longa e próspera. 🖖

ThalisonSantos commented 3 years ago

@osamueloliveira a DLL referenciada diretamente

PGama-Rodrigo commented 2 years ago

Olá @orochasamuel

\fiscalbr.net\src\FiscalBr.EFDFiscal\BlocoC.cs Na classe RegistroC170, campo IndApur ([SpedCampos(19, "IND_APUR", "C", 1, 0, false, 2)])

Este campo, ao entrar no EscreverCampos, cai na última exceção e é escrito a substring de 1 caractere do ENumerador como string (O que resulta no 'M' para Mensal);

Apesar do campo estar correto no SpedCampos, e do campo estar como 'C' no guia prático do SPED Fiscal, os valores possíveis dentro da escrituração são 0 (Mensal) ou 1 (Decendial);

Imagino eu que o correto seria passar esse campo para string e deixar o sistema que está consumindo a DLL passar o valor correto para ele, assim evitaria erros;

Usando DLL Referenciada diretamente;

Grande trabalho no FiscalBr, parabéns!

orochasamuel commented 2 years ago

Fala @PGama-Rodrigo tudo na paz por aí?

Descobri o problema, esse campo estava mapeado com Nullable no enum. Na hora da lib verificar o IsEnum retornava false.


            [SpedCampos(19, "IND_APUR", "C", 1, 0, false, 2)]
            public IndPeriodoApuracaoIpi? IndApur { get; set; }

Corrigi removendo o ? e também criei um teste. Esse foi um erro de mapeamento meu alguns anos atrás, vou revisitar os mapeamentos e me certificar que não ficou mais nenhuma situação como esta.

A correção está no commit 68aafa29641dd41d4a6ed52014dfef6070089fe4, em breve irei publicar no Nuget as últimas atualizações.

PS: Vou implementar uma verificação no caso dos enums pois a lib automaticamente seta para o primeiro item da lista, mesmo que não informado. Vou corrigir antes de publicar no Nuget.

EDIT @ThalisonSantos desculpe a demora em corrigir este erro.

Vida longa e próspera 🖖

PGama-Rodrigo commented 2 years ago

@orochasamuel Rapaz, entrei agora aqui pra escrever uma errata sobre o meu comentário quando vi sua resposta: Eu reparei que o IND_APUR do EFDContribuicoes estava diferente do campo IND_APUR no EFDFiscal;

Show de bola que foi arrumado! Agora só falta eu descobrir o motivo do bot lá ter reprovado o meu PR kkkkkkk

Abraço!

orochasamuel commented 2 years ago

@PGama-Rodrigo acredito que seja culpa do Travis, alguns testes automatizados não estão passando lá. Ainda tenho que descobrir porque, estou usando o XUnit para fazer os testes.

Vida longa e próspera 🖖

orochasamuel commented 2 years ago

@PGama-Rodrigo @ThalisonSantos

Fiz uma implementação no enum IndPeriodoApuracaoIpi e irei replicar para os demais Enums opcionais.


    /// <summary>
    ///     Indicador de período de apuração do IPI
    /// </summary>
    public enum IndPeriodoApuracaoIpi
    {
        [DefaultValue("")] None = 0,
        /// <summary>
        ///     Mensal
        /// </summary>
        [DefaultValue("0")] Mensal,

        /// <summary>
        ///     Decendial
        /// </summary>
        [DefaultValue("1")] Decendial
    }

O valor padrão de um enumerador sempre será o 0 (vide fonte abaixo), eu criei uma flag para None com DefaultValue em branco. Isso resolve o problema onde a lib escrevia o campo mesmo que o Enum não fosse usado ao popular a classe.

EDIT PS: Essa flag só será usada nos enums não obrigatórios. Para os demais enums não será necessário criar essa flag.

Fonte: Microsoft

nelsonasousa commented 1 year ago

Fala @PGama-Rodrigo tudo na paz por aí?

Descobri o problema, esse campo estava mapeado com Nullable no enum. Na hora da lib verificar o IsEnum retornava false.

            [SpedCampos(19, "IND_APUR", "C", 1, 0, false, 2)]
            public IndPeriodoApuracaoIpi? IndApur { get; set; }

Corrigi removendo o ? e também criei um teste. Esse foi um erro de mapeamento meu alguns anos atrás, vou revisitar os mapeamentos e me certificar que não ficou mais nenhuma situação como esta.

A correção está no commit 68aafa2, em breve irei publicar no Nuget as últimas atualizações.

PS: Vou implementar uma verificação no caso dos enums pois a lib automaticamente seta para o primeiro item da lista, mesmo que não informado. Vou corrigir antes de publicar no Nuget.

EDIT @ThalisonSantos desculpe a demora em corrigir este erro.

Vida longa e próspera 🖖

Essa atualização já foi feita no Nuget?

orochasamuel commented 1 year ago

@nelsonasousa ainda não. Vou preparar uma atualização no Nuget nesta semana para "abarcar" todas as mudanças e retorno nesta issue assim que finalizar.

orochasamuel commented 1 year ago

Pacotes nuget atualizados o/