Árvore de páginas


01. Visão Geral

Esta rotina foi construída nos mesmos moldes da rotina MATA103, portanto todas as observações valem também para este item.

Podemos consultar o exemplo MA910AUT.PRW.

02. Exemplo de Utilização

Para utilização desta rotina, necessitamos somente dos arrays de capa e item porém vale uma observação importante para eles sobre os valores dos impostos.

Sobre estes valores de impostos, a rotina possui duas formas de tratamento ( automática e manual ) conforme veremos a seguir.

Automática

A forma automática é a mais aconselhada pela Totvs para a maioria dos casos.

Para utilizar os cálculos automatizados de impostos do sistema, basta NÃO utilizar NENHUMA referência de impostos nos arrays (capa e itens) criados na rotina, além de também informar no último nível do array do item (penúltima posição) o respectivo código do TES (Tipo de entrada/saída - Tabela SF4) utilizado da operação.


MA910AUT - Impostos automáticos
#include 'totvs.ch'
#include 'rwmake.ch'

     /*
     {Protheus.doc} ExecMta910
     ExecAuto Mata910
     @type  Function
    */

User Function MA910AUT()

	Local aCabM910 := {}
	Local aItemM910 := {}
	Local aLinha := {}
	Private lMsErroAuto := .F.

	aadd(aCabM910,{"F1_TIPO","N"})
	aadd(aCabM910,{"F1_DOC","000000003"})
	aadd(aCabM910,{"F1_SERIE","001"})
	aadd(aCabM910,{"F1_EMISSAO",dDatabase})
	aadd(aCabM910,{"F1_FORNECE","COM003"})
	aadd(aCabM910,{"F1_LOJA","01"})
	aadd(aCabM910,{"F1_ESPECIE","SPED"})

	
	aadd(aLinha,{"D1_ITEM" ,"0001",Nil})
	aadd(aLinha,{"D1_COD" ,"000000000000000000000000000010",Nil})
	aadd(aLinha,{"D1_QUANT",1,Nil})
	aadd(aLinha,{"D1_VUNIT",100,Nil})
	aadd(aLinha,{"D1_TOTAL",100,Nil})
	aadd(aLinha,{"D1_TES","10A",Nil})

	aadd(aItemM910,aLinha)

	MSExecAuto({|x,y,z| mata910(x,y,z)},aCabM910,aItemM910,3)

	if lMsErroAuto
		MostraErro()
	else
		FwAlertInfo("Nota Incluida Com Sucesso","TOTVS")
	endif

Return 


Manual

Esta forma é muito utilizada nas integrações com outros sistemas, onde os cálculos dos tributos já foram efetuados na origem e por tal motivo na importação para o Protheus eles não devam ser recalculados e/ou alterados.

Para que esses valores sejam respeitados na importação, basta fazer o procedimento contrário ao item anterior ( Forma automática ), ou seja, informar as referência dos impostos e enviar na primeira posição do array do item a referência do TES (Tipo de entrada/saída - Tabela SF4) do respectivo item.


MA910AUT - Impostos Manuais
#include 'totvs.ch'
#include 'rwmake.ch'

     /*
     {Protheus.doc} ExecMta910
     ExecAuto Mata910
     @type  Function
    */

User Function ExecMta910()

	Local aCabM910 := {}
	Local aItemM910 := {}
	Local aLinha := {}
	Private lMsErroAuto := .F.

	aAdd(aCabM910,{"F1_TIPO","N"})
    aAdd(aCabM910,{"F1_FORMUL" ,"N"})
	aAdd(aCabM910,{"F1_DOC","000000004"})
	aAdd(aCabM910,{"F1_SERIE","001"})
	aAdd(aCabM910,{"F1_EMISSAO",dDatabase})
	aAdd(aCabM910,{"F1_FORNECE","COM003"})
	aAdd(aCabM910,{"F1_LOJA","01"})
	aAdd(aCabM910,{"F1_ESPECIE","SPED"})
	aAdd(aCabM910,{"F1_COND","001"})
	aAdd(aCabM910,{"F1_DESCONT",0})
	aAdd(aCabM910,{"F1_FRETE",0})
	aAdd(aCabM910,{"F1_SEGURO",0})
	aAdd(aCabM910,{"F1_DESPESA",0})  

	/*
		Os valores de impostos somente devem ser informados caso NAO deva ser efetuado o calculo 
		automático pelas rotinas fiscais do sistema.   
		Normalmente as referencias de impostos são passadas quando a importação automática vem   
		de uma integração com outro sistema, onde todos os valores já foram calculados e  
		NAO podem ser alterados.   
	*/

    aAdd(aCabM910,{"F1_BASEICM",100}) // BASE
	aAdd(aCabM910,{"F1_BASEIPI",40})  // BASE
	aAdd(aCabM910,{"F1_VALICM",10})   // VALOR
	aAdd(aCabM910,{"F1_VALIPI",4})	  // VALOR

    
	aAdd(aLinha,{"D1_ITEM" ,"0001",Nil})
	aAdd(aLinha,{"D1_COD" ,"000000000000000000000000000010",Nil})
	aAdd(aLinha,{"D1_QUANT",1,Nil})
	aAdd(aLinha,{"D1_VUNIT",100,Nil})
	aAdd(aLinha,{"D1_TOTAL",100,Nil})
	aAdd(aLinha,{"D1_TES","10A",Nil})

     /* 
		O mesmo tratamento para os impostos comentados acima, vale para os itens também. Portanto só    
		deve ser utilizado quando NAO houver necessidade que o sistema calcule automaticamente.
    */    
    
    aAdd(aLinha,{"D1_IPI",2,Nil})		// Aliquota
	aAdd(aLinha,{"D1_PICM",2,Nil})		// Aliquota
	aAdd(aLinha,{"D1_BASEIPI",40,Nil})  // BASE
	aAdd(aLinha,{"D1_BASEICM",100,Nil}) // BASE
	aAdd(aLinha,{"D1_VALIPI",4,Nil})    // VALOR
	aAdd(aLinha,{"D1_VALICM",10,Nil})   // VALOR

	aAdd(aItemM910,aLinha)

	MSExecAuto({|x,y,z| mata910(x,y,z)},aCabM910,aItemM910,3) 

	If lMsErroAuto
		MostraErro()
	else
		FwAlertInfo("Nota Incluida Com Sucesso","TOTVS")
	endif

return
  

Importante!

Quando se utiliza as referências de impostos, para que os valores sejam respeitados, é muito importante que uma ordem de estruturação do array seja seguida, tanto para o array de capa quanto para o array de itens.

Primeiramente, devem ser declarados todos os valores de alíquotas, seguido dos valores de base e por último os valores dos tributos.

Uma exceção é o array de capa, que não pode conter nenhuma referência de alíquota, somente referências de base e valor do tributo.

03. Integração novos tributos via Configurador de Tributos (FISA170)

Atenção

Esta atualização será disponibilizada na Expedição contínua de DEZEMBRO/2025 e o pacote poderá ser acessado através dos links disponibilizados na documentação Pacotes de Atualização - Fiscal.

Informações sobre a Expedição contínua acessar: http://tdn.totvs.com/x/H4uCEw.

Informações sobre o compatibilizador UPDDISTR acessar: Atualizador de dicionário e base de dados - UPDDISTR.

Visando a reforma tributária, o método descrito abaixo tem por objetivo possibilitar o envio dos novos tributos cadastrados no Configurador de Tributos com Operandos de Integração via MSExecAuto gravando os tributos diretamente nas tabelas F2D e CJ3.

Informação

Este modo esta disponível para rotinas de integração, ou seja, os impostos já estão calculados, não sendo necessário o recalculo pelo motor de calculo do Protheus.

Para que a recepção ocorra corretamente, é necessário enviar um JSON contendo os códigos de identificação dos tributos (ID Totvs), e neles as propriedades obrigatórias de valores de tributos e escrituração. Tendo isso, basta inserir o JSON com uma propriedade TRIBUTOS no array da linha.

Atenção

Os tributos obrigatoriamente tem que ser incluídos dentro de cada linha de item e com a propriedade TRIBUTOS, ou seja, um conjunto de tributos será referente por item.

Exemplo de implementação

User Function ExecM910()
    Local aCabec := {}
    Local aItens := {}
    Local aLinha := {}
    Local jId := jsonObject():New()
    Local jPropri := jsonObject():New()
    Local cDoc := " 900001"

    PRIVATE lMsErroAuto := .F.

    //--Abertura do ambiente --//
    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "XIFIS26" MODULO "FIS" TABLES "SF1","SD1","SA1","SA2","SB1","SB2","SF4","SED","SE1"

    //--Monta a capa do documento fiscal--//
    aadd(aCabec, {"F1_TIPO"   , "N"})
    aadd(aCabec, {"F1_DOC"    , cDoc})
    aadd(aCabec, {"F1_SERIE"  , "001"})
    aadd(aCabec, {"F1_EMISSAO", dDataBase})
    aadd(aCabec, {"F1_FORNECE", "SP0002"})
    aadd(aCabec, {"F1_LOJA"   , "01"})
    aadd(aCabec, {"F1_ESPECIE", "SPED"})
    aadd(aCabec, {"F1_COND"   , "001"})
    aadd(aCabec, {"F1_DESCONT", 0})
    aadd(aCabec, {"F1_FRETE"  , 0})
    aadd(aCabec, {"F1_SEGURO" , 0})
    aadd(aCabec, {"F1_DESPESA", 0})

    //--Montagem dos itens do documento fiscal--//
    aadd(aLinha,{"D1_ITEM" ,"0001",Nil})
    aadd(aLinha,{"D1_COD"  ,"PA0000000000000000000000000002",Nil}) 
    aadd(aLinha,{"D1_QUANT",1,Nil})
    aadd(aLinha,{"D1_VUNIT",1000,Nil}) 
    aadd(aLinha,{"D1_TOTAL",1000,Nil})
    aadd(aLinha,{"D1_TES","00C",Nil})

	//--Montagem do Json de Tributos
    jPropri["base_valor"]        := 1000
    jPropri["base_quantidade"]   := 0
    jPropri["base_um"]           := ""
    jPropri["aliquota"]          := 18
    jPropri["valor"]             := 180
    jPropri["CST"]               := "000"
    jPropri["CCT"]               := "003"
    jPropri["vl_tributado"]      := 6.55
    jPropri["vl_isento"]         := 0.00
    jPropri["vl_outros"]         := 0.00
    jPropri["vl_diferido"]       := 0.00
    jPropri["pc_diferido"]       := 0
    jPropri["pc_reducao_base"]   := 0
    jPropri["base_original"]     := 0
    jPropri["pc_reducao_aliq"]   := 0
    jPropri["aliquota_original"] := 0.00

    jId["000060"]                := jPropri // 000060 sendo o ID do IBS Estadual

    jPropri                      := jsonObject():New()

    jPropri["base_valor"]        := 1000
    jPropri["base_quantidade"]   := 0
    jPropri["base_um"]           := ""
    jPropri["aliquota"]          := 18
    jPropri["valor"]             := 180

    jId["000021"]                := jPropri // 000021 sendo o ID do ICMS

 	//--Inclusão do JSON dos tributos junto com a propriedade TRIBUTOS (obrigatória)
    aadd(aLinha, {"TRIBUTOS", jId})

    aadd(aItens,aLinha)

    //--Teste de inclusao do documento fiscal--//

    MSExecAuto({|x,y,z| mata910(x,y,z)}, aCabec, aItens, 3)

    If !lMsErroAuto
        Conout("Incluido com sucesso! "+cDoc)
    Else
        Conout("Erro na inclusao do documento!")
    EndIf

    ConOut("Fim do processamento!"+ Time())

    RESET ENVIRONMENT

return

No exemplo demonstrado acima estão sendo utilizados os Id's 000060 e 000021, ou seja, o produto PA0000000000000000000000000002 terá os tributos IBS ESTADUAL e ICMS gravados. Para mais informações sobre os ID's Totvs consulte aqui.

Estrutura do JSON

Novos Tributos

Os novos tributos (tributos da reforma), obrigatoriamente precisam conter a seguinte estrutura:

		 id_tributo
           |_base_valor
           |_base_quantidade
           |_base_um
           |_aliquota
           |_valor
           |_esc_CST
           |_esc_CCT
           |_esc_vl_tributado
           |_esc_vl_isento
           |_esc_vl_outros
           |_esc_vl_diferido
           |_esc_pc_diferido
           |_esc_pc_reducao_base
           |_esc_base_original
           |_esc_pc_reducao_aliq
           |_esc_aliquota_original

Composição JSON

 {
      "000060": {
        "base_valor": 0,
        "base_quantidade": 10000,
        "base_um": "UM",
        "aliquota": 10,
        "valor": 500,
        "esc_CST": "000",
        "esc_CCT": "003",
        "esc_vl_tributado": 6.55,
        "esc_vl_isento": 0.00,
        "esc_vl_outros": 0.00,
        "esc_vl_diferido": 0.00,
        "esc_pc_diferido": 0,
        "esc_pc_reducao_base": 0,
        "esc_base_original": 0,
        "esc_pc_reducao_aliq": 0,
        "esc_aliquota_original": 0.00
        }
 } 

Atenção

Caso a estrutura não seja respeitada o processamento será interrompido.

Propriedades do Tributo (F2D)

PropriedadeDescriçãoTypeObrigatório?
base_valor

Valor da base do imposto

number

Sim

base_quantidadeValor da base quando é operação com quantidadenumberNão*
base_umUnidade de medidacharacterNão*
aliquotaAlíquota do tributonumberSim
valorValor do impostonumberSim

Propriedades de escrituração (CJ3)

PropriedadeDescriçãoTypeObrigatório?
esc_CSTClassificação fiscalcharacterNão
esc_CCTCCT IBS/CBScharacterNão
esc_vl_tributadoValor tributadonumberSim
esc_vl_isentoValor isentonumberSim
esc_vl_outrosValor outrosnumberSim

esc_vl_diferido

Valor diferidonumberNão

esc_pc_diferido

Percentual do diferimentonumberNão

esc_pc_reducao_base

Percentual da reduçãonumberNão

esc_base_original

Base originalnumberNão

esc_pc_reducao_aliq

Percentual de redução de alíquotanumberNão

esc_aliquota_original

Alíquota originalnumberNão

Tributos legados

Para o funcionamento correto, os tributos legados (tributos correntes atualmente, antes da reforma) precisam ter pelo menos a seguinte estrutura:

id_tributo
  |_base_valor
  |_aliquota
  |_valor

Composição JSON

{
      "000021": {
        "base_valor": 10000,
        "aliquota": 10,
        "valor": 500,
        }
 }


Propriedades do Tributo (F2D)

Propriedade

Descrição

type

Obrigatório

base_valor

Valor da base do imposto

number

Sim

base_quantidadeValor da base quando é operação com quantidadenumberNão*
base_umUnidade de medida (preenchimento obrigatório caso haja valor na propriedade base_quantidade)characterNão*
aliquotaAlíquota do tributonumberSim
valorValor do impostonumberSim

mva

Índice de cálculo MVAnumberNão

aux_mva

Índice de cálculo auxiliar do MVAnumberNão

pauta

PautanumberNão

vl_majorado

Percentual de MajoraçãonumberNão

aux_majoracao

Indice auxiliar do percentual de majorçãonumberNão

vl_majoracao

Valor MajoraçãonumberNão

pc_majorcao

Alíquota MajoraçãonumberNão

aliquota_tribut

Alíquota do Tributo por regra de NCMnumberNão

ded_dep

Dedução por dependentesnumberNão

Base quantidade

* Em casos onde é necessário enviar o valor da base por quantidade é obrigatório o envio de todas as propriedades do tributo, sendo necessário também o preenchimento da propriedade base_um, exemplo:

id_tributo
  |_base_valor
  |_base_quantidade
  |_base_um
  |_aliquota
  |_valor

Composição JSON

{
      "000021": {
        "base_valor": 0,
        "base_quantidade": 10000,
        "base_um": "UM",
        "aliquota": 10,
        "valor": 500,           
        }
    }

Propriedades de escrituração (CJ3)

PropriedadeDescriçãotypeObrigatório?

esc_tab_CST

Tabela CSTcharacterNão
esc_CSTCSTcharacterNão
esc_vl_tributadoValor tributadonumberSim
esc_vl_isentoValor isentonumberSim
esc_vl_outrosValor outrosnumberSim

esc_vl_diferido

Valor diferidonumberNão

esc_pc_diferido

Percentual do diferimentonumberNão

esc_pc_reducao_base

Percentual da reduçãonumberNão

esc_base_original

Base originalnumberNão

esc_pc_reducao_aliq

Percentual de redução de alíquotanumberNão

esc_aliquota_original

Alíquota originalnumberNão

Estrutura JSON tributos legados completa

		id_tributo 
 			|_base_valor
		 	|_base_quantidade
        	|_base_um
        	|_aliquota
        	|_valor
 		 	|_mva
			|_aux_mva
			|_pauta
			|_vl_majorado
			|_aux_majoracao
			|_vl_majoracao
			|_pc_majorcao
			|_aliquota_tribut
			|_ded_dep 
            |_esc_tab_CST
        	|_esc_CST
        	|_esc_vl_tributado
        	|_esc_vl_isento
        	|_esc_vl_outros
        	|_esc_vl_diferido
        	|_esc_pc_diferido
        	|_esc_pc_reducao_base
        	|_esc_base_original
        	|_esc_pc_reducao_aliq
        	|_esc_aliquota_original

Composição JSON

{
      "000021": {          
	    "base_valor": 0,
        "base_quantidade": 10000,
        "base_um": "UM",
        "aliquota": 10,
        "valor": 500,
		"mva": 0,
		"aux_mva": 0,
		"pauta" : 0,
		"vl_majorado": 0,
		"aux_majoracao": 0,
		"vl_majoracao": 0,
		"pc_majorcao": 0,
		"aliquota_tribut": 0,
		"ded_dep": 0,
        "esc_tab_CST": "000001",
        "esc_CST": "001",
        "esc_vl_tributado": 6.55,
        "esc_vl_isento": 0.00,
        "esc_vl_outros": 0.00,
        "esc_vl_diferido": 0.00,
        "esc_pc_diferido": 0,
        "esc_pc_reducao_base": 0,
        "esc_base_original": 0,
        "esc_pc_reducao_aliq": 0,
        "esc_aliquota_original": 0.00
          }
    }

Regras Operandos de Integração

Para que a integração funcione é necessário que o Operando de integração esteja configurado nas seguintes regras:

  • Regra de Base
  • Regra de Alíquota
  • Regra de Cálculo

No caso da Regra de Escrituração ela só será necessária, caso no JSON, seja informada alguma propriedade de escrituração. Caso o contrário a classe respeitará a regra de escrituração amarrada ao tributo, se houver.

Caso alguma dessas configurações não esteja de acordo será retornada uma mensagem de warning e o processamento será interrompido.

Informações Relacionadas