orochasamuel / fiscalbr-net

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

Novos Enums #91

Closed bruno-crr closed 1 year ago

bruno-crr commented 1 year ago

Boa tarde, atualizei o projeto pra versão 17.0.1 e vi que foram alterado vários campos para utilizar enumeradores, estou tendo um pouco de dificuldade em fazer o cast com alguns dos enums, poderia dar uma força ai de como fica o cast para pegar o valor do enum que está no atributo DefaultValue?

orochasamuel commented 1 year ago

Fala @bruno-crr tudo na paz?

A intenção é ir alterando esses campos aos poucos mas padronizar tudo que for enum, como você disse, vários campos sofreram alterações mas todos foram devidamente mapeados e atribuído o "DefaultValue".

Qual seria sua dúvida? É algum registro específico?

bruno-crr commented 1 year ago

opa blz , minha dúvida é que antes eu fazia cast a prop da minha classe por exemplo o enum IndTipoFrete, na minha classe ele é um int? quando recupero o objeto pra gerar o SPED vem um int? e eu fazia CAST (IndTipoFrete)_nfe.TipoFrete algo assim, e esse cast em alguns enumeradores eu não consegui fazer, eu devo estar bobeando em alguma coisa =\

orochasamuel commented 1 year ago

Entendi sua dúvida.

Se você tem uma classe "intermediária" que você usa no seu sistema você deve converter o valor para obter o enum correspondente. Vide o exemplo abaixo:


    public class ClasseDoBrunoCrr
    {
        public string Info1 { get; set; }

        public decimal Info2 { get; set; }

        public IndTipoFrete TipoFreteEnum { get; set; }

        public int? TipoFreteInt { get; set; }
    }

PS: classe intermediária de exemplo ☝️


        private object PopularClasseParaGerarSped(ClasseDoBrunoCrr obj)
        {
            var registroC100 = new FiscalBr.EFDFiscal.BlocoC.RegistroC100();

            var meuEnumConvertido = ConverterTipoFreteIntParaEnum(obj.TipoFreteInt);

            registroC100.IndFrt = meuEnumConvertido;

            return registroC100;
        }

PS: Método que vai popular a classe SPED, por exemplo. ☝️


        private IndTipoFrete ConverterTipoFreteIntParaEnum(int? obj)
        {
            // obtém todos os valores do enum desejado
            var enums = Enum.GetValues(typeof(IndTipoFrete));

            IndTipoFrete enumDaProp = IndTipoFrete.None;
            for (int i = 0; i < enums.Length; i++)
            {
                var enumConvertido = (IndTipoFrete)enums.GetValue(i);

                if (enumConvertido.ToDefaultValue() == obj.Value.ToString())
                    enumDaProp = enumConvertido;
            }

            return enumDaProp;
        }

PS: Método que vai converter o seu inteiro da classe intermediária para o enum desejado (tem formas melhores de fazer isso mas, esse é um exemplo básico) ☝️


        /// <summary>
        /// Sua chamada seria mais ou menos isso 👇
        /// </summary>
        private void DoMagic()
        {
            var obj = new ClasseDoBrunoCrr();
            obj.Info1 = "qualquer coisa";
            obj.Info2 = 0M;

            // Se a sua classe já tiver o tipo enum desejado basta usar o enum direto
            obj.TipoFreteEnum = IndTipoFrete.SemCobrancaFrete;

            // Se a sua classe usar um tipo primitivo basta converter o DefaultValue para o tipo primitivo desejado
            obj.TipoFreteInt = Convert.ToInt32(IndTipoFrete.SemCobrancaFrete.ToDefaultValue());

            PopularClasseParaGerarSped(obj);
        }
orochasamuel commented 1 year ago

Eu nunca havia me deparado com essa situação mas, é possível melhorar.

Eu vou incluir uma issue para futuramente criar um método .FromEnumDefaultValue(obj enum).

É interessante ter os métodos de ida e volta do valor para cada enumerador. A conversão direta nesse caso não funciona pois o código do enum não é o mesmo que será usado.


        /// <summary>
        ///     Indicador do tipo de frete
        /// </summary>
        public enum IndTipoFrete
        {
            [DefaultValue("")] None, // 0
            [DefaultValue("0")] ContaEmitente, // 1
            [DefaultValue("1")] ContaDestinatarioRemetente, // 2
            [DefaultValue("2")] ContaTerceiros, // 3
            [DefaultValue("9")] SemCobrancaFrete // 4
        }

No caso desse enum, sem frete é o índice 4, mas o valor padrão é o 9.

EDIT Alterei esse enum para refletir os mesmos valores default.


    /// <summary>
    ///     Indicador do tipo de frete
    /// </summary>
    public enum IndTipoFrete
    {
        [DefaultValue("")] None = -1,
        [DefaultValue("0")] ContaEmitente = 0,
        [DefaultValue("1")] ContaDestinatarioRemetente = 1,
        [DefaultValue("2")] ContaTerceiros = 2,
        [DefaultValue("9")] SemCobrancaFrete = 9
    }

Agora fica mais fácil fazer a conversão direta:


        public void ConverterIntParaEnumTest()
        {
            var indicadorFreteInt = 9; // Sem frete

            var indicadorFreteEnum = (IndTipoFrete)indicadorFreteInt;
        }
bruno-crr commented 1 year ago

isso mesmo o erro que dava é que o enum na verdade tem um index inteiro que quando eu fazia o cast direto dava o erro, em alguns enums coincidentemente o index é o mesmo que o valor então funciona normal, mas nesse caso o método que vc mencionou de .FromEnumDefaultValue(obj enum) seria o ideal, no meu projeto eu uso um pacote de enums o SmartEnum que me da mais opções de trabalhar os enums , o que eu fiz foi incluir o enum do Fiscal.Br como um valor do SmartEnum, faco o casto baseado no meu próprio Enum e acesso o valor do Fiscal.Br

bruno-crr commented 1 year ago
/// <summary>
///     Indicador do tipo de frete
/// </summary>
public enum IndTipoFrete
{
    [DefaultValue("")] None = -1,
    [DefaultValue("0")] ContaEmitente = 0,
    [DefaultValue("1")] ContaDestinatarioRemetente = 1,
    [DefaultValue("2")] ContaTerceiros = 2,
    [DefaultValue("9")] SemCobrancaFrete = 9
}

dessa forma aqui sim ele não da erro no cast, já resolve pra quem estava usando a versão anterior e mudar pra 17.

bruno-crr commented 1 year ago

image

Olha ai no caso em alguns enums do meu projeto eu já tinha a referência do Fiscal.Br

orochasamuel commented 1 year ago

Entendi, vou fazer o commit e criar mais alguns testes antes de publicar o novo pacote 17.0.2 no Nuget.

orochasamuel commented 1 year ago

Alterações feitas no commit https://github.com/orochasamuel/fiscalbr-net/commit/94fb794faa4ffef34c4d176a6e3f9fde0d183ec6.

orochasamuel commented 1 year ago

Opa!!

Passando para avisar que os novos pacotes Nuget já estão disponíveis. o/

Vida longa e próspera 🖖