diff --git a/brazilfiscalreport/dacte/dacte.py b/brazilfiscalreport/dacte/dacte.py index 6c5d7121..7b2a76b0 100644 --- a/brazilfiscalreport/dacte/dacte.py +++ b/brazilfiscalreport/dacte/dacte.py @@ -1310,7 +1310,12 @@ def _draw_service_fee_value(self): self.vbc = format_number(extract_text(self.imp, "vBC"), precision=2) self.p_icms = format_number(extract_text(self.imp, "pICMS"), precision=2) self.v_icms = format_number(extract_text(self.imp, "vICMS"), precision=2) - self.v_icms_st = format_number(extract_text(self.imp, "vICMS"), precision=2) + # vICMSSTRet (grupo ICMS60) é o único campo de ST do leiaute do CT-e — + # aqui vinha o vICMS, ou seja, o ICMS próprio impresso na coluna ICMS ST. + # Ausente (CST 00, 20, 45, 90...), format_number devolve "0,00". + self.v_icms_st = format_number( + extract_text(self.imp, "vICMSSTRet"), precision=2 + ) self.p_red_bc = format_number(extract_text(self.imp, "pRedBC"), precision=2) g_ibscbs = ( self.imp_ibscbs.find(f"{URL}gIBSCBS") diff --git a/tests/fixtures/dacte/dacte_icms_st.xml b/tests/fixtures/dacte/dacte_icms_st.xml new file mode 100644 index 00000000..9a6ef47a --- /dev/null +++ b/tests/fixtures/dacte/dacte_icms_st.xml @@ -0,0 +1,205 @@ + + + + + + 01 + 0111111 + 6353 + PRESTACAO DE SERVICO + 57 + 2 + 99203223 + 2024-03-27T00:00:00-03:00 + 1 + 1 + 3 + 2 + 0 + 0 + 4.0 + 4216305 + SAO JOAO BATISTA + SC + 01 + 0 + 4216305 + SAO JOAO BATISTA + SC + 3556453 + VARGEM GRANDE PAULISTA + SP + 1 + 1 + + 0 + + + + + + 0 + + + 0 + + + + O valor aproximado de tributos incidentes sobre o preco deste servico e de R$ 56,40 + + + + 92382301841312 + 232412442 + FANTASMA TRANSPORTES LTDA + FANTASMA TRANSPORTES LTDA + + RUA TESTE FANTASMA + 0099 + FANTASMA + 4216305 + SAO JOAO BATISTA + 88240000 + SC + 48999000066 + + 1 + + + 23924902942209 + 224242421 + INDUSTRIA FANTASMA DE TESTE + INDUSTRIA FANTASMA DE TESTE + 47232332239 + + RODOVIA SC FANTASMA + 122 + TESTE + 4216305 + SAO JOAO BATISTA + 88240000 + SC + 1058 + BRASIL + + + + 02394820392092 + 224242421 + EMPRESA DE TESTE + 23424242442 + + TESTE L.A + 21 + AO LADO DE EMPRESA FANTASMA + TESTE + 3556453 + VARGEM GRANDE PAULISTA + 06730000 + SP + 1058 + BRASIL + + + + 221.19 + 221.19 + + FPESO + 117.78 + + + FVALOR + 4.24 + + + PEDAGIO + 13.11 + + + TAXAS + 79.64 + + + GRIS + 3.15 + + + TAS + 3.27 + + + + + + 60 + 221.19 + 20.00 + 12.00 + 5.00 + + + 56.40 + + + + 3016.92 + FITA GOMADA SEMI-KRAFT 80MM C/REFORCO CADEADO + + 03 + UNIDADE + 14 + + + 03 + PARES + 0 + + + 00 + M3 + 0.0000 + + + 01 + PESO REAL + 209.8000 + + + 01 + PESO BASE DE CALCULO + 209.8000 + + 3016.92 + + + + 02394910232349239234934138491040891884149930 + + + + + 23920392 + + + + + + + https://dfe-portal.svrs.rs.gov.br/cte/qrCode?chCTe=42240302484555000343570020003396861081562222&tpAmb=1 + + + + + + 1 + RS20240222155212 + 4224030248244242523254224232424242 + 2024-03-27T20:17:16-03:00 + 2324240111249023 + UCtDCEsja/Ljq5GjpftJHAK3oHI= + 100 + Autorizado o uso do CT-e + + + diff --git a/tests/generated/dacte/dacte_cnpj_alfanumerico.pdf b/tests/generated/dacte/dacte_cnpj_alfanumerico.pdf index 5c668faf..829c2346 100644 Binary files a/tests/generated/dacte/dacte_cnpj_alfanumerico.pdf and b/tests/generated/dacte/dacte_cnpj_alfanumerico.pdf differ diff --git a/tests/generated/dacte/dacte_default.pdf b/tests/generated/dacte/dacte_default.pdf index b1ea6ec7..c0363795 100644 Binary files a/tests/generated/dacte/dacte_default.pdf and b/tests/generated/dacte/dacte_default.pdf differ diff --git a/tests/generated/dacte/dacte_default_aereo.pdf b/tests/generated/dacte/dacte_default_aereo.pdf index 7909a6ee..0173352c 100644 Binary files a/tests/generated/dacte/dacte_default_aereo.pdf and b/tests/generated/dacte/dacte_default_aereo.pdf differ diff --git a/tests/generated/dacte/dacte_default_aquaviario.pdf b/tests/generated/dacte/dacte_default_aquaviario.pdf index f24d2277..a945b9cf 100644 Binary files a/tests/generated/dacte/dacte_default_aquaviario.pdf and b/tests/generated/dacte/dacte_default_aquaviario.pdf differ diff --git a/tests/generated/dacte/dacte_default_dutoviario.pdf b/tests/generated/dacte/dacte_default_dutoviario.pdf index 89310b46..deb5779c 100644 Binary files a/tests/generated/dacte/dacte_default_dutoviario.pdf and b/tests/generated/dacte/dacte_default_dutoviario.pdf differ diff --git a/tests/generated/dacte/dacte_default_ferroviario.pdf b/tests/generated/dacte/dacte_default_ferroviario.pdf index 46acc544..dce02b3d 100644 Binary files a/tests/generated/dacte/dacte_default_ferroviario.pdf and b/tests/generated/dacte/dacte_default_ferroviario.pdf differ diff --git a/tests/generated/dacte/dacte_default_logo.pdf b/tests/generated/dacte/dacte_default_logo.pdf index 2f4db925..da3dbf5b 100644 Binary files a/tests/generated/dacte/dacte_default_logo.pdf and b/tests/generated/dacte/dacte_default_logo.pdf differ diff --git a/tests/generated/dacte/dacte_default_multimodal.pdf b/tests/generated/dacte/dacte_default_multimodal.pdf index 3b8ef038..f0a269cf 100644 Binary files a/tests/generated/dacte/dacte_default_multimodal.pdf and b/tests/generated/dacte/dacte_default_multimodal.pdf differ diff --git a/tests/generated/dacte/dacte_icms_st.pdf b/tests/generated/dacte/dacte_icms_st.pdf new file mode 100644 index 00000000..7db22767 Binary files /dev/null and b/tests/generated/dacte/dacte_icms_st.pdf differ diff --git a/tests/generated/dacte/dacte_overload.pdf b/tests/generated/dacte/dacte_overload.pdf index c6e45f63..810e7cd9 100644 Binary files a/tests/generated/dacte/dacte_overload.pdf and b/tests/generated/dacte/dacte_overload.pdf differ diff --git a/tests/generated/dacte/dacte_reforma_tributaria.pdf b/tests/generated/dacte/dacte_reforma_tributaria.pdf index d802d071..a8b90292 100644 Binary files a/tests/generated/dacte/dacte_reforma_tributaria.pdf and b/tests/generated/dacte/dacte_reforma_tributaria.pdf differ diff --git a/tests/generated/dacte/dacte_tomador_outros.pdf b/tests/generated/dacte/dacte_tomador_outros.pdf index 2597f367..e6b7b5fe 100644 Binary files a/tests/generated/dacte/dacte_tomador_outros.pdf and b/tests/generated/dacte/dacte_tomador_outros.pdf differ diff --git a/tests/generated/dacte/dacte_watermark_cancelled_homologation.pdf b/tests/generated/dacte/dacte_watermark_cancelled_homologation.pdf index 72abbba0..dec6513d 100644 Binary files a/tests/generated/dacte/dacte_watermark_cancelled_homologation.pdf and b/tests/generated/dacte/dacte_watermark_cancelled_homologation.pdf differ diff --git a/tests/generated/dacte/dacte_watermark_cancelled_production.pdf b/tests/generated/dacte/dacte_watermark_cancelled_production.pdf index 0dab2320..69daec9b 100644 Binary files a/tests/generated/dacte/dacte_watermark_cancelled_production.pdf and b/tests/generated/dacte/dacte_watermark_cancelled_production.pdf differ diff --git a/tests/generated/dacte/dacte_watermark_homologation_only.pdf b/tests/generated/dacte/dacte_watermark_homologation_only.pdf index 5109f50c..bb1b512c 100644 Binary files a/tests/generated/dacte/dacte_watermark_homologation_only.pdf and b/tests/generated/dacte/dacte_watermark_homologation_only.pdf differ diff --git a/tests/generated/dacte/dacte_without_compl.pdf b/tests/generated/dacte/dacte_without_compl.pdf index 2d117f6b..39541173 100644 Binary files a/tests/generated/dacte/dacte_without_compl.pdf and b/tests/generated/dacte/dacte_without_compl.pdf differ diff --git a/tests/test_dacte.py b/tests/test_dacte.py index 88b058d6..16528647 100644 --- a/tests/test_dacte.py +++ b/tests/test_dacte.py @@ -152,3 +152,31 @@ def test_dacte_cnpj_alfanumerico(tmp_path, load_dacte): dacte = load_dacte("dacte_cnpj_alfanumerico.xml") pdf_path = get_pdf_output_path("dacte", "dacte_cnpj_alfanumerico") assert_pdf_equal(dacte, pdf_path, tmp_path) + + +def test_dacte_icms_st(tmp_path, load_dacte): + """CT-e com ICMS retido por substituição tributária (CST 60).""" + dacte = load_dacte("dacte_icms_st.xml") + pdf_path = get_pdf_output_path("dacte", "dacte_icms_st") + assert_pdf_equal(dacte, pdf_path, tmp_path) + + +def test_dacte_icms_st_le_vicmsstret(load_dacte): + """A coluna ICMS ST vem de vICMSSTRet, não do vICMS. + + vICMSSTRet (grupo ICMS60) é o único campo de ST do leiaute do CT-e. Antes + o campo repetia o vICMS, ou seja, imprimia o ICMS próprio como se fosse ST. + """ + dacte = load_dacte("dacte_icms_st.xml") + assert dacte.v_icms_st == "20,00" + + +def test_dacte_icms_st_zero_quando_nao_declarado(load_dacte): + """Sem ST no XML (CST 00), a coluna é zero — não o ICMS próprio. + + Era o caso mais grave: um CT-e sem substituição tributária nenhuma exibia + o vICMS na coluna ICMS ST, sugerindo uma ST que não existe. + """ + dacte = load_dacte("dacte_test_1.xml") + assert dacte.v_icms == "26,54" + assert dacte.v_icms_st == "0,00"