Árvore de páginas

Informações sobre a contabilização de impostos no Documento de Saída

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)


    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

    Exemplo
    MaFisRet(Val(SD2->D2_ITEM), "LF_CRDPRES")

    Importante

    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.

    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 é:

    Exemplo
    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

    Importante

    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)

    Exemplo
    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')

    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:

    Exemplo
    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')


    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:

    Exemplo
    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.

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

    Exemplo:
    F2D_FILIAL + F2D_IDREL + F2D_TRIB


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

    Exemplo:
    {{POSICIONE("F2D",7,xfilial("F2D"){+}SD2->D2_IDTRIB{+}"TESTE","F2D_VALOR")}} {{}}

    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.


    Importante

    • 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: