Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[12.0][REF] Cálculo da alíquota efetiva para empresas do Simples Nacional. #1831

Closed
wants to merge 6 commits into from

Conversation

antoniospneto
Copy link
Contributor

@antoniospneto antoniospneto commented Mar 8, 2022

Atualmente o módulo fiscal não suporta que uma empresa do regime Simples Nacional possa exercer mais de um tipo de atividade ao mesmo tempo, como por exemplo ser uma indústria e comércio. Com a alteração dessa PR o módulo fiscal passa a calcular todos os impostos efetivos, para cada anexo do simples nacional existente.

Antes da PR:
image

Depois da PR:
sn

Antes da PR, caso fosse emitido um nota fiscal que contivesse um item que fosse venda ( produção própria) e também um outro como ( revenda ) o valor da alíquota do "ICMS permitido para aproveitamento de credito" ficava errado, o mesmo valor era aplicado para os dois itens, porém é preciso diferenciar, os itens de produção própria devem ser calculados com base no ANEXO 2 do Simples Nacional (Indústria) e os itens de revenda com base no ANEXO 1 (Comércio)

Depois da PR:
Peek 2022-03-08 19-29

Também arrumei a informação que é impressa na nota fiscal do simples nacional para comportar os dois tipos ao mesmo tempo:
image

Essa PR era pra ser apenas um pequeno FIX, mas no fim ficou um pouco maior que o esperado rss.

@antoniospneto antoniospneto marked this pull request as draft March 9, 2022 14:41
@antoniospneto
Copy link
Contributor Author

Coloquei a pr em rascunho, preciso corrigir uns erro que bateu no trevis e tbm o conflito com o código que entrou na branch principal recentemente.

@antoniospneto antoniospneto marked this pull request as ready for review March 10, 2022 01:31
@marcelsavegnago
Copy link
Member

Oq rolou com o runboat ?

@antoniospneto
Copy link
Contributor Author

Oq rolou com o runboat ?

Ele não tá conseguindo baixar essa lib :(

@antoniospneto
Copy link
Contributor Author

Apesar do runboat está com defeito, não está relacionado a esse PR, ver sbidoul/runboat#48.
Pra quem desejar, a PR está pronto para revisão. trevis verdinho 👍🏻

Copy link
Member

@mileo mileo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, no test

@renatonlima
Copy link
Member

Pessoal, eu dei uma olhada no código e tenho algumas explicações sobre a implementação desse PR mas hoje eu estou voltando de uma viagem de consultoria em um projeto e não vou conseguir escrever, mas na segunda eu reviso

@OCA-git-bot
Copy link
Contributor

This PR has the approved label and has been created more than 5 days ago. It should therefore be ready to merge by a maintainer (or a PSC member if the concerned addon has no declared maintainer). 🤖

@@ -410,7 +410,7 @@ def get_taxes_values(self):
fiscal_price=line.fiscal_price,
fiscal_quantity=line.fiscal_quantity,
uot=line.uot_id,
icmssn_range=line.icmssn_range_id,
cfop_type_move=line.cfop_id.type_move,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O campo icmssn_range não deveria ser eliminado pois deveria ser usado no calculo dos impostos

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

com a alteração dessa pr o uso deste campo dentro do calculo do imposto perde o sentido, pois com a pr já temos todos os impostos do simples nacional previamente calculados dentro das tabelas effective_tax, dentro desse modelo já é marcado qual é o range atual da empresa, na hora de calcular os impostos é só puxar desse modelo.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mas você precisa calcular o valor do percentual de crédito do ICMS para ser destacado no documento fiscal, isso deveria ser encapsulado no l10n_br_fiscal.tax

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tá tudo encapsulado no modelo effective_tax do simples nacional, que já é calculado no momento que informa a receita bruta dos 12 meses, isso facilita um contador revisar as informações. mas essas informações podem ser usadas pelo 10n_br_fiscal.tax.

@@ -37,7 +37,7 @@ def compute_all(
fiscal_price=None,
fiscal_quantity=None,
uot=None,
icmssn_range=None,
cfop_type_move=None,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deveria ser adicionado o argumento cfop no método compute_all pois além do type_move outros campos do l10n_br_fiscal.cfop pode ser nos método compute_all

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pode ser também, coloquei o type_move direto pois é só isso que precisei no momento.

@@ -37,7 +37,7 @@ def compute_all(
fiscal_price=None,
fiscal_quantity=None,
uot=None,
icmssn_range=None,
cfop_type_move=None,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O campo icmssn_range não deveria ser eliminado pois deveria ser usado no calculo dos impostos

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

o mesmo que #1831 (comment)

@@ -28,6 +28,14 @@ def _get_amount_lines(self):
"""Get object lines instaces used to compute fields"""
return self.mapped("line_ids")

def is_sale_industry(self):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Essa parte que define se é uma operação de industria ou comercio deveria estar no mapeamento dos impostos no fiscal.operation.line, lá se a empresa for do simples nacional deveria preencher o icmssn_range_id

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

esse método eu criei ele para facilitar o uso da informação na geração do comentário ( informações adicionais da nota fiscal) eu vou acessar pelo documento, por isso ele foi definido aqui, veja:

o icmssn_range_id no operation line deixa de ser usado com essa pr

from odoo.addons import decimal_precision as dp


class SimplifiedTaxEffective(models.Model):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eu não acho necessário ter esse objeto, no próprio objeto l10n_br_fiscal.simplified.tax.range poderia ter um campo calculado para o valor da taxa efetiva pegando os dados da empresa atual e calculado store=false, isso funcionaria em um ambiente multi-company

Copy link
Contributor Author

@antoniospneto antoniospneto Mar 15, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

eu tentei fazer isso mas temos uma limitação do Odoo pelo que testei e também pesquisei, eu teria que botar esses campos todos como property ( company_dependent=True) porém eu não consigo manipular eles dentro de um compute. ( criação automática das informações ) o company_dependent funciona muito bem quando é o usuário que digita a informação, mas nesse caso não ficou legal.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No objeto l10n_br_fiscal.simplified.tax.range você consegue adicionar um campo calculado com store=False onde você pode calcular a alíquota efetiva para a empresa atual, dessa forma não é necessário ter outro objeto e nem criar campos property

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sim, com o store=False, seria possível, mas a intenção é também evitar ficar recalculado essas informações toda hora

@@ -43,6 +41,31 @@
class ResCompany(models.Model):
_inherit = "res.company"

sn_effective_tax_ids = fields.One2many(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ao invés de criar outro objeto, esse campo poderia ser um m2m calculado para carregar os anexos que a empresa tem incidência pela dependendo dos CNAEs primário e secundários

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Com esse modelo que fiz acho que fica mais apresentável as informações, se eu por essas informações dentro do CNAEs acho que pode ficar um pouco confuso, não estou usando os CNAEs para determinar os impostos.
o proposito do effective_tax é reunir toda essa logica do calculo do imposto do simples nacional em um só lugar, esse modelo vai ter a informação de qual é o imposto total efetivo, qual é o range atual, qual é a alíquota para cada imposto separado ( icms, ipi, pis, etc.. ) e também fica mais simples de expor as informações ali no cadastro da empresa.
Como pode ver ali, o contador ao informar o faturamento da empresa já vai ter uma visualização completa de como vai ficar os impostos, inclusive para todos os anexos. fica mais simples para auditar as informações.

Antes dessa pr por exemplo, se quisesse saber qual era a alíquota do ICMS que o sistema tava calculando, tinha que primeiro emitir uma nota fiscal e ver dentro dela qual foi o ICMS calculado. Com a PR essa visualização já vem na hora.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cada anexo do simples nacional tem uma relação de CNAEs que a empresa deve ter para ser enquadrada naquele anexo por exemplo: Se a empresa tem o CNAE "4530702 - Comércio por atacado de pneumáticos e câmaras-de-ar" ela se enquadra no "ANEXO 1 Empresas de Comércio",

Era dessa forma que dependendo do CNAE Principal eu preenchia o campo do anexo na empresa e a faixa como você colocou alterou o campo para um o2m para outro objeto, o correto seria ter um campo m2m calculado para mostrar as faixas dos anexos que a empresa se enquadra mas usando o objeto l10n_br_fiscal.simplified.tax.range com o campo calculado da taxa efetiva como comentei no #1831 (comment)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sim, o CNAE é uma forma de ver se a empresa se enquadra no anexo 1 ou anexo 2 etc, mas se uma empresa tem vários CNAEs, pode não ser a melhor forma, pois é necessário identificar qual anexo cada linha da fatura se enquadra e a linha da fatura não tem a informação do CNAE dela, o produto também não trás essa informação. por exemplo, se você cria uma fatura com 2 itens:

  1. Produto: Picolé, CFOP 5101 - Venda de produção do estabelecimento. (indústria)
  2. Produto: Caixa de Isopor: CFOP 5102 - Venda de mercadoria adquirida ou recebida de terceiros (comércio)

supondo que o faturamento anual da empresa foi 815 mil no últimos 12 meses, o imposto efetivo para cada linha será:

linha 1) 8,44% simples nacional e permite aproveitamento do ICMS de 2,70%.
consigo chegar nessa informação pelo CFOP fazendo um mapeamento, se o CFOP for do tipo sale_industry eu pego o effective_tax da empresa em questão associada com o ANEXO 2 (Industria).

linha 2) 7,94% simples nacional e permite aproveitamento do ICMS de 2,66%.
neste caso, se o CFOP for do tipo sale_commerce, eu pego o effective_tax da empresa em questão associada com o ANEXO 2 (Industria).

image

por isso que acho que utilizar o CNAE não é a melhor forma de mapear os impostos do simples nacional.

@renatonlima
Copy link
Member

@netosjb,

Fazendo o review do PR dois pontos que vejo importante:

  1. Foi implementado na linha dos documentos fiscais o campo icmssn_range_id A ideia desse campo é que além de armazenar a faixa do simples para pegar o percentual de crédito do ICMS, também é que futuramente na apuração para geração da guia do simples seja apurado as operações por anexo do simples.
  2. O campos implifed_tax_range_id no res.company pode ser um m2m calculado que quando alterado os campos: annual_revenue, payroll_amount, main_cnae_id, cnae_secondary_ids, profit_calculation, is_industry
  3. O percentual efetivo do simples nacional poderia ser um campo calculado no l10n_br_fiscal.simplified.tax.range ao invés de ser criado outro objeto.
  4. A definição da faixa do simples nacional deveria estar no mapeamento da l10n_br_fiscal.operation.line pois lá é possível ler os dados da empresa, parceiro, produto e deduzir a faixa dependendo do regime da empresa, operação e tipo de produto (Produto Acabado, Mercadoria para Revenda)

@antoniospneto
Copy link
Contributor Author

@renatonlima obrigado pela revisão!

segue o meu ponto de vista em relação as duvidas:

Foi implementado na linha dos documentos fiscais o campo icmssn_range_id A ideia desse campo é que além de armazenar a faixa do simples para pegar o percentual de crédito do ICMS, também é que futuramente na apuração para geração da guia do simples seja apurado as operações por anexo do simples.

Agora você pode pegar essas informações que já vão estar previamente calculados de dentro do effective_tax, acaba ficando mais simples também, tanto pra alíquota do ICMS que já tem implementado essa busca, tanto para geração da guia que ainda tem que ser implementado, mas é só buscar a informação de dentro do effective_tax.

O campos implifed_tax_range_id no res.company pode ser um m2m calculado que quando alterado os campos: annual_revenue, payroll_amount, main_cnae_id, cnae_secondary_ids, profit_calculation, is_industry

para cada empresa do simples nacional e cada tabela do simplifed_tax é um calculo de imposto diferente, por isso criei um objeto especifico para guardar essas informações, se eu não fizesse dessa forma eu teria que usar o property ( company_dependent) porém o seu uso é limitado, não consegui manipular a criação desses campos dentro do compute.
talvez na 14.0 seja mais simples de fazer dessa forma.

O percentual efetivo do simples nacional poderia ser um campo calculado no l10n_br_fiscal.simplified.tax.range ao invés de ser criado outro objeto.

A mesma coisa acontece aqui, para cada empresa, para cada tabela do simplified.tax, vai existir um "percentual efetivo do simples nacional" por isso a criação do modelo effective.tax, pois não consigo utilizar o company_dependent.

A definição da faixa do simples nacional deveria estar no mapeamento da l10n_br_fiscal.operation.line pois lá é possível ler os dados da empresa, parceiro, produto e deduzir a faixa dependendo do regime da empresa, operação e tipo de produto (Produto Acabado, Mercadoria para Revenda)

Agora você pode pegar essas informações direto do effective_tax, você pode buscar elas a partir da company.
se for produto acabado você pega o effective_tax do anexo 2, se for revenda você pega o effective_tax do anexo 1.

Dessa forma dá até uma limpada nos outros modelos, a logica do simples nacional não fica um pouco em cada modelo, e sim tudo no effective_tax.

@rvalyi rvalyi added the 12.0 label Apr 3, 2022
Copy link
Contributor

@kmmelcher kmmelcher left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dei uma lida sobre as alterações do PR e a discussão para entender o contexto, e apesar de não ter muito conhecimento sobre a parte fiscal fiz uma revisão sobre a qualidade do código. Parece muito bem escrito, só encontrei pequenos erros de digitação e senti falta de alguns docstrings para ficar mais claro para manter.

string="ICMS Credit rate for Industry",
help="Rate referring to the icms credit allowed when it is a sale of"
"industrialized product in the establishment."
"Applicable to Simple Nacional.",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo: "Simples Nacional."

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Vou corrigir obrigado!

icmssn_credit_commerce = fields.Float(
string="ICMS Credit rate for Commerce",
help="Rate referring to the icms credit allowed when it is a resale"
"of merchandise. Applicable to Simple Nacional.",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo: "Simples Nacional."

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Vou corrigir obrigado!

for record in self:
record._calculate_coefficient_r()

def _compute_icmssn(self):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Acho que seria informativo ter um docstring aqui para explicar, porque foi feito esse filtro

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No simples nacional a alíquota do ICMS quando é Comércio é um valor, quando é Industria é outro valor.
Eu uso o filtro para procurar o valor efetivo para quando for comércio e depois faço o mesmo para quando for indústria.
Esse compute está sendo usado para calcular essa duas variáveis : icmssn_credit_commerce, icmssn_credit_industry.
Eles são usados depois na emissão da nota fiscal do simples nacional.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eu vou pedir pro @renatonlima comentar de novo sobre esse issue...

@antoniospneto antoniospneto force-pushed the 12.0-ref-simples-nacional branch from 70ec708 to 3d03fdc Compare September 26, 2022 00:13
@antoniospneto antoniospneto force-pushed the 12.0-ref-simples-nacional branch from 3d03fdc to 5bd3132 Compare February 21, 2023 17:27
@rvalyi
Copy link
Member

rvalyi commented Jul 9, 2023

@antoniospneto vc conseguiria refazer o PR na 14.0?
@renatonlima vc acha que vale a pena?

@antoniospneto
Copy link
Contributor Author

@antoniospneto vc conseguiria refazer o PR na 14.0?

@renatonlima vc acha que vale a pena?

Consigo sim, em breve abro a PR.

@mileo
Copy link
Member

mileo commented Oct 2, 2023

@antoniospneto vc conseguiria refazer o PR na 14.0?
@renatonlima vc acha que vale a pena?

Consigo sim, em breve abro a PR.

@antoniospneto isso já foi incluído na v14?

@antoniospneto
Copy link
Contributor Author

@mileo ainda não, mas pretendo fazer sim, é que ainda não iniciei a migração do meu cliente que faz o uso deste para a 14.0
mas será em breve

@mileo
Copy link
Member

mileo commented Oct 2, 2023

@mileo ainda não, mas pretendo fazer sim, é que ainda não iniciei a migração do meu cliente que faz o uso deste para a 14.0 mas será em breve

Joia, se precisar de uma mão me avise que puxamos isso.

@antoniospneto antoniospneto force-pushed the 12.0-ref-simples-nacional branch from 5bd3132 to 984770e Compare November 9, 2023 18:47
@antoniospneto antoniospneto marked this pull request as draft November 9, 2023 19:16
@antoniospneto
Copy link
Contributor Author

Estou fechando esta pr pois não há mais o interesse da implementação desta funcionalidade na versão 12.0, para versão 14 existe a PR #2822.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants