As rotinas automáticas de documentos fiscais visam atender o mesmo critério de uma inclusão manual pelo sistema, porém de uma forma transparente e sem intervenção.
Temos pelo menos 3 funcionalidades básicas para atender esta demanda, todas elas utilizam dois arrays, um contendo as informações da capa e outro dos itens do documento, além de algum outro parâmetro específico de cada uma.
Podemos ver nos exemplos a seguir, que esses arrays utilizam como referência campos das próprias tabelas, portanto qualquer campo criado pode ser alimentado por meio desta funcionalidade, basta referencia-lo nos arrays.
Para utilização desta rotina, necessitamos somente dos arrays de capa e item, conforme descrito anteriormente.
Porém vale uma observação importante para eles sobre os valores dos impostos.
A rotina possui duas formas de tratamento dos valores de impostos:
Automática, a forma 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 também de informar, no último nível do array do item, na última posição, o respectivo TES da operação.
#INCLUDE "TBICONN.CH" USER Function MA103AUT() Local aCabs := {} Local aItens := {} Local cDoc := "000007" PRIVATE lMsErroAuto := .F. PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "XIFIS26" MODULO "COM" TABLES "SF1","SD1","SA1","SA2","SB1","SB2","SF4","SED","SE2" //Montagem da capa do documento fiscal aAdd(aCabs, {'F1_TIPO ', 'N' ,}) aAdd(aCabs, {'F1_FORMUL ', 'N' ,}) aAdd(aCabs, {'F1_DOC ', cDoc ,}) aAdd(aCabs, {'F1_SERIE ', 'AUT' ,}) aAdd(aCabs, {'F1_EMISSAO', dDataBase ,}) aAdd(aCabs, {'F1_FORNECE', '000001' ,}) aAdd(aCabs, {'F1_LOJA ', '01' ,}) aAdd(aCabs, {'F1_ESPECIE', 'NF' ,}) aAdd(aCabs, {'F1_COND ', '001' ,}) aadd(aCabs, {'E2_NATUREZ',"TUDO" ,}) //Montagem dos itens do documento fiscal (1. item) aAdd(aItens, {}) aAdd(aItens[Len(aItens)], {'D1_TES ', "021" ,}) aAdd(aItens[Len(aItens)], {'D1_COD ', 'PA0000000000000000000000000001',}) aAdd(aItens[Len(aItens)], {'D1_QUANT ', 1 ,}) aAdd(aItens[Len(aItens)], {'D1_VUNIT ', 100 ,}) aAdd(aItens[Len(aItens)], {'D1_TOTAL ', 100 ,}) aAdd(aItens[Len(aItens)], {'D1_CF ', '1101' ,}) aAdd(aItens[Len(aItens)], {'D1_LOCAL ', '01' ,}) //Montagem dos itens do documento fiscal (2. item) aAdd(aItens, {}) aAdd(aItens[Len(aItens)], {'D1_TES ', "021" ,}) aAdd(aItens[Len(aItens)], {'D1_COD ', 'PA0000000000000000000000000002',}) aAdd(aItens[Len(aItens)], {'D1_QUANT ', 1 ,}) aAdd(aItens[Len(aItens)], {'D1_VUNIT ', 100 ,}) aAdd(aItens[Len(aItens)], {'D1_TOTAL ', 100 ,}) aAdd(aItens[Len(aItens)], {'D1_CF ', '1101' ,}) aAdd(aItens[Len(aItens)], {'D1_LOCAL ', '01' ,}) //Chamada da rotina automatica MSExecAuto ({|x,y,z| MATA103 (x,y,z)}, aCabs, aItens, 3) //Tratamento de erro If !lMsErroAuto ConOut(OemToAnsi("Documento "+cDoc+"/AUT gerado com sucesso!")) Else ConOut(OemToAnsi("Erro na inclusão")) MostraErro() EndIf RESET ENVIRONMENT Return .T. |
Manual. Esta forma é muito utilizada nas integrações com outros sistemas onde os cálculos dos tributos já foram efetuados na origem, e na importação para o Protheus eles não devem ser recalculados e alterados.
Para que esses valores sejam respeitados na importação, basta fazer o procedimento contrário ao item comentado anteriormente Automático, ou seja, informar as referência dos impostos e enviar, na primeira posição do array do item a referência do TES do respectivo item.
Quando se utilizam 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 de itens. Primeiramente, devem ser declarados todos os valores de alíquotas, depois os 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 os de base e valor do tributo. |
#INCLUDE "TBICONN.CH" USER Function MA103AUT() Local aCabs := {} Local aItens := {} Local cDoc := "000007" PRIVATE lMsErroAuto := .F. PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "XIFIS26" MODULO "COM" TABLES "SF1","SD1","SA1","SA2","SB1","SB2","SF4","SED","SE2" //Montagem da capa do documento fiscal aAdd(aCabs, {'F1_TIPO ', 'N' ,}) aAdd(aCabs, {'F1_FORMUL ', 'N' ,}) aAdd(aCabs, {'F1_DOC ', cDoc ,}) aAdd(aCabs, {'F1_SERIE ', 'AUT' ,}) aAdd(aCabs, {'F1_EMISSAO', dDataBase ,}) aAdd(aCabs, {'F1_FORNECE', 'SP0001' ,}) aAdd(aCabs, {'F1_LOJA ', '01' ,}) aAdd(aCabs, {'F1_ESPECIE', 'NF' ,}) aAdd(aCabs, {'F1_COND ', '001' ,}) aadd(aCabs, {'E2_NATUREZ',"" ,}) //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 jah foram calculados e // NAO podem ser alterados. aAdd(aCabs, {'F1_BASEICM', 100 ,}) //Base aAdd(aCabs, {'F1_BASEIPI', 40 ,}) //Base aAdd(aCabs, {'F1_VALICM ', 10 ,}) //Valor imposto aAdd(aCabs, {'F1_VALIPI ', 4 ,}) //Valor imposto //Montagem dos itens do documento fiscal (1. item) aAdd(aItens, {}) aAdd(aItens[Len(aItens)], {'D1_TES ', "021" ,}) aAdd(aItens[Len(aItens)], {'D1_COD ', 'PA0000000000000000000000000001',}) aAdd(aItens[Len(aItens)], {'D1_QUANT ', 1 ,}) aAdd(aItens[Len(aItens)], {'D1_VUNIT ', 100 ,}) aAdd(aItens[Len(aItens)], {'D1_TOTAL ', 100 ,}) aAdd(aItens[Len(aItens)], {'D1_CF ', '1101' ,}) aAdd(aItens[Len(aItens)], {'D1_LOCAL ', '01' ,}) //O mesmo tratamento para os impostos comentados acima, vale para os itens tambem. Portanto soh // deve ser utilizado quando NAO houver necessidade que o sistema calcule automaticamente. aAdd(aItens[Len(aItens)], {'D1_PICM ', 18 ,}) //Aliquota aAdd(aItens[Len(aItens)], {'D1_IPI ', 18 ,}) //Aliquota aAdd(aItens[Len(aItens)], {'D1_BASEICM', 50 ,}) //Base aAdd(aItens[Len(aItens)], {'D1_BASEIPI', 20 ,}) //Base aAdd(aItens[Len(aItens)], {'D1_VALICM ', 5 ,}) //Valor imposto aAdd(aItens[Len(aItens)], {'D1_VALIPI ', 2 ,}) //Valor imposto //Montagem dos itens do documento fiscal (2. item) aAdd(aItens, {}) aAdd(aItens[Len(aItens)], {'D1_TES ', "021" ,}) aAdd(aItens[Len(aItens)], {'D1_COD ', 'PA0000000000000000000000000002',}) aAdd(aItens[Len(aItens)], {'D1_QUANT ', 1 ,}) aAdd(aItens[Len(aItens)], {'D1_VUNIT ', 100 ,}) aAdd(aItens[Len(aItens)], {'D1_TOTAL ', 100 ,}) aAdd(aItens[Len(aItens)], {'D1_CF ', '1101' ,}) aAdd(aItens[Len(aItens)], {'D1_LOCAL ', '01' ,}) //O mesmo tratamento para os impostos comentados acima, vale para os itens tambem. Portanto soh // deve ser utilizado quando NAO houver necessidade que o sistema calcule automaticamente. aAdd(aItens[Len(aItens)], {'D1_PICM ', 18 ,}) //Aliquota aAdd(aItens[Len(aItens)], {'D1_IPI ', 18 ,}) //Aliquota aAdd(aItens[Len(aItens)], {'D1_BASEICM', 50 ,}) //Base aAdd(aItens[Len(aItens)], {'D1_BASEIPI', 20 ,}) //Base aAdd(aItens[Len(aItens)], {'D1_VALICM ', 5 ,}) //Valor imposto aAdd(aItens[Len(aItens)], {'D1_VALIPI ', 2 ,}) //Valor imposto //Chamada da rotina automatica MSExecAuto ({|x,y,z| MATA103 (x,y,z)}, aCabs, aItens, 3) //Tratamento de erro If !lMsErroAuto ConOut(OemToAnsi("Documento "+cDoc+"/AUT gerado com sucesso!")) Else ConOut(OemToAnsi("Erro na inclusão")) MostraErro() EndIf RESET ENVIRONMENT Return .T. |
Esta rotina foi construída nos mesmos moldes do MATA103, porém ela tem outra estrutura de código fonte.
Podemos verificar no exemplo que os array devem ser definidos com a mesma estrutura de dicionário do SX3, tanto para a capa (SF2) quanto para os itens (SD2), e para isso utiliza-se o retorno do dbStruct().
Após se obter esta estrutura, cria-se outro array somente com as informações de conteúdo, e é este array que é passado na rotina automática.
A regra dos impostos continua com a mesma regra de automático ou manual conforme comentado no item 1, porém o que mudou foi a forma de se passar os valores deles.
Podemos ver no exemplo que é utilizado o codeblock com uma função fiscal MAFISALT que força alterar os valores dos impostos, ela altera os cálculos padrões feitos pelo sistema e os grava nas tabelas dos documentos fiscais.