Árvore de páginas

Versões comparadas

Chave

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

01. DATOS GENERALES


Producto

Solucoes_espanhol
SolucaoTOTVS Backoffice

Línea de producto: 

Linhas_totvs_espanhol
LinhaLínea Protheus

Segmento:

Segmentos_totvs_espanhol
SegmentoServicios

Módulo:SIGAFAT - Facturación
Función:
Rutina(s)Nombre TécnicoFecha
LOCXFUNAFunciones Genéricas de Localizaciones1507 
Ticket:9236182 | 9309315
Requisito/Story/Issue (informe el requisito vinculado):DMINA-9641 | DMINA-9771


02. SITUACIÓN/REQUISITO

Inicialmente en los archivos de configuración para Generación de XML para Documentos de Salida (FATSMEX.INI)  y para la Generación de XML para Documentos de Entrada (FATEMEX.INI ), se utilizaban las varias funciones para la Generación de la estructura y cadena original para nodo Conceptos, Impuestos e Impuestos Locales (fGetImps, fGetInfAdu, fCtaPredio, fGetPartes, fTotalImps) localizadas en la rutina de Funciones Genéricas de Localizaciones (LOCXFUNA). El uso de estas funciones permitía que la sección de Conceptos del XML pudiera ser modificada por el usuario.

En las últimas actualizaciones de la rutina, las funciones encargadas de la Generación de la estructura y cadena original para nodo Conceptos, Impuestos e Impuestos Locales (fGetImps, fGetInfAdu, fCtaPredio, fGetPartes, fTotalImps ) fueron reemplazadas por la función fXMLFun.


03. SOLUCIÓN

Se crea el Punto de Entrada LOCXCONCEP, mediante el cual el usuario podrá definir la información que retornará para algunos atributos del nodo Conceptos.

Conforme a lo reportado en el issue DMINA-9771, se realiza una validación que considera a las Notas de Crédito(NCC) , que permite enviar correctamente los parámetros que serán usados en el punto de entrada (Ver 04. INFORMACIÓN ADICIONAL),  ya que se tenía problemas con el tamaño del campo Ítem(D1_ITEM).




Totvs custom tabs box
tabsPre-condiciones,Pasos
idsPre-condiciones,Pasos
Totvs custom tabs box items
defaultyes
referenciaPre-condiciones
  • Contar con un Cliente configurado para generar una Nota Fiscal con timbre fiscal.
  • Contar con un Producto configurado para generar una Nota Fiscal con timbre fiscal. 
  • Consultar la sección 04. INFORMACIÓN ADICIONAL.
Totvs custom tabs box items
defaultno
referenciaPasos
  • En el módulo Facturación (SIGAFAT), ingresar al menú "Actualizaciones | Facturación| Facturaciones" (MATA467N).
  • Informar los parámetros de la rutina.
  • "Incluir" una nueva factura de salida.
  • Informar los campos del encabezado de la factura.
  • Capturar los datos de un ítem.
  • Dar clic en "Grabar".
  • Se confirma la generación del comprobante fiscal y timbrado del CFDI.
  • Validar que en el XML sean informados los atributos especificados en el Punto de Entrada (ver Información Adicional).


04. INFORMACIÓN ADICIONAL

El Punto de Entrada LOCXCONCEP recibe 1 parámetro2 parámetros, que es la concatenación del número del item y el código del producto y el número de ítem, debe retornar un arreglo que contiene todos los campos que se pueden modificar a nivel ítem.

...

#include 'protheus.ch'

User function Function LOCXCONCEP()
Local cArea := GetArea()
Local cCodProd := PARAMIXB[1] // Item+ Código del producto.
Local aDetFac := {"","",0,"","",""} // Arreglo que contiene la información del producto.
/*
aDetFac[1] := ClaveProdSer
aDetFac[2] := No. Identificación
aDetFac[3] := Cantidad
aDetFac[4] := ClaveUnidad
aDetFac[5] := Unidad
aDetFac[6] := Descripcion
*/

aDetFac[2] := AllTrim(SA1-> A1_IDENT)
aDetFac[6] := AllTrim(SA1 -> A1_IDENT)

...

#include 'protheus.ch'

User function Function LOCXCONCEP()
Local cArea := GetArea()
Local cCodProd := PARAMIXB[1] // Item+ Código del producto.
Local aDetFac := {"","","","","",""} // Arreglo que contiene la información del producto.
/*
aDetFac[1] := ClaveProdSer
aDetFac[2] := No. Identificación
aDetFac[3] := Cantidad
aDetFac[4] := ClaveUnidad *Si es nulo omitir el atributo Unidad
aDetFac[5] := Unidad
aDetFac[6] := Descripcion
*/
//Realizar tratamiento conforme tamaño del campo DX_ITEM
cItem := SubStr(cCodProd,1,4)
cCod := SubStr(cCodProd,5)
DbSelectArea("SB1")
SB1->(dbSetorder(1)) // B1_FILIAL + B1_COD
SB1->(Dbseek(XFilial("SB1")+cCodcCodProd))
aDetFac[2] := AllTrim(SB1-> B1_ID)
aDetFac[6] := AllTrim(SB1 -> B1_ID)

...

#include 'protheus.ch'

User function Function LOCXCONCEP()
Local cArea := GetArea()
Local cCodProd := PARAMIXB[1] // Item+ Código del producto.
Local cItem := PARAMIXB[2] // Número del Item.
Local aDetFac := {"","","","","",""} // Arreglo que contiene la información del producto.
Local nRecSD2 := 0

/*
aDetFac[1] := ClaveProdSer
aDetFac[2] := No. Identificación
aDetFac[3] := Cantidad
aDetFac[4] := ClaveUnidad *Si es nulo omitir el atributo Unidad
aDetFac[5] := Unidad
aDetFac[6] := Descripcion
*/
//Realizar tratamiento conforme tamaño del campo D2_ITEM
cItem := SubStr(cCodProd,1,2)
cCod := SubStr(cCodProd,3)
BeginSQL Alias "SD2TMP"
SELECT D2_ITEM,D2_DESCRI
FROM %Table:SD2% SD2
WHERE SD2.D2_FILIAL = %xFilial:SD2%
AND SD2.D2_SERIE = %Exp:SF2->F2_SERIE%
AND SD2.D2_DOC = %Exp:SF2->F2_DOC%
AND SD2.D2_CLIENTE = %Exp:SF2->F2_CLIENTE%
AND SD2.D2_LOJA = %Exp:SF2->F2_LOJA%
AND SD2.D2_TIPO = %Exp:SF2->F2_TIPO%
AND SD2.%NotDel%
EndSQL

DbSelectArea("SD2TMP")
While !SD2TMP ->(Eof())
if If AllTrim(SD2TMP -> D2_ITEM) == AllTrim(cItem)
aDetFac[6] := AllTrim(SD2TMP -> D2_DESCRI)
EndIf
SD2TMP -> (dbskip())
EndDo

SD2TMP ->(dbCloseArea())

RestArea(cArea)
Return aDetFac

Ejemplo 4: Búsqueda en tabla SD1 

#include 'protheus.ch'

User function LOCXCONCEP()
Local cArea := GetArea()
Local cCodProd := PARAMIXB[1] // Item+Código del producto.
Local cItem := PARAMIXB[2] // Número del Item.
Local aDetFac := {"","","","","",""} // Arreglo que contiene la información del producto.
Local nRecSD2 := 0
/*
aDetFac[1] := ClaveProdSer
aDetFac[2] := No. Identificación
aDetFac[3] := Cantidad
aDetFac[4] := ClaveUnidad *Si es nulo omitir el atributo Unidad
aDetFac[5] := Unidad
aDetFac[6] := Descripcion
*/
//Realizar tratamiento conforme tamaño del campo D1_ITEM
cItem := SubStr(cCodProd,1,4)
cCod := SubStr(cCodProd,5)BeginSQL Alias "SD1TMP"
SELECT D1_ITEM,D1_DESCRI
FROM %Table:SD1% SD1
WHERE SD1.D1_FILIAL = %xFilial:SD1%
AND SD1.D1_SERIE = %Exp:SF1 ->F1_SERIE%
AND SD1.D1_DOC = %Exp:SF1->F1_DOC%
AND SD1.D1_FORNECE = %Exp:SF1->F1_FORNECE%
AND SD1.D1_LOJA = %Exp:SF1->F1_LOJA%
AND SD1.D1_TIPO = %Exp:SF1->F1_TIPO%
AND SD1.%NotDel%
EndSQL
DbSelectArea("SD1TMP")
While !SD1TMP ->(Eof())
if AllTrim(SD1TMP -> D1_ITEM) == AllTrim(cItem)
aDetFac[6] := AllTrim(SD1TMP -> D1_DESCRI)
EndIf
SD1TMP -> (dbskip())
EndDo
SD1TMP ->(dbCloseArea())

RestArea(cArea)
Return aDetFac

NOTA: Cabe mencionar que al momento de la ejecución del punto de entrada, se puede posicionar en acceder a algunas tablas como la de Clientes (SA1), ProductosProductos (SB1), Items Ítems de facturafactura (SD2 |/ SD1), por lo que se podrán utilizar campos que ya existen de estas tablas  tablas o campos nuevos que sean agregados y definir la regla para el armado del de los atributos del nodo Conceptos.

Para la tabla las tablas de Items Ítems de facturafactura (SD2 |y SD1), se recomienda apegarse al ejemplo descrito y usar la instrucción BeginSql para sql embebido usando SQL embebido (BeginSql ... EndSql)ya que las instrucciones como DbSetOrder() y DbSeek() sobre tales tablas, causan conflicto por el uso de un archivo temporal para la construcción del archivo XML.


Card documentos
InformacaoEn el Punto de Entrada LOCXCONCEP el contenido de cada una de los campos en el arreglo aDetFac debe cumplir con lo establecido en el Anexo 20 Guía de llenado de los comprobantes fiscales digitales por Internet, referente a los atributos del nodo Conceptos considerando que dicha guía puede ser modificada en cualquier momento por el SAT.
Titulo¡IMPORTANTE!


05. ASUNTOS RELACIONADOS

  • Referencia del SAT, guia guía del Anexo 20 de CFDI:

http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/GuiaAnexo20.pdf

...