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.


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


#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
  

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.

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.

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
  |_CST
  |_CCT
  |_vl_tributado
  |_vl_isento
  |_vl_outros
  |_vl_diferido
  |_pc_diferido
  |_pc_reducao_base
  |_base_original
  |_pc_reducao_aliq
  |_aliquota_original

Composição JSON

{
     "000060": {
       "base_valor": 0,
       "base_quantidade": 10000,
       "base_um": "UM",
       "aliquota": 10,
       "valor": 500,
       "CST": "000",
       "CCT": "003",
       "vl_tributado": 6.55,
       "vl_isento": 0.00,
       "vl_outros": 0.00,
       "vl_diferido": 0.00,
       "pc_diferido": 0,
       "pc_reducao_base": 0,
       "base_original": 0,
       "pc_reducao_aliq": 0,
       "aliquota_original": 0.00
       }
}

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

Propriedades do Tributo (F2D)

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

Valor da base do imposto

number

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

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

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:

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)


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



id_tributo
   |_base_valor
   |_base_quantidade
   |_base_um
   |_aliquota
   |_valor
   |_tab_CST
   |_CST
   |_vl_tributado
   |_vl_isento
   |_vl_outros
   |_vl_diferido
   |_pc_diferido
   |_pc_reducao_base
   |_base_original
   |_pc_reducao_aliq
   |_aliquota_original

Composição JSON



{
      "000021": {
        "base_valor": 0,
        "base_quantidade": 10000,
        "base_um": "UM",
        "aliquota": 10,
        "valor": 500,
        "tab_CST": "000001",
        "CST": "001",
        "vl_tributado": 6.55,
        "vl_isento": 0.00,
        "vl_outros": 0.00,
        "vl_diferido": 0.00,
        "pc_diferido": 0,
        "pc_reducao_base": 0,
        "base_original": 0,
        "pc_reducao_aliq": 0,
        "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:

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

Tributos legados

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

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