Histórico da Página
...
Esta rotina foi construída nos mesmo mesmos moldes do MATA103. Portanto da rotina MATA103, portanto todas as observações valem também valem para este item também.
Podemos consultar o exemplo MA910AUT.PRW.
...
Para utilização desta rotina, necessitamos somente dos arrays de capa e item, conforme descrito anteriormente. Porém vale porém vale uma observação importante para eles sobre os valores dos impostos.
A Sobre estes valores de impostos, a rotina possui duas formas de tratamento dos valores de impostos.
...
( 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 de informar , no último nível do do array do item, na última posição, 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 | ||||||
|---|---|---|---|---|---|---|
| ||||||
#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 devem devam ser recalculados e/ou alterados.
Para que esses valores sejam respeitados na importação, basta fazer o procedimento contrário ao item comentado anteriormente Automáticoanterior ( Forma automática ), ou seja, informar as referência dos impostos e enviar , na primeira posição do do array do do item a referência do TES (Tipo de entrada/saída - Tabela SF4) do respectivo item.
| Bloco de código | ||||||
|---|---|---|---|---|---|---|
| ||||||
#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.
aaddaAdd(aCabM910,{"F1_TIPO","N"})
aaddaAdd(aCabM910,{"F1_FORMUL" ,"N"})
aaddaAdd(aCabM910,{"F1_DOC","000000004"})
aaddaAdd(aCabM910,{"F1_SERIE","001"})
aaddaAdd(aCabM910,{"F1_EMISSAO",dDatabase})
aaddaAdd(aCabM910,{"F1_FORNECE","COM003"})
aaddaAdd(aCabM910,{"F1_LOJA","01"})
aaddaAdd(aCabM910,{"F1_ESPECIE","SPED"})
aaddaAdd(aCabM910,{"F1_COND","001"})
aaddaAdd(aCabM910,{"F1_DESCONT",0})
aaddaAdd(aCabM910,{"F1_FRETE",0})
aaddaAdd(aCabM910,{"F1_SEGURO",0})
aaddaAdd(aCabM910,{"F1_DESPESA",0})
/*
Os valores de impostos somente devem ser informados caso aadd(aCabM910,{"F1_BASEICM",100})
aadd(aCabM910,{"F1_BASEIPI",40})
aadd(aCabM910,{"F1_VALICM",10})
aadd(aCabM910,{"F1_VALIPI",4})
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(aLinha,{"D1_IPI",2,Nil})
aadd(aLinha,{"D1_PICM",2,Nil})
aadd(aLinha,{"D1_BASEIPI",40,Nil})
aadd(aLinha,{"D1_BASEICM",100,Nil})
aadd(aLinha,{"D1_VALIPI",4,Nil})
aadd(aLinha,{"D1_VALICM",10,Nil})
aadd(aItemM910,aLinha)
MSExecAuto({|x,y,z| mata910(x,y,z)},aCabM910,aItemM910,3) //Inclusao
If lMsErroAuto
MostraErro()
else
FwAlertInfo("Nota Incluida Com Sucesso","TOTVS")
endif
return
| ||||||
| Informações | ||||||
| ||||||
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 | ||
|---|---|---|
| ||
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)
| Aviso | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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 | ||
|---|---|---|
| ||
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 | ||||
|---|---|---|---|---|
| ||||
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:
| Bloco de código | ||||
|---|---|---|---|---|
| ||||
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 | ||||
|---|---|---|---|---|
| ||||
{
"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
}
} |
| Aviso | ||
|---|---|---|
| ||
Caso a estrutura não seja respeitada o processamento será interrompido. |
Propriedades do Tributo (F2D)
| Propriedade | Descrição | Type | Obrigatório? |
|---|---|---|---|
| base_valor | Valor da base do imposto | number | Sim |
| base_quantidade | Valor da base quando é operação com quantidade | number | Não* |
| base_um | Unidade de medida | character | Não* |
| aliquota | Alíquota do tributo | number | Sim |
| valor | Valor do imposto | number | Sim |
Propriedades de escrituração (CJ3)
| Propriedade | Descrição | Type | Obrigatório? |
|---|---|---|---|
| esc_CST | Classificação fiscal | character | Não |
| esc_CCT | CCT IBS/CBS | character | Não |
| esc_vl_tributado | Valor tributado | number | Sim |
| esc_vl_isento | Valor isento | number | Sim |
| esc_vl_outros | Valor outros | number | Sim |
esc_vl_diferido | Valor diferido | number | Não |
esc_pc_diferido | Percentual do diferimento | number | Não |
esc_pc_reducao_base | Percentual da redução | number | Não |
esc_base_original | Base original | number | Não |
esc_pc_reducao_aliq | Percentual de redução de alíquota | number | Não |
esc_aliquota_original | Alíquota original | number | Nã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 | ||||
|---|---|---|---|---|
| ||||
id_tributo
|_base_valor
|_aliquota
|_valor |
Composição JSON
| Bloco de código | ||||
|---|---|---|---|---|
| ||||
{
"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_quantidade | Valor da base quando é operação com quantidade | number | Não* |
| base_um | Unidade de medida (preenchimento obrigatório caso haja valor na propriedade base_quantidade) | character | Não* |
| aliquota | Alíquota do tributo | number | Sim |
| valor | Valor do imposto | number | Sim |
mva | Índice de cálculo MVA | number | Não |
aux_mva | Índice de cálculo auxiliar do MVA | number | Não |
pauta | Pauta | number | Não |
vl_majorado | Percentual de Majoração | number | Não |
aux_majoracao | Indice auxiliar do percentual de majorção | number | Não |
vl_majoracao | Valor Majoração | number | Não |
pc_majorcao | Alíquota Majoração | number | Não |
aliquota_tribut | Alíquota do Tributo por regra de NCM | number | Não |
ded_dep | Dedução por dependentes | number | Nã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:
| Bloco de código | ||||
|---|---|---|---|---|
| ||||
id_tributo
|_base_valor
|_base_quantidade
|_base_um
|_aliquota
|_valor |
Composição JSON
| Bloco de código | ||||
|---|---|---|---|---|
| ||||
{
"000021": {
"base_valor": 0,
"base_quantidade": 10000,
"base_um": "UM",
"aliquota": 10,
"valor": 500,
}
} |
Propriedades de escrituração (CJ3)
| Propriedade | Descrição | type | Obrigatório? |
|---|---|---|---|
esc_tab_CST | Tabela CST | character | Não |
| esc_CST | CST | character | Não |
| esc_vl_tributado | Valor tributado | number | Sim |
| esc_vl_isento | Valor isento | number | Sim |
| esc_vl_outros | Valor outros | number | Sim |
esc_vl_diferido | Valor diferido | number | Não |
esc_pc_diferido | Percentual do diferimento | number | Não |
esc_pc_reducao_base | Percentual da redução | number | Não |
esc_base_original | Base original | number | Não |
esc_pc_reducao_aliq | Percentual de redução de alíquota | number | Não |
esc_aliquota_original | Alíquota original | number | Não |
Estrutura JSON tributos legados completa
| Bloco de código | ||||
|---|---|---|---|---|
| ||||
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 | ||||
|---|---|---|---|---|
| ||||
{
"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.