diff --git a/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd b/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd index d204e406..a42c19a6 100644 --- a/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd +++ b/NFe.AppTeste/Schemas/DFeTiposBasicos_v1.00.xsd @@ -340,7 +340,7 @@ - Informar essa opção da Choice para Monofasia (CST 620) + Grupo de Informações do IBS e CBS em operações com imposto monofásico (CST 620) @@ -732,157 +732,6 @@ - - - Tipo Monofasia - - - - Monofasia - - - - Grupo de informações da Tributação Monofásica padrão - - - - - - Quantidade tributada na monofasia - - - - - Alíquota ad rem do IBS - - - - - Alíquota ad rem da CBS - - - - - Valor do IBS monofásico - - - - - Valor da CBS monofásica - - - - - - - - Grupo de informações da Tributação Monofásica sujeita a retenção - - - - - - Quantidade tributada sujeita a retenção. - - - - - Alíquota ad rem do IBS sujeito a retenção - - - - - Valor do IBS monofásico sujeito a retenção - - - - - Alíquota ad rem da CBS sujeita a retenção - - - - - Valor da CBS monofásica sujeita a retenção - - - - - - - - Grupo de informações da Tributação Monofásica retida anteriormente - - - - - - Quantidade tributada retida anteriormente - - - - - Alíquota ad rem do IBS retido anteriormente - - - - - Valor do IBS retido anteriormente - - - - - Alíquota ad rem da CBS retida anteriormente - - - - - Valor da CBS retida anteriormente - - - - - - - - Grupo de informações do diferimento da Tributação Monofásica - - - - - - Percentual do diferimento do imposto monofásico - - - - - Valor do IBS monofásico diferido - - - - - Percentual do diferimento do imposto monofásico - - - - - Valor da CBS monofásica diferida - - - - - - - - Total de IBS monofásico do item - - - - - Total da CBS monofásica do item - - - - Tipo CBS IBS Completo @@ -1351,7 +1200,7 @@ 4 – Recebimento do pagamento com fornecimento posterior; - + Chave de acesso do documento fiscal anterior. @@ -1395,7 +1244,7 @@ Obs: a chave de acesso deverá ser de um emitente com o mesmo CNPJ base - + Chave de acesso do documento fiscal anterior. @@ -1414,7 +1263,7 @@ Obs: a chave de acesso deverá ser de um emitente com o mesmo CNPJ baseInformado para abater as parcelas de antecipação de pagamento, conforme art. 10 §4 - + Chave de acesso do documento fiscal de antecipação de pagamento @@ -1474,7 +1323,7 @@ Obs: esse DFe deverá ter o indAntecipacaoPgto marcado no grupo ide - + @@ -1486,7 +1335,7 @@ comercializado. - + @@ -1597,4 +1446,395 @@ OBS: Percentuais definidos no art. 450, § 1º, da LC 214/25 para o cálculo do + + + Grupo de Informações do IBS e CBS em operações com imposto monofásico (CST 620) + + + + + + + + + Grupo de informações da Tributação Monofásica Ad Rem do IBS + + + + + + Grupo de informações da Tributação Monofásica Padrão + + + + + + Quantidade tributada na monofasia + + + + + Alíquota ad rem do IBS + + + + + Valor do IBS monofásico + + + + + + + + Grupo de informações da Tributação Monofásica Sujeita à Retenção + + + + + + Quantidade tributada sujeita à retenção na monofasia + + + + + Alíquota ad rem do IBS sujeito à retenção + + + + + Valor do IBS monofásico sujeito à retenção + + + + + + + + Grupo de informações da Tributação Monofásica Retida Anteriormente + + + + + + Valor do IBS retido anteriormente + + + + + + + + Grupo de informações sobre mistura de EAC com gasolina A em percentual inferior ou superior ao obrigatório + + + + + + Quantidade de Biocombustível (EAC) a recolher ou a ressarcir + + + + + Valor do IBS correspondente a diferença em relação ao pBioObrigatorio + + + + + + + + + + + + Grupo de informações da Tributação Monofásica Ad Valorem do IBS + + + + + + Grupo de informações da Tributação Monofásica Padrão + + + + + + Valor tributado na monofasia + + + + + Alíquota ad valorem do IBS Estadual + + + + + Valor do IBS monofásico Estadual + + + + + Alíquota ad valorem do IBS Municipal + + + + + Valor do IBS monofásico do Municipal + + + + + Valor do IBS monofásico + + + + + + + + Grupo de informações da Tributação Monofásica Sujeita à Retenção + + + + + + Valor tributado sujeito à retenção na monofasia + + + + + Alíquota ad valorem do IBS sujeito à retenção + + + + + Valor do IBS monofásico sujeito à retenção + + + + + + + + Grupo de informações da Tributação Monofásica Retida Anteriormente + + + + + + Valor do IBS retido anteriormente + + + + + + + + Grupo de informações sobre mistura de EAC com gasolina A em percentual inferior ou superior ao obrigatório + + + + + + + + + + + + + + + + + + + + Grupo de informações da Tributação Monofásica Ad Rem da CBS + + + + + + Grupo de informações da Tributação Monofásica Padrão + + + + + + Quantidade tributada na monofasia + + + + + Alíquota ad rem da CBS + + + + + Valor da CBS monofásica + + + + + + + + Grupo de informações da Tributação Monofásica Sujeita à Retenção + + + + + + Quantidade tributada sujeita à retenção na monofasia + + + + + Alíquota ad rem da CBS sujeita à retenção + + + + + Valor da CBS monofásica sujeita à retenção + + + + + + + + Grupo de informações da Tributação Monofásica Retida Anteriormente + + + + + + Valor da CBS retida anteriormente + + + + + + + + Grupo de informações sobre mistura de EAC com gasolina A em percentual inferior ou superior ao obrigatório + + + + + + Quantidade de Biocombustível (EAC) a recolher ou a ressarcir + + + + + Valor da CBS correspondente a diferença em relação ao pBioObrigatorio + + + + + + + + + + + + Grupo de informações da Tributação Monofásica Ad Valorem da CBS + + + + + + Grupo de informações da Tributação Monofásica Padrão + + + + + + Valor tributado na monofasia + + + + + Alíquota ad valorem da CBS + + + + + Valor da CBS monofásica + + + + + + + + Grupo de informações da Tributação Monofásica Sujeita à Retenção + + + + + + Valor tributado sujeito à retenção na monofasia + + + + + Alíquota ad valorem da CBS sujeita à retenção + + + + + Valor da CBS monofásica sujeita à retenção + + + + + + + + Grupo de informações da Tributação Monofásica Retida Anteriormente + + + + + + Valor da CBS retida anteriormente + + + + + + + + Grupo de informações sobre mistura de EAC com gasolina A em percentual inferior ou superior ao obrigatório + + + + + + + + + + + + + + + + + Total de IBS Monofásico. + + + + + Total da CBS Monofásica. + + + + \ No newline at end of file diff --git a/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd b/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd index 9e86de93..e7ce135a 100644 --- a/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd +++ b/NFe.AppTeste/Schemas/leiauteNFe_v4.00.xsd @@ -561,7 +561,7 @@ Preencher com "2B", quando se tratar de Cupom Fiscal emitido por máqu Endereço do emitente - + Inscrição Estadual do Emitente @@ -5624,7 +5624,7 @@ Substituição Tributaria; Valores totais da NF com IBS / CBS - + Valor Total da NF considerando os impostos por fora IBS, CBS e IS diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gCBSMonoAdRem.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gCBSMonoAdRem.cs new file mode 100644 index 00000000..f70158b7 --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gCBSMonoAdRem.cs @@ -0,0 +1,26 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB95a - Grupo de informações da Tributação Monofásica Ad Rem da CBS (NT 2025.002 v1.50) + /// + public class gCBSMonoAdRem + { + // UB96 + [XmlElement(Order = 1)] + public gMonoPadraoCBSAdRem gMonoPadrao { get; set; } + + // UB97 + [XmlElement(Order = 2)] + public gMonoRetenCBSAdRem gMonoReten { get; set; } + + // UB98 + [XmlElement(Order = 3)] + public gMonoRetCBS gMonoRet { get; set; } + + // UB99 + [XmlElement(Order = 4)] + public gpBioDiferencaCBS gpBioDiferenca { get; set; } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gCBSMonoAdValorem.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gCBSMonoAdValorem.cs new file mode 100644 index 00000000..1790fd1a --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gCBSMonoAdValorem.cs @@ -0,0 +1,26 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB100 - Grupo de informações da Tributação Monofásica Ad Valorem da CBS (NT 2025.002 v1.50) + /// + public class gCBSMonoAdValorem + { + // UB101 + [XmlElement(Order = 1)] + public gMonoPadraoCBSAdValorem gMonoPadrao { get; set; } + + // UB102 + [XmlElement(Order = 2)] + public gMonoRetenCBSAdValorem gMonoReten { get; set; } + + // UB103 + [XmlElement(Order = 3)] + public gMonoRetCBS gMonoRet { get; set; } + + // UB104 + [XmlElement(Order = 4)] + public gpBioDiferencaCBS gpBioDiferenca { get; set; } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gIBSCBSMono.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gIBSCBSMono.cs index e0054990..6a1857fa 100644 --- a/NFe.Classes/Informacoes/Detalhe/Tributacao/gIBSCBSMono.cs +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gIBSCBSMono.cs @@ -2,37 +2,72 @@ namespace NFe.Classes.Informacoes.Detalhe.Tributacao { + /// + /// UB84 - Grupo de Informações do IBS e CBS em operações com imposto monofásico (CST 620) + /// + /// Leiaute da NT 2025.002 v1.50 (PL_010f): o IBS vai em gIBSMonoAdRem ou gIBSMonoAdValorem + /// e a CBS em gCBSMonoAdRem ou gCBSMonoAdValorem. + /// + /// + /// gMonoPadrao, gMonoReten, gMonoRet e gMonoDif são do leiaute anterior, que deixa de ser aceito em 03/11/2026. + /// Ficam somente para a leitura de documentos já autorizados e não devem ser preenchidos em novas emissões. + /// + /// public class gIBSCBSMono { private decimal _vTotIbsMonoItem; private decimal _vTotCbsMonoItem; - // UB84a + // UB84a (leiaute anterior à NT 2025.002 v1.50) [XmlElement(Order = 1)] public gMonoPadrao gMonoPadrao { get; set; } - // UB90 + // UB90 (leiaute anterior à NT 2025.002 v1.50) [XmlElement(Order = 2)] public gMonoReten gMonoReten { get; set; } - // UB94 + // UB94 (leiaute anterior à NT 2025.002 v1.50) [XmlElement(Order = 3)] public gMonoRet gMonoRet { get; set; } - // UB99 + // UB99 (leiaute anterior à NT 2025.002 v1.50) [XmlElement(Order = 4)] public gMonoDif gMonoDif { get; set; } - // UB104 + /// + /// UB85a - Tributação Monofásica Ad Rem do IBS. Informar este ou gIBSMonoAdValorem + /// [XmlElement(Order = 5)] + public gIBSMonoAdRem gIBSMonoAdRem { get; set; } + + /// + /// UB90 - Tributação Monofásica Ad Valorem do IBS. Informar este ou gIBSMonoAdRem + /// + [XmlElement(Order = 6)] + public gIBSMonoAdValorem gIBSMonoAdValorem { get; set; } + + /// + /// UB95a - Tributação Monofásica Ad Rem da CBS. Informar este ou gCBSMonoAdValorem + /// + [XmlElement(Order = 7)] + public gCBSMonoAdRem gCBSMonoAdRem { get; set; } + + /// + /// UB100 - Tributação Monofásica Ad Valorem da CBS. Informar este ou gCBSMonoAdRem + /// + [XmlElement(Order = 8)] + public gCBSMonoAdValorem gCBSMonoAdValorem { get; set; } + + // UB105a + [XmlElement(Order = 9)] public decimal vTotIBSMonoItem { get => _vTotIbsMonoItem.Arredondar(2); set => _vTotIbsMonoItem = value.Arredondar(2); } - // UB105 - [XmlElement(Order = 6)] + // UB105b + [XmlElement(Order = 10)] public decimal vTotCBSMonoItem { get => _vTotCbsMonoItem.Arredondar(2); diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gIBSMonoAdRem.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gIBSMonoAdRem.cs new file mode 100644 index 00000000..bed3db84 --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gIBSMonoAdRem.cs @@ -0,0 +1,26 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB85a - Grupo de informações da Tributação Monofásica Ad Rem do IBS (NT 2025.002 v1.50) + /// + public class gIBSMonoAdRem + { + // UB86 + [XmlElement(Order = 1)] + public gMonoPadraoIBSAdRem gMonoPadrao { get; set; } + + // UB87 + [XmlElement(Order = 2)] + public gMonoRetenIBSAdRem gMonoReten { get; set; } + + // UB88 + [XmlElement(Order = 3)] + public gMonoRetIBS gMonoRet { get; set; } + + // UB89 + [XmlElement(Order = 4)] + public gpBioDiferencaIBS gpBioDiferenca { get; set; } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gIBSMonoAdValorem.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gIBSMonoAdValorem.cs new file mode 100644 index 00000000..626e3825 --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gIBSMonoAdValorem.cs @@ -0,0 +1,26 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB90 - Grupo de informações da Tributação Monofásica Ad Valorem do IBS (NT 2025.002 v1.50) + /// + public class gIBSMonoAdValorem + { + // UB91 + [XmlElement(Order = 1)] + public gMonoPadraoIBSAdValorem gMonoPadrao { get; set; } + + // UB92 + [XmlElement(Order = 2)] + public gMonoRetenIBSAdValorem gMonoReten { get; set; } + + // UB93 + [XmlElement(Order = 3)] + public gMonoRetIBS gMonoRet { get; set; } + + // UB94 + [XmlElement(Order = 4)] + public gpBioDiferencaIBS gpBioDiferenca { get; set; } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoPadraoCBSAdRem.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoPadraoCBSAdRem.cs new file mode 100644 index 00000000..53f429d2 --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoPadraoCBSAdRem.cs @@ -0,0 +1,38 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB96 - Grupo de informações da Tributação Monofásica Padrão da CBS Ad Rem (tag gMonoPadrao) + /// + public class gMonoPadraoCBSAdRem + { + private decimal _qBcMono; + private decimal _adRemCbs; + private decimal _vCbsMono; + + // UB96a + [XmlElement(Order = 1)] + public decimal qBCMono + { + get => _qBcMono.Arredondar(4); + set => _qBcMono = value.Arredondar(4); + } + + // UB96b + [XmlElement(Order = 2)] + public decimal adRemCBS + { + get => _adRemCbs.Arredondar(4); + set => _adRemCbs = value.Arredondar(4); + } + + // UB96c + [XmlElement(Order = 3)] + public decimal vCBSMono + { + get => _vCbsMono.Arredondar(2); + set => _vCbsMono = value.Arredondar(2); + } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoPadraoCBSAdValorem.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoPadraoCBSAdValorem.cs new file mode 100644 index 00000000..1461e329 --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoPadraoCBSAdValorem.cs @@ -0,0 +1,38 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB101 - Grupo de informações da Tributação Monofásica Padrão da CBS Ad Valorem (tag gMonoPadrao) + /// + public class gMonoPadraoCBSAdValorem + { + private decimal _vBcMono; + private decimal _pAliqMonoCbs; + private decimal _vCbsMono; + + // UB101a + [XmlElement(Order = 1)] + public decimal vBCMono + { + get => _vBcMono.Arredondar(2); + set => _vBcMono = value.Arredondar(2); + } + + // UB101b + [XmlElement(Order = 2)] + public decimal pAliqMonoCBS + { + get => _pAliqMonoCbs.Arredondar(4); + set => _pAliqMonoCbs = value.Arredondar(4); + } + + // UB101c + [XmlElement(Order = 3)] + public decimal vCBSMono + { + get => _vCbsMono.Arredondar(2); + set => _vCbsMono = value.Arredondar(2); + } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoPadraoIBSAdRem.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoPadraoIBSAdRem.cs new file mode 100644 index 00000000..af9a0066 --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoPadraoIBSAdRem.cs @@ -0,0 +1,38 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB86 - Grupo de informações da Tributação Monofásica Padrão do IBS Ad Rem (tag gMonoPadrao) + /// + public class gMonoPadraoIBSAdRem + { + private decimal _qBcMono; + private decimal _adRemIbs; + private decimal _vIbsMono; + + // UB86a + [XmlElement(Order = 1)] + public decimal qBCMono + { + get => _qBcMono.Arredondar(4); + set => _qBcMono = value.Arredondar(4); + } + + // UB86b + [XmlElement(Order = 2)] + public decimal adRemIBS + { + get => _adRemIbs.Arredondar(4); + set => _adRemIbs = value.Arredondar(4); + } + + // UB86c + [XmlElement(Order = 3)] + public decimal vIBSMono + { + get => _vIbsMono.Arredondar(2); + set => _vIbsMono = value.Arredondar(2); + } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoPadraoIBSAdValorem.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoPadraoIBSAdValorem.cs new file mode 100644 index 00000000..b9118025 --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoPadraoIBSAdValorem.cs @@ -0,0 +1,67 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB91 - Grupo de informações da Tributação Monofásica Padrão do IBS Ad Valorem (tag gMonoPadrao) + /// + public class gMonoPadraoIBSAdValorem + { + private decimal _vBcMono; + private decimal _pAliqMonoUf; + private decimal _vIbsMonoUf; + private decimal _pAliqMonoMun; + private decimal _vIbsMonoMun; + private decimal _vIbsMono; + + // UB91a + [XmlElement(Order = 1)] + public decimal vBCMono + { + get => _vBcMono.Arredondar(2); + set => _vBcMono = value.Arredondar(2); + } + + // UB91b + [XmlElement(Order = 2)] + public decimal pAliqMonoUF + { + get => _pAliqMonoUf.Arredondar(4); + set => _pAliqMonoUf = value.Arredondar(4); + } + + // UB91c + [XmlElement(Order = 3)] + public decimal vIBSMonoUF + { + get => _vIbsMonoUf.Arredondar(2); + set => _vIbsMonoUf = value.Arredondar(2); + } + + // UB91d + [XmlElement(Order = 4)] + public decimal pAliqMonoMun + { + get => _pAliqMonoMun.Arredondar(4); + set => _pAliqMonoMun = value.Arredondar(4); + } + + // UB91e + [XmlElement(Order = 5)] + public decimal vIBSMonoMun + { + get => _vIbsMonoMun.Arredondar(2); + set => _vIbsMonoMun = value.Arredondar(2); + } + + /// + /// UB91f - Valor do IBS monofásico (vIBSMonoUF + vIBSMonoMun) + /// + [XmlElement(Order = 6)] + public decimal vIBSMono + { + get => _vIbsMono.Arredondar(2); + set => _vIbsMono = value.Arredondar(2); + } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetCBS.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetCBS.cs new file mode 100644 index 00000000..62ced6ca --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetCBS.cs @@ -0,0 +1,20 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB98/UB103 - Grupo de informações da Tributação Monofásica Retida Anteriormente da CBS (tag gMonoRet) + /// + public class gMonoRetCBS + { + private decimal _vCbsMonoRet; + + // UB98a/UB103a + [XmlElement(Order = 1)] + public decimal vCBSMonoRet + { + get => _vCbsMonoRet.Arredondar(2); + set => _vCbsMonoRet = value.Arredondar(2); + } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetIBS.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetIBS.cs new file mode 100644 index 00000000..3d5649b0 --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetIBS.cs @@ -0,0 +1,20 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB88/UB93 - Grupo de informações da Tributação Monofásica Retida Anteriormente do IBS (tag gMonoRet) + /// + public class gMonoRetIBS + { + private decimal _vIbsMonoRet; + + // UB88a/UB93a + [XmlElement(Order = 1)] + public decimal vIBSMonoRet + { + get => _vIbsMonoRet.Arredondar(2); + set => _vIbsMonoRet = value.Arredondar(2); + } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetenCBSAdRem.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetenCBSAdRem.cs new file mode 100644 index 00000000..42123be4 --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetenCBSAdRem.cs @@ -0,0 +1,38 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB97 - Grupo de informações da Tributação Monofásica Sujeita à Retenção da CBS Ad Rem (tag gMonoReten) + /// + public class gMonoRetenCBSAdRem + { + private decimal _qBcMonoReten; + private decimal _adRemCbsReten; + private decimal _vCbsMonoReten; + + // UB97a + [XmlElement(Order = 1)] + public decimal qBCMonoReten + { + get => _qBcMonoReten.Arredondar(4); + set => _qBcMonoReten = value.Arredondar(4); + } + + // UB97b + [XmlElement(Order = 2)] + public decimal adRemCBSReten + { + get => _adRemCbsReten.Arredondar(4); + set => _adRemCbsReten = value.Arredondar(4); + } + + // UB97c + [XmlElement(Order = 3)] + public decimal vCBSMonoReten + { + get => _vCbsMonoReten.Arredondar(2); + set => _vCbsMonoReten = value.Arredondar(2); + } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetenCBSAdValorem.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetenCBSAdValorem.cs new file mode 100644 index 00000000..adc1a8da --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetenCBSAdValorem.cs @@ -0,0 +1,38 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB102 - Grupo de informações da Tributação Monofásica Sujeita à Retenção da CBS Ad Valorem (tag gMonoReten) + /// + public class gMonoRetenCBSAdValorem + { + private decimal _vBcMonoReten; + private decimal _pAliqMonoReten; + private decimal _vCbsMonoReten; + + // UB102a + [XmlElement(Order = 1)] + public decimal vBCMonoReten + { + get => _vBcMonoReten.Arredondar(2); + set => _vBcMonoReten = value.Arredondar(2); + } + + // UB102b + [XmlElement(Order = 2)] + public decimal pAliqMonoReten + { + get => _pAliqMonoReten.Arredondar(4); + set => _pAliqMonoReten = value.Arredondar(4); + } + + // UB102c + [XmlElement(Order = 3)] + public decimal vCBSMonoReten + { + get => _vCbsMonoReten.Arredondar(2); + set => _vCbsMonoReten = value.Arredondar(2); + } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetenIBSAdRem.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetenIBSAdRem.cs new file mode 100644 index 00000000..e8094535 --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetenIBSAdRem.cs @@ -0,0 +1,38 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB87 - Grupo de informações da Tributação Monofásica Sujeita à Retenção do IBS Ad Rem (tag gMonoReten) + /// + public class gMonoRetenIBSAdRem + { + private decimal _qBcMonoReten; + private decimal _adRemIbsReten; + private decimal _vIbsMonoReten; + + // UB87a + [XmlElement(Order = 1)] + public decimal qBCMonoReten + { + get => _qBcMonoReten.Arredondar(4); + set => _qBcMonoReten = value.Arredondar(4); + } + + // UB87b + [XmlElement(Order = 2)] + public decimal adRemIBSReten + { + get => _adRemIbsReten.Arredondar(4); + set => _adRemIbsReten = value.Arredondar(4); + } + + // UB87c + [XmlElement(Order = 3)] + public decimal vIBSMonoReten + { + get => _vIbsMonoReten.Arredondar(2); + set => _vIbsMonoReten = value.Arredondar(2); + } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetenIBSAdValorem.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetenIBSAdValorem.cs new file mode 100644 index 00000000..c4cc3bcb --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gMonoRetenIBSAdValorem.cs @@ -0,0 +1,38 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB92 - Grupo de informações da Tributação Monofásica Sujeita à Retenção do IBS Ad Valorem (tag gMonoReten) + /// + public class gMonoRetenIBSAdValorem + { + private decimal _vBcMonoReten; + private decimal _pAliqMonoReten; + private decimal _vIbsMonoReten; + + // UB92a + [XmlElement(Order = 1)] + public decimal vBCMonoReten + { + get => _vBcMonoReten.Arredondar(2); + set => _vBcMonoReten = value.Arredondar(2); + } + + // UB92b + [XmlElement(Order = 2)] + public decimal pAliqMonoReten + { + get => _pAliqMonoReten.Arredondar(4); + set => _pAliqMonoReten = value.Arredondar(4); + } + + // UB92c + [XmlElement(Order = 3)] + public decimal vIBSMonoReten + { + get => _vIbsMonoReten.Arredondar(2); + set => _vIbsMonoReten = value.Arredondar(2); + } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gpBioDiferencaCBS.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gpBioDiferencaCBS.cs new file mode 100644 index 00000000..cc6c8ddf --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gpBioDiferencaCBS.cs @@ -0,0 +1,29 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB99/UB104 - Grupo de informações sobre mistura de EAC com gasolina A em percentual inferior ou superior ao obrigatório, para a CBS (tag gpBioDiferenca) + /// + public class gpBioDiferencaCBS + { + private decimal _qBcBioComb; + private decimal _vCbsDiferenca; + + // UB99a/UB104a + [XmlElement(Order = 1)] + public decimal qBCBioComb + { + get => _qBcBioComb.Arredondar(4); + set => _qBcBioComb = value.Arredondar(4); + } + + // UB99b/UB104b + [XmlElement(Order = 2)] + public decimal vCBSDiferenca + { + get => _vCbsDiferenca.Arredondar(2); + set => _vCbsDiferenca = value.Arredondar(2); + } + } +} diff --git a/NFe.Classes/Informacoes/Detalhe/Tributacao/gpBioDiferencaIBS.cs b/NFe.Classes/Informacoes/Detalhe/Tributacao/gpBioDiferencaIBS.cs new file mode 100644 index 00000000..75bfe98f --- /dev/null +++ b/NFe.Classes/Informacoes/Detalhe/Tributacao/gpBioDiferencaIBS.cs @@ -0,0 +1,29 @@ +using System.Xml.Serialization; + +namespace NFe.Classes.Informacoes.Detalhe.Tributacao +{ + /// + /// UB89/UB94 - Grupo de informações sobre mistura de EAC com gasolina A em percentual inferior ou superior ao obrigatório, para o IBS (tag gpBioDiferenca) + /// + public class gpBioDiferencaIBS + { + private decimal _qBcBioComb; + private decimal _vIbsDiferenca; + + // UB89a/UB94a + [XmlElement(Order = 1)] + public decimal qBCBioComb + { + get => _qBcBioComb.Arredondar(4); + set => _qBcBioComb = value.Arredondar(4); + } + + // UB89b/UB94b + [XmlElement(Order = 2)] + public decimal vIBSDiferenca + { + get => _vIbsDiferenca.Arredondar(2); + set => _vIbsDiferenca = value.Arredondar(2); + } + } +} diff --git a/NFe.Utils.Testes/IBSCBSMonoTestes.cs b/NFe.Utils.Testes/IBSCBSMonoTestes.cs new file mode 100644 index 00000000..9a15cb2d --- /dev/null +++ b/NFe.Utils.Testes/IBSCBSMonoTestes.cs @@ -0,0 +1,202 @@ +using System.Collections.Generic; +using System.IO; +using System.Xml; +using System.Xml.Schema; +using System.Xml.Serialization; +using NFe.Classes.Informacoes.Detalhe.Tributacao; +using Xunit; + +namespace NFe.Utils.Testes +{ + /// + /// Testes do grupo gIBSCBSMono no leiaute da NT 2025.002 v1.50 (PL_010f v1.04) + /// + public class IBSCBSMonoTestes + { + private const string NamespaceNfe = "http://www.portalfiscal.inf.br/nfe"; + + //o DFeTiposBasicos não tem targetNamespace; o envelope o inclui no namespace da NF-e e declara o IBSCBS como no leiauteNFe + private const string SchemaEnvelope = + "" + + "" + + "" + + ""; + + private static string SerializarComNamespaceNfe(IBSCBS ibscbs) + { + var serializador = new XmlSerializer(typeof(IBSCBS), NamespaceNfe); + using (var sw = new StringWriter()) + { + serializador.Serialize(sw, ibscbs); + return sw.ToString(); + } + } + + private static List ValidarContraPl010f(string xml) + { + var erros = new List(); + var schemas = new XmlSchemaSet { XmlResolver = new XmlUrlResolver() }; + using (var reader = XmlReader.Create(new StringReader(SchemaEnvelope), new XmlReaderSettings(), Path.Combine(Directory.GetCurrentDirectory(), "Schemas", "envelope.xsd"))) + schemas.Add(NamespaceNfe, reader); + + var cfg = new XmlReaderSettings { ValidationType = ValidationType.Schema, Schemas = schemas }; + cfg.ValidationEventHandler += (sender, e) => erros.Add(e.Message); + + using (var reader = XmlReader.Create(new StringReader(xml), cfg)) + while (reader.Read()) { } + + return erros; + } + + [Fact] + public void Serializar_RevendaCobradaAnteriormente620006_GeraXmlValidoNoPl010f() + { + // Arrange + var ibscbs = new IBSCBS + { + CST = CSTIBSCBS.cst620, + cClassTrib = "620006", + gIBSCBSMono = new gIBSCBSMono + { + gIBSMonoAdValorem = new gIBSMonoAdValorem { gMonoRet = new gMonoRetIBS { vIBSMonoRet = 0.06m } }, + gCBSMonoAdValorem = new gCBSMonoAdValorem { gMonoRet = new gMonoRetCBS { vCBSMonoRet = 0.54m } }, + vTotIBSMonoItem = 0m, + vTotCBSMonoItem = 0m + } + }; + + // Act + var xml = SerializarComNamespaceNfe(ibscbs); + + // Assert + Assert.Empty(ValidarContraPl010f(xml)); + Assert.Contains("0.06", xml.Replace("\r", "").Replace("\n", "").Replace(" ", "")); + Assert.DoesNotContain("gMonoDif", xml); + } + + [Fact] + public void Serializar_MonofasiaAdRemComRetencaoEDiferencaDeBiocombustivel_GeraXmlValidoNoPl010f() + { + // Arrange + var ibscbs = new IBSCBS + { + CST = CSTIBSCBS.cst620, + cClassTrib = "620002", + gIBSCBSMono = new gIBSCBSMono + { + gIBSMonoAdRem = new gIBSMonoAdRem + { + gMonoPadrao = new gMonoPadraoIBSAdRem { qBCMono = 1000m, adRemIBS = 0.0123m, vIBSMono = 12.30m }, + gMonoReten = new gMonoRetenIBSAdRem { qBCMonoReten = 500m, adRemIBSReten = 0.0123m, vIBSMonoReten = 6.15m }, + gpBioDiferenca = new gpBioDiferencaIBS { qBCBioComb = 10.5m, vIBSDiferenca = 0.13m } + }, + gCBSMonoAdRem = new gCBSMonoAdRem + { + gMonoPadrao = new gMonoPadraoCBSAdRem { qBCMono = 1000m, adRemCBS = 0.1107m, vCBSMono = 110.70m }, + gMonoReten = new gMonoRetenCBSAdRem { qBCMonoReten = 500m, adRemCBSReten = 0.1107m, vCBSMonoReten = 55.35m } + }, + vTotIBSMonoItem = 18.45m, + vTotCBSMonoItem = 166.05m + } + }; + + // Act + var xml = SerializarComNamespaceNfe(ibscbs); + + // Assert + Assert.Empty(ValidarContraPl010f(xml)); + } + + [Fact] + public void Serializar_MonofasiaAdValoremPadrao_GeraXmlValidoNoPl010f() + { + // Arrange + var ibscbs = new IBSCBS + { + CST = CSTIBSCBS.cst620, + cClassTrib = "620001", + gIBSCBSMono = new gIBSCBSMono + { + gIBSMonoAdValorem = new gIBSMonoAdValorem + { + gMonoPadrao = new gMonoPadraoIBSAdValorem { vBCMono = 1000m, pAliqMonoUF = 0.1m, vIBSMonoUF = 1m, pAliqMonoMun = 0m, vIBSMonoMun = 0m, vIBSMono = 1m } + }, + gCBSMonoAdValorem = new gCBSMonoAdValorem + { + gMonoPadrao = new gMonoPadraoCBSAdValorem { vBCMono = 1000m, pAliqMonoCBS = 0.9m, vCBSMono = 9m } + }, + vTotIBSMonoItem = 1m, + vTotCBSMonoItem = 9m + } + }; + + // Act + var xml = SerializarComNamespaceNfe(ibscbs); + + // Assert + Assert.Empty(ValidarContraPl010f(xml)); + } + + [Fact] + public void Serializar_LeiauteAnteriorAV150_EhRejeitadoPeloPl010f() + { + // Arrange + var ibscbs = new IBSCBS + { + CST = CSTIBSCBS.cst620, + cClassTrib = "620006", + gIBSCBSMono = new gIBSCBSMono + { + gMonoRet = new gMonoRet { qBCMonoRet = 100m, adRemIBSRet = 0.0006m, vIBSMonoRet = 0.06m, adRemCBSRet = 0.0054m, vCBSMonoRet = 0.54m }, + vTotIBSMonoItem = 0m, + vTotCBSMonoItem = 0m + } + }; + + // Act + var xml = SerializarComNamespaceNfe(ibscbs); + + // Assert + Assert.NotEmpty(ValidarContraPl010f(xml)); + } + + [Fact] + public void Deserializar_XmlAutorizadoNoLeiauteAnterior_PreencheOsGruposAntigos() + { + // Arrange + const string xml = + "620620006" + + "100.00000.00060.060.00540.54" + + "0.000.00" + + ""; + + // Act + var ibscbs = DFe.Utils.FuncoesXml.XmlStringParaClasse(xml); + + // Assert + Assert.Equal(0.06m, ibscbs.gIBSCBSMono.gMonoRet.vIBSMonoRet); + Assert.Equal(0.54m, ibscbs.gIBSCBSMono.gMonoRet.vCBSMonoRet); + Assert.Null(ibscbs.gIBSCBSMono.gIBSMonoAdValorem); + } + + [Fact] + public void Deserializar_XmlNoLeiauteV150_PreencheOsGruposNovos() + { + // Arrange + const string xml = + "620620006" + + "0.06" + + "0.54" + + "0.000.00" + + ""; + + // Act + var ibscbs = DFe.Utils.FuncoesXml.XmlStringParaClasse(xml); + + // Assert + Assert.Equal(0.06m, ibscbs.gIBSCBSMono.gIBSMonoAdValorem.gMonoRet.vIBSMonoRet); + Assert.Equal(0.54m, ibscbs.gIBSCBSMono.gCBSMonoAdRem.gMonoRet.vCBSMonoRet); + Assert.Null(ibscbs.gIBSCBSMono.gMonoRet); + } + } +} diff --git a/NFe.Utils.Testes/NFe.Utils.Testes.csproj b/NFe.Utils.Testes/NFe.Utils.Testes.csproj index 628c6016..ca4e464a 100644 --- a/NFe.Utils.Testes/NFe.Utils.Testes.csproj +++ b/NFe.Utils.Testes/NFe.Utils.Testes.csproj @@ -22,4 +22,8 @@ + + + +