diff --git a/l10n_br_fiscal/data/operation_data.xml b/l10n_br_fiscal/data/operation_data.xml
index 04464ba5c5be..c7873fa40b74 100644
--- a/l10n_br_fiscal/data/operation_data.xml
+++ b/l10n_br_fiscal/data/operation_data.xml
@@ -42,6 +42,36 @@
00
+
+ ST CFOP 6404
+
+
+ ST CFOP 6401
+
+
+
+
+
+
+
+
+ approved
+
+
+
+
+
+
+
+ approved
+
+
Venda ST contribuinte substituto
@@ -50,6 +80,15 @@
approved
04
+
+ icms
+
@@ -62,6 +101,18 @@
00
+
+
+
+
+
+
+ approved
+
+
Revenda ST contribuinte substituído
@@ -70,6 +121,15 @@
approved
00
+
+ icms
+
out
-
+
@@ -285,7 +285,7 @@
/>
1
-
+
out
@@ -385,7 +385,7 @@
/>
1
-
+
out
@@ -946,5 +946,116 @@
+
+
+
+
+
+
+ 1
+
+
+ out
+
+
+
+
+ Teste ST
+
+
+ 100
+ 1
+ out
+
+
+
+
+
+
+
+
+
+
+ 100
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ out
+
+
+
+
+ Teste ST
+
+
+ 100
+ 1
+ out
+
+
+
+
+
+
+
+
+
+
+ 100
+
+
+
+
+
+
+
+
+
diff --git a/l10n_br_fiscal/demo/product_demo.xml b/l10n_br_fiscal/demo/product_demo.xml
index da9bb80e4161..d68a609b6531 100644
--- a/l10n_br_fiscal/demo/product_demo.xml
+++ b/l10n_br_fiscal/demo/product_demo.xml
@@ -1978,4 +1978,126 @@
+
+
+ Office Lamp ST 6404
+ icms
+
+ 35.0
+ 40.0
+ consu
+ 0.01
+
+
+ FURN_8889
+
+
+
+
+
+
+
+
+
+ fiscal_type
+
+ 00
+ selection
+
+
+
+
+
+ icms_origin
+
+ 5
+ selection
+
+
+
+
+
+
+
+ Office Lamp ST 6401
+ icms
+
+ 35.0
+ 40.0
+ consu
+ 0.01
+
+
+ FURN_8880
+
+
+
+
+
+
+
+
+
+ fiscal_type
+
+ 04
+ selection
+
+
+
+
+
+ icms_origin
+
+ 5
+ selection
+
+
+
diff --git a/l10n_br_fiscal/tests/test_fiscal_document_generic.py b/l10n_br_fiscal/tests/test_fiscal_document_generic.py
index 281ecbd945f4..e4bc2f65e87a 100644
--- a/l10n_br_fiscal/tests/test_fiscal_document_generic.py
+++ b/l10n_br_fiscal/tests/test_fiscal_document_generic.py
@@ -15,6 +15,12 @@ def setUpClass(cls):
# Contribuinte
cls.nfe_same_state = cls.env.ref("l10n_br_fiscal.demo_nfe_same_state")
cls.nfe_other_state = cls.env.ref("l10n_br_fiscal.demo_nfe_other_state")
+ cls.nfe_other_state_st_6404 = cls.env.ref(
+ "l10n_br_fiscal.demo_nfe_other_state_st_6404"
+ )
+ cls.nfe_other_state_st_6401 = cls.env.ref(
+ "l10n_br_fiscal.demo_nfe_other_state_st_6401"
+ )
cls.nfe_not_taxpayer = cls.env.ref("l10n_br_fiscal.demo_nfe_nao_contribuinte")
cls.nfe_not_taxpayer_pf = cls.env.ref(
@@ -174,7 +180,7 @@ def test_nfe_other_state(self):
self.nfe_other_state._onchange_document_serie_id()
self.nfe_other_state._onchange_fiscal_operation_id()
-
+ self.nfe_other_state.action_document_confirm()
for line in self.nfe_other_state.fiscal_line_ids:
line._onchange_product_id_fiscal()
line._onchange_commercial_quantity()
@@ -291,6 +297,111 @@ def test_nfe_other_state(self):
"from COFINS 3% for Venda de Contribuinte p/ Fora do Estado.",
)
+ def test_nfe_other_state_st_6404(self):
+ """Testing NFe in another state with tax substitution."""
+ empresa_lucro_presumido = self.env.ref("l10n_br_base.empresa_lucro_presumido")
+ self.nfe_other_state_st_6404._onchange_document_serie_id()
+ self.nfe_other_state_st_6404._onchange_fiscal_operation_id()
+
+ for line in self.nfe_other_state_st_6404.fiscal_line_ids:
+ line.with_company(empresa_lucro_presumido.id)._onchange_product_id_fiscal()
+ line.with_company(
+ empresa_lucro_presumido.id
+ )._onchange_commercial_quantity()
+ line.with_company(empresa_lucro_presumido.id)._onchange_ncm_id()
+ line.with_company(
+ empresa_lucro_presumido.id
+ )._onchange_fiscal_operation_id()
+ line.with_company(
+ empresa_lucro_presumido.id
+ )._onchange_fiscal_operation_line_id()
+ line.with_company(empresa_lucro_presumido.id)._onchange_fiscal_taxes()
+
+ self.assertTrue("Revenda" in line.fiscal_operation_line_id.name)
+ if "Revenda" in line.fiscal_operation_line_id.name:
+ self.assertEqual(
+ line.cfop_id.code,
+ "6404",
+ "Error to mapping CFOP 6404"
+ " for Revenda de Contribuinte p/ Fora do Estado.",
+ )
+
+ # ICMS
+ if line.product_id.icms_origin not in ICMS_ORIGIN_TAX_IMPORTED:
+ line.write(
+ {
+ "icms_tax_id": self.env.ref("l10n_br_fiscal.tax_icms_antst").id,
+ }
+ )
+ line.with_company(empresa_lucro_presumido.id)._onchange_fiscal_taxes()
+ self.assertEqual(
+ line.icms_tax_id.name,
+ "ICMS Cobrado Ant. por ST",
+ "Error to mapping ICMS Cobrado Ant. por ST"
+ " for Venda de Contribuinte p/ Fora do Estado.",
+ )
+ self.assertEqual(
+ line.icms_cst_id.code,
+ "60",
+ "Error to mapping CST 60 from ICMS Cobrado Ant. por ST"
+ " for Venda de Contribuinte p/ Fora do Estado.",
+ )
+
+ def test_nfe_other_state_st_6401(self):
+ """Testing NFe in another state with tax substitution."""
+ empresa_lucro_presumido = self.env.ref("l10n_br_base.empresa_lucro_presumido")
+ self.nfe_other_state_st_6401._onchange_document_serie_id()
+ self.nfe_other_state_st_6401._onchange_fiscal_operation_id()
+
+ for line in self.nfe_other_state_st_6401.fiscal_line_ids:
+ line.with_company(empresa_lucro_presumido.id)._onchange_product_id_fiscal()
+ line.with_company(
+ empresa_lucro_presumido.id
+ )._onchange_commercial_quantity()
+ line.with_company(empresa_lucro_presumido.id)._onchange_ncm_id()
+ line.with_company(
+ empresa_lucro_presumido.id
+ )._onchange_fiscal_operation_id()
+ line.with_company(
+ empresa_lucro_presumido.id
+ )._onchange_fiscal_operation_line_id()
+ line.with_company(empresa_lucro_presumido.id)._onchange_fiscal_taxes()
+
+ if "Venda" in line.fiscal_operation_line_id.name:
+ self.assertEqual(
+ line.cfop_id.code,
+ "6401",
+ "Error to mapping CFOP 6401"
+ " for Venda de Contribuinte p/ Fora do Estado.",
+ )
+
+ # ICMS
+ if line.product_id.icms_origin not in ICMS_ORIGIN_TAX_IMPORTED:
+ line.write(
+ {
+ "icms_tax_id": self.env.ref("l10n_br_fiscal.tax_icms_12_st").id,
+ }
+ )
+ line.with_company(empresa_lucro_presumido.id)._onchange_fiscal_taxes()
+ self.assertEqual(
+ line.icms_tax_id.name,
+ "ICMS 010 12%",
+ "Error to mapping ICMS 010 12%"
+ " for Venda de Contribuinte p/ Fora do Estado.",
+ )
+ self.assertEqual(
+ line.icmsst_tax_id.name,
+ "ICMS 30% MVA 50",
+ "Error to mapping ICMS 30% MVA 50"
+ " for Venda de Contribuinte p/ Fora do Estado.",
+ )
+ self.assertEqual(
+ line.icms_cst_id.code,
+ "10",
+ "Error to mapping CST 10 from ICMS 010 12%"
+ " for Venda de Contribuinte p/ Fora do Estado.",
+ )
+
def test_nfe_not_taxpayer(self):
"""Test NFe not taxpayer."""