Escolar Documentos
Profissional Documentos
Cultura Documentos
1. INTRODUÇÃO
A MATXFIS.PRX é um programa que possui um conjunto de funções que administram um conjunto de arrays
STATICS para calcular todos os impostos do ERP Protheus.
É importante para o Protheus que todos os impostos já existentes e novos impostos que venham a ser
criados pela legislação do país, sejam administrados e calculados por este programa, desta forma é possível
que as manutenções constantes na legislação sejam realizadas de forma mais rápida e eficiente, por ser feita
em um único ponto do sistema, com isso evita-se erros ao atualizar a legislação de um imposto (ICMS) , em
um ponto do sistema e deixando de atualizar, e ou atualizar de forma diferente em outro ponto do sistema,
isto ocorria quando os impostos eram calculados diretamente nos programas de documentos fiscais,
relatórios e outros. Com a centralização foi possível atualizar a legislação dos impostos de todo o sistema em
apenas um ponto, para isso foram criados alguns recursos a fim de facilitar a forma com que os programas
que utilizem a MATXFIS possam interagir com ela, um destes recursos é mencionado neste guia como
REFERÊNCIA FISCAL, é chamado de referência fiscal uma DEFINE contida numa lista de DEFINES do fonte
MATXDEF.CH, a ideia é que cada referência fiscal leve um nome com um prefixo e um sufixo que possam
facilitar a identificação do seu conteúdo, exemplo: “NF_DESCONTO” – valor do desconto no cabeçalho da
nota, “IT_BASEIPI” – valor do IPI no item da nota, “LF_VALCONT” – Valor Contábil da nota que será gravado
no Livro Fiscal, cada referência fiscal é um DEFINE do MATXDEF.CH com um numero que corresponde a sua
posição nos arrays STATICS da MATXFIS e podem ser utilizados na passagem de parâmetros de todas as
funções disponíveis para a integração das aplicações x MATXFIS e dicionário de dados.
Este guia tem a intenção de explicar como desenvolver e dar manutenção em aplicações que utilizem o
motor de impostos MATXFIS de forma a garantir que o desenvolvimento seja realizado de forma correta e
com melhor desempenho possível, pois como o uso das funções são muito flexíveis, é natural que o mesmo
resultado seja obtido de inúmeras formas diferentes, onde a escolha da melhor forma é crucial para o
desempenho da aplicação.
O guia apresenta uma lista com 25 funções que cobrem todas as formas de integração da aplicação x
MATXFIS, cada uma das funções é apresentada com uma descrição resumida, lista de parâmetros, retorno,
como e onde utilizar e exemplos de uso.
2. FUNÇÕES
Abaixo será descrito em detalhe todas as características e funcionamento das principais funções que
compõe a rotina MATXFIS contendo:
Descrição da função;
Uma breve descrição da função para que seja entendido o contexto da mesma.
Parâmetros;
Tabela contendo todas as Informações necessárias sobre os parâmetros recebidos da função.
Retorno;
Tabela contendo as Informações do retorno da função.
Descrição da função:
Verifica a existência de elementos nos arrays aNFCab e aNFItem da MATXFIS. O aNFCab é um array estático
da MATXFIS responsável por armazenar os dados do cabeçalho do documento fiscal e o aNFItem o array
responsável por armazenar todos os itens do documento fiscal, conforme a passagem do parâmetro
cReferencia “NF” ou “IT” a função retorna .T. ou .F. se houver elementos nos Arrays.
Parâmetros:
Retorno:
Utilizar em programas que utilizam MATXFIS ou novos programas que pretendem fazer uso das funções
fiscais da matxfis para calcular impostos. Deve ser utilizada ANTES de iniciar a carga dos dados do
documento fiscal para a MATXFIS através das funções MaFisINI, MaFisAdd e MaFisIniLoad com o propósito
de verificar se os dados do cabeçalho e ou dos itens já foram carregados para a MATXFIS, evitando assim que
um mesmo item seja carregado mais de uma vez ou até mesmo que o mesmo documento fiscal seja
carregado novamente. Também deve ser utilizada ANTES da chamada de qualquer função MATXFIS quando
em um contexto que não se tem certeza se os dados já foram ou não carregados para a MATXFIS. NUNCA
utilizar dentro de contextos onde mais de uma verificação seja necessária, como verificar se o documento
fiscal existe MaFisFound(“NF”) dentro de laços nos itens Whiles, For/Next, aEval(), até mesmo a consulta
por itens dentro dos laços MaFisFound(“IT”, N ) deve ser realizada somente quando NÃO se tem certeza da
existência do item, em contexto onde a existência do item é lógica, não utilizar.
Exemplos de Uso:
If ! MaFisFound("NF")
EndIf
MaFisAlt("IT_PRCUNI",aCols[n][nPPreco],n)
EndIf
2.2 MaFisSave()
Descrição da função:
Salva o estado atual (todos os dados do documento fiscal carregado na MATXFIS) para uma área temporária
com o propósito de liberar os arrays internos do mecanismo para utilização de um outro processo e ou
documento fiscal e após o uso ser restaurado o estado atual novamente. É importante ressaltar que a
MATXFIS trabalha com apenas um documento fiscal por vez e quando por algum motivo é necessário
carregar um outro documento fiscal para o mecanismo se faz necessário alternar entre eles, e para isso o
uso desta função.
Parâmetros:
Retorno:
Utilizar em programas que utilizam MATXFIS e necessitam em algum momento carregar um novo documento
fiscal por um instante e ou realizar um calculo fiscal a parte do documento fiscal atual e em seguida retornar
ao documento fiscal original. O uso se faz comum em situações como na consulta do histórico de produtos
ao incluir um pedido de compras onde é possível consultar os últimos pedidos do produto consultado, para
realizar esta consulta é necessário salvar os dados do pedido atual em uma área temporária, para que após a
consulta os dados possam ser restaurados e dar continuidade a edição do pedido, outro exemplo é na nota
fiscal de entrada (Documento de Entrada) onde é possível consultar todos os pedidos de compras vinculados
aquela nota fiscal de entrada.
Exemplos de Uso:
Function A120ComView()
MaFisEnd()
If !AtIsRotina("MACOMVIEW")
If !Empty(aCols[n][nPosCod])
EndIf
EndIf
Return
2.3 MaFisRestore()
Descrição da função:
Restaura os arrays internos da MATXFIS contendo todos os dados do estado atual armazenado pela função
MaFisSave() da área temporária, vide a função MaFisSave(). É importante ressaltar que a MATXFIS trabalha
com apenas um documento fiscal por vez e quando por algum motivo é necessário carregar um outro
documento fiscal para o mecanismo se faz necessário alternar entre eles, e para isso o uso desta função em
conjunto com a função MaFisSave().
Parâmetros:
Retorno:
Utilizar em programas que utilizam MATXFIS e necessitam em algum momento carregar um novo documento
fiscal por um instante e ou realizar um calculo fiscal a parte do documento fiscal atual e em seguida retornar
ao documento fiscal original. O uso se faz comum em situações como na consulta do histórico de produtos
ao incluir um pedido de compras onde é possível consultar os últimos pedidos do produto consultado, para
realizar esta consulta é necessário salvar os dados do pedido atual em uma área temporária, para que após a
consulta os dados possam ser restaurados e dar continuidade a edição do pedido, outro exemplo é na nota
fiscal de entrada (Documento de Entrada) onde é possível consultar todos os pedidos de compras vinculados
aquela nota fiscal de entrada.
Exemplos de Uso:
Função utilizada no pedido de compras para consultar os últimos pedidos de compras para
o produto.
Function A120ComView()
MaFisEnd()
If !AtIsRotina("MACOMVIEW")
If !Empty(aCols[n][nPosCod])
EndIf
EndIf
Return
2.4 MaFisClear()
Descrição da função:
Limpa todos os itens e zera todos totalizadores do cabeçalho dos arrays internos da MATXFIS. O aNFCab é
um array estático da MATXFIS responsável por armazenar os dados do cabeçalho do documento fiscal e o
aNFItem o array responsável por armazenar todos os itens do documento fiscal, a função MaFisClear() exclui
todos os itens do array aNFItem e zera todos os elementos com valores totais no array aNFCab preservando
todos os demais dados do cabeçalho, como Cliente, Loja, Tipo da NF, UF, etc.
Parâmetros:
Retorno:
Usar em momentos quando se faz necessário recomeçar a incluir itens no mesmo documento fiscal, ou seja,
se NÃO for necessário reiniciar todo o procedimento de carga de todo o documento fiscal. Se os dados do
cabeçalho do documento fiscal forem os mesmos, não há necessidade de finalizar toda a MATXFIS para
carrega-la novamente, com esta função é possível ganhar tempo neste processo, um exemplo de uso é a
carga do pedido de compras para o documento de entrada (MATA103.PRW), onde a cada carga de pedidos,
os itens do documento de entrada (aCols) são LIMPOS, preservando todos os demais dados da NFE já
digitados, ou seja, cada vez que se ativa a função para carregar pedidos de compras no documento de
entrada os itens são descartados do aCols para uma nova carga de novos pedidos, outro uso comum também
na rotina MAT103.PRW é quando o usuário está digitando uma nota fiscal de entrada e num dado momento
vai ao cabeçalho da nota e altera o Tipo da Nota de ’Normal’ para ‘Nota de Complemento’ neste caso por
exemplo, como uma nota de complemento tem características próprias deste modelo como ter apenas 1
item que seja amarrado em um outro documento original, se faz necessário limpar todo conteúdo digitado
antes da alteração do tipo da nota para reiniciar uma nova digitação compatível com o modelo de
complemento.
Exemplos de Uso:
Function NfeTipo(cTipo,cFornece,cLoja,oSay,oFornece,oLoja)
MaFisAlt("NF_CLIFOR",IIf(cTipo$"DB","C","F"))
MaFisAlt("NF_TIPONF",cTipo)
Eval(bRefresh)
EndIf
Return
2.5 MaFisEnd()
Descrição da função:
Diferente da função MaFisClear() esta função finaliza todo o uso da MATXFIS limpando TODOS os seus arrays
internos
Parâmetros:
Retorno:
Usar sempre que todo o processo de calculo, inclusão, alteração, exclusão, visualização e geração de
impostos for finalizado, independente de se após a finalização destes processos for iniciar um novo processo
ou não. Para o caso de iniciar um novo processo o uso é essencial, pois é necessário que os arrays internos e
mecanismos de refresh() sejam finalizados para não conflitar com os dados novo processo, para
simplesmente finalizar o processo o uso deve ser praticado para liberar a memória utilizada pelos arrays
internos que não tem mais utilidade, seu uso é praticamente obrigatório para finalizar todos os processos.
Exemplos de Uso:
Trecho de código para obter o valor total do item com a incidência de impostos
For nX := 1 To Len(aRefImp)
Next nX
nTotItem := MaFisRet(1,"IT_TOTAL") // obtém o valor total do item calculado pela matxfis com a
incidência dos impostos
2.6 MaFisNFCab()
Descrição da função:
Retorna um array contendo todos os impostos calculados na MATXFIS no momento da chamada da função
com quebra por impostos + alíquotas
Parâmetros:
Retorno:
Pode ser utilizado em casos onde a aplicação necessite em determinado ponto apresentar e ou utilizar como
referencia para cálculos no código, valores totalizados dos impostos calculados na operação pela MATXFIS, o
comum para esta situações é utilizarmos a função MaFisRet( ,'NF_VALICM') passando como parâmetro a
referência do Imposto que necessite no momento, contudo, em situações onde o uso do MaFisRet não seja
possível e ou não seja viável, pode se utilizar esta função como recurso.
Exemplos de Uso:
Função para obter todos os impostos calculados pela MATXFIS até o momento
Function ImpostosdaNF()
Local aImpostos := {}
If MaFisFound("NF")
aTodosImpostos := MaFisNFCab()
EndIf
Return ( aTodosImpostos )
2.7 MaFisIni(cCodCliFor,cLoja,cCliFor,cTipoNF,cTpCliFor,aRelImp,cTpComp,lInsere,
cAliasP,cRotina,cTipoDoc,cEspecie,cCodProsp,cGrpCliFor,cRecolheISS,cCliEnt,cLo
jEnt,aTransp,lEmiteNF,lCalcIPI,cPedido,cCliFat,cLojcFat)
Descrição da função:
A função MaFisIni() é responsável por iniciar todo o processo da MATXFIS, ela é a função que forma o array
aNFCab (Cabeçalho do Documento Fiscal) através dos dados informados nos parâmetros passados pela
função, parâmetros SX6, dados da tabela de Cliente (SA1) e ou Fornecedor (SA2) e Natureza Financeira (SED),
com isso dando forma ao documento que será gerado
Parâmetros:
Novos parâmetros podem ser acrescentados a esta função, verificar o código fonte.
Retorno:
A função MaFisIni() tem que ser usada obrigatoriamente em qualquer operação que envolva a MATXFIS,
sempre deve ser utilizada ANTES da carga de qualquer Item, pois ela monta o cabeçalho (aNFCab) com dados
que interferem diretamente nos cálculos dos itens, e a arquitetura do código exige que o cabeçalho seja
formado antes da inclusão dos itens. Deve ser chamada apenas uma vez para cada documento fiscal. Quando
em alguns casos, há necessidade e ou possibilidade que dados do cabeçalho sejam alterados, como é o caso
de interfaces de inclusão de notas fiscais, é necessário chamar a função MaFisAlt() com a referencia do
cabeçalho que necessite ser alterada, MaFisAlt("NF_UFORIGEM", cNovoUF ) para refazer o array interno
(aNFCab) com a nova informação e conforme a referencia refazer os cálculos de todos os itens.
Exemplos de Uso:
dbSelectArea("SC5")
If nItem == 1
MaFisIni(cCliEnt,SC5->C5_LOJAENT,If(SC5->C5_TIPO$'DB',"F","C"),SC5->C5_TIPO
,SC5->C5_TIPOCLI,aRelImp,, ,,'MATA461',,,,cGrpCliTrb,,,,aTransp,,,SC6->C6_NUM
,SC5->C5_CLIENTE,SC5->C5_LOJACLI)
EndIf
MaFisLoad("IT_VALMERC",aRateio[RT_PRECOIT][3]+aRateio[RT_PRECOIT][4],nItem)
MaFisLoad("IT_PRCUNI",aRateio[RT_PRECOIT][1],nItem)
MaFisLoad("IT_VLR_FRT",aRateio[RT_VLR_FRT],nItem)
MaFisIni(ca120Forn,ca120Loj,"F","N",Nil,aRefImpos,,.T.,,,,,,,)
// Laço para carregar todos os itens do pedido a partir do ACOLS formado pela tabela SC7 de
pedido de compras
For nX := 1 to Len(aCols)
MaFisIniLoad(nX,,.T.)
For nY := 1 To Len(aHeader)
cValid := AllTrim(UPPER(aHeader[nY][6]))
cRefCols := MaFisGetRf(cValid)[1]
MaFisLoad(cRefCols,aCols[nX][nY],nX)
EndIf
Next nY
MaFisEndLoad(nX,2)
Next nX
// Trecho de código para validar a digitação dos dados no cabeçalho do documento de entrada na
Inclusão.
If !MaFisFound("NF")
MaFisIni(cA100For,cLoja,IIf(cTipo$'DB',"C","F"),cTipo,Nil,MaFisRelImp("MT100",{"SF1","SD1
"}),,!lVisual,NIL,NIL,NIL)
If !Empty(cUfOrig)
MaFisAlt("NF_UFORIGEM",cUfOrig)
Endif
Else
If !Empty(cUfOrig)
MaFisAlt("NF_UFORIGEM",cUfOrig)
Endif
EndIf
MaFisIni(SF1->F1_FORNECE,SF1->F1_LOJA,IIf(cTipo$'DB',"C","F"),
,cTipo,Nil,MaFisRelImp("MT100",{"SF1","SD1"}),,!l103Visual)
...
Descrição da função:
A Função MaFisIniLoad acrescenta um NOVO item no array interno de itens da MATXFIS ( aNFItem ). Este
item pode ser acrescentado com todos os elementos em branco ou se informado os dados básicos na
passagem do parâmetro aItemLoad estes dados serão carregados no novo item, Exemplo: Código do
Produto, TES ou Quantidade. Pode-se utilizar a função também para estornar os valores do item dos
totalizadores do cabeçalho (aNFCab) conforme necessidade da aplicação a ser desenvolvida, se o item
informado no parâmetro nItem já existir e o parâmetro lEstorno for passado como .T., os valores deste item
serão estornados dos elementos totalizadores do cabeçalho do documento fiscal (aNFCab).
Parâmetros:
Retorno:
A Função MaFisIniLoad() é a melhor forma de acrescentar um item ao utilizar a MATXFIS e deve sempre ser
priorizada em relação ao uso da função MaFisAdd() por ser mais rápida, pois não executa o recalculo do item
a cada item carregado. Deve ser utilizada dentro dos laços dos itens da aplicação de forma que a cada item
lido no laço seja chamada a função passando o item atual como parâmetro do parâmetro nItem. Se
aplicação utiliza MsGetDados() e aCols para manipulação dos itens, os itens gerados pela MaFisIniLoad()
devem sempre estar na mesma ordem em que os itens do aCols foram formados, pois aCols e aNFItem tem
obrigatoriamente de estar sincronizados em qualquer situação.
Exemplos de Uso:
// Laço para carregar todos os itens do pedido a partir do acols formado pela tabela SC7 de pedido
de compras
cValid := AllTrim(UPPER(aHeader[nY][6]))
EndIf
Next nY
Next nX
2 ) Carregando um item para a MATXFIS a partir dos dados de um registro da tabela SD2.
For nX := 1 To Len(aRefImpos)
MaFisLoad(aRefImpos[nX][3],SD2->(FieldGet(FieldPos(aRefImpos[nX][2]))),Len(aColsX))
Next nX
MaFisEndLoad(Len(aCols),2)
dbSelectArea("SC5")
If nItem == 1
MaFisIni(cCliEnt,SC5->C5_LOJAENT,If(SC5->C5_TIPO$'DB',"F","C"),SC5->C5_TIPO
,SC5->C5_TIPOCLI,aRelImp,, ,,'MATA461',,,,cGrpCliTrb,,,,aTransp,,,SC6->C6_NUM
,SC5->C5_CLIENTE,SC5->C5_LOJACLI) //Carrega o Cabeçalho apenas 1 Vez
EndIf
// Carrega o Item para o aNFItem da MATXFIS passando como parâmetro (aItemLoad), os dados das
variáveis do MATA461 e das tabelas SC6, SB1 e SF4.
MaFisTes(SC6->C6_TES,SF4->(RecNo()),nItem)
If (SuperGetMV("MV_ISSPRG",,"N") == "S")
MaFisLoad("IT_VALMERC",SC6->C6_VALOR,nItem)
EndIf
MaFisLoad("IT_VALMERC",aRateio[RT_PRECOIT][3]+aRateio[RT_PRECOIT][4],nItem)
MaFisLoad("IT_PRCUNI",aRateio[RT_PRECOIT][1],nItem)
MaFisLoad("IT_VLR_FRT",aRateio[RT_VLR_FRT],nItem)
MaFisLoad("IT_FRETE",aRateio[RT_FRETE],nItem)
MaFisLoad("IT_SEGURO",aRateio[RT_SEGURO],nItem)
MaFisLoad("IT_DESPESA",aRateio[RT_DESPESA],nItem)
MaFisLoad("IT_AUTONOMO",aRateio[RT_FRETAUT],nItem)
MaFisLoad("IT_DESCONTO",aRateio[RT_PRECOIT][4],nItem)
MaFisLoad("IT_PESO",SB1->B1_PESO,nItem)
MaFisRecal("",nItem)
....
Descrição da função:
Assim como a função MaFisIniLoad(), a função MaFisAdd() inclui um novo item no array aNFItem da
MATXFIS, contudo ela não somente inclui o novo item mas também dispara o calculo de TODOS os impostos,
atualiza os valores do cabeçalho e dos folders livro fiscal e Impostos a cada chamada da função, devido a
estas características ela leva mais tempo do que a função MaFisIniLoad() e deve ser usada somente em
contextos onde a atualização de todos os demais dados fora do item (Cabeçalho, Folders do Rodapé dos
documentos Fiscais, Refreshs, etc) devam ocorrer obrigatoriamente item a item, sendo indicada a principio
para processos onde o documento a ser gerado possua apenas um item, ou seja, se NÃO necessitar que
todas esta operações sejam realizadas item a item na aplicação, utilizar MaFisIniLoad(). Para que estas
operações ocorram o maior numero de dados devem ser passados como parâmetros, alguns, inclusive
obrigatórios, caso contrario os cálculos não terão efeito.
Parâmetros:
Retorno:
Deve ser utilizado preferencialmente em situações onde apenas um item é necessário no documento fiscal,
como Notas de Complemento de ICMS, IPI, Notas de Frete, Resumos de despesas, e ou situações onde a
cada item incluído seja necessário realizar o calculo de todos os impostos e atualizações do cabeçalho,
evitar, de todas as formas utilizar dentro dos laços de itens que NÃO possuam esta exigências, pois o tempo
consumido para suas operações é muito superior a da função MaFisIniLoad() e aumenta exponencialmente
a cada item incluído conforme as características do documento a ser gerado e os impostos configurados.
Exemplos de Uso:
Trecho de código do programa PMSA203.PRW para obter os impostos calculados de um produto da tarefa.
SA1->( MsSeek(xFilial("SA1")+AF8->AF8_CLIENT+AF8->AF8_LOJA) )
If SB1->(MsSeek(xFilial("SB1")+cCodProd))
cTESProd := SB1->(B1_TS)
nQtdPeso := nQtdVend*SB1->B1_PESO
Endif
// Carrega o item com todos dados necessários e roda o calculo de todos os impostos do documento
MaFisAlt("IT_PESO", nQtdPeso , nItem) // Altera dado que não pode ser carregado no MaFisAdd
Descrição da função:
Carrega valores de impostos e demais conteúdos para os arrays internos da MATXFIS. Para que o conteúdo
seja armazenado nos elementos dos arrays é necessário informar na passagem do parâmetro cCampo a
referência fiscal a qual quer atualizar, a lista completa das referências a serem utilizadas constam no fonte
MATXDEF.CH, as referências com nomes iniciados por “NF_” dizem respeito ao array aNFCab, array estático
responsável pelos dados do cabeçalho e as referencias iniciadas por “IT_” ao array aNFItem, array estático
responsável pelos dados dos itens do documento fiscal.
Parâmetros:
Retorno:
A função deve ser utilizada para alimentar os arrays internos de cabeçalho e itens do documento fiscal na
MATXFIS em todas as situações onde a atualização for necessária, é importante ressaltar que a função NÃO
realiza nenhum calculo com os valores e ou conteúdos passados, somente atualiza os valores nos arrays,
muito útil em interfaces de visualização de documentos onde pode-se ler os dados da tabela e alimentar as
referências fiscais da MATXFIS a partir desta tabela, muito utilizada também para carregar demais dados que
não constam na lista de parâmetros das funções MaFisIni(), MaFisIniLoad() e MaFisAdd(). Em alguns casos
pode ser utilizada para “Forçar” algum valor que possa divergir do calculo realizado pela MATXFIS, contudo,
o contexto deve ser muito bem estudado, pois qualquer outra função que disparar um novo calculo da
MATXFIS APÓS a sua chamada poderá em algumas situações descartar o conteúdo passado e fazer
prevalecer o conteúdo calculado pela MATXFIS.
Exemplos de Uso:
dbSelectArea("SC5")
If nItem == 1
MaFisIni(cCliEnt,SC5->C5_LOJAENT,If(SC5->C5_TIPO$'DB',"F","C"),SC5->C5_TIPO,
SC5->C5_TIPOCLI,aRelImp,,,,'MATA461',,,,cGrpCliTrb,,,,aTransp,,,SC6->C6_NUM,
SC5->C5_CLIENTE,SC5->C5_LOJACLI)
// Após a MaFisIni() carrega a espécie da NF para o array cabeçalho aNFCab complementando o
que NÃO foi carregado acima
MaFisLoad( "NF_ESPECIE" , SF2->F2_ESPECIE )
EndIf
// Inclui um novo item no aNFItem
MaFisLoad("IT_VALISS",ExecBlock("M460VISS",.F.,.F.,MaFisRet(nItem,"IT_VALISS")),nItem)
EndIf
2 ) Carregando um item para a MATXFIS a partir dos dados de um registro da tabela SD2.
// Este array possui TODAS as referencias fiscais encontradas no X3_VALID da tabela “SD2”
Local aRefImpos := MaFisRelImp('MT100',{"SD2"})
// a cada linha incluída do aCols carrega um novo item no aNFItem e a seguir carrega os dados da
tabela SD2
MaFisIniLoad(Len(aCols))
For nX := 1 To Len(aRefImpos) // Roda TODAS as referencia do array para carga
// Carrega o conteúdo da tabela SD2 para a referencia fiscal no array interno da MATXFIS
MaFisLoad( aRefImpos[nX][3] , SD2->( FieldGet( FieldPos( aRefImpos[nX][2] ) ) ) ,
Len(aColsX) )
Next nX
MaFisEndLoad(Len(aCols),2)
cValid := AllTrim(UPPER(aHeader[nY][6]))
cRefCols := MaFisGetRf(cValid)[1] // Busca na MATXFIS e armazena a referencia fiscal
do campo na variável cRefCols
If !Empty(cRefCols) .And. MaFisFound("IT",nX) // Verifica a existência do Item no
aNFItem da MATXFIS
EndIf
Next nY
MaFisEndLoad( nX , 2 ) // Encerra a carga do Item
Next nX
Descrição da função:
Parâmetros:
Retorno:
Usar dentro do laço dos itens da aplicação sempre que o item for carregado pela função MaFisIniLoad(),
fechando a carga do item por esta função. Extremamente importante ressaltar que para este caso a opção
indicada do parâmetro nTipo deve ser igual a 2, pois como a opção nTipo igual a 1 ou sem a passagem do
nTipo a função ASSUME o DEFAULT 1, a aplicação perderá a performance de forma Exponencial em razão
desta opção ( nTipo = 1 ), limpar os valores do cabeçalho e varrer o aNFItem para somar TODOS os itens para
recompor novamente os valores do cabeçalho no aNFCab, por isso, muito cuidado ao utilizar esta opção e
usá-la somente em contextos onde seja absolutamente necessário.
Exemplos de Uso:
cValid := AllTrim(UPPER(aHeader[nY][6]))
EndIF
Next nY
Next nX
Descrição da função:
Retorna o conteúdo (no caso de valores de impostos, os valores já calculados) da referência fiscal informada
no parâmetro cCampo, ao informar referências “IT_” e “LF_” os valores retornados serão do item informado
no parâmetro nItem, array interno aNFItem, e referências “NF_” retornarão conteúdos do array interno
aNFCab e dispensam a passagem do nItem. Consulte o fonte MATXDEF.CH para encontrar as referencias
fiscais possíveis para o uso.
Parâmetros:
Retorno:
Utilizada praticamente em todos os tipos de aplicação serve para obter o valor de impostos calculados pela
MATXFIS no momento da chamada da função e ou qualquer outro conteúdo dos array de cabeçalho e item
internos da MATXFIS, pode ser utilizado também para obter valores do livro fiscal, referência fiscal “LF_”, útil
para obter valores como o ‘Valor Contábil” e demais valores que não são próprios do item.
Exemplos de Uso:
If MaFisFound("IT",nItem)
EndIf
Function A120Refresh(aValores)
aValores[VALMERC] := MaFisRet(,"NF_VALMERC")
aValores[VALDESC] := MaFisRet(,"NF_DESCONTO")
aValores[FRETE] := MaFisRet(,"NF_FRETE")
aValores[TOTPED] := MaFisRet(,"NF_TOTAL")
aValores[SEGURO] := MaFisRet(,"NF_SEGURO")
aValores[VALDESP] := MaFisRet(,"NF_DESPESA")
aValores[TOTF1] := aValores[VALDESP]+aValores[SEGURO]
RestArea(aArea)
Return .T.
2.13 MaFisSXRef(cAlias)
Descrição da função:
Esta função pesquisa a (Tabela) informada em cAlias no dicionário de dados SX3 buscando no X3_VALID de
TODOS os campos desta tabela a expressão “MaFisRef” para obter a referência fiscal “NF_”, “IT_” ligada ao
campo e retornar um array contendo o nome do campo e a referência fiscal ligada a ele, promovendo assim
uma espécie de homônimo, ou seja, para a aplicação desenvolvida (programa que utilizará a MATXFIS), em
muitos momentos vai se referir diretamente aos campos da tabela, Exemplo: D1_BASEICM, D2_VALIPI,
C6_TOTAL, contudo a MATXFIS sempre olhará para a referência fiscal ligada a este campo e NUNCA ao
campo propriamente dito, o retorno desta função lista no primeiro elemento o campo da tabela e em
seguida a referência fiscal a qual ele será processado na MATXFIS.
Parâmetros:
Retorno:
Utilizado principalmente em conjunto com as funções MaFisIniLoad() e MaFisLoad() para promover uma
carga rápida de todas as referências fiscais de uma tabela para a MATXFIS, usada também em muitos outros
contextos onde se faz necessário um lista com todas as referências fiscais possíveis da tabela em uso na
aplicação.
Exemplos de Uso:
// A instrução a seguir varre todas as referências fiscais do array aAuxRefSD1 para carregar a
MATXFIS pela MaFisLoad()
For nX := 1 To Len(aAuxRefSD1)
Next nX
MaFisEndLoad(Len(aCols),2)
....
2) Trecho de código do programa MATA103x.prx para carregar os pedidos de compras para Nota Fiscal de
Entrada
Function FePC2Acol(nRecSC7,nItem,nSalPed,cItem,lPreNota,aRateio,aHeadSDE,aColsSDE,nPrUPreNf)
If MaFisFound()
MaFisIniLoad(nItem)
For nX := 1 To Len(aRefSc7)
Do Case
OtherWise
EndCase
Next nX
MaFisEndLoad(nItem)
EndIf
2.14 MaFisRelImp(cProg,aAlias)
Descrição da função:
Aplicação idêntica a função MaFisSXRef() (Vide a função), porém pode ser usada para mais de um Alias ao
mesmo tempo , retornando um array com a referencias fiscais separadas para cada Alias informado no
parâmetro aAlias.
Parâmetros:
Retorno:
Aplicação idêntica a função MaFisSXRef(), porém dê preferência ao uso desta função quando for tratar mais
de uma tabela como é o caso de tabelas que possuem cabeçalho e item, como é o caso das tabelas SF1/SD1
e SF2/SD2.
Exemplos de Uso:
If aRelImp == Nil
aRelImp := MaFisRelImp("MT100",{"SF2","SD2"})
EndIf
dbSelectArea("SF2")
For nY := 1 To Len(aRelImp)
If aRelImp[nY][1] == "SF2"
EndIf
Next nY
MaFisIniLoad(nItemNf2,Nil,.T.)
For nZ := 1 To Len(aRelImp)
If aRelImp[nZ][1] == "SD2"
EndIf
Next nZ
MaFisEndLoad(nItemNf2,2)
Descrição da função:
A Função MaFisRef() foi desenvolvida para integrar a MATXFIS com programas que possuam interface para
manipulação de dados do documento fiscal, (Inclusão, Alteração, Exclusão e Visualização). A função tem a
responsabilidade de localizar a referência fiscal nos arrays internos da MATXFIS, comparar o valor passado
pelo parâmetro xValor com o valor constante nos arrays internos (aNFCab e ou aNFItem) e havendo
divergência entre os conteúdos, realizar a alteração para o novo conteúdo de xValor, disparar o recalculo de
todos impostos ligados a referência informada e atualizar os novos conteúdos na variável PRIVATE aCols da
aplicação sincronizando assim o conteúdo dos arrays internos da MATXFIS com as variáveis da aplicação, ou
seja, para utilizar esta função é obrigatório que haja uma interface onde exista uma MsGetDados() para os
itens da aplicação com as variáveis aHeader e aCols disponíveis. O uso convencional desta função se dá no
X3_VALID dos campos do dicionário de dados SX3, Exemplo: X3_VALID do campo D1_VALIPI com MaFisRef(
"IT_VALIPI" , "MT100" , M->D1_VALIPI ) , contudo, nada impede que esta função seja chamada diretamente
da própria aplicação em um contexto adequado ao seu funcionamento.
Parâmetros:
Retorno:
01 lOk Lógico .T. = Se a referência fiscal foi encontrada e pode ser atualizada.
.F. = Se a referência fiscal NÃO foi encontrada e ou atualizada.
Usar preferencialmente no X3_VALID dos campos das tabelas de cabeçalho e itens da aplicação que
resultarão no documento fiscal que será processado, Exemplos em tabelas existentes: SF1/SD1 – Nota Fiscal
de Entrada, SF2/SD2 – Nota Fiscal de Saída, SC8 – Cotações de Compras, SC7 – Pedido de Compras. Deve ser
chamada em TODOS os campos de impostos da tabela e demais campos que tenham uma referência fiscal
“NF_” ou “IT_” compatível na lista do fonte MATXDEF.CH. É importante ressaltar que NENHUM imposto
deve ser calculado dentro da própria aplicação, TODOS os impostos devem obrigatoriamente serem
calculados dentro da MATXFIS, por inúmeras razões, dentre as quais, o fato de que as legislações fiscais
estão em constante evolução e a equipe fiscal deve concentrar a manutenção destas legislações em um só
ponto, se impostos forem calculados nas aplicações “POR FORA”, os cálculos apresentarão distorções em
relação a legislação atualizada. Toda vez que um NOVO imposto, regra, alíquota, Margem, for implementado
em uma tabela, deve-se OBRIGATÓRIAMENTE criar o campo na tabela com o X3_VALID contendo a
MaFisRef e a referência fiscal equivalente a nova implementação, caso a referência NÃO EXISTA, a mesma
deve ser criada pela equipe FISCAL, da mesma forma se o tratamento NÃO existir na MATXFIS para atender a
legislação, também deve ser solicitado o tratamento para a equipe Fiscal.
Exemplos de Uso:
Ao alterar o valor do campo D1_TOTAL no aCols da MsGetDados, o X3_VALID é disparado com a função
MaFisRef(), internamente na MATXFIS são chamadas as 3 funções principais em sequência:
MaFisRef() – Verifica se a alteração é possível e se o item existe, chama a MaFisAlt() que chama a
MaFisrecal() e após, atualiza todas as colunas do aCols que possuem MaFisRef no X3_VALID com os
valores recalculados pela MATXFIS a partir da alteração deste campo D1_TOTAL
Após clicar ENTER neste campo, estas 3 funções serão executadas, todas as colunas do aCols serão
atualizadas e também os demais objetos controlados pela MATXFIS, como é o caso dos folders “Livros
Fiscais” e “Impostos”
2.16 MaFisAlt(cCampo,nValor,nItem,lNoCabec,nItemNao,lDupl,cRotina,lRecal)
Descrição da função:
A função MaFisAlt() altera o conteúdo da referência fiscal informada em cCampo nos arrays internos aNFCab
e aNFItem da MATXFIS e dispara o recalculo de todos os impostos promovendo assim a atualização de todas
as demais referências fiscais relacionadas a ela, o recalculo dos impostos podem ocorrer ou não dependendo
do parâmetro lRecal.
Parâmetros:
Retorno:
Embora deva ser usada para todas as situações onde seja necessário alterar o conteúdo de uma referencia
fiscal mais a execução do recalculo de todas as referencias fiscais ligadas a este conteúdo e atualizar as
somas do cabeçalho, é importante ressaltar que esta operação exige muito mais tempo que APENAS alterar
o conteúdo de uma referencia fiscal utilizando MaFisLoad() , no caso do uso, o ideal é ficar atento ao
desenhar uma aplicação para minimizar o uso da função ao máximo afim de evitar o uso desnecessário da
função e com isso comprometer a performance da aplicação, principalmente em rotinas onde sejam
processados ou gerados vários documentos fiscais de uma vez. Muita ATENÇÃO ao utilizar os parâmetros
lNoCabec e lRecal, pois estes parâmetros se .T., aumentam o tempo de execução consideravelmente,
principalmente o lNoCabec que se aplicado dentro de laços de processamento de itens pode exponenciar o
tempo conforme a quantidade de itens por VARRER TODOS OS ITENS desde o primeiro não importando qual
o item esteja sendo alterado no momento.
Exemplos de Uso:
1) Uso comum para alterar as referencias fiscais de Frete, Despesa e Seguro no cabeçalho ou rodapé do
documento fiscal, a chamada da função alem de alterar o total das referencias no cabeçalho também fará
o rateio do valor entre os itens do documento;
MaFisAlt("NF_FRETE",avalores[FRETE])
MaFisAlt("NF_DESPESA",avalores[VALDESP])
MaFisAlt("NF_SEGURO",avalores[SEGURO])
2) Alterando valores calculados na MATXFIS dos itens do documento fiscal com base nos valores gravados
de uma tabela
If (cAliasSD1)->D1_BASEICM > 0
MaFisAlt("IT_BASEICM",(cAliasSD1)->D1_BASEICM,Len(aCols))
MaFisAlt("IT_ALIQICM",(cAliasSD1)->D1_PICM,Len(aCols))
MaFisAlt("IT_VALICM",(cAliasSD1)->D1_VALICM,Len(aCols))
EndIf
3) Uso de um Ponto de Entrada do MATA461.PRX (Geração de Notas Fiscais de Saída pra alterar o valor do
IPI, observar que o uso da função FORÇA uma nova soma no cabeçalho do Documento Fiscal APÓS alterar a
referência.
If ( aEntry[EP_M460IPT] )
VALORIPI := MaFisRet(nItem,"IT_VALIPI")
BASEIPI := MaFisRet(nItem,"IT_BASEIPI")
QUANTIDADE := MaFisRet(nItem,"IT_QUANT")
ALIQIPI := MaFisRet(nItem,"IT_ALIQIPI")
BASEIPIFRETE:= MaFisRet(nItem,"IT_FRETE")
//Após FORÇAR um novo valor de IPI pelo P.E., recarrega novamente os valores de base e
alíquota para a MATXFIS
MaFisLoad("IT_BASEIPI",BASEIPI,nItem)
MaFisLoad("IT_ALIQIPI",ALIQIPI,nItem)
MaFisLoad("IT_FRETE",BASEIPIFRETE,nItem,"11")
EndIf
Descrição da função:
A função MaFisDel() marca ou desmarca como deletado, o item no array interno aNFItem da MATXFIS, é
utilizado para SINCRONIZAR o array aCols de interfaces de digitação de documentos fiscais com o array
statico aNFItem da MATXFIS, quando o item é marcado como deletado no aCols da interface é necessário
que na MATXFIS o aNFItem também seja deletado, e se a tecla “Delete” for acionada novamente para
recuperar o item deletado no aCols, o ANFItem também deve ser restaurado.
Parâmetros:
Retorno:
Exemplos de Uso:
// Trecho do código que monta a MsGetdados com a passagem do parâmetro da função de deleção
oGetDados:=MSGetDados():New(aPosObj[2,1],aPosObj[2,2],aPosObj[2,3],aPosObj[2,4],nOpcx,'A920Li
nOk','A920TudOk','+D2_ITEM', (!l920Visual) ,,,,300,'A920FieldOk',,, 'A920Del' )
Function A920Del()
MaFisDel( n ,aCols[n][Len(aCols[n]) ] )
Eval(bRefresh)
Return .T.
2.18 MaColsToFis( aHeader , aCols , nItem , cProg , lRecalc , lVisual , lDel , lSOItem)
Descrição da função:
A função MaColsToFis é bem flexível, pode ser utilizada para carregar TODOS os dados do aCols para o
aNFItem, esta carga pode ser de apenas um item ou de todos os itens, esta carga pode ser sem realizar
nenhuma outra atualização (Totalizadores do cabeçalho e recalculo) ou realizando todo o recalculo e após
atualizando todo o aCols com os novos valores calculados, deve ser utilizada com cautela para NÃO
comprometer a performance da aplicação.
Parâmetros:
Retorno:
Deve ser utilizada toda vez que se quer carregar todas as referencias fiscais do aCols para a MATXFIS de uma
vez, por exemplo, ao invés de chamar repetidamente MaFisLoad() para cada referencia, isto também pode
ser feito para apenas um item ou TODOS os itens do aCols, Atenção! Deve-se ter extremo cuidado neste
caso, pois se esta função estiver dentro de um For / Next do aCols e NÃO for informado o nItem no
parâmetro da função, o DEFAULT da função será carregar TODOS os itens do acols, fazendo com que se
dentro de um laço, a cada item lido no For / Next, TODO o acols será rodado a cada item, aumentando o
TEMPO de forma EXPONENCIAL, por isso esteja atento para utilizar a função SEM informar o nitem, apenas
FORA dos laços do aCols, outro parâmetro da função que também merece atenção é o lRecalc, utilizar
somente quando for necessário o recalculo pois o tempo é aumentado significativamente quando ativado e
nem sempre é necessário, principalmente quando dentro de laços do aCols, mais 2 parâmetros que podem
afetar o tempo de execução da função, lVisual e lSoItem, o lVisual se ativado (.T.), não fará a atualização dos
totalizadores do cabeçalho na MATXFIS através do array aNFCab, com isso, a execução será mais rápida,
quando porém estiver .F. ou NÃO for informado, DEFAULT .F., o parâmetro lSoItem será consultado, se .F.
(DEFAULT) a função somará o item ou os itens que estiverem sendo processados e atualizará o cabeçalho
(aNFCab) somando TODOS os itens, se .T. somente o item informado em nItem será somado ao cabeçalho.
Logo, devido a sua FLEXIBILIDADE de uso, é muito importante utilizar esta função no contexto correto, pois o
TEMPO de execução pode variar muito dependendo da forma que for configurada.
Exemplos de Uso:
//A cada item carregará para a MATXFIS o (nItem) para a MATXFIS e executará o Recalculo e soma do
cabeçalho.
Next nItem
2) Exemplo ERRADO de uso para carregar os itens do aCols para MATXFIS, ao chamar a função dentro do
Laço SEM informar o nItem.
// Se o item NÃO for informado em uma carga de 100 itens por exemplo, a cada item a função
RODARÁ os 100 itens novamente dentro da matxfis para realizar sua tarefa. Resultando 100x100 =
10000 + 100, ou seja, 10100 Vezes
Next nItem
// Se o Item NÃO For informado e o lVisual for .F. e o lSoItem também for .F. , isso resultará que
em uma carga de 100 Itens, o aCols será rodado 100 Vezes no For/Next, rodará mais 100 Vezes a
cada item dentro da função MaColsToFis(), por esta entender que deverá processar TODOS os itens
do aCols por NÃO ter sido Informado o item em nItem e Rodará mais 100 Vezes por item pelo fato
de lSoItem ter sido informado como .F. indicando que a soma do cabeçalho deverá
obrigatoriamente ser refeita a CADA item com base no aNFItem que será acrescido a cada rodado
do For/Next, o que resultará em algo aproximado a este calculo 100 ( For/Next) + 100 x 100 = 10000
(MaColstoFis) x 100 (Soma do aNFCab) = 100 + 100x100x100 = 1000100. Por isso é importante ter
cuidado, pois é possível que ao desenvolver a aplicação POUCOS itens sejam usados e NÃO se
PERCEBA o prejuízo de PERFORMANCE.
Next nItem
3) Se executado FORA do laço para se carregar TODOS os itens do aCols o uso será CORRETO, porém não
tão eficiente, pois se desperdiçará o fato de a aplicação já ter rodado os itens no FOR/NEXT, o melhor uso
dependerá da necessidade de configuração dos demais parâmetros (lRecalc,lVisual,lDel,lSoItem)
Next nItem
Descrição da função:
Essa função atualiza as informações do aCols com os dados das referencias fiscais já calculadas no array
interno aNFItem da MATXFIS
Parâmetros:
Retorno:
Usar quando necessitar atualizar o conteúdo do aCols com o conteúdo já calculado da MATXFIS, o único
cuidado a ser tomado neste caso é quanto a passagem do parâmetro nItem que se NÃO for passado a função
assumirá que TODO o aCols deve ser atualizado e não somente o item, por isso deve ser observado o
contexto em que se aplicará a chamada da função.
Exemplos de Uso:
1) Trecho de código onde após os cálculos terem sido realizados pela MATXFIS ao carregar um item do
pedido de compras para o documento de entrada, o item (aCols) do documento de entrada é atualizado
com os cálculos da MATXFIS
// Len(aCols) é o item atual após os cálculos realizados anteriormente no código. O Item atual será
atualizado com o conteúdo da MATXFIS
2) Trecho de código que atualiza TODOS os itens do aCols APÓS ser alterada a UF de Origem no cabeçalho
do documento Fiscal de Entrada, e com isso, o calculo de TODOS os itens da nota são afetados e devem ser
atualizados.
If cReferencia == "NF_NATUREZA"
Endif
MaFisToCols(aHeader,aCols, ,"MT100")
EndIf
Eval(bGDRefresh)
Eval(bRefresh)
Descrição da função:
A função MaFisRecal() executa a pilha de funções do calculo de impostos, item a item. Ela é utilizada
internamente pela MATXFIS para calcular todos os impostos através da chamada de outras funções que
devem estar na aplicação desenvolvida ou no dicionário de dados SX3 (X3_VALID). Estas funções são:
MaFisRef(), MaFisAlt(), MaFisAdd() e MaColsToFis(), Contudo, ela pode ser utilizada fora da MATXFIS
(aplicação desenvolvida) em situações muito especificas.
Parâmetros:
Retorno:
Procurar conter o uso o máximo possível, pois a função é de uso interno da MATXFIS e é chamada pelas
funções de uso externo MaFisRef(), MaFisAlt(), MaFisAdd() e MaColsToFis(), contudo há casos onde o uso
dela pode ser a única solução para executar o calculo de TODOS impostos em uma ordem especifica e para
se obter os resultados dos cálculos ANTES do termino do processo, como é o caso do programa
MATA461.PRX (Geração das Notas Fiscais de Saída) onde os valores calculados pela sua chamada interferem
diretamente nos valores que ainda serão usados na operação, como é o caso de valores passados, avaliados
e ou validados em pontos de entrada num determinado ponto da rotina, em resumo, o seu uso deve ser
restringido ao máximo em situações onde a chamada das demais funções mencionadas acima, podem
proporcionar a solução sem o seu uso.
Exemplos de Uso:
1) Trecho de código do programa MATA461.PRX onde é necessário o calculo de TODOS os impostos do item
ANTES da chamada de demais funções e pontos de entrada.
MaFisLoad("IT_ABVLISS",SC6->C6_ABATISS,nItem)
MaFisTes(SC6->C6_TES,SF4->(RecNo()),nItem)
MaFisLoad("IT_VALMERC",aRateio[RT_PRECOIT][3]+aRateio[RT_PRECOIT][4],nItem)
MaFisLoad("IT_PRCUNI",aRateio[RT_PRECOIT][1],nItem)
MaFisLoad("IT_VLR_FRT",aRateio[RT_VLR_FRT],nItem)
MaFisLoad("IT_FRETE",aRateio[RT_FRETE],nItem)
MaFisLoad("IT_SEGURO",aRateio[RT_SEGURO],nItem)
MaFisLoad("IT_DESPESA",aRateio[RT_DESPESA],nItem)
MaFisRecal("",nItem) // Realiza o calculo de TODOS os impostos do Item
dbSelectArea("SC6")
For nY := 1 to Len(aFisGet)
If !Empty( SC6->(FieldGet(FieldPos(aFisGet[ny][2])))
EndIf
Next nY
MaFisAlt("IT_ALIQISS",aRateio[RT_PRECOIT][5],nItem,.T.) // Alterada a Alíquota do ISS depois do
calculo do Item
If ( aEntry[EP_M460VISS] ) // Ponto de Entrada para ALTERAR o valor calculado do ISS pela
MATXFIS
MaFisLoad("IT_VALISS",ExecBlock("M460VISS",.F.,.F.,MaFisRet(nItem,"IT_VALISS")),nItem)
EndIf
Descrição da função:
Função utilizada para gravar os campos das tabelas do documento fiscal processado com o conteúdo das
referencias fiscais ( calculadas pela MATXFIS) referente aos campo da tabela, pode ser usada também para
ajustar todos os arredondamentos ANTES de iniciar a gravação dos campos.
Parâmetros:
Retorno:
Deve ser utilizada ao iniciar o processo de gravação do documento fiscal (Editado via interface de digitação
ou rotina de geração de notas) para ajustar os arredondamentos de todas as referencias fiscais calculadas e
após este passo gravar efetivamente todos os dados das referencias fiscais calculadas pela MATXFIS (aNFCab
e aNFItem) nos campos correspondentes das tabelas do documento fiscal, cabeçalho e itens, exemplo:
SF1/SD1, SF2/SD2.
Exemplos de Uso:
If nOpc == 1
a103Grava( Params....
End Transaction
EndIf
Function a103Grava( ....
SF4->( MaFisWrite( 2 , "SF1" ) ) // Grava nos campos da tabela SF1 os conteúdos das
referencias Fiscais calculadas na MATXFIS
// Gravando os itens na tabela SD1
For nX := 1 to Len(aCols)
SD1->D1_FILIAL := xFilial("SD1")
SD1->D1_FORNECE := cA100For
SD1->D1_LOJA := cLoja
SD1->D1_DOC := cNFiscal
….
SF4->( MaFisWrite( 2 , "SD1" , nX ) ) // Grava nos campos da tabela SD1 as referencias
Fiscais do item calculado pela MATXFIS
Next nX
Return
Descrição da função:
Embora o nome da função seja MaFisAtuSF3(), hoje a função grava alem da tabela SF3, as tabelas SFT e CD2,
utilizada sempre APÓS a gravação do documento fiscal para gravar todas as informações geradas pelo
documento fiscal nas tabelas SF3 – Livro Fiscal, SFT – Livro Fiscal por Item da NF e CD2 – Livro Digital de
Impostos SPED Fiscal. Deve ser utilizada também ao Excluir os documentos fiscais.
Parâmetros:
Retorno:
Utilizar na rotina de gravação do documento fiscal (editado ou gerado), logo após a gravação do cabeçalho e
dos itens, tanto quando for INCLUIR o documento, como EXCLUIR,
NUNCA GRAVE AS TABELAS SF3, SFT E CD2 NA ROTINA DE GRAVAÇÃO DA APLICAÇÃO, USE SEMPRE A
MaFisAtuSF3()
Exemplos de Uso:
If INCLUI
SF1->F1_DOC := cNFiscal
SF1->F1_STATUS := "A"
SF1->F1_SERIE := cSerie
SF1->F1_FORNECE := cA100For
SF1->F1_LOJA := cLoja
...
SF4->( MaFisWrite( 2 , "SF1" ) ) // Grava nos campos da tabela SF1 os conteúdos das
referencias Fiscais calculadas na MATXFIS
SD1->D1_FILIAL := xFilial("SD1")
SD1->D1_FORNECE := cA100For
SD1->D1_LOJA := cLoja
SD1->D1_DOC := cNFiscal
….
SF4->( MaFisWrite( 2 , "SD1" , nX ) ) // Grava nos campos da tabela SD1 as referencias
Fiscais do item calculado pela MATXFIS
Next nX
….
MaFisAtuSF3( 1 , "E" , 0 , "SF1" ) // Na Inclusão gravando as tabelas SF3, SFT e CD2
EndIf
Return
2.23 MaFisIniNF(nTipoNF,nRecSF,aOtimizacao,cAlias,lReprocess,cFunOrig)
Descrição da função:
A função carrega as notas fiscais de entrada e saída para a MATXFIS a partir das tabelas SF2/SD2
(Documentos de Saída) e SF1/SD1 (Documentos de Entrada), as referências fiscais são lidas do dicionário de
dados SX3 (X3_VALID) destas tabelas para efetuar a carga.
Parâmetros:
Retorno:
Deve ser utilizada para facilitar a leitura de documentos fiscais gravados de entrada e saída das tabelas
SF1/SD1 ou SF2/SD2, obter referencias fiscais destes documentos calculadas pela MATXFIS através da função
MaFisRet(). O uso principal da função está diretamente ligado ao programa MATA930.PRX
(Reprocessamento dos Livros Fiscais) onde o seu uso se dá através do parâmetro lReprocess que estando .T.
usa os dados gravados das tabelas SF1/SD1, SF2/SD2 como base para um NOVO CALCULO, quando este
novo calculo é realizado a MATXFIS utiliza a situação ATUAL de TODOS os cadastros envolvidos na geração
das notas fiscais, como TES, Cliente/Fornecedor, Exceção Fiscal, parâmetros SX6, com isso é possível
reconstruir os Livros Fiscais (Tabelas SF3/SFT) com as novas configurações dos cadastros.
Exemplos de Uso:
1) Exemplo de uma Função para obter valores calculados pela MATXFIS de um determinado item de uma
nota fiscal
Local nRet := 0
Default nRecSF := 0
Return (nRet)
Begin Transaction
//Efetua a exclusão dos registros referente a Nota Fiscal no SF3/SFT para serem gravados com os
NOVOS cálculos
dbSelectArea("SF3")
dbSetOrder(1)
MsSeek(xFilial("SF3")+Dtos((cAlias)->F1_DTDIGIT)+(cAlias)->F1_DOC+(cAlias)->F1_SERIE+(cAlias)-
>F1_FORNECE+(cAlias)->F1_LOJA)
...
RecLock('SF3',.F.,.T.)
dbDelete()
MsUnlock()
FkCommit()
…
dbSelectArea("SFT")
dbSetOrder(3)
MsSeek(xFilial("SFT")+"E"+SF3->F3_CLIEFOR+SF3->F3_LOJA+SF3->F3_SERIE+SF3->F3_NFISCAL+SF3-
>F3_IDENTFT)
….
RecLock('SFT',.F.,.T.)
dbDelete()
MsUnlock()
FkCommit()
MaFisWrite()
MaFisAtuSF3(1,"E",IIf(lQuery,(cAlias)->SF1RECNO,SF1->(RecNo())),"","",cCNAE)
MAFISCDA(,,.T.,(cAlias)-
>("E"+F1_ESPECIE+F1_FORMUL+F1_DOC+F1_SERIE+F1_FORNECE+F1_LOJA),(cAlias)-
>F1_FORMUL,cAlias)
MAFISCDA(,2,,(cAlias)-
>("E"+F1_ESPECIE+F1_FORMUL+F1_DOC+F1_SERIE+F1_FORNECE+F1_LOJA),(cAlias)-
>F1_FORMUL,cAlias)
2.24 MaFisBrwLivro(oWnd,aPosWnd,lVisual,aRecSF3,lOpcVisual)
Descrição da função:
Essa função cria um objeto de browse para exibição dos demonstrativos de livros fiscais, este objeto pode
estar disponível na dialog de digitação do documento fiscal em um Folder ou panel onde será possível
acompanhar os valores calculados ao digitar ou visualizar o documento.
Parâmetros:
Retorno:
01 oLivro Objeto Objeto browse com os dados do Livro Fiscal que será gravado na
tabela SF3.
Usar em interfaces de digitação de documentos fiscais de entrada e saída, em todas as operações, Inclui,
Alterar, Visualizar e excluir, é necessário que o ambiente da aplicação já tenha iniciado a MATXFIS.
Exemplos de Uso:
1) Trecho de código do programa MATA103.PRW (documento de entrada) para criação do FOLDER – Livros
Fiscais
….
oGetDados:=MSGetDados():New(aPosObj[2,1],aPosObj[2,2],aPosObj[2,3],aPosObj[2,4],nOpcx,'A103Lin
Ok','A103TudOk','+D1_ITEM',!l103Visual,,,,IIf(l103Class,Len(aCols),999),,,,IIf(l103Class,'AllwaysFalse()',"
NfeDelItem"))
oFolder:aDialogs[4]:oFont := oDlg:oFont
Descrição da função:
Essa função cria um objeto com o demonstrativo dos impostos calculados (Base, Alíquota e Valor), este
objeto pode estar disponível na dialog de digitação do documento fiscal em um Folder ou panel onde será
possível acompanhar os valores calculados ao digitar ou visualizar o documento fiscal. O Objeto também
permite que os impostos sejam editados no próprio browse clicando-se na Base e Valor do Imposto quando o
parâmetro lVisual = .F. , também com esta configuração é possível incluir novos impostos através de uma
lista apresentada em uma nova dialog disparada ao clicar 2 vezes (DoubleClick) na primeira linha do Browse
na coluna Código onde são apresentado três pontos (...).
Parâmetros:
Retorno:
Muito útil para visualizar os valores dos cálculos dos impostos no ato da digitação ou visualização de forma
resumida, é possível até editar os valores totais (Base e Valor) de cada imposto e a MATXFIS após a edição
rateia os valores editados entre os itens, também é possível acrescentar impostos que NÃO foram calculados
automaticamente no documento. Recomendamos que toda aplicação a ser desenvolvida e ou aplicações que
já existam SEM o uso desta função, implementar a mesma.
Exemplos de Uso:
oFolder:aDialogs[4]:oFont := oDlg:oFont
oFisRod := A103Rodape(oFolder:aDialogs[5])
l103Visual := .T.
Else
EndIf
Informações de Versão
Rotina/Fonte Data/Hora ChangeSet
MatxFis.prw 24/01/2013 – 17:01:51 136306
MatxDef.ch 17/12/2012 – 11:40:00 130348
Elaborado por: