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.
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.
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 |
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. |
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. |
User Function ExecM910()
Local aCabec := {}
Local aItens := {}
Local aLinha := {}
Local jId := jsonObject():New()
Local jPropri := jsonObject():New()
//Local nX := 0
//Local nY := 0
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
jPropri := jsonObject():New()
jPropri["base_valor"] := 1000
jPropri["base_quantidade"] := 0
jPropri["base_um"] := ""
jPropri["aliquota"] := 18
jPropri["valor"] := 180
jId["000021"] := jPropri
//--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.
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)
| Propriedade | Descrição | Type |
|---|---|---|
| aliquota | Alíquota do tributo | number |
| base_quantidade | Valor da base quando é operação com quantidade | number |
| base_um | Unidade de medida (preenchimento obrigatório caso haja valor na propriedade base_quantidade) | character |
| base_valor | Valor da base do imposto | number |
| valor | Valor do imposto | number |
Propriedades de escrituração (CJ3)
| Propriedade | Descrição | Type |
|---|---|---|
| CST | Classificação fiscal | character |
| CCT | CCT IBS/CBS | character |
| vl_tributado | Valor tributado | number |
| vl_isento | Valor isento | number |
| vl_outros | Valor outros | number |
vl_diferido | Valor diferido | number |
pc_diferido | Percentual do diferimento | number |
pc_reducao_base | Percentual da redução | number |
base_original | Base original | number |
pc_reducao_aliq | Percentual de redução de alíquota | number |
aliquota_original | Alíquota original | number |
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_quantidade | Valor da base quando é operação com quantidade | number |
| base_um | Unidade de medida (preenchimento obrigatório caso haja valor na propriedade base_quantidade) | character |
| aliquota | Alíquota do tributo | number |
| valor | Valor do imposto | number |
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ção | Type |
|---|---|---|
tab_CST | Tabela CST | character |
| CST | CST | character |
| vl_tributado | Valor tributado | number |
| vl_isento | Valor isento | number |
| vl_outros | Valor outros | number |
vl_diferido | Valor diferido | number |
pc_diferido | Percentual do diferimento | number |
pc_reducao_base | Percentual da redução | number |
base_original | Base original | number |
pc_reducao_aliq | Percentual de redução de alíquota | number |
aliquota_original | Alíquota original | numbe |
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
}
} |
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.
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.