quinta-feira, 18 de outubro de 2007

Impostos no AX - Class Tax - Parte 1

Como foi dito no post anterior a classe Tax é o motor de impostos do sistema, sendo uma das mais importantes se tratando de localização brasileira.

Alguns métodos importantes, por ordem de execução (macro) e alguns comentários para cada método:

protected void insertIntersection(TaxGroup _taxGroup,
Neste método, primeiro a ser chamado quando se trata de calcular impostos, nenhum valor é tratado e sim é feita a interseção dos dois grupos de impostos (TaxGroupData e TaxOnItem) e inicializada a tabela temporária tmpTaxWorkTrans, esta tabela tem extrema importancia no manuseio dos impostos no AX, e dela que se deve extrair as imformações enquanto a nota fiscal não é efetivamente registrada, como ela é temporaria e esta dentro da classe tax, deve ser tomado um cuidado especial quando tentar usala em um escopo fora desta classe, sempre acessando o método tmpTaxWorkTrans(), que retorna a tabela.


protected void insertLineInInternal(TaxBase _baseAmount,
Ao meu ver, o melhor lugar para se "trabalhar" com as bases dos impostos, é o primeiro lugar em que se pode alterar de qualquer maneira a base dos impostos sem que haja consequencias para o post dos impostos, da nota fiscal ou que quebre o método de calculo, calculo do limite mínimo ou máximo, etc... do imposto.


TaxAmount calcTax()
Método que efetivamente faz os impostos serem calculados, a principio tem uma maniera um pouco estranha de trabalhar ja que a tabela que é utilizada nesse escopo é a TmpTax e não a TmpTaxWorkTrans, o método organiza a sequencia de calculo, isto é, impostos que tem usa base de cálculo baseada no valor "net" são calculados primeiro que impostos que tem a base baseada no "gross", em outro momento posto sobre meu entendimento de "net" e "gross" aplicado as bases de impostos aqui no Brasil.
Quem efetivamente calcula os impostos é a propria tabela de imposto através do método TaxTable.calcTaxSimple e .calcTax, um ponto importante para a localização brasileira é que regras de negócio importantes estão definidas dentro desses métodos como a redução na ase de impostos e aumento da base de impostos, aplicada a substituição tributária.


public void saveAndPost()
Método que cria as transações de impostos e registra os lançamentos contábeis relativos aos impostos.


protected void post(TaxDirection _taxDirection,
Chamado pelo método saveAndPost, contém a lógica do registro no objeto LedgerVoucher.

Impostos no AX - Visão geral

O termo Imposto é usado em 10 de 10 conversas sobre ERPs no Brasil, e claro, é foco de preocupações quando se fala de ERPs internacionais.

Tecnicamente falando, os impostos no AX são dividos em 2 classes básicas:
1. Tax
2. TaxWithhold

class Tax
A classe Tax é a base do potente motor de impostos do AX ela é responsável por descobrir que impostos devem ser calculados, trabalhar em cima das bases dos impostos até chegar na base final, que vai ser usada para efetivamente o calculo dos impostos e finalmente e registrar-los contabilmente.
Essa classe é utilizada em todos os lugares do sistema onde se vê Impostos sobre Vendas (Sales Tax), isto é, atua no momento que uma nota fiscal (seja ela se vendas, compras, projetos) é postada no sistema.


class TaxWithhold
Esta classe trabalha no famigerado calculo de impostos retidos no pagamento (seja ele de clientes ou fornecedores). Diferente dos impostos sobre vendas, os impostos aqui são calculados com base em um único grupo de impostos e não a interseção (união de 2 grupos) de grupos de impostos. A classe cumpre a tarefa de descobrir a base do imposto, calculá-la e registra-la contabilmente.
Um detalhe importante é que diferente da classe Tax. a classe TaxWithhold não é uma super classe totalmente genérica, criada para a retenção de impostos (ou um único imposto) no pagamento a fornecedores para a Itália, foi estendida para o Brasil para também tratar pagamentos recebidos de clientes, para isso, temos a classe:
TaxWithhold_CustPaym extends TaxWithhold, onde os métodos mais importantes da classe TaxWithhold são sobrescritos para tratar os impostos com base na tabela CustTrans e não VendTrans.

Histórico sobre retenção no pagamento:
Criada pela lei 10.833 de 2003 que diz que para uma serie de serviços, quem contrata o serviço é obrigado a reter, no ato do pagamento (e não do faturamento) o imposto, com o detalhe que ele so começa a ser retido após após o pagamento a partir 5000,00 e pior ainda, cumulativo, isto é, para um pagamento de 3000,00, não há impostos, para outro pagamento, no mesmo mes de 3000,00, deve ser retido os impostos com base em 6000,00 e a partir daí, todos os pagamentos devem ter o imposto retido.

segunda-feira, 8 de outubro de 2007

Job para verificar labels em um arquivo XPO

Para quem desenvolve modificações "localizadas", isto é, em mais de um idioma, eu criei um pequeno job, muito simples na verdade, que verifica, em um arquivo XPO, as propriedades "label", "helptext", "caption" e mostra a linha e o conteúdo caso não encontre o @ necessário para toda etiqueta.

Utilize as constantes para procurar pelas propriedades pré-definidas, esse job pode ser estendido para refinar o review dessas propriedades.

A ideia é facilitar o code review antes de um build para teste ou deploy em um cliente.

Até mais,
Matiazo



static void VerifyLabels(Args _args)
{
#define.label('Label #')
#define.menu('MENU #')
#define.helptext('HelpText #')
#define.caption('Caption #')

AsciiIo f = new AsciiIo('C:\\exported.xpo', 'r');
container line;
int pos;
str a;
int linenum=1;
int arroba;
;

f.inFieldDelimiter('\n');
f.inRecordDelimiter('\n');

while(!f.status())
{
line = f.read();
a = con2str(line);
pos = strscan(a,#label,0,strlen(a));
if(pos)
{
arroba = strscan(a,'@',0,strlen(a));
if(!arroba)
{
info(strfmt('%3 (%1) -> %2',pos, substr(a,pos,50),linenum));
}
}
pos = 0;
linenum++;
}
}