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..680e7f86bc8a 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."""