Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Produto:

Microsiga Protheus®

Ambiente:

Faturamento (SIGAFAT)

Ocorrência:

Como contabilizar os Impostos através no Documento de Saída?

Passo a passo:

Os LPs 610 e 620 são destinados a contabilização de itens do Documento de Saída (SD2) e do cabeçalho do Documento de Saída (SF2), logo os ponteiros de tabelas estarão nestes registros, assim, o ponteiramento de qualquer outra tabela deve ser feito através de uma sintaxe.


Os Lançamento Padronizados podem ser ajustados de acordo com a regra necessária para a contabilização, podendo inclusive serem utilizadas funções em seus campos macro executáveis, logo podem ser consultados registros de outras tabelas através de funções como a "Posicione", que retorna o dado desejado, ou através de uma "Função de usuário" que em seu retorno devolva a informação a ser processada.


Apontando para outras tabelas (On Line / Off Line)
Os LPs criados com sintaxes apontadas para as tabelas SD2 e SF2 podem ser usados tanto na contabilização On Line e quanto Off Line.

Para apontamento de outras tabelas (ex. SF3 e SFT), quando a execução for Off Line, no momento da execução da contabilização On Line, as tabelas podem não estar gravadas ainda, impedindo que a regra do Lançamento Padronizado colete as informações.

Portanto, para cada uso (on line e off line) pode existir a necessidade de criar sintaxes diferentes.


Um exemplo usando a contabilização do campo "Crd.Pres." (FT_CRDPRES), que é o campo de Crédito Presumido de ICMS gravado na tabela de itens fiscais (SFT)


Deck of Cards
idContabilização Impostos
Card
labelExecução On Line

O LP do item da NF é o 610, que posiciona a tabela SD2. A tabela equivalente na parte fiscal é a tabela SFT.

Considerando que a tabela SFT é criada após a gravação da NF, isto é, não há mais ponteiramento na Contabilização da NF, será necessário buscar a informação pelo calculo e não pelo campo gravado.

Mesmo o registro SFT não existindo ainda, o fluxo da MATXFIS já foi iniciado no momento e pode ser feita a mesma chamada da função fiscal no LP para o retorno do valor, neste caso a MAFISRET.

A função MAFISRET() está preparada para receber dois parâmetros em sua chamada, sendo:

1. O número da linha da nota que está sendo processada;

2. O identificador do campo/imposto que estaria sendo processado, neste caso a referência do Credito Presumido é LF_CRDPRES

Bloco de código
titleExemplo
MaFisRet(Val(SD2->D2_ITEM), "LF_CRDPRES")
Aviso
titleImportante

O campo "Item" (D2_ITEM) é um campo caractere de tamanho 2, logo para pedidos com mais de 99 itens o conteúdo desse se torna alfanumérico e a conversão fornecida pela função VAL() não irá atender. Neste caso teria que ser realizada a lógica reversa do processo de SOMA1() ou configurado o parâmetro MV_NUMITEM com o limite de 99 itens por nota.

Caso haja necessidade de lógica reversa em torno da função SOMA1, é necessário realizar o tratamento através de uma User Function, sendo necessária a atuação de um analista programador.

Card
labelExclusão da NF (sempre On Line)

Na exclusão do documento de saída (LP 620), devemos adotar outra forma de trabalho, isso por que neste ponto, os tributos não estão sendo calculados e a linha SFT do documento que está sendo excluído já existe.

Neste caso, pode ser utilizada a função Posicione(), esta irá localizar a linha SFT referente ao item da nota e retornar o dado do campo FT_CRDPRES.

O uso do comando Posicione() recebe quatro parâmetros (Documentação), sendo:

1. Tabela onde a busca será feita;
2. Índice (composição de dados da busca) utilizado para localizar o registro;
3. Expressão identificadora da linha desejada;
4. Campo do dado desejado.

Neste caso como vamos buscar um dado da SFT, um exemplo de Sintaxe que podemos utilizar é:

Bloco de código
titleExemplo
Posicione('SFT', 1, xFilial('SFT') + 'S' + SD2->D2_SERIE + SD2->D2_DOC + SD2->D2_CLIENTE + SD2->D2_LOJA + SD2->D2_ITEM + ' ' + SD2->D2_COD, 'FT_CRDPRES')

Onde, cada parâmetro, detalhados abaixo, respectiva de um dos quatro a serem usados no posicione (na sintaxe são separadas por vírgula):

1. SFT \\ Tabela onde a busca será feita
2. 1 \\ Índice utilizado para localizar o registro
3. xFilial('SFT') + 'S' + SD2->D2_SERIE + SD2->D2_DOC + SD2->D2_CLIENTE + SD2->D2_LOJA + SD2->D2_ITEM + ' ' + SD2→D2_COD \\ Expressão
4. FT_CRDPRES \\ Campo do dado desejado

Aviso
titleImportante

Importante observar que na ‘expressão identificadora da linha desejada’ (parâmetro 3) existem dois dados pré-definidos:

• ‘S’ indicativo de que buscamos a informação de uma nota de saída na SFT e;
• ‘ ‘, este é a inclusão de dois espaços vazios na expressão, os quais são necessários pois o dado anterior (D2_ITEM) por padrão possui o tamanho 2, enquanto o item da tabela SFT, FT_ITEM possui tamanho 4, já que recebe dados de outras tabelas como da SD1, onde o D1_ITEM possui o tamanho 4.


Sobre o tamanho do campo, é possível usar também a sintaxe abaixo (já alterada para o tamanho do campo)

Bloco de código
titleExemplo
Posicione('SFT', 1, xFilial('SFT') + 'S' + SD2->D2_SERIE + SD2->D2_DOC + SD2->D2_CLIENTE + SD2->D2_LOJA + SD2->D2_ITEM + ' ' + ' ' + SD2->D2_COD, 'FT_CRDPRES')
Card
labelContabilização Off Line

A chamada da MAFISRET somente funciona na execução online, pois os processos de cálculo devem estar iniciados, o que não ocorre na contabilização offline, já que lá não ocorre cálculo de imposto.

Para o processo offline pode ser utilizada a mesma sintaxe da exclusão, pois o registro SFT já foi gerado e pode então ser consultado:

Bloco de código
titleExemplo
Posicione('SFT', 1, xFilial('SFT') + 'S' + SD2->D2_SERIE + SD2->D2_DOC + SD2->D2_CLIENTE + SD2->D2_LOJA + SD2->D2_ITEM + ' ' + ' ' + SD2->D2_COD, 'FT_CRDPRES')


Card
labelCaso queira usar On Line e Off Line

Se não houver tratamento, será gerado error.log, uma vez que na Contabilização On Line não poderá usar na sintaxe a tabela SFT e na OFF line a função MAFISRET porque a NF já está gravada.

Existe a função IsInCallStack que verifica na pilha de chamada, a existência de determinada função na pilha de chamadas.

Sendo assim é possível sua utilização para identificar se a execução está sendo feita pelo processo de geração da nota ou pela própria rotina de contabilização:

Bloco de código
titleExemplo
Iif(IsInCallStack("CTBANFS"),POSICIONE(),MAFISRET())


Neste exemplo o IsInCallStack identifica se a função CTBANFS está na pilha de chamadas, se estiver executa o Posicione(), se não executa o MaFisRet().

Neste exemplo usamos apenas as funções Posicione e MaFisRet sem os seus parâmetros, apenas para apresentar o comportamento, porém ao montar a sintaxe para testar informe a expressão inteira.

Card
labelContabilizar Tributos Genéricos

Para realizar a contabilização de Tributos Genéricos, basta criar um índice na tabela F2D.

Bloco de código
languagesql
titleExemplo:
F2D_FILIAL + F2D_IDREL + F2D_TRIB

Image Added
Para buscar o dado do campo, pode-se utilizar a sintaxe que será utilizado com a LP 610.

Bloco de código
languagesql
titleExemplo:
{POSICIONE("F2D",7,xfilial("F2D"){+}SD2->D2_IDTRIB{+}"TESTE","F2D_VALOR")} 

Image Added
Com o novo índice, o sistema retornou para o posicione o valor do tributo "TESTE" corretamente.

Este processo pode ser no modo on-line e off-line.


Aviso
titleImportante
  • O exemplo acima foi para contabilizar somente o campo FT_CRDPRES. Cada campo das tabelas SFT e SF3 podem ter tratamentos diferentes, portanto, será necessário consultar o suporte Livros Fiscais para entender como é feito o calculo e quais campos são gravados;
  • Verifique se o mesmo calculo fiscal possui gravação nas tabelas SD2 e SF2. Se houver o calculo, basta criar uma sintaxe padrão dos LPs 610 e 630, uma vez que estas tabelas estão posicionadas no LP
  • LP 610: Para trazer o valor do ICMS solidário, por exemplo, é possível usar somente a sintaxe SD2->D2_ICMSRET, tanto para On Line quanto para Off Line;
  • LP 620: Para trazer o valor do ICMS, por exemplo, é possível usar a sintaxe SF2->F2_VALICM, tanto para On Line quanto para Off Line;
  • O exemplo que usamos do campo de Crédito Presumido de ICMS,no início desta documentação, só é gravado na tabela SFT, portanto, não é possível usar da forma simples como descrevemos o uso nas tabelas SD2 e SF2.

Pode lhe interessar: