Árvore de páginas

Versões comparadas

Chave

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

...

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.


Bloco de código
languagephpjs
themeRDarkMidnight
titleMA910AUT - 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.


Bloco de código
languagephpjs
themeRDarkMidnight
titleMA910AUT - 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
  
Informações
titleImportante!

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)

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.

Aviso
titleAtençã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ções
titleInformação

Este modo esta disponível para rotinas de integração, ou seja, os impostos já estão

Informações
titleInformaçã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.

Aviso
titleAtençã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

Bloco de código
languagejs
themeMidnight
User Function ExecM910()
    Local aCabec := {}
    Local aItens := {}
    Local aLinha := {}
    Local jId := jsonObject():New()
    Local jPropri := jsonObject():New()
    //Local nXcDoc  := 0" 900001"

    //Local nY  := 0
    Local cDoc := " 900001"

    PRIVATE 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["000062000060"]                := 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

Estrutura do JSON

Novos Tributos

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:

Bloco de código
languagejs
themeMidnight
		 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

Bloco de código
languagejs
themeMidnight
 {
      "000062000060": {
        "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,
       "vl_outros": 0.00,
       "vl_diferido": 0.00,
       "pc_diferido": 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
        }
 } 
Aviso
titleAtençã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:

Bloco de código
languagejs
themeMidnight
id_tributo
  |_base_valor
  |_aliquota
  |_valor

Composição JSON

Bloco de código
languagejs
themeMidnight
{
       "pc_reducao_base000021": 0,{
        "base_originalvalor": 010000,
        "pc_reducao_aliqaliquota": 010,
        "aliquota_originalvalor": 0.00500,
        }
 }
Aviso
titleAtenção

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


Propriedades do Tributo (F2D)

Propriedade

Descrição

Type

type

Obrigatório

base_valor

Valor da base do imposto

number

Sim

aliquotaAlíquota do tributonumber

base_quantidadeValor da base quando é operação com quantidadenumberNão*
base_umUnidade de medida (preenchimento obrigatório caso haja valor na propriedade base_quantidade)character
base_valor

Valor da base do imposto

number
Não*
aliquotaAlíquota do tributonumberSim
valorValor do impostonumber

Propriedades de escrituração (CJ3)

PropriedadeDescriçãoType
CSTClassificação fiscalcharacter
CCTCCT IBS/CBScharacter
vl_tributadoValor tributadonumber
vl_isentoValor isentonumber
vl_outrosValor outrosnumber

vl_diferido

Valor diferidonumber

pc_diferido

Percentual do diferimentonumber

pc_reducao_base

Percentual da reduçãonumber

base_original

Base originalnumber

pc_reducao_aliq

Percentual de redução de alíquotanumber

aliquota_original

Alíquota originalnumber

Tributos legados

Sim

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, exemploPara o funcionamento correto, os tributos legados (tributos correntes atualmente, antes da reforma) precisam ter pelo menos a seguinte estrutura:

Bloco de código
languagejs
themeMidnight
id_tributo
  |_base_valor
  |_base_quantidade
  |_base_um
  |_aliquota
  |_valor

Composição JSON

Bloco de código
languagejs
themeMidnightMidnight
{
      "000021": {
        "000021base_valor": {0,
        "base_valorquantidade": 10000,
        "base_um": "UM",
        "aliquota": 10,
        "valor": 500,           
        }
 }

Propriedades do Tributo (F2D)

Propriedade

Descrição 

Type

base_valor

Valor da base do imposto

number

base_quantidadeValor da base quando é operação com quantidadenumber
base_umUnidade de medida (preenchimento obrigatório caso haja valor na propriedade base_quantidade)character
aliquotaAlíquota do tributonumber
valorValor do impostonumber

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:

Bloco de código
languagejs
themeMidnight
id_tributo
  |_base_valor
  |_base_quantidade
  |_base_um
  |_aliquota
  |_valor

...

    }

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

Bloco de código
languagejs
themeMidnight
{
      "000021": {
        "base_valor": 0,
        "base_quantidade": 10000,
        "base_um": "UM",
        "aliquota": 10,
        "valor": 500,           
        }
    }

Propriedades de escrituração (CJ3)

Propriedade

DescriçãoType

tab_CST

Tabela CSTcharacter
CSTCSTcharacter
vl_tributadoValor tributadonumber
vl_isentoValor isentonumber
vl_outrosValor outrosnumber

vl_diferido

Valor diferidonumber

pc_diferido

Percentual do diferimentonumber

pc_reducao_base

Percentual da reduçãonumber

base_original

Base originalnumber

pc_reducao_aliq

Percentual de redução de alíquotanumber

aliquota_original

Alíquota originalnumbe

Em casos onde é necessário enviar a escrituração é obrigatório que todas as propriedades de escrituração estejam no JSON:

Estrutura JSON tributos legados completa

Midnight
		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

Bloco de código
languagejs
themeMidnight
id_tributo
   |_base_valor
   |_base_quantidade{
   |_base_um
   |_aliquota
   "000021": {    |_valor
   |_tab_CST
   |_CST
	   |_vl_tributado "base_valor": 0,
   |_vl_isento
   |_vl_outros
   |_vl_diferido"base_quantidade": 10000,
   |_pc_diferido
   |_pc_reducao_base
   |_"base_originalum": "UM",
   |_pc_reducao_aliq
     |_aliquota_original

Composição JSON

Bloco de código
languagejs
themeMidnight
{
"aliquota": 10,
        "valor": "000021500,
		"mva": 0,
		"aux_mva": {
        "base_valor0,
		"pauta" : 0,
		"vl_majorado": 0,
        "base_quantidade		"aux_majoracao": 100000,
        "base_um		"vl_majoracao": "UM",
        "aliquota": 10,
        "valor": 5000,
		"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

Novos tributos

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

  • Regra de Base
  • Regra de Alíquota
  • Regra de Escrituração
  • Regra de Cálculo

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

Tributos legados

        }
    }

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