Calculo de impostos em DefaultTaxProvider , problema persistente desde a versão 4.1
Hoje pela lógica da rotina na versão 5.1 temos as seguintes ocorrência de problemas:
As seguintes situações foram encontradas:
1) O valor da fatura ocorre pelo valor total da nota não fazendo as retenções quando ocorrem.
As seguintes retenções não estão tratadas: Pis, COFINS, IR.
2) A criação de outros impostos como CSSL e INSS necessita de alteração de código2 pois nunca serão gravados em MLBRTaxLine.
3) Quando da compra o valor do imposto a reter não são contabilizados, e empresas que devem controlar a contabilização dos impostos retidos por seus clientes (responsabilidade solidaria), não podem usar o idempierelbr com essa finalidade.
4) Quando da compra para industrialização de empresa do simples, não credita o ICMS do simples que a empresa tem direito.
Alterações em DefaultTaxProvider que serão necessárias novamente:
Referente a situação 1:
Parâmetros do idempierelbr que deveriam estar envolvidos no tratamento do valor de calculo da rotina DefaultTaxProvider.
a)Boolean LBR_TAXLINE.isTaxIncluded() método em várias tabelas de impostos do Brasil mas em geral todas buscam dessa origem. Objetivo: Determina se um imposto está incluso no preço ou não. Caso não esteja incluso ele deve ser somado ao valor da fatura.
b) Boolean LBR_TAXNAME.lbr_haswithhold - Indica a retenção de um imposto. Hoje não está sendo gravado na tabela LBR_TAXLINE.
Objetivo: Indica se um imposto deve ter retenção ou não. No caso de retençaõ o mesmo não deve compor o valor a ser recebido, no caso de compras a retenção indica uma responsabilidade do comprador com o governo. O mesmo imposto pode ser cadastrado com retenção ou sem retenção nessa tabela com nomes diferentes.
c) Boolean LBR_TAXLINE.lbr_postTax - Indica se o imposto deve ser contabilizado ou não, marcado na definição do imposto.Objetivo: Determinar se aquele imposto deve ser contabilizado.
Com base nesses pressupostos objetivos desses três parâmetros conclui-se que:
Lógica:
A) Se um imposto não está incluso e não é não retido deve ser SOMADO ao valor total. Exemplos IPI, ICMS (Cfe o caso) (!taxincluded && !taxhold)
B) Se um imposto está incluso no preço e for retido o valor do imposto deve ser SUBTRAÍDO do valor total. Exemplos retenção de IR, CSSL, PISServiço, COFINSServiço. (taxincluded && taxhold)
C) As demais combinações dessas duas variáveis não influenciam o valor total;
Obs.: Hoje para o sistema funcionar é necessário indicar o impostos de retenção como taxa não inclusa e marcar a retenção ao contrário da lógica do item B. Sendo que acontece a soma de um valor negativo obtido da fórmula de calculo. Esse valor negativo gera outros problemas nos campos de impostos gravados.
Referente a situação 2: Para que se possa abrir os totais dos outros impostos é fundamental que na em
a) MLBRTAX se adicione:
TAX_GROUP_CSSL_NAME = "CSSL";
TAX_GROUP_INSS_NAME = "INSS";
b) Alteração das
rotinas que envolvem a classe MLBRDocLineOTHER.
Referente a situação 3: LBR_TAXLINE.lbr_postTax = accountable = true
Somente se o flag de contabilização for verdadeiro o valor da base do imposto e o valor do imposto deve ser SOMADO a tabela de impostos totais da transação (MOrderTax ou MinvoiceTax).
Caso já tenham sido somados em variáveis devem ser SUBTRAIDOS (newOTax, newITax).
Referente a situação 4: O valor do ICMS deve ser somado ao valor ICMS do simples se o ICMS estiver marcado como para ser contabilizado SOMANDO nos totais da transação (MOrderTax ou MinvoiceTax)