Relatos problemas 5.1 calculo de impostos DefaultTaxProvider, persistentes desde 4.1

53 views
Skip to first unread message

Rinaldo

unread,
Mar 13, 2018, 1:38:40 PM3/13/18
to iDempiereLBR

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)

Rinaldo

unread,
Mar 13, 2018, 2:36:56 PM3/13/18
to iDempiereLBR
Para resolver situação 1 e 3

Exemplo de alteração no PIS para tratar retenção e não contabilizacao (linha 
M    // PIS
    MLBRDocLinePIS[] pisLines = MLBRDocLinePIS.getOfDetails(details);
    if (pisLines.length > 0) {
MLBRDocLinePIS pis = pisLines[0];
int c_Tax_ID = line.getC_Tax_ID();
Properties ctx=order.getCtx();
String trx=order.get_TrxName();
if (pis.getLBR_TaxAmt() != null) {
Boolean[] status=statusTaxLine(ctx, details, trx, c_Tax_ID, MLBRTax.getTaxGroupID(MLBRTax.TAX_GROUP_PIS_NAME ));
boolean taxhold=status[0];        //retencao
boolean accountable=status[1]; //contabilizacao 
if ((accountable)&& (oTaxList.containsKey(MLBRTax.getTaxGroupID(MLBRTax.TAX_GROUP_PIS_NAME)))) {
MOrderTax newOTax = oTaxList.get(MLBRTax.getTaxGroupID(MLBRTax.TAX_GROUP_PIS_NAME));
newOTax.setIsTaxIncluded(pis.isTaxIncluded());
newOTax.setTaxBaseAmt(newOTax.getTaxBaseAmt().add(pis.getLBR_TaxBaseAmt()));
newOTax.setTaxAmt(newOTax.getTaxAmt().add(pis.getLBR_TaxAmt().abs()));
}
if ((!pis.isTaxIncluded()) && (!taxhold))
grandTotal = grandTotal.add(pis.getLBR_TaxAmt().abs());
if ((pis.isTaxIncluded()) &&(taxhold))
grandTotal = grandTotal.subtract(pis.getLBR_TaxAmt().abs());
}
}

+ New Method
/* Get data about MLBRTaxLine in MLBRTaxName of a code of lbr_tax_group 
*/
private Boolean[] statusTaxLine(Properties ctx, MLBRDocLineDetailsTax details, String trx, int c_Tax_ID, int lbr_id_tax_group) {
MLBRTax mlbrTaxlines = new MLBRTax(ctx, details.getLBR_Tax_ID(), trx);
for (org.idempierelbr.tax.model.MLBRTaxLine mlbrTaxLine : mlbrTaxlines.getLines()) {
Integer key = mlbrTaxLine.getChild_Tax_ID(c_Tax_ID);
if (key <= 0)
continue;
else
{
MTax taxChild = new MTax(ctx, key, trx);
int lbr_id_group=taxChild.get_ValueAsInt("LBR_TaxGroup_ID");

if (lbr_id_group==lbr_id_tax_group) {
org.idempierelbr.tax.model.MLBRTaxName taxName = new org.idempierelbr.tax.model.MLBRTaxName(ctx, mlbrTaxLine.getLBR_TaxName_ID(), null);
boolean taxhold = (org.idempierelbr.tax.model.MLBRTaxName.LBR_TAXTYPE_Service.equals(taxName.getLBR_TaxType())
&& (taxName.isLBR_HasWithHold()));
boolean accountable = mlbrTaxLine.isLBR_PostTax(); // Tax
// isPosted()
// true
boolean isSalesTax = taxChild.isSalesTax();
Boolean status[]=new Boolean[3];
status[0]=taxhold;
status[1]=accountable;
status[2]=isSalesTax;
return status;
}
}
}
return null;

Rinaldo

unread,
Mar 15, 2018, 3:01:00 PM3/15/18
to iDempiereLBR
Como ninguém se pronunciou aqui, acho difícil que essas minhas alterações sejam de interesse de mais alguém na comunidade a ponto de divulga-las aqui.

Parece que a comunidade concorda que todo o imposto que é retido também deve ter marcado o flag como imposto não incluso para que as retenções funcionem. Além disso a contabilização do mesmo também deve estar marcado  (obrigatório  em função do if (!tl.isLBR_PostTax()) em MLBRDocLineDetails). Caso essas três condições não sejam verdadeira a retenção não funcionará, além de alguns negativos em valores em tabelas. Acho estranho essas tês condições ter que ser verdadeira e como seria explicar isso para o usuário.






Jorge Babo

unread,
Mar 19, 2018, 2:26:56 PM3/19/18
to iDempiereLBR
Rinaldo

Qeria entrar em contato contigo.

Meus contatos 24 24431339
email. jab...@gmail.com


Em terça-feira, 13 de março de 2018 14:38:40 UTC-3, Rinaldo escreveu:

Raimundo Carvalhedo

unread,
Dec 23, 2018, 7:20:17 PM12/23/18
to iDempiereLBR


Em terça-feira, 13 de março de 2018 14:38:40 UTC-3, Rinaldo escreveu:

Raimundo Carvalhedo

unread,
Dec 23, 2018, 7:21:48 PM12/23/18
to iDempiereLBR
Rinaldo!

Parabéns pelo trabalho, é que a comunidade muito ocupada mesmo!
Show sua postagem!

Abraços

Em terça-feira, 13 de março de 2018 14:38:40 UTC-3, Rinaldo escreveu:
Reply all
Reply to author
Forward
0 new messages