Versões comparadas

Chave

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

Índice


01. Visión general

La clase TCIWritten (Tax Configurator Integration Written) se desarrolló para hacer viable el acceso a los datos grabados en las tablas F2D (Tributos genéricos calculados)y CJ3 (Tabla Registro por ítem) del Configurador de tributos (FISA170) de una forma dinámica e intuitiva. 

...

Aviso
titleAtención

Todos los ejemplos mostrados en esta documentación son ficticios, creados con el objetivo de orientar, cabiendo al desarrollador aplicar los conceptos mostrados de manera que atienda plenamente las necesidades de la operación. 

02. Introducción

La clase TCIWritten facilita la recuperación de datos específicos de las tablas F2D y CJ3 utilizando métodos que permiten el acceso a los registros por medio de ID. La devolución de los datos se estructura en el formato JSON, quedando fácil de manejar e integrar con otras partes de una aplicación.

03. Historial de modificaciones

02/09/2025 - Implementación del campo F2D_BASQTD en el atributo base_cantidad_tributo (Solamente TCIWritten)

Se incluyó atributo base_cantidad_tributoen la clase TCIWritten.

14/07/2025 - Implementación de cClassTrib y Reducción de alícuotas

Algunos atributos del tipo TCIWritten se incluyeron posteriormente. De esta manera, si estos atributos no estuvieran disponibles en el entorno, será necesario realizar su actualización.

  • ["dados_escriturados"]["perc_red_aliquota"] → Toma el contenido del Registro al registrar la factura (campo Red. Alíc. % (CJ3_PREDAL) de la tabla Regla registro (CJ3)).
  • ["datos_registrados"]["porc_alicuota_original"] → Toma el contenido del Registro al registrar la factura (campo Alic. Origin (CJ3_ALIQOR) de la tabla Regla registro (CJ3)).
  • ["datos_registrados"]["cclasstrib"] → Toma el contenido del Registro al registrar la factura (compuesto por el campo CST (CJ3_CST) y CCT IBS/CBS (CJ3_CCT) de la tabla Regla registro (CJ3)).
  • ["datos_registrados"]["cct"] → Toma el contenido del Registro al registrar la factura (campo CCT IBS/CBS (CJ3_CCT) de la tabla CJ3).
  • ["regras_aliquota"]["perc_red_aliquota"] → Toma el contenido del registro de Regla de alícuota del Configurador de tributos (campo Red. Alíc. % (F28_REDALI) de la tabla Regla de alícuota (F28)).
  • ["reglas_registro"]["cclasstrib"] → Toma el contenido del registro de Regla de registro del Configurador de tributos (campo Clas Trib (CJ2_CSTCCT) de la tabla Tabla registro por ítem (CJ2)).
  • ["regras_escrituracao"]["cct"] → Toma el contenido del registro de Regla de registro del Configurador de tributos (campo CCT IBS/CBS (CJ2_CCT) de la tabla Tabla registro por ítem (CJ2)).

04. Cómo identificar si una factura tiene cálculos realizados por el configurador de tributos

Al inicializar MATXFIS utilizando la función MafisIni en la rutina de inclusión de documentos de entrada o salida, es necesario informar que la rutina está apta para procesar el configurador de tributos. Esta información debe pasarse al parámetro 33.

...

Bloco de código
languagejava
themeMidnight
titleIniciando Mafisini con el configurador de tributos
// Valida la utilización del configurador de tributos
// lCalcTG: variable lógica que indica si la función ChkTrbGen se encontró y se ejecuta con éxito
lCalcTG  := IIf(FindFunction("ChkTrbGen"), ChkTrbGen("SD2","D2_IDTRIB"), .F.)

//Inicia los cálculos de Matxfis
MaFisIni(SA1->A1_COD, SA1->A1_LOJA, cTipoPar,cTipoNf, SA1->A1_TIPO , MaFisRelImp("MT100",{"SF2","SD2"}),,.T.,,,,,,,,,,,,,,,,,,,,,,,,,lCalcTG)

//...Cuerpo de la función...

// Graba el campo responsable por la relación del ítem con el configurador de tributos
If lTrbGen
	SD2->D2_IDTRIB	:= MaFisTG(1,"SD2",nY)
EndIf

Función ChkTrbGen

La función ChkTrbGen responsable por efectuar algunas validaciones para utilización de los tributos genéricos.

...

      • cAlias - Alias de la tabla en la cual se grabará el ID de relación con la tabela F2D.
      • cCampo - Campo en el cual se grabará el ID de relación con la tabela F2D.

Función MaFisTG

La función MaFisTG es responsable por la grabación y borrado de los tributos calculados por el configurador de tributos.

...

      • Tipo de la operación ( 1- Grabación de los tributos genéricos o 2 - Borrado de los tributos genéricos)
      • Alias de la tabla 
      • Ítem de la factura
      • Id del tributo (Utilizado para borrado)

05. Cómo utilizar

Para utilizar la clase, debe instanciar un objeto de la clase TCIWritten, utilizando namespace totvs.protheus.backoffice.fiscal.tciclass y utilice los métodos disponibles para informar el ID (o los ID) de los registros que desea obtener. Los datos se devolverán en el formato JSON.

Dica
titleUso de Namespace

Para más información sobre el uso de namespaces, consulte el manual Namespace.

Clases en TLPP que heredan de clase con namespace deben utilizar namespace en la declaración de la clase o utilizar namespace en el programa que ejecuta la activación de la clase.

Para fuentes escritos en TLPP, puede incluir namespace al inicio del archivo fuente. Por ejemplo:

Bloco de código
languagejava
themeMidnight
titleTLPP
#include 'tlpp-core.th'  

using NameSpace totvs.protheus.backoffice.fiscal.tciclass

Function Teste() 

    Local  oDados as object 
    
    oDados := TCIWritten():New()

Return  

Para fuentes escritos en ADVPL debe utilizarse por completo namespace + clase.

Bloco de código
languagejava
themeMidnight
titleADVPL
#include "Protheus.CH"

Function Teste()

	Local  oDados as object
	
	//Verifica si la clase existe
	If FindClass("totvs.protheus.backoffice.fiscal.tciclass.TCIWritten")
		oDados := totvs.protheus.backoffice.fiscal.tciclass.TCIWritten():New()
	Endif

Return

06. Métodos

New()

El constructor de la clase. Inicializa un nuevo objeto de la clase TCIWritten.

...

Bloco de código
languagejs
themeMidnight
titleExemplo implementação New()
	oDados := TCIWritten():New()	

SetId(aData as Array)

Define los ID de los registros que se desea obtener los datos. Puede ser un único ID o una lista de estos.

...

Bloco de código
languagejs
themeMidnight
titleEjemplo de implementación SetId()
// Definiendo un único ID
	aData := {"369ca132-2b3b-ac96-6b78-3247afcc2219"}

	oDados := TCIWritten():New()
	oDados:SetId(aData)

// Definiendo múltiples ID
	aData1 := {"369ca132-2b3b-ac96-6b78-3247afcc2219","a5dcda40-d145-28d1-c57f-1047e15ce1fe"}
	
	oDados := TCIWritten():New()
	oDados:SetId(aData1)

GetDataId()

Recupera los datos de los registros informados en 𝚜𝚎𝚕𝚏:𝚊𝙸𝚍𝚁𝚎𝚚𝚞𝚎𝚜𝚝

...

Bloco de código
languagejs
themeMidnight
titleEjemplo de devolución GetDataId()
{
  "dados_Id": {
    "fd32a6d9-70fa-6b68-18b5-cc17375d15b3": {
          "TG_001": {
        "filialsucursal": "XIFIS26",
        "tributo": "TG0002",
        "codigo_tributo_relacionado": "",
        "descricao_tributo_relacionado": "",
        "base_quantidade_tributo": 0,
        "base_tributo": 0,     
        "aliquota_tributo": 10,
        "valor_tributo": 80,
        "valor_urf": 10,
        "mva": 0,
        "valor_pauta": 0,
        "percentual_majora": 0,
        "indice_aux_majora": 0,
        "tributo_majora": "",
        "aliquota_majora": 0,
        "valor_majora": 0,
        "ded_dependentes": 0,
	 	        "id_cadastro_regra_tributo": "4201ee25-972f-5840-9feb-2df327f3982d"
        "dados_escriturados": {
          "filialsucursal": "",
          "codigo_tributo": "",
          "valor_tributado": 0,
          "cst": "",
          "valor_isento": 0,
          "valor_outros": 0,
          "valor_nao_tributado": 0,
          "valor_diferido": 0,
          "valor_majorado": 0,
          "perc_majorado": 0,
          "perc_diferido": 0,
          "perc_reducao": 0,
          "valor_pauta": 0,
          "mva": 0,
          "ind_aux_mva": 0,
          "Ind_aux_majora": 0,
          "codigo_tab_cst": "",
          "valor_base_original": 0,
        },
		"regras_base  "perc_red_aliquota": {
			"codigo_regra0,
          "perc_aliquota_original": 0,
          "cct": "BAS021",
			"descricao          "cclasstrib": "Base ICMS ST RED. 41,67%"
        },
        "regras_base": {
            "codigo_regra": "BAS021",
            "descripcion": "Base ICMS ST RED. 41,67%                                     ",
			                                       ",
            "acao_origem": "11",
			            "acao_desconto": "1",
			            "acao_frete": "1",
			            "acao_seguro": "1",
			            "acao_despesa": "1",
			            "acao_icms_desonerado": "1",
			            "acao_icms_retido": "1",
			            "perc_reducao": 41.67,
			            "tipo_reducao": " ",
			"": " ",
            "unidade_medida": "  ",
			            "formula_base": "( ( O:VAL_MERCADORIA * I:PERC_REDUCAO_BASE ) * I:MVA )",
			            "id_formula": "c706aeb1-3f33-c97c-71df-87b1edff2d88",
			            "codigo_formula": "B:BAS021"
		        },
		        "regras_aliquota": {
			            "codigo_regra": "ALQ023",
			"descricao            "descripcion": "ALIQUOTAALICUOTA PADRAOESTANDAR DEDEL 20%                                                                              ",
			            "acao_origem": "04",
			            "acao_tipo": "1",
			            "perc_aliquota": 20,
			            "codigo_urf": "      ",
			"perc_urf": 0,
			            "perc_urf": 0,
            "formula_aliquota": "20",
			            "id_formula": "9d86e6bc-6a3c-9ea8-8053-57b2eb7eb045",
			            "codigo_fomula": "A:ALQ023",
            "perc_red_aliquota"
		: 0
        },
		        "regras_escrituracao": {
			 {
            "codigo_regra": "ESC013",
			"descricao            "descripcion": "ICMS Tributado ReduçãoReduccion emen IsentoExento CST 70                                                             ",
			            "acao_incidencia": "2",
			            "acao_total_nf": "6",
			            "perc_diferimento": 0,
			            "incidencia_parc_red": " ",
			            "tabela_cst": "000001",
			            "cst": "70 ",
			            "cst_devolucao": "70 ",
            "cct": "",
            "
		cclasstrib": ""
        }
 
      },
      "TG_00N": { ... },
       
    },

Descripción de las propiedades contenidas en el tributo

Propiedad

Tipo

Descripción

filial

carácter

Sucursal de la operación

tributo

carácter

Sigla del tributo

codigo_tributo_relacionado

carácter

Código del tributo relacionado

descricao_tributo_relacionado

carácter

Descripción de los tributos relacionadosbase

base_tributonúmero*Valor de la base del tributo
base_quantidade_tributonúmero*Valor de la base por cantidad del tributo

aliquota_tributo

número

Alícuota del tributo

valor_tributo

número

Valor del tributo

valor_urf

número

Valor de la URF

mva

número

Valor de MVA

valor_pauta

número

Valor de la tarifa

percentual_majora

número

Porcentaje aumentado

indice_aux_majora

número

Índice auxiliar de aumento

tributo_majora

carácter

Tributo aumentado

aliquota_majora

número

Alícuota aumentada

valor_majora

número

Valor aumentado

ded_dependentes

número

Deducción por dependientes

id_cadastro_regra_tributo

carácter

Id del registro del tributo

dados_escriturados

json


regras_base

json


regras_aliquota

json


regras_escrituracao

json


Informações
titleInformación

*El atributo base_tributo puede tener su origen (por valor de la mercadería, valor contable, etc.) verificado en el atributo "acao_origem" (que queda dentro de "regras_base"). 

La opción de base por cantidad estará siempre en el atributo "base_quantidade_tributo".

De acuerdo con la base de cálculo (campo F27_VALORI), los posibles orígenes de una base pueden ser:

Image Added


Objeto dados_escriturados

...

Bloco de código
languagejs
themeMidnight
titleEjemplo de implementación GetDataId()
	aIds := {"fd32a6d9-70fa-6b68-18b5-cc17375d15b3"}
	cResponse := ""
	
	oDados := TCIWritten():New()
	oDados:SetId(aIds)
	cResponse := oDados:GetDataId()

SetDataItems(aContent as Array)

Permite incluir a la devolución de GetDataId() detalles de las configuraciones realizadas por el usuario en el Configurador de tributos (FISA170). 

...

Bloco de código
languagejava
themeMidnight
titleIniciando Mafisini con el configurador de tributos
using totvs.protheus.backoffice.fiscal.tciclass
 
Function Exemplo()
    Local oDados as json
    Local cRetorno
     
    oDados := TCIWritten():New()
    oDados:setDataItems({"regras_base", "regras_aliquota", "regras_escrituracao"})
     
    cRetorno := oDados:GetDataId()
 
Return cRetorno

setReturnByTaxRule()

Modifica la devolución de GetDataId(), para devolver un JSON indexado por reglas de cálculo (F2B_REGRA).

...

Bloco de código
languagejs
themeMidnight
titleEjemplo de implementación:
	aData := {"DD227D08-AECE-4F11-BE55-AC5AFCAF013F","A7A15DCF-C1B8-4F11-9E54-AC5AFCAF013F","30DE92B8-C9B8-4F11-8E54-AC5AFCAF013F"}  
	aFieldsNeeded := {'dados_escriturados','mva','regras_escrituracao'}
 	aTribs := {'PISTG','COFTG'}  

    oDados := TCIWritten():New()
	oDados:SetId(aData)
	
	oDados:setReturnByTaxRule()  // Modifica la devolución del método :GetDataId()

	oDados:setAdditionalFieldsToReturn( aFieldsNeeded ) // Opcional: Incluir más campos en la devolución del objeto

    oDados:setTaxRuleFilterList( aTribs )  // Opcional: Filtra la devolución solamente con las reglas de cálculo que se desea       
CONOUT( oDados:GetDataId() )

	/*
 {
   "COFTG":{
      "items":{
         "DD227D08-AECE-4F11-BE55-AC5AFCAF013F":{
            "regra_trib":"COFTG",
            "filial":"XIFIS26",
            "codigo_tributo_relacionado":"000016",
            "tributo":"COF",
            "descricao_tributo_relacionado":"CONTRIBUYE PARA FINANCIACIÓN DE LA SEGURIDAD SOCIAL",
            "base_tributo":1000,
            "aliquota_tributo":7.6,
            "valor_tributo":76,
            "dados_escriturados":{
},
            "mva":0,
            "regras_escrituracao":"regla no vinculada"
         },
         "A7A15DCF-C1B8-4F11-9E54-AC5AFCAF013F":{
},
         "30DE92B8-C9B8-4F11-8E54-AC5AFCAF013F":{
}
      }
   },
   "PISTG":{
      "items":{
         "DD227D08-AECE-4F11-BE55-AC5AFCAF013F":{
},
         "A7A15DCF-C1B8-4F11-9E54-AC5AFCAF013F":{
},
         "30DE92B8-C9B8-4F11-8E54-AC5AFCAF013F":{
}
      }
   }
}
	*/

setReturnByIdTotvs()

Modifica la devolución de GetDataId(), para devolver un JSON indexado por tributos con ID Totvs (F2C_CODIGO).

...

Bloco de código
languagejs
themeMidnight
titleEjemplo de implementación:
	aData  := {"DD227D08-AECE-4F11-BE55-AC5AFCAF013F","A7A15DCF-C1B8-4F11-9E54-AC5AFCAF013F","30DE92B8-C9B8-4F11-8E54-AC5AFCAF013F"}   
	aFieldsNeeded := {'mva','regras_escrituracao'}

	oDados := TCIWritten():New()
	oDados:SetId(aData)
	
	oDados:setReturnByIdTotvs() // Modifica la devolución del método :GetDataId()  

  	oDados:setAdditionalFieldsToReturn( aFieldsNeeded ) // Opcional: Incluir más campos en la devolución del objeto 

	aTotvsId := {'000021'} // 000021 = ICMS
	oDados:setIdTotvsFilterList( aTotvsId ) // Opcional: Filtra la devolución solamente el ID totvs que desea             CONOUT( oDados:GetDataId() )
	/*
 {
   "000021":{
      "items":{
         "DD227D08-AECE-4F11-BE55-AC5AFCAF013F":{
            "regra_trib":"ICMSTG",
            "filial":"XIFIS26",
            "codigo_tributo_relacionado":"000021",
            "tributo":"ICMS",
            "descricao_tributo_relacionado":"ICMS - Impuesto sobre circulación de mercaderías y servicios",
            "base_tributo":1000,
            "aliquota_tributo":18,
            "valor_tributo":180,
            "mva":0,
            "regras_escrituracao":{
               "codigo_regra":"PRUEBA",
               "descricao":"REGLA DE REGISTRO",
               "acao_incidencia":"1",
               "acao_total_nf":"5",
               "perc_diferimento":0,
               "incidencia_parc_red":" ",
               "tabela_cst":"000001",
               "cst":"00",
               "cst_devolucao":"00"
            }
         },
         "A7A15DCF-C1B8-4F11-9E54-AC5AFCAF013F":{
},
         "30DE92B8-C9B8-4F11-8E54-AC5AFCAF013F":{
}
      }
   }
}
	*/

getAgregTypeByTax()

El método getAgregTypeByTax( cTipoIncidencia , cCodTribIdTotvs ) permite recibir de manera simple cuál fue el tipo de incidencia sobre el total de la factura (CJ2_STONF) para cada tributo, dentro de cada ítem de un documento.

...

Bloco de código
languagejs
themeMidnight
titleEjemplo de implementación getAgregTypeByTax
{
   "data":{
      "6D76CB61-2AEE-4F11-9E56-AC5AFCAF013F":{
         "ICMSTG":{
            "acao_tot_nf":"5",
            "id_totvs":"000021"
         }
      },
      "ADE403B0-D7F2-4F11-8E56-AC5AFCAF013F":{
         "ICMSTG":{
            "acao_tot_nf":"5",
            "id_totvs":"000021"
         }
      }
   }

getAdditionalData()

El Método getAdditionalData() sirve para recibir los datos adicionales. Este hace uso de la classe TCAdditionalData.

Bloco de código
languagejs
themeMidnight
titleEjemplo método getAdditionalData()
using totvs.protheus.backoffice.fiscal.tciclass 
Function Exemplo()
	Local oDados
	Local cRetorno := ""

	aIds := {"369ca132-2b3b-ac96-6b78-3247afcc2219","a5dcda40-d145-28d1-c57f-1047e15ce1fe"}  // Id do tributo  
	
	// Configuracao da classe ...
	oDados := TCIWritten():New()
	oDados:setDataItems({"regras_escrituracao"}) // Es necesario para recibir los datos adicionales dentro de la propiedad de donde vinieron, en este caso, regla de registro    
	oDados:SetId(aIds)

	cRetorno := oDados:getAdditionalData()     // Devuelve los datos adicionales
Return

Ejemplo de devolución getAdditionalData()

*Hasta el momento de la publicación de esta documentación, solamente los datos adicionales que se refieren a la regla de registro se están devolviendo devolviendo, pues los datos adicionales del Perfil de operación y Regla de cálculo están en desarrollo.

Bloco de código
languagejs
themeMidnight
titleEjemplo de devolución GetDataItems()
{
   "1":{  // Item do documento fiscal
	  "TG_001":{ // Tributo
         "regra escrituracao":{
            "id":"e118b167-a462-0bb0-1a11-08991d2ff2c2", // Identificador único de la regla de registro
            "dados adicionais":{ // Contiene todos los datos adicionales y sus respectivos valores
               "AGCREDPRES":{
                  "conteudo":"1"
               },
               "BASEIPICAL":{
                  "conteudo":"O"
               },
               "ENQIPICODE":{
                  "conteudo":"113"
               },
               "TRIBPREF":{
                  "conteudo":"99"
               }
            }
         },
         "perfil de operacao":{},
         "regra de calculo":{}
      }
   }
}

Destroy()

Libera los recursos utilizados por la instancia de la clase TCIWritten.

...

Bloco de código
languagejs
themeMidnight
titleEjemplo de implementación destroy()
	aIds := {"369ca132-2b3b-ac96-6b78-3247afcc2219","a5dcda40-d145-28d1-c57f-1047e15ce1fe"}
	cResponse := ""
	
	oDados := TCIWritten():New()
	oDados:SetId(aIds)
	cResponse := oDados:GetDataId()

	oDados:destroy()


07. Ejemplo completo de implementación


Bloco de código
languagejs
themeMidnight
titleEjemplo completo de implementación
 using NameSpace totvs.protheus.backoffice.fiscal.tciclass

  Function Exemplo()
	Local  aData as array
	Local  cResponse as character
    Local  oDados as object       


	aData := {"ec451397-7b97-8114-a231-74a1490e1417"}
    cResponse := ""
     
    oDados := TCIWritten():New()
    oDados:SetId( aData )
    oDados:setDataItems({"regras_base", "regras_aliquota", "regras_escrituracao"})
    cResponse := oDados:GetDataId()
 
Return cResponse

...