using System.Reflection; using NfProcessorApp.Domain.Services; using NfProcessorApp.Handlers; using Unimake.Business.DFe.Xml.NFe; namespace NfProcessorApp.Domain.Entities { public class NF(InfNFe infNFe) : INFParser { private readonly InfNFe _infNFe = infNFe; public string CNPJ_Comprador => Convert.ToInt64(_infNFe.Dest.CNPJ ?? _infNFe.Dest.CPF) .ToString("00000000000000"); public string CNPJ_Vendedor => Convert.ToInt64(_infNFe.Emit.CNPJ) .ToString("00000000000000"); public decimal Montante_operacao => _infNFe.Det.Sum(d => d.Prod.UCom == "KWH" ? d.Prod.QCom / 1000m : d.Prod.QCom); public double Soma2 => (double)_infNFe.Det.Sum(d => ((d.Prod.UCom == "KWH" ? d.Prod.QCom / 1000m : d.Prod.QCom) * (d.Prod.UCom == "KWH" ? d.Prod.VUnCom / 1000m : d.Prod.VUnCom))); public double Valor_unitario => GetValorUnit(); public double Valor_final_com_impostos => _infNFe.Pag.DetPag.Sum(p => p.VPag) != 0 ? _infNFe.Pag.DetPag.Sum(p => p.VPag) : _infNFe.Cobr.Fat.VLiq; public string RS_Comprador => _infNFe.Dest.XNome.Replace("&", "&").Replace("&", "&"); public string RS_Vendedor => _infNFe.Emit.XNome.Replace("&", "&").Replace("&", "&"); public int Numero_NF => _infNFe.Ide.NNF; public double ICMS_NF => GetICMS(_infNFe.Det.First().Imposto.ICMS); public string UF_NF { get; set; } = infNFe.Dest.EnderDest.UF.ToString(); public string UF_Vend { get; set; } = infNFe.Emit.EnderEmit.UF.ToString(); public NF Parse(string caminhoArquivo) { // Implementar lógica de parsing aqui throw new NotImplementedException(); } public double GetICMS(ICMS icms) { var propICMS = icms.GetType() .GetProperties(BindingFlags.Public | BindingFlags.Instance) // Opcional: filtrar apenas pelas que começam com "ICMS" .Where(p => p.Name.StartsWith("ICMS")) .ToList(); var primeiraProp = propICMS .Select(p => new { Prop = p, Valor = p.GetValue(icms) }) .FirstOrDefault(x => x.Valor != null); bool test = double .TryParse(GetICMS(_infNFe.Det.First().Imposto.ICMS) .ToString(), out double ICMS); if (!test && Valor_final_com_impostos != 0) { return 1 - (Soma2 / Valor_final_com_impostos); } return ICMS; } public double GetValorUnit() { if (UF_NF == "SP" && UF_Vend == "SP") { return Montante_operacao == 0 ? 0 : (Soma2 / (double)Montante_operacao) * (1 - ICMS_NF); } else { return Montante_operacao == 0 ? 0 : (Soma2 / (double)Montante_operacao); } } public static NFResult Invalid(string filePath) => new() { FilePath = filePath, IsValid = false }; } }