Árvore de páginas

Versões comparadas

Chave

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

ÍNDICE

Índice

...

stylenone

01.

...

VISIÓN GENERAL

En la página del SAT, en el apartado de la documentación técnica del CFDI 4.0, se establece que la vigencia de esta nueva versión inicia a partir del 1 de enero de 202220

22, existiendo un periodo de convivencia entre la versión 3.3 y la versión 4.0 el cual comprende del 1 de enero al 30 de abril Junio de 2022.

Por tanto, será a partir del 1 de mayo Julio de 2022 que se deje de utilizar la versión 3.3 y se generalice la obligación de emitir la versión 4.0.

Para cumplir con dicha reforma fiscal, se modifica el esquema del CFDI con los siguientes cambios:

  • Incluye de manera obligatoria el nombre y domicilio fiscal del emisor y del receptor.
  • Se incluye nuevos atributos (Exportacion, DomicilioFiscaIReceptor, RegimenFiscalR, y Objetolmp).
  • Incluye campos para identificar las operaciones donde exista una exportación de mercancías (Exportacion).
  • Identifica si las operaciones que ampara el comprobante son objeto de impuestos indirectos (Objetolmp).
  • Incorpora nuevos apartados para reportar información respecto de las operaciones con el público en general; así como, aquellas que se realicen a cuenta de terceras personas.
  • Se cambia la secuencia de CfdiRelacionados.
  • Inclusión de reglas de validación para los nuevos Nodos y Atributos.

Para mayor información ver el portal del SAT.de la Reforma Fiscal 2022, se recomienda revisar el siguiente enlace:

Actualización Factura Electrónica - Reforma Fiscal 2022

Rutinas utilizadas

Para tener activa la Versión 4.0 del CFDI es necesario tener actualizadas con una fecha mayor o igual las siguientes rutinas:


Rutina
Rutinas involucradasNombre TécnicoFecha
LOCXNFNotas Fiscales.12/03/2022
LOCXNF2Funciones Genéricas para Documentos Fiscales.07/03/2022
LOCXMEXFunciones Genéricas
localizadas
para Documentos Fiscales para México.
 FATSMEXGeneración de XML de documentos de salida.
 11/03/2022
LOCXFUNAFunciones generales de documentos fiscales.07/03/2022
FISA800Timbrado masivo de CFDI.17/03/2022 
FISA812Mantenimiento de Catálogos del SAT.08/03/2022 
MATA468NGeneración automática de facturas.16/03/2022
FISA815CFDI con Complemento para Recepción de Pagos03/03/2022
FATEMEXGeneración de XML de documentos de entrada.LOCXFUNAFunciones Genéricas para notas fiscales.
SIGACUSFunciones Genéricas.
LOCXNF2Funciones Genérica para notas fiscales.

02. EJEMPLO DE UTILIZACIÓN

...

04/03/2022
MATR475

Generación de PDF para Documentos Fiscales de Entrada/Salida.

16/02/2022
MATA521Eliminación de documentos de Salida09/03/2022
Archivo relacionadoNombre Técnico

Fecha

FATSMEX.INIScript de generación de los archivos XML para Notas Fiscales de Salida.07/03/2022
FATEMEX.INIScript de generación de los archivos XML para Notas Fiscales de Entrada.16/03/2022

02. EJEMPLO DE UTILIZACIÓN

  1. Realice las modificaciones al Diccionario de Datos, sugeridas en la sección 04. DICCIONARIO DE DATOS, las cuales corresponden a la emisión de CFDI's.
  2. Realice las modificaciones al Diccionario de Datos, sugeridas en la sección 5.1 Cancelación de CFDI con Motivo de Cancelación 01 - Compr. Emitido c/errores c/relac., las cuales corresponden al proceso de Cancelación de CFDI's. 
  3. Realice las actualizaciones a los Archivos de Configuración (.ini) y configuración de Catálogos indicados en la sección 03. CONFIGURACIONES.


Aviso
titleIMPORTANTE

Algunos de los procesos de versión 3.3 siguen funcionando de la misma manera y no fueron afectados por los ajustes para versión 4.0, para más información ver Documento Técnico de Factura Electrónica de México CFDI Versión 3.3

...

  1. En el módulo Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Facturaciones (MATA467N).
  2. Informar los parámetros de la rutina.
  3. Incluir una Factura de Venta (NF).:
    • Informar los datos del Encabezado de la factura.
    • Informar los datos de los ítems de la factura.
  4. Confirmar el grabado de la Factura de Venta.
  5. Confirmar la generación y timbrado exitoso del Comprobante Fiscal Digita para Internet (Esta Ésta confirmación puede presentarse o no de acuerdo a la configuración del parámetro MV_CFDUSO).
  6. Validar que los nuevos nodos mencionados anteriormente, se muestren correctamente como en el siguiente ejemplo:


03. CONFIGURACIONES

Parámetros

  • Configurar parámetro MV_CFDI40 igual a ".T." para activar la versión 4.0 del CFDI.


Elemento CDFI Relacionados para Notas de débito y Facturas de venta de tipo normal.

Para la implementación del nuevo requerimiento del elemento CfdiRelacionados se cambio la funcionalidad de los campos UUID Relacionados(F1_UUIDREL/F2_UUIDREL) y Tipo Relación(F1_RELSAT/F2_RELSAT). A continuación se describe la nueva funcionalidad de dichos campos:

Para Facturas de entrada y Notas de Debito:

  • El campo Relación CFD(F2_RELSAT) queda deshabilitado.
  • Para informar un Tipo de Relación y los UUID Relacionados se tiene que seguir lo siguiente:Informar en primer lugar el código del "Tipo de Relación" utilizando el carácter ";" para separar los UUID Relacionados.
    Tipos de Relación
  • Para separar cada UUID correspondiente a un Tipo de relación se utiliza el carácter "|"
  • Para indicar el inicio de un nuevo Tipo de relación se debe utilizar un salto de línea.
  • Ejemplo:

    Image Removed

    Elemento CDFI Relacionados para Notas de Crédito.

    • Los campos Relación CFD y UUID Relacionados se informa de forma automática a través de las opciones "Doc Orig > Facturas" y "Doc Orig > Item" cumpliendo con lo siguiente:
      • Antes de ejecutar el proceso "Doc Orig" es necesario informar el campo Relación CFD(F1_RELSAT).
      • Al seleccionar un documento y confirmar, el campo UUID Relacionados se actualiza con el valor del campo Relación CFD utilizando el carácter ";" para separar de los UUID.
      • Para separar cada UUID correspondiente a un Tipo de relación se utiliza el carácter "|"
      • Para indicar el inicio de un nuevo Tipo de relación es necesario cambiar el valor del campo Relación CFD(F1_RELSAT).

    Ejemplo:

    Image Removed

    Image Removed

    Image Removed

    Al cambiar el valor del campo Relación CFD, al momento de relacionar otro documento se realizará un salto de línea y se procederá a actualizar el campo UUD Relacs:

    Image Removed 

    Image Removed

    Image Removed

    Informaçõeswarning
    titleIMPORTANTE
    CódigoDescripción
    01Notas de Crédito de Documentos Relacionados
    02

    Notas de Débito de los Documentos Relacionados

    03

    Devolución de Mercancías sobre Facturas o Traslados Previos

    04

    Sustitución de los CFDI Previos

    05

    Traslados de Mercancías Facturados Previamente

    06

    Factura Generada por los Traslados Previos

    07

    CFDI por Aplicación de Anticipo

    08

    Facturas Generadas por Pagos en Parcialidades

    09

    Factura Generada por Pagos Diferidos

    03. CONFIGURACIONES

    • Configurar parámetro MV_CFDI40 igual a ".T." para activar la versión 4.0 del CFDI.
    • En la ruta especificada en el parámetro MV_PATH814, coloque los archivos de catálogos del SAT.
    Aviso
    titleIMPORTANTE
    • Validar que los siguientes catálogos de Protheus se encuentren actualizados de acuerdo a los publicados por el SAT Catálogos CFDI Versión 4.0.
    • La fecha de inicio y fin de vigencia para las claves incluidas en las actualizaciones de los catálogos, se indican en las columnas correspondientes en cada catálogo, por lo que para aquellas claves cuya vigencia expiró, no se podrán utilizar a partir de la fecha indicada en la columna fecha fin de vigencia.
      Los catálogos a considerar son los siguientes:
    • c_RegimenFiscal.csv
    • c_UsoCFDI.csv
    • c_ClaveProdServCP.csv
    • c_Colonias.csvc_Localidad.csv
    • c_Municipio.csv
    • c_Estado.csv
    • c_CodigoPostal.csv
    • c_FraccionArancelaria.csv
    • c_FormaPago.csv
    • c_TipoRelación.csv
    • c_MetodoPago.csv
    Nota:

    Los parámetros para Facturación Electrónica utilizados desde la versión 3.3, no sufrieron cambios.

    Aviso
    titleIMPORTANTE

    Para evitar errores de timbrado, es importante configurar el parámetro MV_IVATRAS con el código de los impuestos de traslado a ser desplozados en el XML, por ejemplo "IVA|IV0|IEPS". En caso de que el documento tenga retenciones se configura el parámetro MV_RETIVAM con el código de las retenciones de iva, por ejemplo "RIV".

    Catálogos de Datos de CFDI

    • En la ruta especificada en el parámetro MV_PATH814, coloque los archivos de catálogos del SAT.


    Aviso
    titleIMPORTANTE
    • Validar que los siguientes Catálogos de Datos de CFDI, se encuentren actualizados de acuerdo a los publicados por el SAT Catálogos CFDI Versión 4.0.
    • La fecha de inicio y fin de vigencia para las claves incluidas en las actualizaciones de los catálogos, se indican en las columnas correspondientes en cada catálogo, por lo que para aquellas claves cuya vigencia expiró, no se podrán utilizar a partir de la fecha indicada en la columna fecha fin de vigencia.
      Los catálogos a considerar, son los siguientes:
    • c_RegimenFiscal.csv
    • c_UsoCFDI.csv
    • c_ClaveProdServCP.csv
    • c_Colonias.csv
    • c_Localidad.csv
    • c_Municipio.csv
    • c_Estado.csv
    • c_CodigoPostal.csv
    • c_FraccionArancelaria.csv
    • c_FormaPago.csv
    • c_TipoRelación.csv
    • c_MetodoPago.csv

    Configuración en la Empresa (Emisor)

    • En el módulo Configurador (SIGACFG) ir al menú Entorno | Empresas | Sucursal (CFGX032).
      • Revisar que los siguientes campos correspondientes al Emisor, coincidan con los registrados ante el SAT:
        • Nombre Comercial (M0_NOMECOM).
        • CNPJ o CPF (M0_CGC), este campo corresponde al RFC.
        • CP Fiscal/Entrega (M0_CEPENT), ubicado en la pestaña Dirección Fiscal/Entrega:.

    Configuración en el Cliente (Receptor)

    • En el módulo Facturación (SIGAFAT) ir al menú Actualizaciones | Archivos | Clientes (MATA030).
      1. Registrar un cliente que tenga informado el nuevo campo Rég.Fiscal (AI0_REGFIS).

    ...

    titleIMPORTANTE
      1. Crear un Cliente, informando los campos obligatorios y los siguientes campos:
        • Nombre (A1_NOME), debe coincidir con el registrado ante el SAT.
        • CP (A1_CEP), debe coincidir con el registrado ante el SAT.
        • RFC (A1_CGC), debe coincidir con el registrado ante el SAT.
      2. Mediante la opción "Complemento de Cliente", informar los siguientes campos:
        • Método Pago (AI0_MPAGO).
        • Rég.Fiscal (AI0_REGFIS).

    Configuración para generación y timbrado de XML

    Por Archivos de Configuración (.ini)

    ...

    En los script de "Generación de XML de documentos de salida."(FATSMEX.INI) y "Generación de XML de documentos de entrada."(FATEMEX).INI) se realizan los ajustes para agregar los nuevos atributos Exportacion,DomicilioFiscaIReceptor y RegimenFiscalReceptor, además se actualizan las URL utilizadas para la versión CFDi 4.0.

    FATSMEX.INI

    Se recomienda editar el script actual de generación de CFDI (Archivo XML), actualizando las secciones de acuerdo al siguiente modelo, en donde las líneas resaltadas con color azul se agregaron o fueron modificadas para integrar la Versión 4.0 CFDi; las líneas resaltadas con color rojo fueron removidas:

    Painel
    borderWidth2
    titleBGColorlightblue
    borderStyledashedsolid
    titleFATSMEX.INI

    //FATSMEX.INI V4.0 --- Modelo 2022

    [XXX POSICIONAMENTOS]
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SA2->(MSSeek(xFilial("SA2")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)

    [XXX INICIALIZACION]
    (PRE) SD2->(DbSetOrder(1))
    (PRE) SB1->(DbSetOrder(1))
    (PRE) SYA->(DbSetOrder(1))
    (PRE) SC6->(DbSetOrder(1))
    (PRE) SE4->(DbSetOrder(1))
    (PRE) CTO->(DbSetOrder(1))
    (PRE) SAH->(DbSetOrder(1))
    (PRE) _aTotal[009] := SuperGetMV("MV_CFDICPG", .F., "")
    (PRE) _aTotal[010] := FindFunction("zh_FechaHoraUTC") .And. !Empty(_aTotal[009])
    (PRE) _aTotal[011] := FindFunction("LxFunaCaPo")
    (PRE) _aTotal[094] := ""
    (PRE) _aTotal[095] := ""
    (PRE) _aTotal[033] := ""
    (PRE) _aTotal[034] := ""
    (PRE) _aTotal[035] := ""
    (PRE) _aTotal[036] := 0
    (PRE) _aTotal[037] := 0
    (PRE) _aTotal[038] := 0
    (PRE) _aTotal[075] := Alltrim(SM0->M0_NOMECOM)
    (PRE) IIf(_aTotal[010],_aTotal[096] := zh_FechaHoraUTC(Alltrim(_aTotal[009]),Alltrim(SM0->M0_CEPENT),SF2->F2_EMISSAO,SF2->F2_HORA),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] := DtoS(SF2->F2_EMISSAO),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] := Left(_aTotal[096],4) + "-" + Substr(_aTotal[096],5,2)+ "-" + Right(_aTotal[096],2),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] += "T" + SF2->F2_HORA,"")
    (PRE) _aTotal[097] := {"SD2",""}
    (PRE) _aTotal[098] := "|"
    (PRE) _aTotal[099] := "||"
    (PRE) _aTotal[100] := ""
    (PRE) _aTotal[101] := "OPERACION DE CONFORMIDAD CON EL ART. 29 FRACCION I DE LIVA Y LO ESTIPULADO EN LAS RGCE 5.2.6. FRACCION I, 5.2.7 Y 4.3.21"
    (PRE) _aTotal[102] := "OPERACION DE CONFORMIDAD CON EL ART. 29 FRACCION I DE LIVA Y LO ESTIPULADO EN LAS RGCE 5.2.6. FRACCION II, 5.2.7 Y 4.3.21"
    (PRE) _aTotal[103] := fSumBC(SF2->F2_DOC,SF2->F2_SERIE,SF2->F2_CLIENTE,SF2->F2_LOJA)
    (PRE) _aTotal[104] := IIf(SF2->(ColumnPos("F2_TPCOMPL")) > 0 .And. AllTrim(SF2->F2_TPCOMPL)=="S",.T.,.F.)
    (PRE) _aTotal[105] := ""
    (PRE) _aTotal[106] := IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21",0,2)
    (PRE) lCCCE := .F.
    (PRE) cNodoCCE := ""

    (PREREG) FsQuery(_aTotal[097],1,"D2_DOC='" + SF2->F2_DOC + "' AND D2_SERIE='" + SF2->F2_SERIE + "' AND D2_CLIENTE='" + SF2->F2_CLIENTE + "' AND D2_LOJA='" + SF2->F2_LOJA + "'","SD2->D2_DOC=SF2->F2_DOC .AND. SD2->D2_SERIE=SF2->F2_SERIE .AND. SD2->D2_CLIENTE=SF2->F2_CLIENTE .AND. SD2->D2_LOJA=SF2->F2_LOJA","D2_ITEM") .And. .T.

    (PRE) fImptosD(SF2->F2_DOC,SF2->F2_SERIE,SF2->F2_CLIENTE,SF2->F2_LOJA,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),"SD2", SF2->F2_GLOBAL == "1",@(_aTotal[036]),_aTotal[104],@_aTotal[037], @_aTotal[038] )

    [SD2 CADENAORIGINAL_SELLO]
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SA2->(MSSeek(xFilial("SA2")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SYA->(MsSeek(xFilial("SYA")+SA2->A2_PAIS)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",CTO->(MsSeek(xFilial("CTO")+Strzero(SF2->F2_MOEDA,2))) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",CTO->(MsSeek(xFilial("CTO")+Strzero(SF2->F2_MOEDA,2))) , .T.)
    //////////////////////////////////////////////CADENA ORIGINAL//////////////////////////////////////////////
    (PRE) cCadOrig := _aTotal[099]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF2->F2_TIPOPE), .T., .F.)
    (PRE) cCadOriCCE := ""

    //Cadena Original | Complemento de Comercio Exterior (Mercancias)
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_ITEM + SD2->D2_COD), (cCadOriCCE += Alltrim(SD2->D2_ITEM + SD2->D2_COD) + _aTotal[098],.T.),("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), (cCadOriCCE += Alltrim(SD2->D2_FRACCA) + Alltrim(SD2->D2_NICO) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_CANADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_CANADU)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), (cCadOriCCE += AllTrim(ObtColSAT("S014",AllTrim(SD2->D2_FRACCA),1,8,9,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_VALADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_VALADU,14,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_USDADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_USDADU,14,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. SA1->A1_CONTRBE=="1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", (cCadOriCCE += '1.0' +_aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. SA1->A1_CONTRBE=="1" .And. SF2->F2_CONUNI=="1", (cCadOriCCE += 'IMMEX:' + ALLTRIM(SA1->A1_PFISICA) + ' ' + _aTotal[101] + _aTotal[098],.T.), IIf (lCCCE .And. SA1->A1_CONTRBE=="1" .And. SF2->F2_CONUNI=="2", (cCadOriCCE += 'IMMEX:' + ALLTRIM(SA1->A1_PFISICA) + ' ' + _aTotal[102] + _aTotal[098],.T.), ("",,.T.)))

    ///////////DATOS DE LA FACTURA/////////////////
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    //Version
    (PRE) cCadOrig += "4.0" + _aTotal[098]
    //Serie
    (PRE) cCadOrig += Alltrim(SF2->F2_SERIE) + _aTotal[098]
    //Folio
    (PRE) cCadOrig += Alltrim(SF2->F2_DOC) + _aTotal[098]
    //Fecha
    (PRE) cCadOrig += Alltrim(_aTotal[096]) + _aTotal[098]
    //FormaPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", IIf(SF2->F2_GLOBAL == '1',FormPagGlo(SF2->F2_DOC,SF2->F2_SERIE),IIf(Empty(AI0->AI0_MPAGO).Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",Alltrim(AI0->AI0_MPAGO))) + _aTotal[098] )
    //NoCertificado
    (PRE) cCadOrig += Alltrim(SF2->F2_CERTFOL) + _aTotal[098]
    //CondicionesDePago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + _aTotal[098] )
    //Subtotal
    (PRE) cCadOrig += Alltrim(STR(IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, (SF2->F2_VALMERC + _aTotal[103] + SF2->F2_DESCONT) - _aTotal[036] - _aTotal[037]),14,_aTotal[106])) + _aTotal[098]
    //Descuento
    (PRE) cCadOrig += IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", "", IIf( SF2->F2_DESCONT == 0, "", Alltrim(STR(SF2->F2_DESCONT,14,2)) + _aTotal[098]) )
    //Moneda
    (PRE) cCadOrig += IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","XXX",Alltrim(CTO->CTO_MOESAT)) + _aTotal[098]
    //TipoCambio
    (PRE) cCadOrig += IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","",IIf(!(Alltrim(CTO->CTO_MOESAT) <> $ "MXN|XXX"), Alltrim(STR(SF2->F2_TXMOEDA,14,2)), "1") + _aTotal[098])
    //Total
    (PRE) cCadOrig += Alltrim(Str(IIf(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, iif(GetSx3Cache("F2_VALBRUT","X3_DECIMAL")<= 2,SF2->F2_VALBRUT + _aTotal[103]- _aTotal[037],Round(SF2->F2_VALBRUT,2) + _aTotal[103] - _aTotal[037])),14,_aTotal[106])) + _aTotal[098]
    //TipoDeComprobante
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_ESPECIE) == "NF",IIf(ALLTRIM(SF2->F2_TIPODOC) == "21", "T", "I" ), "E") + _aTotal[098]
    //Exportacion
    (PRE) cCadOrig += IIf(lCCCE .And. Alltrim(SF2->F2_ESPECIE) == "NF","02", "01") + _aTotal[098]
    //MetodoPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", Alltrim(SE4->E4_MPAGSAT) + _aTotal[098] )
    //LugarExpedicion
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + _aTotal[098]

    //////////////////////CFDI Relacionados//////////////////////////
    (PREREG) AllTrim!Empty(SF2->F2_RELSAT).Or. !Empty(SF2->F2_SERMAN).Or. !Empty(SF2->F2_UUIDRELDOCMAN) <> ""
    (PRE) IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","",fGetFolRel("S",.T.))

    ///////////DATOS DEL EMISOR///////////////////////
    //Rfc
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CGC),.F.) + _aTotal[098]
    //Nombre
    (PRE) cCadOrig += CFDCarEsp(_aTotal[075],.F.) + _aTotal[098]
    //RegimenFiscal
    (PRE) cCadOrig += CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + _aTotal[098]

    //////////////////////DATOS DEL RECEPTOR//////////////////////////
    (PRE) AllTrim(SF2->F2_ESPECIE) <> "NDI"
    (PRE) SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA))
    (PRE) SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS))
    //Rfc
    (PRE) (cCadOrig += IIf(!_aTotal[104] .And. (ALLTRIM(SF2->F2_TIPODOC) == "21" .Or. SF2->F2_GLOBAL == "1"), "XAXX010101000", CFDCarEsp(AllTrim(SA1->A1_CGC), .F.)) + _aTotal[098])
    //Nombre
    (PRE) (cCadOrig += IIf(SF2->F2_GLOBAL <> "1",CFDCarEsp(Alltrim(SA1->A1_NOME),.F.) + _aTotal[098],""), .T.)
    //DomicilioFiscalReceptor
    (PRE) (cCadOrig += IIf(SF2->F2_GLOBAL <> "1",CFDCarEsp(Alltrim(SA1->A1_CEP),.F.) + _aTotal[098],""), .T.)
    //ResidenciaFiscal
    (PRE) IIf(lCCCE .And. !Empty(CFDCarEsp(Alltrim(SF2->F2_RESIDE))), cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SF2->F2_RESIDE,"YA_CCESAT")) + _aTotal[098], "")
    //NumRegIdTrib
    (PRE) IIf(lCCCE .And. !Empty(CFDCarEsp(Alltrim(SF2->F2_IDTRIB))), cCadOrig += CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + _aTotal[098], "")
    //RegimenFiscalReceptor
    (PRE) (cCadOrig += IIf(SF2->F2_GLOBAL <> "1" .And. AI0->(ColumnPos("AI0_REGFIS")) > 0,CFDCarEsp(Alltrim(AI0->AI0_REGFIS),.F.) + _aTotal[098],""), .T.)
    //UsoCFDI
    (PRE) (cCadOrig += Alltrim(SF2->F2_USOCFDI) + _aTotal[098], .T.)

    (PRE) (cCadOrig += fXMLFUN("CO",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.)
    (PRE) (cCadOrig += fXMLFUN("TI",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)
    (PRE) (cCadOrig += fXMLFUN("IL",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)

    //Carta Porte
    (PRE) IIf(_aTotal[011],(cCadOrig += LxFunaCaPo(SF2->F2_FILIAL,SF2->F2_DOC,SF2->F2_SERIE,.T.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.),"")

    (POS) IIf(lCCCE, cCadOrig += "1.1" + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_TRASLA), cCadOrig += Alltrim(SF2->F2_TRASLA) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_TIPOPE), cCadOrig += Alltrim(SF2->F2_TIPOPE) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_CVEPED), cCadOrig += Alltrim(SF2->F2_CVEPED) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_CERORI), cCadOrig += Alltrim(SF2->F2_CERORI) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_NUMCER), cCadOrig += Alltrim(SF2->F2_NUMCER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_EXPCONF), cCadOrig += Alltrim(SF2->F2_EXPCONF) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_INCOTER), cCadOrig += Alltrim(SF2->F2_INCOTER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_SUBDIV), cCadOrig += Alltrim(SF2->F2_SUBDIV) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. SF2->(ColumnPos("F2_OBSCE")) > 0 .And. !Empty(SF2->F2_OBSCE), cCadOrig += CFDCarEsp(AllTrim(SF2->F2_OBSCE), .F.) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF2->F2_TCUSD)), cCadOrig += Alltrim(Str(SF2->F2_TCUSD)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF2->F2_TOTUSD)), cCadOrig += Alltrim(Str(SF2->F2_TOTUSD,14,2)) + _aTotal[098], "")

    //Emisor
    (POS) IIf(lCCCE , cCadOrig += CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CEPENT), cCadOrig += CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CODZOSE)+ALLTRIM(SM0->M0_CEPENT),1,9,1,4))) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CODMUN), cCadOrig += AllTrim(SM0->M0_CODMUN) + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += "MEX" + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += AllTrim(SM0->M0_CEPENT) + _aTotal[098], "")

    //Receptor Domicilio
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(AllTrim(SA1->A1_END)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), cCadOrig += AllTrim(SA1->A1_NR_END) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), cCadOrig += AllTrim(SA1->A1_NROINT) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), cCadOrig += CFDCarEsp(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))) + _aTotal[098],"")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_MUN))), cCadOrig += CFDCarEsp(AllTrim(SA1->A1_MUN),.F.) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(SA1->A1_CEP) + _aTotal[098], "")

    (POS) cCadOrig += IIf(!Empty(cCadOriCCE), cCadOriCCE, "")

    (POS) cCadOrig += _aTotal[098]
    (POS) _aTotal[033] := cCadOrig

    //SELLO
    (POS) _aTotal[100] := EVPDigest(cCadOrig,5)
    (POS) _aTotal[100] := PrivSignRSA(&(SuperGetMv("MV_CFDDIRS",,""))+SuperGetMv("MV_CFDARQS",,""),_aTotal[100],6,"assinatura")
    (POS) _aTotal[100] := ENCODE64(_aTotal[100])
    [XXX CABECERA]
    Linha1 C 041 0 Chr(239) + Chr(187) + Chr(191) + '<?xml version="1.0" encoding="UTF-8"?>'
    [XXX FACTURA]
    //Certificado del SAT incluido para pruebas
    (PRE) cCert := "MIIFyDCCA7CgAwIBAgIUMzAwMDEwMDAwMDA0MDAwMDI0NDMwDQYJKoZIhvcNAQEL"
    (PRE) cCert += "BQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFE"
    (PRE) cCert += "TUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9y"
    (PRE) cCert += "aXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0w"
    (PRE) cCert += "GwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWRpejEOMAwGA1UEEQwFMDYzNzAxCzAJ"
    (PRE) cCert += "BgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhD"
    (PRE) cCert += "T1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3Bv"
    (PRE) cCert += "bnNhYmxlOiBBQ0RNQS1TQVQwHhcNMTkwNjE3MjA0MDUxWhcNMjMwNjE3MjA0MDUx"
    (PRE) cCert += "WjCB7zEqMCgGA1UEAxMhWEVOT04gSU5EVVNUUklBTCBBUlRJQ0xFUyBTIERFIENW"
    (PRE) cCert += "MSowKAYDVQQpEyFYRU5PTiBJTkRVU1RSSUFMIEFSVElDTEVTIFMgREUgQ1YxKjAo"
    (PRE) cCert += "BgNVBAoTIVhFTk9OIElORFVTVFJJQUwgQVJUSUNMRVMgUyBERSBDVjElMCMGA1UE"
    (PRE) cCert += "LRMcWElBMTkwMTI4SjYxIC8gS0FITzY0MTEwMUIzOTEeMBwGA1UEBRMVIC8gS0FI"
    (PRE) cCert += "TzY0MTEwMUhOVExLUzA2MSIwIAYDVQQLExlYZW5vbiBJbmR1c3RyaWFsIEFydGlj"
    (PRE) cCert += "bGVzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiJQ5YcSgjwsGf29+"
    (PRE) cCert += "3go7VGdtMZCcH9wUpn46ZMAlFwUojnCPTvwJ3+cSwjqJnw8ahr3DuRwekvGR4BJA"
    (PRE) cCert += "b5b9Xi8kyoiWtwcGOSWxO38Bp9J1e/BO9HMbQBPAtLDuG47oqnH8zWLOeaoYRJDp"
    (PRE) cCert += "ARw4RX1ko2+9tbj0ntBtM7Vk1E8EWiA/h2Meq0LIv1+ySGTUrEW46FM01J5pzELv"
    (PRE) cCert += "5XupBghuJxR5DG9fiOW7u3dR5s3tZoVLwA1KdjJtY0mmnfCwxg6i5AqhvY+FAI5D"
    (PRE) cCert += "6CF6/lHA8PWg63WasvrhuIv70xCLjgPT/j00ZcPrLvBf1DefGVic980Ch/SDvC+M"
    (PRE) cCert += "dJ1F5wIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG"
    (PRE) cCert += "9w0BAQsFAAOCAgEACjfTPoKY2N5MxjmAMltd5XZCV1vgAwEtrIRYTodhE8R0Tp1Q"
    (PRE) cCert += "anAXb0luPyBv5hIXWK4VqAI4fcTtP+n7kkrwfha6ErkPWFNJWJm8ZsMmby/3WgVo"
    (PRE) cCert += "JkOFyRYQqr5Il3N6wMa5kiDBtDRbqB3iEXmvtrvjWSHyxAER+zo3jWGFlhBZ0nQN"
    (PRE) cCert += "Rtjx8sPFihVc5TUH682HJiU4oWvT63Dnra8ncqiW/uCuY86crnUq0fW7Lw/3+PY5"
    (PRE) cCert += "xXjNxR/Hh3sUPITfJrGaLWurD1J9npr9yGAJ6t9zrhhZnepIC0DUMc5+j4pg1DrO"
    (PRE) cCert += "32jzwUOLQqErDizh84NoJCWwbg+US8wi3zD0ZKiDv7XsTNWAW2Ap2JkzykKHjFTZ"
    (PRE) cCert += "iEm3uZOkJNfcu3o+kefr5HfXFT+iN9K5FUEhaQwgUeZBRJ8V5F6gmhz3d6ixVbiZ"
    (PRE) cCert += "oFNhYR8e2k8gF9gGrVMrEbJGQrl+6+ZYQLFiauXeG7fu1svk19PuyredRJGnseJq"
    (PRE) cCert += "yV4RzcRGhJA+cLnmpdDOTEhignnvnhEuY6HVRYYXhOTyeeluET7KRCxbJGqO7TdW"
    (PRE) cCert += "gjrHL3HRbNE4NY5GAdOZuLaWxElG5ZVCHqtG0Nh7UQAhcz+EKyZBAewv5XuH0Oom"
    (PRE) cCert += "ZXw6mM2mY2soL6z1224NusM8/BbJcYTQUlAEKblEChhGK1XlxiVOU2nc9KE="

    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF2->F2_TIPOPE), .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SYA->(MsSeek(xFilial("SYA")+SA2->A2_PAIS)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) _aTotal[001] := '<cfdi:Comprobante'
    (PRE) _aTotal[001] += ' xmlns:cfdi="http://www.sat.gob.mx/cfd/4"'
    (PRE) _aTotal[001] += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
    (PRE) _aTotal[001] += Iif(!lCCCE,' xmlns:cartaporte20="http://www.sat.gob.mx/CartaPorte20"','')
    (PRE) _aTotal[001] += ' xmlns:implocal="http://www.sat.gob.mx/implocal"'
    (PRE) _aTotal[001] += IIf(lCCCE .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", ' xmlns:leyendasFisc="http://www.sat.gob.mx/leyendasFiscales"' , "")
    (PRE) _aTotal[001] += ' xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv4.0cfdv40.xsd '
    (PRE) _aTotal[001] += IIF(lCCCE,'http://www.sat.gob.mx/ComercioExterior11 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd ','http://www.sat.gob.mx/CartaPorte20 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte20.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd')
    (PRE) _aTotal[001] += IIf(lCCCE .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", ' http://www.sat.gob.mx/leyendasFiscales http://www.sat.gob.mx/sitio_internet/cfd/leyendasFiscales/leyendasFisc.xsd"' , '"')
    (PRE) _aTotal[001] += IIf(lCCCE, ' xmlns:cce11="http://www.sat.gob.mx/ComercioExterior11"' , "")
    (PRE) _aTotal[001] += ' Version="4.0"'
    (PRE) _aTotal[001] += ' Serie="' + Alltrim(SF2->F2_SERIE) + '"'
    (PRE) _aTotal[001] += ' Folio="' + Alltrim(SF2->F2_DOC) + '"'
    (PRE) _aTotal[001] += ' Fecha="' + Alltrim(_aTotal[096]) + '"'
    (PRE) _aTotal[001] += ' Sello="' + Alltrim(_aTotal[100]) + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' FormaPago="' + IIf(SF2->F2_GLOBAL == '1',FormPagGlo(SF2->F2_DOC,SF2->F2_SERIE),IIf(Empty(AI0->AI0_MPAGO) .Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",Alltrim(AI0->AI0_MPAGO))) + '"' )
    (PRE) _aTotal[001] += ' NoCertificado="' + Alltrim(SF2->F2_CERTFOL) + '"'
    (PRE) _aTotal[001] += ' Certificado="' + cCert + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' CondicionesDePago="' + CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + '"' )
    (PRE) _aTotal[001] += ' SubTotal="' + Alltrim(STR(IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, (SF2->F2_VALMERC + _aTotal[103] + SF2->F2_DESCONT) - _aTotal[036] - _aTotal[037] ),14,_aTotal[106])) + '"'
    (PRE) _aTotal[001] += IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", "", IIf( SF2->F2_DESCONT == 0, "", ' Descuento="' + Alltrim(STR(SF2->F2_DESCONT,14,2)) + '"' ))
    (PRE) _aTotal[001] += ' Moneda="' + IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","XXX",Alltrim(CTO->CTO_MOESAT)) + '"'
    (PRE) _aTotal[001] += IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21", "", ' TipoCambio="' + IIf(!(Alltrim(CTO->CTO_MOESAT) $ "MXN|XXX"), Alltrim(STR(SF2->F2_TXMOEDA,14,2)), "1") + '"')
    (PRE) _aTotal[001] += ' Total="' + Alltrim(Str(IIf(Alltrim(SF2->F2_TIPODOC) == "21", 0, IIf(GetSx3Cache("F2_VALBRUT","X3_DECIMAL") <= 2,SF2->F2_VALBRUT + _aTotal[103] - _aTotal[037] - _aTotal[038] ,Round(SF2->F2_VALBRUT,2) + _aTotal[103] - _aTotal[037] - _aTotal[038])),14,_aTotal[106])) + '"'
    (PRE) _aTotal[001] += ' TipoDeComprobante="' + IIf(Alltrim(SF2->F2_ESPECIE) == "NF",IIf(Alltrim(SF2->F2_TIPODOC) == "21", "T", "I"), "E") + '"'
    (PRE) _aTotal[001] += ' Exportacion="'+IIf(lCCCE .And. Alltrim(SF2->F2_ESPECIE) == "NF","02","01")+'"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' MetodoPago="' + Alltrim(SE4->E4_MPAGSAT) + '"' )
    (PRE) _aTotal[001] += ' LugarExpedicion="' + CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + '"'
    (PRE) _aTotal[001] += '>'
    (PREREG) _aTotal[001]


    (POS) cNodoCCE := IIf(lCCCE, ' <cce11:ComercioExterior' , "")

    (POS) cNodoCCE += IIf(lCCCE, ' Versionxmlns:cfdi="1.1http://www.sat.gob.mx/cfd/3"' , "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_TRASLA), ' MotivoTraslado="' , ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' xmlns:cce11="http://www.sat.gob.mx/ComercioExterior11"' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd"' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' Version="1.1"' , "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_TRASLA), ' MotivoTraslado="' + Alltrim(SF2->F2_TRASLA) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_TIPOPE), ' TipoOperacion="' + Alltrim(SF2->F2_TIPOPE) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_CVEPED), ' ClaveDePedimento="' + Alltrim(SF2->F2_CVEPED) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_CERORI), ' CertificadoOrigen="' + Alltrim(SF2->F2_CERORI) +'"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_NUMCER), ' NumCertificadoOrigen="' + Alltrim(SF2->F2_NUMCER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_EXPCONF), ' NumeroExportadorConfiable="' + Alltrim(SF2->F2_EXPCONF) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_INCOTER), ' Incoterm="' + Alltrim(SF2->F2_INCOTER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_SUBDIV), ' Subdivision="' + Alltrim(SF2->F2_SUBDIV) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. SF2->(ColumnPos("F2_OBSCE")) > 0 .And. !Empty(SF2->F2_OBSCE), ' Observaciones="' + CFDCarEsp(AllTrim(SF2->F2_OBSCE), .T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF2->F2_TCUSD)), ' TipoCambioUSD="' + Alltrim(Str(SF2->F2_TCUSD)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF2->F2_TOTUSD)), ' TotalUSD="' + Alltrim(Str(SF2->F2_TOTUSD,14,2)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "")
    (POS) _aTotal[094] := cNodoCCE

    [XXX CFDIREL]
    (PREREG) AllTrim) !Empty(SF2->F2_RELSAT).Or. !Empty(SF2->F2_SERMAN).Or. !Empty(SF2->F2_UUIDRELDOCMAN) <> ""
    (PREREG) (_aTotal[001] := IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","",fGetFolRel("S")))
    (PREREG) _aTotal[001]

    [XXX EMISOR]
    (PRE) (_aTotal[001] := ' <cfdi:Emisor' , .T.)
    (PRE) (_aTotal[001] += ' Rfc="' + CFDCarEsp(AllTrim(SM0->M0_CGC))+ '"' , .T.)
    (PRE) (_aTotal[001] += ' Nombre="' + CFDCarEsp(_aTotal[075],.T.) + '"' , .T.)
    (PRE) (_aTotal[001] += ' RegimenFiscal="' + CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + '"' , .T.)
    (PRE) (_aTotal[001] += '/>' , .T.)
    (PRE) (_aTotal[001] := _aTotal[001] , .T.)
    (PREREG) _aTotal[001]

    [XXX RECEPTOR_CLIENTE]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF2->F2_TIPOPE), .T., .F.)
    (PRE) cNodoCCE := ""

    (PREREG) AllTrim(SF2->F2_ESPECIE) <> "NDI"
    (PREREG) (SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PREREG) (SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PREREG) (_aTotal[001] := ' <cfdi:Receptor' , .T.)
    (PREREG) (_aTotal[001] += ' Rfc="' + CFDCarEsp(IIf(!_aTotal[104] .And.(Alltrim(SF2->F2_TIPODOC) == "21" .Or. SF2->F2_GLOBAL == "1"), "XAXX010101000", Alltrim(SA1->A1_CGC))) + '"' , .T.)
    (PREREG) (_aTotal[001] += IIf(SF2->F2_GLOBAL <> "1",' Nombre="' + CFDCarEsp(Alltrim(SA1->A1_NOME),.T.) + '"',"") , .T.)
    (PREREG) (_aTotal[001] += ' DomicilioFiscalReceptor="' + Alltrim(SA1->A1_CEP) + '"' , .T.)
    (PREREG) (_aTotal[001] += Iif(AI0->(ColumnPos("AI0_REGFIS")) > 0,' RegimenFiscalReceptor="' + Alltrim(AI0->AI0_REGFIS) + '"',""), .T.)
    (PREREG) (_aTotal[001] += ' UsoCFDI="' + Alltrim(SF2->F2_USOCFDI) + '"' , .T.)
    (PREREG) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB)))), (_aTotal[001] += ' NumRegIdTrib="' + CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + '"' , .T.), "")
    (PREREG) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(AllTrim(SF2->F2_RESIDE)))), (_aTotal[001] += ' ResidenciaFiscal="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SF2->F2_RESIDE,"YA_CCESAT")) + '"' , .T.), "")
    (PREREG) (_aTotal[001] += '/>' ,.T.)
    (PREREG) (_aTotal[001] := _aTotal[001] , .T.)
    (PREREG) _aTotal[001]

    (POS) cNodoCCE += IIf(lCCCE, ' <cce11:Emisor' , "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, ' <cce11:Domicilio' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))), ' Colonia="' + CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CODZOSE)+ALLTRIM(SM0->M0_CEPENT),1,9,1,4))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SM0->M0_CEPENT))), ' Municipio="' + CFDCarEsp(AllTrim(SM0->M0_CODMUN)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim("MEX") + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SM0->M0_CEPENT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, ' </cce11:Emisor>' + ( chr(13)+chr(10) ), "")

    (POS) cNodoCCE += IIf(lCCCE, ' <cce11:Receptor' , "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "")

    (POS) cNodoCCE += IIf(lCCCE, ' <cce11:Domicilio' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SA1->A1_END)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), ' NumeroExterior="' + AllTrim(SA1->A1_NR_END) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), ' NumeroInterior="' + AllTrim(SA1->A1_NROINT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), ' Colonia="' + CFDCarEsp(AllTrim(SA1->A1_BAIRRO)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_MUN)), ' Municipio="' + CFDCarEsp(AllTrim(SA1->A1_MUN),.T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SA1->A1_CEP) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, ' </cce11:Receptor>' + ( chr(13)+chr(10) ), "")

    (POS) (cNodoCCE += IIf(lCCCE, ' <cce11:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    [SD2 CONCEPTO]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF2->F2_TIPOPE), .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) DbGoTop()

    (PREREG) (cNodoCCE += IIf(lCCCE, ' <cce11:Mercancia' , ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE , ' NoIdentificacion="' + Alltrim(SD2->D2_ITEM + SD2->D2_COD) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), ' FraccionArancelaria="' + Alltrim(SD2->D2_FRACCA) + Alltrim(SD2->D2_NICO) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD2->D2_CANADU)), ' CantidadAduana="' + Alltrim(Str(SD2->D2_CANADU)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), ' UnidadAduana="' + AllTrim(ObtColSAT("S014",AllTrim(SD2->D2_FRACCA),1,8,9,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD2->D2_VALADU)), ' ValorUnitarioAduana="' + Alltrim(Str(SD2->D2_VALADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, ' ValorDolares="' + Alltrim(Str(SD2->D2_USDADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ) , ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, ' </cce11:Mercancia>' + ( chr(13)+chr(10) ), ""),.T.)

    (POS) (cNodoCCE += IIf(lCCCE, ' </cce11:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) (cNodoCCE += IIf(lCCCE, ' </cce11:ComercioExterior>' , ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    (POS) (_aTotal[034] := fXMLFUN("CO",.F., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.)

    [XXX CONCEPTOS]
    (POS) FsQuery(_aTotal[097],2)

    (PREREG) (_aTotal[001] := _aTotal[034] ,.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOS]
    (PREREG) (_aTotal[002] := fXMLFUN("TI",.F.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)
    (PREREG) _aTotal[002]

    //IMPUESTOS LOCALES//
    (PRE) (_aTotal[095] := fXMLFUN("IL",.F.),.T.)

    [XXX COMPLEMENT]
    (PREREG) IIf(_aTotal[011],_aTotal[105] := LxFunaCaPo(SF2->F2_FILIAL,SF2->F2_DOC,SF2->F2_SERIE,.F.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),"")
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095] ) .Or. !Empty(_aTotal[105]), ' <cfdi:Complemento', ""), .T.)
    (PREREG) (_aTotal[001] += IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095] ) .Or. !Empty(_aTotal[105]),'>',""),.T.)
    (PREREG) _aTotal[001]
    COMPLEMENT C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.T.,.F.,4))


    [XXX COMERCIOEX]
    (PREREG) (_aTotal[001] := _aTotal[094],.T.)
    (PREREG) _aTotal[001]

    [XXX CARTAPORTE]
    (PREREG) (_aTotal[001] := _aTotal[105],.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOLOC]
    (PREREG) (_aTotal[001] := _aTotal[095],.T.)
    (PREREG) _aTotal[001]

    [XXX LEYENDASFIS]
    (PREREG) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF2->F2_TIPOPE), .T., .F.) .And. SF2->(FieldPos("F2_CONUNI")) > 0
    (PREREG) lCCCE
    (PREREG) (_aTotal[001] := IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF" , ' <leyendasFisc:LeyendasFiscales version="1.0" >'+ ( chr(13)+chr(10) ), ""), .T.)
    (PREREG) (_aTotal[001] += IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF" , ' <leyendasFisc:Leyenda textoLeyenda=', ""), .T.)
    (PREREG) (_aTotal[001] += IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. SF2->F2_CONUNI=="1" .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", '"IMMEX:'+ AllTrim(SA1->A1_PFISICA) +' ' + _aTotal[101] +'" />', IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. SF2->F2_CONUNI=="2" .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF",'"IMMEX:'+ AllTrim(SA1->A1_PFISICA) + ' ' + _aTotal[102] +'" />',"")), .T.)
    (PREREG) _aTotal[001]
    (PREREG) (_aTotal[001] := IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF",' </leyendasFisc:LeyendasFiscales>', ""), .T.)
    (PREREG) _aTotal[001]


    [XXX COMPLEMENT]
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094]) .or. !EMPTY(_aTotal[095]) .or. !EMPTY(_aTotal[105]),' </cfdi:Complemento>',""), .T.)
    (PREREG) _aTotal[001]
    COMPLEMENT C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.F.,.T.,4))

    //[XXX CAD_ORIG]
    //(PREREG) _aTotal[033]

    [XXX FACTURA]
    (PRE) _aTotal[095] := &(GetNewPar("MV_CFDNAF2","Lower(AllTrim(SF2->F2_ESPECIE)) + '_' + Lower(AllTrim(SF2->F2_SERIE)) + '_' + Lower(AllTrim(SF2->F2_DOC)) + '.xml'"))
    (ARQ) _aTotal[095]
    FACTURA C 019 0 ENCODEUTF8(XMLConv("",,,"cfdi:Comprobante",.F.,.T.,0))

    FATEMEX.INI

    Se recomienda editar el script actual de generación de CFDI (Archivo XML), actualizando las secciones de acuerdo al siguiente modelo, en donde las líneas resaltadas con color azul se agregaron o fueron modificadas para integrar la Versión 4.0 CFDi en las Notas de Crédito.; las líneas resaltadas con color rojo fueron removidas:


    Painel
    borderWidth2
    titleBGColorlightblue
    borderStyledashedsolid
    titleFATSMEXFATEMEX.INI

    //FATEMEX.INI V4.0 --- Modelo 2022
    [XXX POSICIONAMENTOS]
    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",SA2->(MSSeek(xFilial("SA2")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)<>"NCC",SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF1->F1_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)

    [XXX INICIALIZACION]
    (PRE) SD1->(DbSetOrder(1))
    (PRE) SB1->(DbSetOrder(1))
    (PRE) SYA->(DbSetOrder(1))
    (PRE) SC6->(DbSetOrder(1))
    (PRE) SE4->(DbSetOrder(1))
    (PRE) CTO->(DbSetOrder(1))
    (PRE) SAH->(DbSetOrder(1))
    (PRE) _aTotal[094] := ""
    (PRE) _aTotal[095] := ""
    (PRE) _aTotal[033] := ""
    (PRE) _aTotal[034] := ""
    (PRE) _aTotal[035] := ""
    (PRE) _aTotal[036] := 0
    (PRE) _aTotal[075] := Alltrim(SM0->M0_NOMECOM)
    (PRE) _aTotal[096] := DtoS(SF1->F1_EMISSAO)
    (PRE) _aTotal[096] := Left(_aTotal[096],4) + "-" + Substr(_aTotal[096],5,2)+ "-" + Right(_aTotal[096],2)
    (PRE) _aTotal[096] += "T" + SF1->F1_HORA
    (PRE) _aTotal[097] := {"SD1",""}
    (PRE) _aTotal[098] := "|"
    (PRE) _aTotal[099] := "||"
    (PRE) _aTotal[100] := ""
    (PRE) _aTotal[101] := IIF(SuperGetMv("MV_DESCSAI",.T.,"2") == "1", .T., .F.)
    (PRE) lCCCE := .F.
    (PRE) cNodoCCE := ""

    (PREREG) FsQuery(_aTotal[097],1,"D1_DOC='" + SF1->F1_DOC + "' AND D1_SERIE='" + SF1->F1_SERIE + "' AND D1_FORNECE='" + SF1->F1_FORNECE + "' AND D1_LOJA='" + SF1->F1_LOJA + "'","SD1->D1_DOC=SF1->F1_DOC .AND. SD1->D1_SERIE=SF1->F1_SERIE .AND. SD1->D1_FORNECE=SF1->F1_FORNECE .AND. SD1->D1_LOJA=SF1->F1_LOJA","D1_ITEM") .And. .T.

    (PRE) fImptosD(SF1->F1_DOC,SF1->F1_SERIE,SF1->F1_FORNECE,SF1->F1_LOJA, .F. , "SD1", .F., @(_aTotal[036]))

    [SD1 CADENAORIGINAL_SELLO]
    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",CTO->(MsSeek(xFilial("CTO")+Strzero(SF1->F1_MOEDA,2))) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)<>"NCC",SA2->(MSSeek(xFilial("SA2")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)<>"NCC",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)<>"NCC",CTO->(MsSeek(xFilial("CTO")+Strzero(SF1->F1_MOEDA,2))) , .T.)
    //////////////////////////////////////////////CADENA ORIGINAL//////////////////////////////////////////////
    (PRE) cCadOrig := _aTotal[099]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF1->F1_TIPOPE), .T., .F.)
    (PRE) cCadOriCCE := ""

    //Cadena Original | Complemento de Comercio Exterior
    (PREREG) IIf(lCCCE .And. !Empty(SD1->D1_ITEM + SD1->D1_COD), (cCadOriCCE += Alltrim(SD1->D1_ITEM + SD1->D1_COD) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD1->D1_FRACCA), (cCadOriCCE += Alltrim(SD1->D1_FRACCA) + Alltrim(SD1->D1_NICO) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD1->D1_CANADU)), (cCadOriCCE += Alltrim(Str(SD1->D1_CANADU)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD1->D1_FRACCA), (cCadOriCCE += AllTrim(ObtColSAT("S014",AllTrim(SD1->D1_FRACCA),1,8,9,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD1->D1_VALADU)), (cCadOriCCE += Alltrim(Str(SD1->D1_VALADU,14,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD1->D1_USDADU)), (cCadOriCCE += Alltrim(Str(SD1->D1_USDADU,14,2)) + _aTotal[098],.T.), ("",,.T.))

    //Cadena Original | Complemento de Comercio Exterior
    (POS) IIf(lCCCE, cCadOrig += "1.1" + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_TRASLA), cCadOrig += Alltrim(SF1->F1_TRASLA) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_TIPOPE), cCadOrig += Alltrim(SF1->F1_TIPOPE) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_CVEPED), cCadOrig += Alltrim(SF1->F1_CVEPED) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_CERORI), cCadOrig += Alltrim(SF1->F1_CERORI) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_NUMCER), cCadOrig += Alltrim(SF1->F1_NUMCER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_EXPCONF), cCadOrig += Alltrim(SF1->F1_EXPCONF) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_INCOTER), cCadOrig += Alltrim(SF1->F1_INCOTER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_SUBDIV), cCadOrig += Alltrim(SF1->F1_SUBDIV) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. SF1->(ColumnPos("F1_OBSCE")) > 0 .And. !Empty(SF1->F1_OBSCE), cCadOrig += CFDCarEsp(Alltrim(SF1->F1_OBSCE),.F.) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF1->F1_TCUSD)), cCadOrig += Alltrim(Str(SF1->F1_TCUSD)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF1->F1_TOTUSD)), cCadOrig += Alltrim(Str(SF1->F1_TOTUSD,14,2)) + _aTotal[098], "")

    ///////////DATOS DE LA FACTURA/////////////////
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF1->F1_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    //Version
    (PRE) cCadOrig += "4.0" + _aTotal[098]
    //Serie
    (PRE) cCadOrig += Alltrim(SF1->F1_SERIE) + _aTotal[098]
    //Folio
    (PRE) cCadOrig += Alltrim(SF1->F1_DOC) + _aTotal[098]
    //Fecha
    (PRE) cCadOrig += Alltrim(_aTotal[096]) + _aTotal[098]
    //FormaPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", IIf(SF2->F2_GLOBAL == '1',FormPagGlo(SF2->F2_DOC,SF2->F2_SERIE),IIf(Empty(AI0->AI0_MPAGO) .Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",Alltrim(AI0->AI0_MPAGO))) + _aTotal[098] )
    //NoCertificado
    (PRE) cCadOrig += Alltrim(SF1->F1_CERTFOL) + _aTotal[098]
    //CondicionesDePago
    (PRE) cCadOrig += CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + _aTotal[098]
    //Subtotal
    (PRE) cCadOrig += Alltrim(STR((SF1->F1_VALMERC + IIF(_aTotal[101], SF1->F1_DESCONT, 0 )) - _aTotal[036],14,2)) + _aTotal[098]
    //Descuento
    (PRE) cCadOrig += IIf(SF1->F1_DESCONT==0, "", Alltrim(STR(SF1->F1_DESCONT,14,2)) + _aTotal[098])
    //Moneda
    (PRE) cCadOrig += Alltrim(CTO->CTO_MOESAT) + _aTotal[098]
    //TipoCambio
    (PRE) cCadOrig += IIf(!(Alltrim(CTO->CTO_MOESAT) <> $ "MXN|XXX"), Alltrim(STR(SF1->F1_TXMOEDA,14,2)), "1") + _aTotal[098]
    //Total
    (PRE) cCadOrig += Alltrim(STR(iif(GetSx3Cache("F1_VALBRUT","X3_DECIMAL")<= 2,SF1->F1_VALBRUT,Round(SF1->F1_VALBRUT,2)),14,2)) + _aTotal[098]
    //TipoDeComprobante
    (PRE) cCadOrig += IIf(Alltrim(SF1->F1_ESPECIE) == "NF", "I", "E") + _aTotal[098]
    //Exportacion
    (PRE) cCadOrig += IIf(lCCCE,"02", "01") + _aTotal[098]
    //MetodoPago
    (PRE) cCadOrig += IIf(Alltrim(SF1->F1_TIPODOC) == "21", "", Alltrim(SE4->E4_MPAGSAT) + _aTotal[098] )
    //LugarExpedicion
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + _aTotal[098]
    //Confirmacion
    //(PRE) cCadOrig += "ClavePAC" + _aTotal[098]

    //////////////////////CFDI Relacionados//////////////////////////
    (PREREG) AllTrim(SF1->F1_RELSAT) <> ""
    (PRE) fGetFolRel("E",.T.)

    ///////////DATOS DEL EMISOR///////////////////////
    //Rfc
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CGC),.F.) + _aTotal[098]
    //Nombre
    (PRE) cCadOrig += CFDCarEsp(_aTotal[075],.F.) + _aTotal[098]
    //RegimenFiscal
    (PRE) cCadOrig += CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + _aTotal[098]

    //////////////////////DATOS DEL RECEPTOR//////////////////////////
    (PRE) AllTrim(SF1->F1_ESPECIE) == "NCC"
    (PRE) SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA))
    (PRE) SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS))
    //Rfc
    (PRE) (cCadOrig += CFDCarEsp(AllTrim(SA1->A1_CGC), .F.) + _aTotal[098], .T.)
    //Nombre
    (PRE) (cCadOrig += CFDCarEsp(Alltrim(SA1->A1_NOME),.F.) + _aTotal[098], .T.)
    //DomicilioFiscalReceptor
    (PRE) (cCadOrig += IIf(SF2->F2_GLOBAL <> "1", CFDCarEsp(Alltrim(SA1->A1_CEP),.F.) + _aTotal[098], ""), .T.)
    //ResidenciaFiscal
    (PRE) IIf(lCCCE,(cCadOrig += Alltrim(SYA->YA_CCESAT) + _aTotal[098], .T.),"")
    //NumRegIdTrib
    (PRE) IIf(lCCCE,(cCadOrig += Alltrim(AI0->AI0_IDFIS) + _aTotal[098], .T.),"")
    //RegimenFiscalReceptor
    (PRE) (cCadOrig += IIf(SF2->F2_GLOBAL <> "1" .And. AI0->AI0->(ColumnPos("AI0_REGFIS")) > 0,CFDCarEsp(Alltrim(AI0->AI0_REGFIS),.F.) + _aTotal[098],""), .T.)
    //UsoCFDI
    (PRE) (cCadOrig += Alltrim(SF1->F1_USOCFDI) + _aTotal[098], .T.)

    (PRE) (cCadOrig += fXMLFUN("CO",.T., .F. ,.F.))
    (PRE) (cCadOrig += fXMLFUN("TI",.T., .F. ,.T.))
    (PRE) (cCadOrig += fXMLFUN("IL",.T., .F. ,.T.))

    //Cadena Original | Complemento de Comercio Exterior

    //Emisor
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_BAIRENT), cCadOrig += ObtColSAT("S015",AllTrim(SM0->M0_CEPENT),5,5,1,4) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CODMUN), cCadOrig += AllTrim(SM0->M0_CODMUN) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += "MEX" + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(SM0->M0_CEPENT) + _aTotal[098], "")

    //Receptor Domicilio
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(AllTrim(SA1->A1_END)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), cCadOrig += AllTrim(SA1->A1_NR_END) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), cCadOrig += AllTrim(SA1->A1_NROINT) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), cCadOrig += CFDCarEsp(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))) + _aTotal[098],"")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_MUN))), cCadOrig += CFDCarEsp(AllTrim(SA1->A1_MUN),.F.) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + _aTotal[098],"")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_PAIS)), cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_CEP)), cCadOrig += AllTrim(SA1->A1_CEP) + _aTotal[098], "")

    (POS) cCadOrig += IIf(!Empty(cCadOriCCE), cCadOriCCE, "")

    (POS) cCadOrig += _aTotal[098]
    (POS) _aTotal[033] := cCadOrig

    //SELLO
    (POS) _aTotal[100] := EVPDigest(cCadOrig,5)
    (POS) _aTotal[100] := PrivSignRSA(&(SuperGetMv("MV_CFDDIRS",,""))+SuperGetMv("MV_CFDARQS",,""),_aTotal[100],6,"assinatura")
    (POS) _aTotal[100] := ENCODE64(_aTotal[100])

    [XXX CABECERA]
    Linha1 C 041 0 Chr(239) + Chr(187) + Chr(191) + '<?xml version="1.0" encoding="UTF-8"?>'

    [XXX FACTURA]
    //Certificado del SAT incluido para pruebas
    (PRE) cCert := "MIIFyDCCA7CgAwIBAgIUMzAwMDEwMDAwMDA0MDAwMDI0NDMwDQYJKoZIhvcNAQEL"
    (PRE) cCert += "BQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFE"
    (PRE) cCert += "TUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9y"
    (PRE) cCert += "aXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0w"
    (PRE) cCert += "GwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWRpejEOMAwGA1UEEQwFMDYzNzAxCzAJ"
    (PRE) cCert += "BgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhD"
    (PRE) cCert += "T1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3Bv"
    (PRE) cCert += "bnNhYmxlOiBBQ0RNQS1TQVQwHhcNMTkwNjE3MjA0MDUxWhcNMjMwNjE3MjA0MDUx"
    (PRE) cCert += "WjCB7zEqMCgGA1UEAxMhWEVOT04gSU5EVVNUUklBTCBBUlRJQ0xFUyBTIERFIENW"
    (PRE) cCert += "MSowKAYDVQQpEyFYRU5PTiBJTkRVU1RSSUFMIEFSVElDTEVTIFMgREUgQ1YxKjAo"
    (PRE) cCert += "BgNVBAoTIVhFTk9OIElORFVTVFJJQUwgQVJUSUNMRVMgUyBERSBDVjElMCMGA1UE"
    (PRE) cCert += "LRMcWElBMTkwMTI4SjYxIC8gS0FITzY0MTEwMUIzOTEeMBwGA1UEBRMVIC8gS0FI"
    (PRE) cCert += "TzY0MTEwMUhOVExLUzA2MSIwIAYDVQQLExlYZW5vbiBJbmR1c3RyaWFsIEFydGlj"
    (PRE) cCert += "bGVzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiJQ5YcSgjwsGf29+"
    (PRE) cCert += "3go7VGdtMZCcH9wUpn46ZMAlFwUojnCPTvwJ3+cSwjqJnw8ahr3DuRwekvGR4BJA"
    (PRE) cCert += "b5b9Xi8kyoiWtwcGOSWxO38Bp9J1e/BO9HMbQBPAtLDuG47oqnH8zWLOeaoYRJDp"
    (PRE) cCert += "ARw4RX1ko2+9tbj0ntBtM7Vk1E8EWiA/h2Meq0LIv1+ySGTUrEW46FM01J5pzELv"
    (PRE) cCert += "5XupBghuJxR5DG9fiOW7u3dR5s3tZoVLwA1KdjJtY0mmnfCwxg6i5AqhvY+FAI5D"
    (PRE) cCert += "6CF6/lHA8PWg63WasvrhuIv70xCLjgPT/j00ZcPrLvBf1DefGVic980Ch/SDvC+M"
    (PRE) cCert += "dJ1F5wIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG"
    (PRE) cCert += "9w0BAQsFAAOCAgEACjfTPoKY2N5MxjmAMltd5XZCV1vgAwEtrIRYTodhE8R0Tp1Q"
    (PRE) cCert += "anAXb0luPyBv5hIXWK4VqAI4fcTtP+n7kkrwfha6ErkPWFNJWJm8ZsMmby/3WgVo"
    (PRE) cCert += "JkOFyRYQqr5Il3N6wMa5kiDBtDRbqB3iEXmvtrvjWSHyxAER+zo3jWGFlhBZ0nQN"
    (PRE) cCert += "Rtjx8sPFihVc5TUH682HJiU4oWvT63Dnra8ncqiW/uCuY86crnUq0fW7Lw/3+PY5"
    (PRE) cCert += "xXjNxR/Hh3sUPITfJrGaLWurD1J9npr9yGAJ6t9zrhhZnepIC0DUMc5+j4pg1DrO"
    (PRE) cCert += "32jzwUOLQqErDizh84NoJCWwbg+US8wi3zD0ZKiDv7XsTNWAW2Ap2JkzykKHjFTZ"
    (PRE) cCert += "iEm3uZOkJNfcu3o+kefr5HfXFT+iN9K5FUEhaQwgUeZBRJ8V5F6gmhz3d6ixVbiZ"
    (PRE) cCert += "oFNhYR8e2k8gF9gGrVMrEbJGQrl+6+ZYQLFiauXeG7fu1svk19PuyredRJGnseJq"
    (PRE) cCert += "yV4RzcRGhJA+cLnmpdDOTEhignnvnhEuY6HVRYYXhOTyeeluET7KRCxbJGqO7TdW"
    (PRE) cCert += "gjrHL3HRbNE4NY5GAdOZuLaWxElG5ZVCHqtG0Nh7UQAhcz+EKyZBAewv5XuH0Oom"
    (PRE) cCert += "ZXw6mM2mY2soL6z1224NusM8/BbJcYTQUlAEKblEChhGK1XlxiVOU2nc9KE="

    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF1->F1_TIPOPE), .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF1->F1_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) _aTotal[001] := '<cfdi:Comprobante'
    (PRE) _aTotal[001] += ' xmlns:cfdi="http://www.sat.gob.mx/cfd/4"'
    (PRE) _aTotal[001] += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
    (PRE) _aTotal[001] += ' xmlns:implocal="http://www.sat.gob.mx/implocal"'
    (PRE) _aTotal[001] += ' xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv4cfdv40.0.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd '
    (PRE) _aTotal[001] += IIF(lCCCE,'http://www.sat.gob.mx/ComercioExterior11 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd "','"')
    (PRE) _aTotal[001] += IIf(lCCCE, ' xmlns:cce11="http://www.sat.gob.mx/ComercioExterior11"' , "")
    (PRE) _aTotal[001] += ' Version="4.0"'
    (PRE) _aTotal[001] += ' Serie="' + Alltrim(SF1->F1_SERIE) + '"'
    (PRE) _aTotal[001] += ' Folio="' + Alltrim(SF1->F1_DOC) + '"'
    (PRE) _aTotal[001] += ' Fecha="' + Alltrim(_aTotal[096]) + '"'
    (PRE) _aTotal[001] += ' Sello="' + Alltrim(_aTotal[100]) + '"'
    (PRE) _aTotal[001] += ' FormaPago="' + Iif(Empty(AI0→AI0AI0->AI0_MPAGO) .Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",Alltrim(AI0->AI0_MPAGO)) + '"'
    (PRE) _aTotal[001] += ' NoCertificado="' + Alltrim(SF1->F1_CERTFOL) + '"'
    (PRE) _aTotal[001] += ' Certificado="' + cCert + '"'
    (PRE) _aTotal[001] += ' CondicionesDePago="' + CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + '"'
    (PRE) _aTotal[001] += ' SubTotal="' + Alltrim(STR((SF1->F1_VALMERC + IIF(_aTotal[101], SF1->F1_DESCONT, 0 )) - _aTotal[036],14,2)) + '"'
    (PRE) _aTotal[001] += IIf(SF1->F1_DESCONT==0, "", ' Descuento="' + Alltrim(STR(SF1->F1_DESCONT,14,2)) + '"')
    (PRE) _aTotal[001] += ' Moneda="' + Alltrim(CTO->CTO_MOESAT) + '"'
    (PRE) _aTotal[001] += ' TipoCambio="' + IIf(Alltrim(CTO->CTO_MOESAT) <> "MXN", Alltrim(STR(SF1->F1_TXMOEDA,14,2)), "1") + '"'
    (PRE) _aTotal[001] += ' Total="' + Alltrim(STR(iif(GetSx3Cache("F1_VALBRUT","X3_DECIMAL")<= 2,SF1->F1_VALBRUT,Round(SF1->F1_VALBRUT,2)),14,2)) + '"'
    (PRE) _aTotal[001] += ' TipoDeComprobante="' + IIf(Alltrim(SF1->F1_ESPECIE) == "NF", "I", "E") + '"'
    (PRE) _aTotal[001] += ' Exportacion="'+IIf(lCCCE .And. Alltrim(SF2SF1->F2>F1_ESPECIE) == "NFNCC","02","01")+'"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF1->F1_TIPODOC) == "21", "", ' MetodoPago="' + Alltrim(SE4->E4_MPAGSAT) + '"' )
    (PRE) _aTotal[001] += ' LugarExpedicion="' + CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + '"'
    (PRE) _aTotal[001] += '>'
    (PREREG) _aTotal[001]

    (POS) cNodoCCE := IIf(lCCCE, ' <cce11       <cce11:ComercioExterior' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' xmlns:cfdi="http://www.sat.gob.mx/cfd/4"' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' xmlns:cce11="http://www.sat.gob.mx/ComercioExterior11"' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv4.0.xsd http://www.sat.gob.mx/ComercioExterior11 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd"' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' Version="1.1"' , "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_TRASLA), ' MotivoTraslado="' + Alltrim(SF1->F1_TRASLA) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_TIPOPE), ' TipoOperacion="' + Alltrim(SF1->F1_TIPOPE) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_CVEPED), ' ClaveDePedimento="' + Alltrim(SF1->F1_CVEPED) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_CERORI), ' CertificadoOrigen="' + Alltrim(SF1->F1_CERORI) +'"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_NUMCER), ' NumCertificadoOrigen="' + Alltrim(SF1->F1_NUMCER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_EXPCONF), ' NumeroExportadorConfiable="' + Alltrim(SF1->F1_EXPCONF) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_INCOTER), ' Incoterm="' + Alltrim(SF1->F1_INCOTER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_SUBDIV), ' Subdivision="' + Alltrim(SF1->F1_SUBDIV) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. SF1->(ColumnPos("F1_OBSCE")) > 0 .And. !Empty(SF1->F1_OBSCE), ' Observaciones="' + CFDCarEsp(Alltrim(SF1->F1_OBSCE), .F.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF1->F1_TCUSD)), ' TipoCambioUSD="' + Alltrim(Str(SF1->F1_TCUSD)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF1->F1_TOTUSD)), ' TotalUSD="' + Alltrim(Str(SF1->F1_TOTUSD,14,2)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "")
    (POS) _aTotal[094] := cNodoCCE

    [XXX CFDIREL]
    (PREREG) AllTrim(SF1->F1_RELSAT) <> ""
    (PREREG) (_aTotal[001] := fGetFolRel("E"),.T.)
    (PREREG) _aTotal[001]

    [XXX EMISOR]
    (PRE) _aTotal[001] := ' <cfdi:Emisor'
    (PRE) _aTotal[001] += ' Rfc="' + CFDCarEsp(AllTrim(SM0->M0_CGC)) + '"'
    (PRE) _aTotal[001] += ' Nombre="' + CFDCarEsp(_aTotal[075],.T.) + '"'
    (PRE) _aTotal[001] += ' RegimenFiscal="' + CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + '"'
    (PRE) _aTotal[001] += '/>'
    (PREREG) _aTotal[001]

    [XXX RECEPTOR_CLIENTE]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF1->F1_TIPOPE), .T., .F.)
    (PRE) cNodoCCE := ""

    (PREREG) AllTrim(SF1->F1_ESPECIE) == "NCC"
    (PREREG) (SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PREREG) (SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PREREG) (_aTotal[001] := ' <cfdi:Receptor' , .T.)
    (PREREG) (_aTotal[001] += ' Rfc="' + CFDCarEsp(AllTrim(SA1->A1_CGC)) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' Nombre="' + CFDCarEsp(Alltrim(SA1->A1_NOME),.T.) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' DomicilioFiscalReceptor="' + Alltrim(SA1->A1_CEP) + '"' , .T.)
    (PREREG) (_aTotal[001] += Iif(AI0->(ColumnPos("AI0_REGFIS")) > 0,' RegimenFiscalReceptor="' + Alltrim(AI0->AI0_REGFIS) + '"',""), .T.)
    (PREREG) IIf(lCCCE,(_aTotal[001] += ' ResidenciaFiscal="' + Alltrim(SYA->YA_CCESAT) + '"' , .T.),"")
    (PREREG) IIf(lCCCE,(_aTotal[001] += ' NumRegIdTrib="' + Alltrim(AI0->AI0_IDFIS) + '"' , .T.),"")
    (PREREG) (_aTotal[001] += ' UsoCFDI="' + Alltrim(SF1->F1_USOCFDI) + '"' , .T.)
    (PREREG) (_aTotal[001] += '/>' ,.T.)
    (PREREG) _aTotal[001]


    //Emisor
    (POS) cNodoCCE += IIf(lCCCE, ' <cce11:Emisor' , "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, ' <cce11:Domicilio' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))), ' Colonia="' + CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CEPENT),5,5,1,4))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SM0->M0_CEPENT))), ' Municipio="' + CFDCarEsp(AllTrim(SM0->M0_CODMUN)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim("MEX") + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SM0->M0_CEPENT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, ' </cce11:Emisor>' + ( chr(13)+chr(10) ), "")

    //Receptor
    (POS) cNodoCCE += IIf(lCCCE, ' <cce11:Receptor' , "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "")

    //Domicilio Receptor
    (POS) cNodoCCE += IIf(lCCCE, ' <cce11:Domicilio' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SA1->A1_END)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), ' NumeroExterior="' + AllTrim(SA1->A1_NR_END) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), ' NumeroInterior="' + AllTrim(SA1->A1_NROINT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), ' Colonia="' + CFDCarEsp(AllTrim(SA1->A1_BAIRRO)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_MUN)), ' Municipio="' + CFDCarEsp(AllTrim(SA1->A1_MUN),.T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SA1->A1_CEP) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, ' </cce11:Receptor>' + ( chr(13)+chr(10) ), "")

    (POS) (cNodoCCE += IIf(lCCCE, ' <cce11:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    [SD1 CONCEPTO]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF1->F1_TIPOPE), .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) DbGoTop()

    (PREREG) (cNodoCCE += IIf(lCCCE, ' <cce11:Mercancia' , ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD1->D1_ITEM + SD1->D1_COD), ' NoIdentificacion="' + Alltrim(SD1->D1_ITEM + SD1->D1_COD) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD1->D1_FRACCA), ' FraccionArancelaria="' + Alltrim(SD1->D1_FRACCA) + Alltrim(SD1->D1_NICO) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD1->D1_CANADU)), ' CantidadAduana="' + Alltrim(Str(SD1->D1_CANADU)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD1->D1_FRACCA), ' UnidadAduana="' + AllTrim(ObtColSAT("S014",AllTrim(SD1->D1_FRACCA),1,8,9,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD1->D1_VALADU)), ' ValorUnitarioAduana="' + Alltrim(Str(SD1->D1_VALADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD1->D1_USDADU)), ' ValorDolares="' + Alltrim(Str(SD1->D1_USDADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ) , ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, ' </cce11:Mercancia>' + ( chr(13)+chr(10) ), ""),.T.)

    (POS) (cNodoCCE += IIf(lCCCE, ' </cce11:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) (cNodoCCE += IIf(lCCCE, ' </cce11:ComercioExterior>' , ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    (POS) (_aTotal[034] := fXMLFUN("CO",.F., .F. ,.F.))

    [XXX CONCEPTOS]
    (POS) FsQuery(_aTotal[097],2)
    (PREREG) (_aTotal[001] := _aTotal[034],.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOS]
    (PREREG) (_aTotal[002] := fXMLFUN("TI",.F., .F. ,.T.))
    (PREREG) _aTotal[002]

    //IMPUESTOS LOCALES//
    (PRE) (_aTotal[095] := fXMLFUN("IL",.F.),.T.)

    [XXX COMPLEMENT]
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095]), ' <cfdi:Complemento', ""), .T.)
    (PREREG) (_aTotal[001] += IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095]),'>',""),.T.)
    (PREREG) _aTotal[001]
    COMPLEMENT C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.T.,.F.,4))

    [XXX COMERCIOEX]
    (PREREG) (_aTotal[001] := _aTotal[094],.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOLOC]
    (PREREG) (_aTotal[001] := _aTotal[095],.T.)
    (PREREG) _aTotal[001]

    [XXX COMPLEMENT]
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094]) .or. !EMPTY(_aTotal[095]) ,' </cfdi:Complemento>',""), .T.)
    (PREREG) _aTotal[001]
    COMPLEMENT C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.F.,.T.,4))

    //[XXX CAD_ORIG]
    //(PREREG) _aTotal[033]

    [XXX FACTURA]
    (PRE) _aTotal[095] := &(GetNewPar("MV_CFDNAF1","Lower(AllTrim(SF1->F1_ESPECIE)) + '_' + Lower(AllTrim(SF1->F1_SERIE)) + '_' + Lower(AllTrim(SF1->F1_DOC)) + '.xml'"))
    (ARQ) _aTotal[095]
    FACTURA C 019 0 ENCODEUTF8(XMLConv("",,,"cfdi:Comprobante",.F.,.T.,0))

    04. DICCIONARIO DE DATOS

    ...

    titleInformación

    Los ajustes a Diccionario de Datos se realizaron en los pacotes de atusx 010064 y 010082.

    Por medio de rutinas

    Por medio de esta configuración es posible dejar de usar los archivos .INI.

    Para la implementación de la generación de XML por rutina, es importante considerar los siguientes puntos:

    1. Configurar el parámetro MV_FEXML con valor igual a "S". 
    2. Configurar el parámetro MV_CFDDIRS con la ruta donde se encuentran las llaves y certificados.

    Con esto se  deja de usar los archivo .INI de la sección anterior y usará las nuevas rutinas  FATSMEX.PRW y FATEMEX.PRW. 

    Para agregar personalizaciones deberá hacer uso de los nuevos puntos de entrada que se mencionan en los puntos 5.12 a 5.14 del índice general de este documento.

    Para mas información verifique el enlace  DT Factura electrónica, sin uso de archivos .INI para México

    Configuración de directorios para timbrado de CFDI

    Para el timbrado de CFDI es necesario considerar lo mencionado en el siguiente documento técnico sobre la configuración de directorios en caso de tener instalado y en funcionamiento el  WebApp - WebAgent

    04. DICCIONARIO DE DATOS

    Los ajustes al Diccionario de Datos:

    ...

     Parámetros en el archivo SX6 – Parámetros:

    Nombre de la Variable

    MV_CFDI40

    Tipo

    Lógico

    Descripción

    Uso de CFDI versión 4.0

    Valor Estándar.T.
    CampoValor
    Nombre de Var.MV_FEXML
    Tipo1 - Caracteres
    Cont. Esp
    DescripciónPermite activar la funcionalidad para generar XML a través de rutina, evitando el uso de archivos .INI. S - Realizara la creación de archivos XML y no hará uso de los actuales archivo INI


    En la Tabla AI0 -Complemento del Cliente:

    Se agregó el siguiente campo:

    CampoAI0_REGFIS
    TipoC - Carácter
    Tamaño3
    Decimal0
    Formato@!
    ContextoReal
    PropiedadModificar
    Tit. EspañolRég. Fiscal
    Desc. EspañolRégimen Fiscal
    ValidaciónVazio() .Or. ValidF3I("S010",M->AI0_REGFIS,1,
    2
    3)
    F3MEX010
    ObligatorioNo
    UsadoSi
    Exhibe en BrowseNo
    Help

    Atributo requerido para incorporar la clave del régimen fiscal del contribuyente receptor al que aplicará el efecto fiscal de este

    comprobante.


    En la Tabla SF1 -Encabezado de Fact. de Entrada:

    Se actualizó el help del siguiente campo:

    CampoF1_UUIDREL
    Tit. EspañolUUID Relacs
    Help
    Tipo de relación y

    Folio fiscal de un CFDI relacionado con el presente comprobante.

    Informar el Tipo de relación y separar con ";" de los folios fiscales. Para cada

    folio fiscal del tipo de relación seperar con "|" . Para indicar un nuevo tipo de relación seperar

    Separar cada folio fiscal con un salto de línea.

    Por ejemplo: "01;F921D156-70C9-42C2-9F37-7E1246CBCEF5|E53F3E38-7003-4662-9DD1-7A077C55136E"

    Tabla SF2 -Encabezado de Fact. de Salida:

    Se actualizó el help del siguiente campo:

    ...

    Tipo de relación y Folio fiscal de un CFDI relacionado con el presente comprobante.

    Para separar el Tipo de relación de los folios fiscales se utiliza ";". Separar cada folio fiscal con el carácter "|".

    Para indicar un nuevo tipo de relación con sus respectivos folios fiscales, separar con un salto de línea.

    Por ejemplo:

    "01;E53F3E38-7003-4662-9DD1-7A077C55136E|014298A8-F58F-4937-8816-291E9165E11D"


    Tabla SF2 -Encabezado de Fact. de Salida:

    Se actualizó el help del siguiente campo:

    CampoF2_UUIDREL
    Tit. EspañolUUID Relacs
    Help

    Folio fiscal de un CFDI relacionado con el presente comprobante. Separar cada folio fiscal con un salto de línea.


    Actualización Consulta Estándar en el archivo SXB – Consulta Estándar:

    Alias

    Tipo

    SecuenciaColumnaDescripciónContenido

    MEX010

    1

    01RERégimen fiscalF3I

    MEX010

    2

    0101Régimen fiscalF812SXB("S010","RegiFiscal")

    MEX010

    5

    01

    VAR_IXB


    05. BITÁCORA DE CAMBIOS

    5.1 Cancelación de CFDI con Motivo de Cancelación 01 - Compr. Emitido c/errores c/relac


    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGFAT - Facturación.
    Función:

    Rutinas

    Nombre Técnico

    Fecha

    LOCXNFNotas Fiscales.07/03/2022
    LOCXNF2Funciones Genéricas para Documentos Fiscales.07/03/2022
    LOCXMEXFunciones Genéricas para Documentos Fiscales para México.07/03/2022
    LOCXFUNAFunciones generales de documentos fiscales.07/03/2022
    SIGACUSFunciones Genéricas para Documentos Fiscales.04/03/2022
    FISA800Timbrado masivo de CFDI.07/03/2022
    FISA812Mantenimiento de Catálogos del SAT.08/03/2022
    FISA817Anular/Timbrar/Imprimir Cobros Diversos.08/03/2022
    MATA468NGeneración automática de facturas.07/03/2022
    FATSMEX.INIScript de generación de los archivos XML para Notas Fiscales de Salida.07/03/2022
    País:México.
    Paquete:010208
    Ticket:13529247
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-15012


    Conforme a la actualización realizada al Servicio de Cancelación de CFDI ante el SAT (reforma fiscal 2022), para solicitar la Cancelación de una Factura de Venta (NF), Nota de Débito al Cliente (NDC) o Nota de Crédito al Cliente (NCC) se debe informar el Motivo de Cancelación, uno de estos motivos es el 01 - Comprobante emitido con errores con relación, el cual aplica para cuando el Documento cuyo Comprobante Fiscal Digital por Internet (CFDI) contiene un error en la Clave del Producto, Valor Unitario, Descuento o cualquier otro dato, por lo que se debe reexpedir. En este caso, primero se sustituye el documento y cuando se solicita la cancelación, se incorpora el UUID del Documento que sustituye al cancelado.

    Lo anterior implica que se debe generar un nuevo Documento cuando aún no se cancela el documento que será reemplazado, sin embargo, con el funcionamiento actual del sistema existen las siguientes limitantes que impiden realizar este proceso: 

    Si se requiere Cancelar una Factura de Venta (NF) para la cual se utilizó un Tipo de Entrada/Salida (TES) que afecta a stock, es decir, el campo Act. Stock (F4_ESTOQUE) con valor S - Si, no se puede generar la nueva Factura de Venta (NF) porque el stock sigue ocupado por la Factura de Venta (NF) que se pretende cancelar.


    SOLUCIÓN

    Se realizaron ajustes a las siguientes rutinas:

    Cancelación de CFDI (FISA817):

    En la función que Genera los archivos timbradocfdi.ini y timbrado.bat para consumo del WS de solicitud cancelación o consulta de status (ProcesoWS), se agrega un nuevo parámetro que indica si se ejecuta la cancelación automática. Se realizan ajustes para que cuando el usuario seleccione el motivo de cancelación 01 - Compr. Emitido c/errores c/relac. para un documento, este se anule dentro del sistema Protheus y no mande la solicitud de cancelación al SAT.

    Se agrega una nueva función, F817CanMot(), que permite detonar la solicitud de cancelación para los documentos pendientes para la cancelación.

    Dentro de la definición del menú de la rutina (MenuDef) se agrega una nueva opción llamada Solic. Canc. Pendientes, la cual ejecuta a la función F817CanMot().

    Se agrega la función F817ValDoc() que valida si el documento ya fue informado como documento a sustituir para la cancelación.

    Funciones generales de documentos fiscales (LOCXFUNA):

    Se realizaron ajustes en la función que genera el nodo cfdi:CfdiRelacionados, fGetFolRel(), para que al leer el campo de UUID Relacs (F1_UUIDREL/F2_UUIDREL) cuando son varios UUID, se tome como separador el salto de línea y si se informó el documento a sustituir, es decir, se informaron los campos Serie Sust. (F1_SERMAN/F2_SERMAN) y No. Doc Sust (F1_DOCMAN/F2_DOCMAN), se genere un nodo adicional de cfdi:CfdiRelacionados, donde el atributo TipoRelacion sea 04, de Sustitución de los CFDI Previos, tomando el UUID del campo UUID Doc. (F3_CNATREC) de la tabla SF3 - Libros Fiscales.

    Notas Fiscales (LOCXNF):

    Se modificó la función de exclusión de Notas Fiscales, LocxDelNF(), para realizar llamado a la función que realiza el marcado del registro del documento (NF,NDC,NCC) cuando se Anulan los documentos, LxActSF3(), actualizando los campos Motivo Canc. (F3_MOTIVO), Status Cance (F3_STATUS), UUID Doc. (F3_CNATREC) y Nom. XML Anu (F3_CODNFE).

    Se modificó la función que relaciona documentos desde la acción Doc Orig, LxDocOri(), para llenar el campo UUID Relacs (F1_UUID), utilizando el separador de salto de línea para cuando existe más de un UUID Relacionado (para que la funcionalidad para versión de CDFI 4.0 aplique como lo hace la versión de CFDI 3.3 y el ajuste aplica para la versión Factura de la acción Doc Orig)

    Funciones Genéricas para Documentos Fiscales (LOCXNF2):

    Se eliminan las funciones que validaban los datos del campo UUID Relacs, ValUUIDRel() y LxVldF3I(), ya que no se utilizarán porque se deja funcionalidad de llenado del campo F1_UUIDRE/F2_UUIDREL para versión CFDI 4.0 como lo hace para la versión CFDI 3.3. 

    Se modificó la función que valida el Tipo de Relación CFDI y Uso CFDI, ValRetSat(), para que en Factura de Venta (NF), Nota de Débito al Cliente (NDC) y Nota de Crédito al Cliente (NCC) no se permita informar el valor 04 en el campo Relacion CFD (F1_RELSAT/F2_RELSAT).

    Funciones Genéricas para Documentos Fiscales para México (LOCXMEX):

    En la función que agrega campos en el encabezado de Notas Fiscales para el país México, LxCposMex(), se activaron los campos Serie Sust. (F2_SERMAN) y No. Doc Sust (F2_DOCMAN) para Facturas de Venta (NF) y Nota de Débito al Cliente (NDC), se activaron los campos Serie Sust. (F1_SERMAN) y No. Doc Sust (F1_DOCMAN) para Nota de Crédito al Cliente (NCC), adicional se dejó activado el campo Relacion CFD (F2_UUIDREL) para Facturas de Venta (NF) y Nota de Débito al Cliente (NDC) para versión de CFDI 4.0.

    Se creó la función que realiza el marcado del registro del documento (NF,NDC,NCC) cuando se Anulan los documentos (LxActSF3) pero no se realiza la solicitud de Cancelación al SAT, actualizando los campos Motivo Canc. (F3_MOTIVO), Status Cance (F3_STATUS), UUID Doc. (F3_CNATREC) y Nom. XML Anu (F3_CODNFE).

    Se creó la función LxVDocSuc() para realizar las siguientes validaciones al informar los campos Serie Sust. (F1_SERMAN/F2_SERMAN) y No. Doc Sust (F1_DOCMAN/F2_DOCMAN):

      • El Documento a Sustituir no puede estar relacionado a otro documento.
      • El Documento a Sustituir debe ser de la misma especie del nuevo documento y estar como Anulado pero sin solicitud de cancelación ante el SAT (Campos F3_STATUS igual a 'S').

    Timbrado CFDI (FISA800):

    Se creó la función F800SolCan() para realizar la solicitud de Cancelación ante el SAT de los documentos que solo fueron anulados en Protheus (Campos F3_STATUS igual a 'S') pero no se realizó la solicitud de cancelación en el SAT con Motivo de Cancelación 01, informando al final del proceso el folio del nuevo documento que fue timbrado y el folio del documento que fue cancelado ante el SAT.

    Funciones Genéricas para Documentos Fiscales (SIGACUS):

    Se realizaron ajustes en la función F4NfOri() para que en el caso de la versión de CFDI 4.0 no se solicite llenar el campo Relacion CFD (F1_RELSAT) para cuando se ejecuta la acción Doc Orig al incluir una Nota de Crédito al Cliente (NCC), para la opción ítem, y al llenar el campo de UUID Relacs (F1_UUIDREL) no se llene con el UUID de la factura que se relaciona sin anteponer el Tipo de Relación.

    Mantenimiento de Catálogos del SAT (FISA812):

    En la función ValidF3I() que valida códigos de los catálogos del SAT, se considera el campo Relacion CFD (F1_RELSAT) de documentos de entrada, en validación actual para documentos de salida (F2_RELSAT) en donde se permite dejar vacío el campo. 

    Generación automática de facturas de venta (MATA468N):

    Se modificaron varias funciones y se agregaron otras para el manejo de campos que ayudan al control de las cancelaciones y relación entre los documentos, cancelado y el que sustituye.

    a468nFatura() - Generación de facturas: Agrega arreglo de facturas a generar (aFacs) como parámetro en la ejecución de las funciones a468nNotas() y a468nGera().

    a468nGera() - Generación de la nota fiscal: Recibe por parámetro el arreglo de facturas a generar (aFacs) y lo envía a las funciones a468nGravF2() y a468nNotas().

    a468nGravF2() - Graba registros en la tabla de documentos fiscales de salida SF2: Recibe por parámetro el arreglo de facturas a generar (aFacs) del cual toma los valores para grabar los campos Serie Sust. (F2_SERMAN) y No. Doc Sust (F2_DOCMAN).

    a468nNotas() - Visualiza la lista de notas fiscales que serán generadas: Recibe por parámetro el arreglo de facturas a generar (aFacs).

    Determina coordenadas y nuevos componentes de la ventana de facturas a generar, se agregan las columnas Serie Sust. (F2_SERMAN), No. Doc Sust (F2_DOCMAN) y UUID Relacs (F2_UUIDREL).

    A468DblClic() - Permite editar algunas columnas de la ventana de facturas a generar: Si detecta doble clic en las columnas de Serie o Documento que Sustituye, ejecuta la función A468ChgRel().

    A468ChgRel() - Edición de los campos Serie y Factura que sustituye: Visualiza ventana para editar la Serie y Factura que sustituye el nuevo documento.

    A468ValRel() - Valida Serie/Folio del documento que se sustituye: Valida que el documento seleccionado esté cancelado en Protheus, pendiente de transmitir al SAT y que el folio fiscal correspondiente (UUID) no esté usado por otro documento.


    PROCESO DE IMPLEMENTACIÓN

    Cancelación ante SAT de Factura de Venta (NF) con Motivo de Cancelación 01 - Comprobante emitido con errores con relación:

    1. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Facturaciones (MAT467N)
    2. Incluir y Timbrar el CFDI de una Factura de Venta (NF).
    3. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Cancelación CFDI (FISA817)
    4. En los parámetros para visualizar la Factura, indicando en la pregunta ¿Tipo de Documento? con la opción Factura.
    5. Seleccionar la Factura de Venta (NF) que fue creada y timbrada previamente, ejecutar la acción Act. Status.
    6. Validar que la Factura sea Cancelable con o sin aceptación.
    7. Seleccionar de nueva cuenta la Factura de Venta (NF), y ejecutar la acción Cancelar.
    8. En la pantalla "Motivo baja" informar en el campo Motivo cancelación la opción 01 - Compr. Emitido c/errores c/relac., presionar Confirmar.

      Image Added

    9. Confirmar que se realice la anulación de la Factura, teniendo en cuenta que la solicitud de Cancelación ante el SAT no será realizada.
    10. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Facturaciones (MAT467N)
    11. Incluir una nueva Factura de Venta (NF).
    12. En el encabezado informar en los campos Serie Sust. (F2_SERMAN) y Núm. Doc. Sust. (F2_DOCMAN) la Factura que fue anulada en Protheus pero no fue Cancelada ante el SAT.
    13. Presionar Confirmar para guardar la Factura.
    14. Confirmar la generación y timbrado del Comprobante Fiscal Digital por Internet (CFDI), validar que se haya timbrado la nueva Factura y que se haya Cancelado ante el SAT la Factura a la que se sustituye.


    Cancelación ante SAT de Nota de Débito al Cliente (NDC) con Motivo de Cancelación 01 - Comprobante emitido con errores con relación:

    1. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Generac. de Notas de Crédito y Débito (MAT465N)
    2. Incluir y Timbrar el CFDI de una Nota de Débito al Cliente (NDC).
    3. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Cancelación CFDI (FISA817)
    4. En los parámetros para visualizar la Nota de Débito, indicando en la pregunta ¿Tipo de Documento? con la opción Nota de Débito.
    5. Seleccionar la Nota de Débito al cliente (NDC) que fue creada y timbrada previamente, ejecutar la acción Act. Status.
    6. Validar que la Nota de Crédito sea Cancelable con o sin aceptación.
    7. Seleccionar de nueva cuenta la Nota de Débito (NF), y ejecutar la acción Cancelar.
    8. En la pantalla "Motivo baja" informar en el campo Motivo cancelación la opción 01 - Compr. Emitido c/errores c/relac., presionar Confirmar.

      Image Added

    9. Confirmar que se realice la anulación de la Nota de Débito, teniendo en cuenta que la solicitud de Cancelación ante el SAT no será realizada.
    10. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Generac. de Notas de Crédito y Débito (MAT465N)
    11. Incluir una nueva Nota de Débito (NDC).
    12. En el encabezado:
      • Informar el campo Relación CFD (F2_RELSAT) con valor 02 - NOTA DE DÉBITO DE LOS DOCUMENTOS RELACIONADOS.
      • Informar en los campos Serie Sust. (F2_SERMAN) y Núm. Doc. Sust. (F2_DOCMAN) la Nota de Débito que fue anulada en Protheus pero no fue Cancelada ante el SAT.
      • El campo UUIDRelacs (F2_UUIDREL) se deben informar de manera manual los UUID de las Facturas de Venta a las que afecta la Nota de Débito  Sin se van a relacionar más de un UUID es necesario hacer salto de línea por UUID.

        Image Added

    13. Presionar Confirmar para guardar la Nota de Débito.
    14. Confirmar la generación y timbrado del Comprobante Fiscal Digital por Internet (CFDI), validar que se haya timbrado la nueva Nota de Débito y que se haya Cancelado ante el SAT la Nota de Débito a la que se sustituye.


    Cancelación ante SAT de Nota de Crédito al Cliente (NCC) con Motivo de Cancelación 01 - Comprobante emitido con errores con relación:

    1. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Generac. de Notas de Crédito y Débito (MAT465N)
    2. Incluir y Timbrar el CFDI de una Nota de Crédito al Cliente (NDC).
    3. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Cancelación CFDI (FISA817)
    4. En los parámetros para visualizar la Nota de Crédito, indicando en la pregunta ¿Tipo de Documento? con la opción Nota de Crédito.
    5. Seleccionar la Nota de Crédito al cliente (NCC) que fue creada y timbrada previamente, ejecutar la acción Act. Status.
    6. Validar que la Nota de Crédito sea Cancelable con o sin aceptación.
    7. Seleccionar de nueva cuenta la Nota de Crédito (NCC), y ejecutar la acción Cancelar.
    8. En la pantalla "Motivo baja" informar en el campo Motivo cancelación la opción 01 - Compr. Emitido c/errores c/relac., presionar Confirmar.

      Image Added

    9. Confirmar que se realice la anulación de la Nota de Débito, teniendo en cuenta que la solicitud de Cancelación ante el SAT no será realizada.
    10. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Generac. de Notas de Crédito y Débito (MAT465N)
    11. Incluir una nueva Nota de Crédito (NCC).
    12. En el encabezado:
      • Informar el campo Relación CFD (F1_RELSAT) con valor 01 - NOTAS DE CRÉDITO DE DOCUMENTOS RELACIONADOS o 03 - DEVOLUCIÓN DE MERCANCÍAS SOBRE FACTURAS O TRASLADOS PREVIOS.
      • Informar en los campos Serie Sust. (F1_SERMAN) y Núm. Doc. Sust. (F1_DOCMAN) la Nota de Crédito que fue anulada en Protheus pero no fue Cancelada ante el SAT.
      • El campo UUIDRelacs (F1_UUIDREL) se deben informar de los UUID de las Facturas de Venta a las que afecta la Nota de Crédito.  Sin se van a relacionar más de un UUID es necesario hacer salto de línea por UUID (Está acción se realiza de manera automática usar la acción Doc Orig que se encuentra en Otras acciones)

        Image Added

    13. Presionar Confirmar para guardar la Nota de Crédito.
    14. Confirmar la generación y timbrado del Comprobante Fiscal Digital por Internet (CFDI), validar que se haya timbrado la nueva Nota de Crédito y que se haya Cancelado ante el SAT la Nota de Crédito a la que se sustituye.


    Cancelación ante el SAT de Factura de Venta (NF) generada desde Pedido de Venta, con Motivo de Cancelación 01 - Comprobante emitido con errores con relación:

    1. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Pedidos | Pedidos de Venta (MATA410).
    2. Incluir un nuevo pedido con uno o más productos. El campo Doc. Gener. (C5_DOCGER) debe indicar 1 - Factura.
    3. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Pedidos | Liberación de Pedidos de Venta (MATA440).
    4. Seleccionar el pedido registrado y hacer clic en la opción Aprobar, Confirmar liberación.
    5. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Pedidos | Liberación de Crédito y Stock (MATA456).
    6. Seleccionar cada ítem del pedido registrado y hacer clic en la opción Manual, confirmar liberación haciendo clic en el botón Ok.
    7. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Generación de Notas (MATA468N).
    8. En la pregunta ¿Generación por ?, seleccionar Pedidos.
    9. Proporcionar los parámetros del proceso.
    10. Marcar los ítems del Pedido de Venta registrado. En Otras acciones, dar clic en Genera Fact.
    11. Hacer doble clic sobre la columna Serie y proporcionar la Serie (F2_SERIE) a utilizar.

      Image Added

    12. A continuación, hacer clic en el botón Ok y confirmar la generación y timbrado del CFDI correspondiente.
    13. Verificar que el timbrado del CFDI sea satisfactorio. La impresión (generación de PDF) es opcional.
    14. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Cancelación CFDI (FISA817)
    15. En los parámetros, indicar en la pregunta ¿Tipo de Documento? la opción Factura.
    16. Seleccionar la Factura (NF) que fue creada y timbrada previamente, ejecutar la acción Act. Status.
    17. Validar que la Factura sea Cancelable con o sin aceptación.
    18. Seleccionar de nueva cuenta la Factura (NF), ejecutar la acción Cancelar.
    19. En la pantalla "Motivo baja" informar en el campo Motivo cancelación la opción 01 - Compr. Emitido c/errores c/relac., presionar Confirmar.

      Image Added

    20. Confirmar que se realice la anulación de la Factura, teniendo en cuenta que la solicitud de Cancelación ante el SAT no será realizada.
    21. Responder afirmativamente al mensaje ¿Dejar pedido aprobado?.
    22. Visualizar resultado del proceso:

      Image Added

    23. En caso de ser necesario, se deberá volver a Liberar el Pedido y/o los Ítems por Crédito/Stock, pasos previos 3 a 6.
    24. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Generación de Notas (MAT468N)
    25. En la pregunta ¿Generación por ?, seleccionar Pedidos.
    26. Proporcionar los parámetros del proceso.
    27. Marcar los ítems del Pedido de Venta registrado. En Otras acciones, dar clic en Genera Fact.
    28. Hacer doble clic sobre la columna Serie y proporcionar la Serie (F2_SERIE) a utilizar.
    29. Hacer doble clic sobre alguna de las columnas Serie Sust. o No. Doc Sust:

      Image Added

    30. Se mostrará una ventana donde se registrará el documento a sustituir:

      Image Added

    31. Utilizar la consulta estándar para seleccionar el documento cancelado previamente:

      Image Added

    32. Confirmar la generación de la factura:

      Image Added

    33. Confirmar la generación y timbrado del CFDI correspondiente.
    34. Posterior al timbrado del CFDI también se procesa la cancelación del CFDI relacionado.
    35. Verificar que tanto el timbrado como la transmisión de cancelación de los CFDI correspondientes sean satisfactorios.


    DICCIONARIO DE DATOS:

    Preguntas en el archivo  SX1 - Preguntas

    Grupo: F817CAN


    Orden

    Título

    Tipo

    Tamaño

    Decimal

    Objeto

    Consulta estándar

    01¿Serie?C30GetDOCSUS
    02¿Número de documento?C20

    0

    Get

     

    Consulta Estándar en el archivo SXB – Consulta Estándar:

    Consulta: DOCSUS


    Alias

    Tipo

    SecuenciaColumnaDescripciónContenido

    DOCSUS

    1

    01DBDocumento SustituyeSF3

    DOCSUS

    2

    0105Serie Fact. + Factur

    DOCSUS

    4

    0101SerieF3_SERIE
    DOCSUS40102Número Documento       F3_NFISCAL
    DOCSUS40103ClienteF3_CLIEFOR
    DOCSUS40104TiendaF3_LOJA
    DOCSUS40105UUIDF3_CNATREC
    DOCSUS501

    SF3->F3_SERIE
    DOCSUS502

    SF3->F3_NFISCAL
    DOCSUS601

    F3_TIPOMOV ==  "V" .And. F3_STATUS == "S" .And. F3_ESPECIE == cEspecie


    Configurar los siguientes campos en la tabla SF1 - Encabezado de Fact. de Entrada:


    Atributo

    Contenido

    CampoF1_SERMAN
    TipoC - Caracter
    Tamaño3
    Decimal0
    Formato@!
    ContextoReal
    PropiedadModificar
    Tit. EspañolSerie Sust.
    Desc. EspañolSerie del Doc. Sustituye 
    ObligatorioNo
    UsadoSi
    Exhibe en BrowseNo
    Help

    Indica la Serie del Documento que sustituye a un documento que será cancelado ante el SAT. Al informarse este campo será generado en automático un nodo cfdi:CfdiRelacionados donde el atributo TipoRelacion sea 04 (Sustitución de los CFDI Previos).

    Atributo

    Contenido

    CampoF1_DOCMAN
    TipoC - Caracter
    Tamaño20
    Decimal0
    Formato@!
    Condición

    LxVDocSus(M->F1_SERMAN, M->F1_DOCMAN)

    ContextoReal
    PropiedadModificar
    Tit. EspañolNo. Doc Sust
    Desc. EspañolNo. de Doc. Sustituye
    ObligatorioNo
    UsadoSi
    Exhibe en BrowseNo
    Help

    Indica la Número del Documento que sustituye a un documento que será cancelado ante el SAT. Al informarse este campo será generado en automático un nodo cfdi:CfdiRelacionados donde el atributo TipoRelacion sea 04 (Sustitución de los CFDI Previos).

    CampoContenido
    CampoF1_TIPNOTA
    TipoC- Carácter
    Tamaño2
    Decimal0
    Formato@!
    ContextoReal
    PropiedadModificar
    Tit. EspañolMot.Cancela
    Desc. EspañolMotivo de cancelación
    Lista Español01=Compr. Emitido c/errores c/relac.;02=Compr. emitido c/errores s/relac.;03=No se llevó a cabo la oper.;04=Oper. nominativa.
    ObligatorioNo
    UsadoSi
    Exhibe en BrowseNo
    Help

    Indica el motivo de Cancelación que aplica para el CFDI:
    01 - Comprobante emitido con errores con relación.
    02 - Comprobante emitido con errores sin relación.
    03 - No se llevó a cabo la operación.
    04 - Operación nominativa relacionada en la factura global.


    Configurar los siguientes campos en la tabla SF2 - Encabezado de Fact. de Salida:


    Atributo

    Contenido

    CampoF2_SERMAN
    TipoC - Caracter
    Tamaño3
    Decimal0
    Formato@!
    ContextoReal
    PropiedadModificar
    Tit. EspañolSerie Sust.
    Desc. EspañolSerie del Doc. Sustituye 
    ObligatorioNo
    UsadoSi
    Exhibe en BrowseNo
    Help

    Indica la Serie del Documento que sustituye a un documento que será cancelado ante el SAT. Al informarse este campo será generado en automático un nodo cfdi:CfdiRelacionados donde el atributo TipoRelacion sea 04 (Sustitución de los CFDI Previos).

    Atributo

    Contenido

    CampoF2_DOCMAN
    TipoC - Caracter
    Tamaño20
    Decimal0
    Formato@!
    Condición

    LxVDocSus(M->F2_SERMAN, M->F2_DOCMAN)

    ContextoReal
    PropiedadModificar
    Tit. EspañolNo. Doc Sust
    Desc. EspañolNo. de Doc. Sustituye
    ObligatorioNo
    UsadoSi
    Exhibe en BrowseNo
    Help

    Indica la Número del Documento que sustituye a un documento que será cancelado ante el SAT. Al informarse este campo será generado en automático un nodo cfdi:CfdiRelacionados donde el atributo TipoRelacion sea 04.

    CampoContenido
    CampoF2_TIPNOTA
    TipoC- Carácter
    Tamaño2
    Decimal0
    Formato@!
    ContextoReal
    PropiedadModificar
    Tit. EspañolMot.Cancela
    Desc. EspañolMotivo de cancelación
    Lista Español01=Compr. Emitido c/errores c/relac.;02=Compr. emitido c/errores s/relac.;03=No se llevó a cabo la oper.;04=Oper. nominativa.
    ObligatorioNo
    UsadoSi
    Exhibe en BrowseNo
    Help

    Indica el motivo de Cancelación que aplica para el CFDI:
    01 - Comprobante emitido con errores con relación.
    02 - Comprobante emitido con errores sin relación.
    03 - No se llevó a cabo la operación.
    04 - Operación nominativa relacionada en la factura global.



    Configurar los siguientes campos en la tabla SF3 - Libros Fiscales:


    AtributoContenido
    CampoF3_STATUS
    TipoC - Caracter
    Tamaño1
    Decimal0
    Formato@!
    ContextoReal
    PropiedadModificar
    Tit. EspañolStatus Cance
    Desc. EspañolStatus de la Cancelación
    ObligatorioNo
    UsadoSi
    Exhibe en BrowseNo
    Help

    Indica si el documento fue a Anulado en Protheus y está pendiente de solicitud de Cancelación ante el SAT. ('S' es Si y vacío es No).

    AtributoContenido
    CampoF3_CODNFE
    TipoC - Caracter
    Tamaño35
    Decimal0
    Formato@!
    ContextoReal
    PropiedadModificar
    Tit. EspañolNom. XML Anu
    Desc. EspañolNombre de XML Anulado
    ObligatorioNo
    UsadoSi
    Exhibe en BrowseNo
    Help

    Indica el nombre del archivo XML del documento que fue a Anulado en Protheus y está pendiente de solicitud de Cancelación ante el SAT. 

    AtributoContenido
    CampoF3_MOTIVO
    TipoC - Caracter
    Tamaño2
    Decimal0
    Formato@!
    ContextoReal
    PropiedadModificar
    Tit. EspañolMotivo Canc.
    Desc. EspañolMotivo de Cancelación
    ObligatorioNo
    UsadoSi
    Exhibe en BrowseNo
    Help

    Indica el motivo de Cancelación del documento fiscal de acuerdo al catálogo de Motivos de cancelación definido por el SAT. 

    AtributoContenido
    CampoF3_CNATREC
    TipoC - Caracter
    Tamaño36
    Decimal0
    Formato@!
    ContextoReal
    PropiedadModificar
    Tit. EspañolUUID Doc.
    Desc. EspañolUUID Doc. Anulado
    ObligatorioNo
    UsadoSi
    Exhibe en BrowseNo
    Help

    Indica el UUID del documento fiscal que fue anulado pero que se tiene pendiente la Solicitud de Cancelación ante el SAT. 

    5.2 Desactivar la Cancelación Automática ante el SAT de los documentos con Motivo de cancelación 01 CFDI 4.0 MEX

    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación
    Función:

    Rutina

    Nombre Técnico

    Fecha

    FISA800Timbrado masivo de CFDI.05/08/2022
    País:México 
    Ticket:14627447
    Pacote:010920
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-16413


    De acuerdo con la información emitida en la reforma fiscal 2022 acerca del Servicio de Cancelación de CFDI, para solicitar la Cancelación de una Factura de Venta (NF), Nota de Débito al Cliente (NDC) o Nota de Crédito al Cliente (NCC) se debe informar el Motivo de Cancelación.

    Cuando el motivo indicado es el 01 - Comprobante emitido con errores con relación, primero se sustituye el documento y cuando se solicita la cancelación, se incorpora el UUID del Documento que sustituye al cancelado.
    Al realizar el proceso con los servicios del Proveedor Autorizado de Certificación (PAC),el sistema indica que el documento fue cancelado, pero al hacer la verificación en el portal del SAT el documento aún no se encuentra cancelado.

    El proveedor indica que la actualización del UUID del documento que sustituye al original puede tardar algunos minutos, por lo que se solicita la actualización para que al realizar el timbrado del nuevo documento, no se detone de inmediato la cancelación del documento original, si no que el usuario pueda realizarlo posteriormente a través de la FISA817 – Cancelación de CFDi.

    SOLUCIÓN

    Se realiza ajuste en la rutina FISA800 (Timbrado masivo de CFDi) para que al realizar el Timbrado del documento que sustituye al anterior, no se detone la cancelación automática si el parámetro MV_CANAUT es igual a 'N'.

    Una vez que se genera el Timbre Fiscal, el sistema también emite un mensaje indicando que el documento original aún no ha sido cancelado.“El documento XXXXX quedo pendiente de cancelación ante el SAT, no olvide realizar dicha cancelación”.

    Image Added


    Aviso
    titleFuncionalidad del parámetro

    Al configurar el parámetro MV_CANAUT = N , se desactivará la cancelación automática del documento que sustituye por lo cual recordar realizar dicha solicitud de cancelación desde la Cancelación de CFDI (FISA817) en el menú de "Otras acciones > Solic. Canc. Pendientes". Dicha configuración podrá ser utilizada por cualquier PAC por delay en el timbrado de la factura que sustituye y cancelación de la factura relacionada.

    Si el parámetro está vació o con S la funcionalidad actual de la cancelación de facturas relacionadas no tendrá ningún cambio.


    DICCIONARIO DE DATOS

    Parámetros (SX6)

    Ítems/CarpetasDescripción
    TipoC
    Nombre de Var.MV_CANAUT 
    DescripciónPermite omitir la sol. de canc. ante el SAT de
    docs. cancelados con Motivo 01, al timbrar el doc.
    que lo sustituye. N = Desactiva canc. automática. 
    Cont. Esp


    5.3 Activar la Forma de Pago en el Documento y no en el Cliente

    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación
    Función:

    Rutina

    Nombre Técnico

    Fecha

    LOCXMEXFunciones Genéricas para Documentos Fiscales para México.20/09/2022
    MATA462ANGeneración de Remitos de Venta.19/09/2022
    MATA468NGeneración de Notas Fiscales.19/09/2022
    FATSMEX.INIGeneración de XML de Documentos de Salida20/09/2022
    País:México 
    Ticket:14883985
    Pacote:011130
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-16668


    Se requiere permitir modificar y/o indicar la Forma de Pago del Documento desde que se está generando, por lo tanto se requiere activar un campo donde se indique la "Forma de Pago" en el encabezado de los documentos: "Pedido de Venta (MATA410),  Factura (MATA467N), Nota de Débito (MATA465N) y Remisión de ventas (MATA462N)"

    SOLUCIÓN

    En la rutina Funciones Genéricas para Documentos Fiscales para México "LOCXMEX":

    Se agrega el campo Forma de Pago (F2_TPDOC) para que se visualice en la pantalla de los documentos de tipo Factura (MATA467N), Nota de Débito (MATA465N) y Remisión de ventas (MATA462N).

    Se crea la función LxMxHab() y la función LxMxFPago() que cumplen con la siguiente regla de negocio:

    • Cuando el cliente tiene indicado el campo Forma de Pago desde la rutina de "Clientes>Complemento del cliente" se mostrará el contenido el campo (AI0_MPAGO).
    • Si la condición de pago del Pedido/Factura /Nota de Débito tiene asociado el Método de Pago - "PPD - Pago en Parcialidades ó PID - Pago Diferido", entonces se indicará el campo Forma de Pago (C5_TPDOC/F2_TPDOC) con valor "99" y no se permitirá su edición. Si el usuario cambia a otra condición de pago que no tenga relacionado el método de pago un Método de Pago - "PPD - Pago en Parcialidades ó PID - Pago Diferido" se permitirá la edición del campo Forma de Pago (C5_TPDOC/F2_TPDOC).

    En la rutina Generación de Remitos de Venta "MATA462AN":

    Se modifica la función de Generación de Remito Automático (A462ANGera), para que se realice el guardado del campo Forma de Pago (F2_TPDOC), a partir del campo Forma de Pago (C5_TPDOC) al generar la Factura a partir de la Remisión.

    En la rutina Generación de Notas Fiscales "MATA468N":

    Se modifica la función que Genera Registros en SF2 y Acumula Valores (A468nGravF2), para que realice el guardado del campo Forma de Pago (F2_TPDOC), a partir del campo Forma de Pago (C5_TPDOC) al generar la Factura a partir de un "Pedido" y de un "Pedido a Remisión".

    FATSMEX.INI

    Se requiere editar el script actual de generación de CFDI (Archivo XML), actualizando las secciones de acuerdo al siguiente modelo, en donde se agregaron o fueron modificadas líneas para integrar esta nueva funcionalidad.

    Painel
    titleColorWHITE
    borderWidth2
    titleBGColorblue
    borderStylesolid
    titleFATSMEX.INI

    En el apartado de [XXX INICIALIZACION] 

    Se agrega la línea:

    (PRE) _aTotal[107] := IIf(SF2->(ColumnPos("F2_TPDOC")) > 0,ALLTRIM(SF2->F2_TPDOC),ALLTRIM(AI0->AI0_MPAGO))

    En el apartado de ///////////DATOS DE LA FACTURA///////////////// 

    Se modifica la línea:

    //FormaPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", IIf(SF2->F2_GLOBAL == '1',FormPagGlo(SF2->F2_DOC,SF2->F2_SERIE),IIf(Empty(AI0->AI0_MPAGO),"99",Alltrim(AI0->AI0_MPAGO))) + _aTotal[098] )

    Por la línea:

    //FormaPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", IIf(SF2->F2_GLOBAL == '1',FormPagGlo(SF2->F2_DOC,SF2->F2_SERIE),IIf(Empty(_aTotal[107]).Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",_aTotal[107])) + _aTotal[098] )


    En el apartado de [XXX FACTURA]

    Se modifica la línea:

    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' FormaPago="' +  IIf(SF2->F2_GLOBAL == '1',FormPagGlo(SF2->F2_DOC,SF2->F2_SERIE),IIf(Empty(AI0->AI0_MPAGO),"99",Alltrim(AI0->AI0_MPAGO))) + '"' )

    Por la siguiente línea

    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' FormaPago="' +  IIf(SF2->F2_GLOBAL == '1',FormPagGlo(SF2->F2_DOC,SF2->F2_SERIE),IIf(Empty(_aTotal[107]) .Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",_aTotal[107])) + '"' )


    Nota de Crédito

    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación
    Función:

    Rutina

    Nombre Técnico

    Fecha

    LOCXMEXFunciones Genéricas para Documentos Fiscales para México.11/10/2022
    FATEMEX.INIGeneración de XML de Documentos de Entrada11/09/2022
    País:México
    Ticket:N/A
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-16686  (Pacote: 011130)


    Se requiere permitir modificar y/o indicar la Forma de Pago del Documento desde que se está generando, por lo tanto se requiere activar un campo donde se indique la "Forma de Pago" en el encabezado de la Nota de Crédito (MATA465N), así como agregar la validación al guardar la Nota de Crédito donde se verifique la Forma de pago(F1_TPDOC) es igual a 15, si existen Facturas relacionadas estás deben tener saldo mayor a cero en Cuentas por Cobrar.


    Solución

    En la rutina Funciones Genéricas para Documentos Fiscales para México "LOCXMEX":

    Se agrega el campo Forma de Pago (F1_TPDOC) para que se visualice en la pantalla de la Nota de Crédito (MATA465N),  por default este campo se mostrará con valor "99"

    Se crea la función LxMxPagoNC() que cumplen con la siguiente regla de negocio:

        • Si la condición de pago de la Nota de Crédito tiene indicado el campo Forma Pago (F1_TPDOC) con valor "15", si existen Facturas relacionadas estás deben tener saldo mayor a cero en Cuentas por Cobrar tabla (SE1) en caso contrario no permitirá el guardado de la Nota de Crédito.


    Informações
    titleNOTA

    Actualmente si se indica una Forma de Pago diferente al valor "99" se debe indicar un Método de Pago diferente a "PPD - Pago en Parcialidades


    Para más información de ajustes y proceso de validación ver Documento Técnico de Activación de la Forma de Pago en la NCC y no en el Cliente


    DICCIONARIO DE DATOS

    Creación de campos en el archivo SX3 – Campos:

    Tabla SC5 - Pedidos de Venta.

    CampoC5_TPDOC
    TipoC - Caracter
    Tamaño2
    Decimal0
    Formato@!
    TítuloForma de Pago
    DescripciónForma de Pago SAT
    Modo ediciónLxMxHab("C5",.T.)
    ConsultaMEX005
    Validación de sistemaVazio() .or. ValidF3I("S005", M->C5_TPDOC,1,2)
    Nivel1
    Obligatorio
    Utilizado
    BrowseNo
    Help

    Informe la Forma de Pago SAT para el Documento generado, de acuerdo al catálogo cFormaPago definido por el SAT. Si la condición de Pago usa un Método de pago "PPD O PID" no se permitirá su edición.


    Tabla SF2 - Encabezado de Fact. de Salida.

    CampoF2_TPDOC
    TipoC - Caracter
    Tamaño2
    Decimal0
    Formato@!
    TítuloForma de Pago
    DescripciónForma de Pago SAT
    Modo ediciónLxMxHab("F2",.T.)
    ConsultaMEX005
    Validación de sistemaVazio() .or. ValidF3I("S005", M->F2_TPDOC,1,2)
    Nivel1
    Obligatorio
    Utilizado
    BrowseNo
    Help

    Informe la Forma de Pago SAT para el Documento generado, de acuerdo al catálogo cFormaPago definido por el SAT. Si la condición de Pago usa un Método de pago "PPD O PID" no se permitirá su edición.


    Tabla SF1 - Encabezado de Fact. de Entrada.

    CampoF1_TPDOC
    TipoC - Caracter
    Tamaño2
    Decimal0
    Formato@!
    TítuloForma Pago
    DescripciónForma de Pago SAT
    Iniciador Estandar'99'
    ConsultaMEX005
    Validación de sistemaVazio() .or. ValidF3I("S005", M->F1_TPDOC,1,2)
    Nivel1
    Obligatorio
    Utilizado
    BrowseNo
    Help

    Informe la Forma de Pago SAT para el Documento generado, de acuerdo al catálogo cFormaPago definido por el SAT. 


    Creación de Disparadores en el archivo SX7 – Disparadores:


    Campo DominioC5_CLIENTE
    Secuencia001
    ReglaLxMxHab("C5",.T.)
    Campo Ctr. DominioC5_TPDOC
    TipoP - Primario
    SeekN - No


    Campo DominioC5_CLIENTELOJA
    Secuencia001
    ReglaLxMxHab("C5",.T.)
    Campo Ctr. DominioC5_TPDOC
    TipoP - Primario
    SeekN - No


    Campo DominioF2_CLIENTE
    Secuencia001
    ReglaLxMxHab("F2",.T.)
    Campo Ctr. DominioF2_TPDOC
    TipoP - Primario
    SeekN - No


    Campo DominioF2_LOJA
    Secuencia001
    ReglaLxMxHab("F2",.T.)
    Campo Ctr. DominioF2_TPDOC
    TipoP - Primario
    SeekN - No


    5.4 Complemento de Comercio Exterior versión 1.1 Revisión E para CFDI 4.0

    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación
    Función:

    Rutina

    Nombre Técnico

    Fecha

    LOCXMEXFunciones Genéricas para Documentos Fiscales para México28/09/2022
    FATSMEX.INIGeneración de XML de Documentos de Salida28/09/2022
    País:México 
    Ticket:No aplica
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-16793


    Con fecha 18 de julio de 2022 el Servicio de Administración Tributaria (SAT) da a conocer una nueva revisión del Complemento de Comercio Exterior (CCX) del Comprobante Fiscal Digital por Internet (CFDI). Este complemento mantiene la versión 1.1, pero es ahora Revisión “E”.

    Fundamento: Comercio Exterior versión 11 Revision E

    SOLUCIÓN

    En la rutina de Funciones Genéricas para Documentos Fiscales para México (LOCXMEX):

    Se realiza ajuste para activar los siguientes campos para funcionalidad de Comercio Exterior, para la inclusión de Facturas de Venta de tipo Traslado (21), cuando el parámetro MV_CFDIEXP está configurado con el valor .T.:

    • Tipo Opera (F2_TIPOPE) 
    • Clv. Ped. (F2_CVEPED)
    • Cer Origen (F2_CERORI) 
    • Incoterm (F2_INCOTER)
    • Subdivisión (F2_SUBDIV)
    • Cambio USD (F2_TCUSD)
    • Total USD (F2_TOTUSD)
    • Reg. Fiscal (F2_IDTRIB)
    • Res. Fiscal (F2_RESIDE)
    • Mot. Tras. (F2_TRASLA)

    Se agregó una validación para que si el Tipo de Documento es Traslado (21), cuando se tiene activada la funcionalidad de Facturación Electrónica, y el campo Mot. Tras. (F2_TRASLA) se encuentra vacío, se presente el siguiente mensaje y no se permita el guardado del documento:

    Para Documentos de tipo Traslado con Complemento de Comercio Exterior, es necesario informar el campo  Mot. Tras. (F2_TRASLA).


    Informações
    titleRechazos

    Si el XML es de una Factura de tipo Traslado, y en el nodo cfdi:Comprobante\cfdi:Complemento\cce11:ComercioExterior no existe el atributo MotivoTraslado, se recibe el siguiente rechazo: 

    [Error #CCE999] Error no clasificado Folio: 00000000000000000250. Serie: A. El TipoDeComprobante es "T" Traslado el atributo "ComercioExterior:MotivoTraslado" debe existir.

    En el archivo de Generación de XML de Documentos de Salida (FATSMEX.INI):

    Se realizaron los siguientes ajustes:

    Si se encuentra configurado el parámetro MV_CFDIEXP con el valor .T., se informa el campo Tipo Opera (F2_TIPOPE) o el tipo de Documento es Traslado (F2_TIPODOC igual a 21) y se indicó que si tiene Carta Porte (F2_TPCOMPL igual a S), en el nodo cfdi:Comprobante\cfdi:Receptor los atributos Rfc, Nombre, DomicilioFiscalReceptor y RegimenFiscalReceptor son informados con los datos de los campos CNPJ o CPF (M0_CGC), Nombre Comercial (M0_NOMECOM), CP Fiscal Entrega (M0_CEPENT) y Actividad Económica (M0_DSCCNA) de la Sucursal.

    Se mueven los datos que aplican para el complemento de Carta Porte, para que en la cadena original se muestren después de los datos que aplican para el complemento de Comercio Exterior.

    Si el RCF del Cliente es XEXX010101000 en el nodo cfdi:Comprobante\cfdi:Complemento\cce11:Receptor se genera el atributo NumRegIdTrib con el valor del campo Reg. Fiscal (F2_IDTRIB)

    Para más información de ajustes y proceso de validación ver Docmento Técnico de Ajustes para Complemento de Comercio Exterior 1.1 Revisión E México


    5.5 Activación de generación de XML de Factura de Venta de tipo Normal mediante la rutina FATSMEX.PRW



    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación
    Función:

    Rutina

    Nombre Técnico

    Fecha

    FATSMEXGeneración de XML para Documentos de Salida01/11/2022
    LOCXFUNAFunciones Genéricas para Notas Fiscales09/11/2022
    FATXFUMIFunciones genéricas para Facturación - Mercado Internacional08/11/2022
    País:México (Pacote: 011320)
    Ticket:No aplica
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-17245


    Se solicita activar la funcionalidad para que la generación del Comprobante Fiscal Digital por Internet (CFDI) para la Factura de Venta de tipo Normal, sea realizada a través del uso de la rutina FATSMEX.PRW, para evitar el uso del archivo FATSMEX.INI.

    SOLUCIÓN

    Se crea la rutina de Generación de XML para Documentos de Salida (FATSMEX), para la generación del Comprobante Fiscal Digital por Internet (CFDI) de documentos de tipo Salida, la cual genera los siguientes nodos:

      • cfdi:Conceptos
      • cfdi:Impuestos
      • cfdi:Retenciones

    Así como los atributos para visualizar los Totales por Impuestos:

      • TotalImpuestosRetenidos
      • TotalImpuestosTrasladados

    En la rutina de Funciones genéricas para Facturación - MI (FATXFUMI),se crean las funciones:

      • FATXMICERT(), la cual obtiene el certificado informado en el parámetro MV_CFDI_CP.
      • FATXMISECA(), la cual realiza el sellado de la Cadena Original con algoritmo SHA256 utilizando el archivo configurado en el parámetro MV_CFDI_CP.
      • FATXFOLREL(), la cual genera la Cadena Original y nodo de cfdi:CfdiRelacionados.
      • FATXMIEMIS(), la cual genera la Cadena Original y nodo de cfdi:Emisor.
      • FATXMIRECE(), la cual genera la Cadena Original y nodo de cfdi:Receptor.
      • FATXMICREA(), la cual crea el XML en la ruta definida en el parámetro MV_CFDDOCS.
      • FATXCOMPCL(), la cual obtiene los datos del Complementos del Cliente (AI0).


    Para activar la funcionalidad de generación del XML  a través de la rutina FATSMEX.PRW se debe crear el parámetro MV_FEXML en la tabla SX6 - Parámetros y configurarse con el valor S:

    Campo

    Valor

    Nombre de Var.MV_FEXML
    Tipo1 - Caracteres
    Cont. Esp
    Descripción

    Permite activar la funcionalidad para generar XML a través de rutina, evitando el uso de archivos .INI. S - Realizara la creación de archivos XML y no hará uso de los actuales archivo INI.


    Consideraciones importantes para el timbrado a través del uso de la rutina FATSMEX.PRW:

    1. Configurar el parámetro MV_FEXML.
    2. Configurar el parámetro MV_CFDDIRS con la ruta donde se encuentran las llaves y certificados.
    3. Configurar el parámetro MV_CFDI_CP con el nombre y extensión del Archivo de la clave privada (.pem).
    4. Configurar los parámetros MV_IVATRAS y MV_RETIVAM con los códigos de Impuestos y Retenciones.
    5. Ingresar al módulo Libros Fiscales (SIGAFIS), ir al menú Actualizaciones | Archivos | Contr. Formularios (MATA992)
      • Configurar los datos para la Serie de la Factura informando los campos No. Inicial, No. Final, Fch Validez y Certificado
    6. En la ruta configurada en el parámetro MV_CFDDIRS debe existir el archivo que se configuró en el parámetro MV_CFDI_CP, ya que con este archivo es generado el atributo Certificado en el XML del CFDI.

    5.6 Activación de generación de Factura Global desde la MATA467N


    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación 
    Función:

    Rutina

    Nombre Técnico

    Fecha 

    FISA814Definición de Catálogos del SAT.20/12/2022
    MATR475

    Generación de PDF para Documentos Fiscales de Entrada/Salida.

    20/12/2022
    LOCXMEXFunciones Genéricas para Documentos Fiscales para México.20/12/2022
    LOCXFUNAFunciones generales de documentos fiscales.20/12/2022
    País:México
    Ticket:15663253/15642890/15662513
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-17711 / DMINA-17694 / DMINA-17713

    Se solicita realizar la habilitación de las Facturas Globales desde la rutina Facturación (MATA467N) de las cuales se requiere emitir un CFDI Global versión 4.0, ya que actual del sistema no se contempla la emisión de CFDI Global desde dicha rutina debido a que no se pueden capturar los datos que requiere el nodo: InformacionGlobal.

    Se realizaron los siguientes ajustes:

    Funciones generales de documentos fiscales (LOCXFUNA):

    • Se realizaron ajustes en la función fProdSB1(), agregando las últimas posiciones al arreglo adatosSB1 en la bifurcación de la Factura Global.

    Funciones Genéricas para Documentos Fiscales para México (LOCXMEX):

    • En la función LxCposMex(), se habilitan los campos para la Información Global "Periodicidad (F2_IDCBAJA)", "Meses (F2_MODCONS)" y "Año (F2_PTOEMIS)" de emisión de la Factura Global así como la validación de solo mostrarse cuando el parámetro MV_NFGLOBA = S. 
    • En la función NfTudOkMex(), se agrega la validación en el llenado de los campos "Periodicidad (F2_IDCBAJA)", "Meses (F2_MODCONS)" y "Año (F2_PTOEMIS)" cuando el campo Es Global? - 1 - Si.

    Definición de Catálogos del SAT (FISA814):

    • En la función f814CatMex(), Se agrega la estructuras  para los catálogos c_Periodicidad.csv y c_Meses.csv.

    Generación de PDF para Documentos Fiscales de Entrada/Salida.

    • En la rutina MATR475Enc(), se añade a la impresión de la Factura el nuevo nodo de "InformaciónGlobal".

    Creación de Consulta Estándar en el archivo SXB - Consultas Estándar:

    Alias

    Tipo

    Secuencia

    Columna

    Descripción

    Contiene

    MEX029101REPeriodicidadF3I
    MEX02920101
    F812SXB("S029","Period")
    MEX029501

    VAR_IXB

    Alias

    Tipo

    Secuencia

    Columna

    Descripción

    Contiene

    MEX030101REMesesF3I
    MEX03020101
    F812SXB("S029","Meses")
    MEX030501

    VAR_IXB


    Creación de campos en el archivo SX3 – Campos:

    Tabla SF2 - Encabezado de Fact. de Salida.

    Campo

    F2_GLOBAL

    TipoC - Caracter
    Tamaño1
    Decimal0
    Formato
    TítuloEs Global?
    DescripciónDeterm. si es factura glob
    Lista Español1=Si;2=No
    Inic. Estandar"2"
    Nivel1
    Utilizado
    BrowseNo
    Help

    Determina si el documento es una factura
    global.

    Campo

    F2_IDCBAJA

    TipoC - Caracter
    Tamaño2
    Decimal0
    Formato@!
    TítuloPeriodicidad
    DescripciónPeriodicidad de Emisión
    ConsultaMEX029
    Validación de sistemaVazio() .or. ValidF3I("S029", M->F2_IDCBAJA,1,2)
    Nivel1
    Utilizado
    BrowseNo
    Help

    Informe el período al que corresponde a la información del comprobante global.

    Campo

    F2_MODCONS

    TipoC - Caracter
    Tamaño2
    Decimal0
    Formato@!
    TítuloMes Emisión
    DescripciónMes de Emisión de Fact
    ConsultaMEX030
    Validación de sistemaVazio() .or. ValidF3I("S030", M->F2_MODCONS,1,2)
    Nivel1
    Utilizado
    BrowseNo
    Help

    Indicar la clave del mes o los meses al que corresponde la información de las operaciones celebradas con el público en general, las distintas claves vigentes se encuentran incluidas en el catálogo c_Meses .

    Campo

    F2_PTOEMIS

    TipoC - Caracter
    Tamaño4
    Decimal0
    Formato@!
    TítuloAño Emisión
    DescripciónAño Emisión de Fact Global
    Estandar
    Consulta
    Validación de sistema
    Nivel1
    Utilizado
    BrowseNo
    Help

    Se debe registrar el año al que corresponde la información del comprobante global. El valor registrado debe ser igual al año en curso o al año inmediato anterior considerando el registrado en la Fecha de emisión del comprobante. 


    Creación del parámetro en la tabla SX6 - Parámetros:

    Campo

    Valor

    Nombre de Var.MV_NFGLOBA
    Tipo1 - Caracteres
    Cont. Esp
    DescripciónPermite activar la funcionalidad para generar Facturas Globales a través de rutina. Valor S para habilitar los campos requeridos.


    Ejemplo de envió de Factura Global por rutina automática.


    Bloco de código
    languagedelphi
    themeEclipse
    titleM467AUTO - Función de usuario ejemplo para generar una factura de traslado con carta porte.
    linenumberstrue
    #include "Protheus.ch"
    
    User Function M467Auto()
       Processa( { || GeneraNF() } , "", "Generando Factura Global..." )
    Return
    
    Static Function GeneraNF()
       Local aCab			:= {}
       Local aLinha			:= {}
       Local aItens			:= {}
       Local cSerie			:= "A  "
       Local cDoc			:= ""
       Local cCertFol		:= SuperGetMv("MV_CFDI_CS",,"")
       Local cProd			:= PadR("TST000000000037",20)
    
       Private lMsErroAuto := .F.
    
       // Consecutivo factura
       SX5->(DBSetOrder(1))
       SX5->(MsSeek(xFilial("SX5")+"01"+cSerie))
       cDoc := IIf( SX5->(Found()), PadR(Trim(X5Descri()),20) , StrZero(126,20,0) )
    
       // Encabezado de factura
       AAdd( aCab, { "F2_CLIENTE", "016082"						, Nil } )
       AAdd( aCab, { "F2_LOJA"   , "01"							, Nil } )
       AAdd( aCab, { "F2_SERIE"  , cSerie						, Nil } )
       AAdd( aCab, { "F2_DOC"    , cDoc							, Nil } )
       AAdd( aCab, { "F2_COND"   , "015"						, Nil } )
       AAdd( aCab, { "F2_EMISSAO", dDataBase					, Nil } )
       AAdd( aCab, { "F2_EST"    , "QRO"						, Nil } )
       AAdd( aCab, { "F2_TIPO"   , "N"							, Nil } )
       AAdd( aCab, { "F2_ESPECIE", "NF   "						, Nil } )
       AAdd( aCab, { "F2_PREFIXO", "A"							, Nil } )
       AAdd( aCab, { "F2_MOEDA"  , 1							, Nil } )
       AAdd( aCab, { "F2_TXMOEDA", 1							, Nil } )
       AAdd( aCab, { "F2_FORMUL" , "S"							, Nil } )
       AAdd( aCab, { "F2_TIPODOC", "01"							, Nil } )
       AAdd( aCab, { "F2_USOCFDI", "S01"						, Nil } )
       AAdd( aCab, { "F2_GLOBAL" , "1"                          , Nil } ) // Indica si es Factura Global 1-Si / 2-No.
       AAdd( aCab, { "F2_IDCBAJA", "01"                         , Nil } ) // Indicar la Periodicidad de emisión de la Factura Global.
       AAdd( aCab, { "F2_MODCONS", "01"                         , Nil } ) // Indicar los Meses de emisión de la Factura Global.
       AAdd( aCab, { "F2_PTOEMIS", "2022"                       , Nil } ) // Indicar el año de emisión de la Factura Global.
       AAdd( aCab, { "F2_APROFOL", "1"							, Nil } )
       AAdd( aCab, { "F2_CERTFOL", cCertFol						, Nil } )
    
       // Ítems de la factura
       aLinha := {}
       AAdd( aLinha, { "D2_COD"    , cProd						, Nil } )
       AAdd( aLinha, { "D2_UM"     , "UN"						, Nil } )
       AAdd( aLinha, { "D2_QUANT"  , 1							, Nil } )
       AAdd( aLinha, { "D2_PRCVEN" , 1000						, Nil } )   
       AAdd( aLinha, { "D2_TOTAL"  , 1000						, Nil } )   
       AAdd( aLinha, { "D2_PESO"   , 1							, Nil } )
       AAdd( aLinha, { "D2_TES"    , "501"						, Nil } )
       AAdd( aLinha, { "D2_ESPECIE", "NF   "					, Nil } )
       AAdd( aItens, aLinha)
    
       // Rutina automática
       MSExecAuto( { |x,y,z,w| Mata467n(x,y,z,,,,w) }, aCab, aItens, 3, )   //3-Incluir, 5-Excluir e 6-Cancelar
    
       If lMsErroAuto
       	  MsgStop("Error en la grabación de la Factura global.")
       	  MostraErro()
       Else
       	  MsgAlert("Factura global incluida con éxito.")
       EndIf
    
    Return
    
    

    Para más información de ajustes y proceso de validación ver DT Factura Global CFDI 4.0 MATA467N MEX

    5.7 Reenvió de cancelación de una solicitud rechazada

    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación
    Función:

    Rutina

    Nombre Técnico

    Fecha

    FISA800Timbrado CFDI10/02/2023
    FISA817Cancelación CFDI13/02/2023
    LOCXMEXFunciones genéricas para el país México10/02/2023
    LOCXNFFunciones genéricas de localizaciones 10/02/2023
    País:México
    Ticket:15946342 (Pacote: 0011736)
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-18213


    Se solicita se permita el reenvió  de una solicitud de cancelación cuando se realiza la Solicitud de Cancelación ante el SAT de una Factura de Venta que tiene el estatus "Cancelable con Aceptación", y esta es RECHAZADA por el Cliente, al intentar reenviar la Solicitud de cancelación de esa misma Factura en la rutina Cancelación de CFDI (FISA817) desde Otras acciones | Solic. Can. Pendientes.

    En la rutina de Cancelación de CFDI (FISA817), para los documentos con estatus "Cancelable con aceptación" con tipo de motivo de cancelación "01", donde al realizar la cancelación del documento le indique la marca de "E" que fue enviado a solicitud de cancelación y estará disponible el documento para la consulta del estatus en el SAT mediante el Proveedor Autorizado de Certificación (PAC) MasterEdi  donde con base al estatus que retorna el PAC se realiza la siguiente regla de negocio:

      1. Reenvió de una solicitud  de cancelación rechazada se mostrará en el log:
        Image Added
      2. "Solicitud Rechazada": Solicitud de cancelación que rechazo el receptor no está anulada en el SAT y queda disponible para su solicitar el reenvió de la cancelación del documento en el sistema se mostrará en el log:
        Image Added
      3. "En proceso": Solicitud en proceso que aun se encuentra vigente en el SAT y no está aun anulada en el SAT y queda disponible para realizar la consulta de estatus del documento se mostrará en el log:
        Image Added
      4. "Cancelado": Documento que ha sido cancelado en el SAT por lo tanto ya no se encuentra disponible para realizar alguna otra acción se mostrará en el log:
        Image Added


    En el caso de las cancelaciones con motivo diferente a "01 - Comprobante emitido con errores con relación de documento", se realizo ajuste cuando sean documentos "Cancelables con aceptación" una vez seleccionado el motivo de cancelación no se eliminarán del browser hasta que la petición de solicitud de cancelación haya sido aceptada en caso contrario podrá actualizar el estatus o reenviar la solicitud de cancelación en caso de ser necesario como se indica en el DT DT_Factura_Electronica_Mexico_CFDI_Version_3_3#7.2ProcedimientodeUtilizaci%C3%B3n.


    Funcionalidad con cualquier motivo.

    EstatusAcción protheusRespuesta Protheus

    Vigente

    Actualiza Status
    Cambia estatus a Vigente Cancelable Con Aceptación
    Cambia estatus a Vigente Cancelable Sin Aceptación




    Vigente Cancelable Con Aceptación
    Cancelar e indicar Motivo

    Motivo

    Respuesta Protheus

    01Indica el documento fue anulado en sistema pero no ante el SAT disponible para su cancelación desde "Otras opciones > Solic. Can Pendientes" o al timbrar la factura relacionada.
    Diferente a 01Cambia a estatus "En proceso"


    Funcionalidad con motivo diferente a "01 - Comprobante emitido con errores con relación de documento"

    EstatusAcción protheusRespuesta Protheus
    En proceso

    Actualiza Status

    Solicitud de Cancelación Rechazada
    No cancelable , contiene documentos relacionados
    Acepta cancelación (Se elimina el registro).
    Solicitud de Cancelación RechazadaCancelar e indicar MotivoCambia a estatus "En proceso"
    Informações

    Este cambio solo aplica para el Proveedor Autorizado de Certificación (PAC) MasterEdi 


    Ajuste al diccionario de Datos:


    Consulta Estándar en el archivo SXB – Consulta Estándar:

    Consulta: DOCSUS

    Alias

    Tipo

    SecuenciaColumnaDescripciónContenido

    DOCSUS

    1

    01DBDocumento SustituyeSF3

    DOCSUS

    2

    0105Serie Fact. + Factur

    DOCSUS

    4

    0101SerieF3_SERIE
    DOCSUS40102Número Documento       F3_NFISCAL
    DOCSUS40103ClienteF3_CLIEFOR
    DOCSUS40104TiendaF3_LOJA
    DOCSUS40105UUIDF3_CNATREC
    DOCSUS501

    SF3->F3_SERIE
    DOCSUS502

    SF3->F3_NFISCAL
    DOCSUS601

    F3_TIPOMOV ==  "V" .And. F3_STATUS $ "S|A" .And. F3_ESPECIE == cEspecie 

    5.8 Actualización de valores en catálogo c_Exportación.

    01. DATOS GENERALES


    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación
    Función:

    Rutina

    Nombre Técnico

    Fecha

    LOCXMEXLocalizaciones genéricas para el país México 21/02/2023
    FATSMEXGeneración de XML para Documentos de Salida21/02/2023
    FATEMEXGeneración de XML para Documentos de Entrada21/02/2023
    País:México
    Ticket:No aplica (Pacote: 0011806)
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-18471


    02. SITUACIÓN/REQUISITO

    De acuerdo a las actualizaciones en el catálogo de c_Exportación realizadas por el SAT el pasado 24 de febrero del 2022 , se requiere que para el Complemento de Comercio Exterior, cuando la clave de pedimento sea distinta de A1 o que no exista enajenación en términos del Código Fiscal de la Federación (CFF), en el atributo "Exportación" se deberá indicar el valor "04", de acuerdo a lo definido por el SAT:

    c_ExportacionDescripción
    04Definitiva con clave distinta a A1 o cuando no existe enajenación en términos del CFF

    Para la inclusión de Documentos Fiscales (LOCXNF), cuando se tiene activa la funcionalidad de Comercio Exterior (el parámetro MV_CFDIEXP se encuentra configurado con valor .T.), se realizaron ajustes para dar seguimiento a la siguiente regla de negocio:

    Los campos necesarios para la generación del nodo de Complemento de Comercio Exterior, solo serán obligatorios si el campo Tipo Opera (F2_TIPOPE) es informado y el campo Clv. Ped. (F2_CVEPED) es igual a "A1".

    En el CFDI del Documento, el atributo Exportacion tomará los siguientes valores:

    • 01 si el parámetro MV_CFDIEXP se encuentra configurado con valor .F. o si el campo Tipo Opera (F2_TIPOPE) se encuentra vacío.
    • 02 Si el campo Tipo Opera (F2_TIPOPE) es diferente de vacío y el campo Clv. Ped. (F2_CVEPED) es igual a "A1"
    • 04 si el campo Tipo Opera (F2_TIPOPE) está informado como Exportación sin Enajenación o el campo Clv. Ped. (F2_CVEPED) está informado con un valor diferente de "A1".

    Los siguientes campos, son los necesarios para la funcionalidad del Complemento de Comercio Exterior:

    • Tipo Opera (F2_TIPOPE) 
    • Clv. Ped. (F2_CVEPED)
    • Cer Origen (F2_CERORI) 
    • Incoterm (F2_INCOTER)
    • Subdivisión (F2_SUBDIV)
    • Cambio USD (F2_TCUSD)
    • Total USD (F2_TOTUSD)
    • Reg. Fiscal (F2_IDTRIB)
    • Res. Fiscal (F2_RESIDE)


    En caso de tener personalizaciones en el archivo FATSMEX.INI se debe hacer los ajustes que se enmarcan a continuación:
    FATSMEX.INI

    Painel
    titleFATSMEX.INI

    [XXX POSICIONAMENTOS]
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SA2->(MSSeek(xFilial("SA2")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)

    [XXX INICIALIZACION]
    (PRE) SD2->(DbSetOrder(1))
    (PRE) SB1->(DbSetOrder(1))
    (PRE) SYA->(DbSetOrder(1))
    (PRE) SC6->(DbSetOrder(1))
    (PRE) SE4->(DbSetOrder(1)) 
    (PRE) CTO->(DbSetOrder(1)) 
    (PRE) SAH->(DbSetOrder(1)) 
    (PRE) _aTotal[009] := SuperGetMV("MV_CFDICPG", .F., "")
    (PRE) _aTotal[010] := FindFunction("zh_FechaHoraUTC") .And. !Empty(_aTotal[009])
    (PRE) _aTotal[011] := FindFunction("LxFunaCaPo")
    (PRE) _aTotal[094] := ""
    (PRE) _aTotal[095] := ""
    (PRE) _aTotal[033] := ""
    (PRE) _aTotal[034] := ""
    (PRE) _aTotal[035] := ""
    (PRE) _aTotal[036] := 0
    (PRE) _aTotal[037] := 0
    (PRE) _aTotal[038] := 0
    (PRE) _aTotal[039] := SuperGetMV("MV_CFDIEXP",.F.,.F.)
    (PRE) _aTotal[075] := Alltrim(SM0->M0_NOMECOM)
    (PRE) _aTotal[076] := ((_aTotal[039] .And. !Empty(SF2->F2_TIPOPE)) .Or. SF2->(ColumnPos("F2_TPCOMPL")) > 0 .And. AllTrim(SF2->F2_TPCOMPL)=="S") .And. Alltrim(SF2->F2_TIPODOC) == "21"
    (PRE) IIf(_aTotal[010],_aTotal[096] := zh_FechaHoraUTC(Alltrim(_aTotal[009]),Alltrim(SM0->M0_CEPENT),SF2->F2_EMISSAO,SF2->F2_HORA),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] := DtoS(SF2->F2_EMISSAO),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] := Left(_aTotal[096],4) + "-" + Substr(_aTotal[096],5,2)+ "-" + Right(_aTotal[096],2),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] += "T" + SF2->F2_HORA,"")
    (PRE) _aTotal[097] := {"SD2",""}
    (PRE) _aTotal[098] := "|"
    (PRE) _aTotal[099] := "||"
    (PRE) _aTotal[100] := ""
    (PRE) _aTotal[101] := "OPERACION DE CONFORMIDAD CON EL ART. 29 FRACCION I DE LIVA Y LO ESTIPULADO EN LAS RGCE 5.2.6. FRACCION I, 5.2.7 Y 4.3.21"
    (PRE) _aTotal[102] := "OPERACION DE CONFORMIDAD CON EL ART. 29 FRACCION I DE LIVA Y LO ESTIPULADO EN LAS RGCE 5.2.6. FRACCION II, 5.2.7 Y 4.3.21"
    (PRE) _aTotal[103] := fSumBC(SF2->F2_DOC,SF2->F2_SERIE,SF2->F2_CLIENTE,SF2->F2_LOJA)
    (PRE) _aTotal[104] := IIf(SF2->(ColumnPos("F2_TPCOMPL")) > 0 .And. AllTrim(SF2->F2_TPCOMPL)=="S",.T.,.F.)
    (PRE) _aTotal[105] := ""
    (PRE) _aTotal[106] := IIf(Alltrim(SF2->F2_TIPODOC) == "21",0,2)
    (PRE) _aTotal[107] := IIf(SF2->(ColumnPos("F2_TPDOC")) > 0,ALLTRIM(SF2->F2_TPDOC),ALLTRIM(AI0->AI0_MPAGO))
    (PRE) _aTotal[108] := IIf(_aTotal[076],AllTrim(SM0->M0_CGC),AllTrim(SA1->A1_CGC))
    (PRE) _aTotal[109] := IIf(_aTotal[076],_aTotal[075],Alltrim(SA1->A1_NOME))
    (PRE) _aTotal[110] := IIf(_aTotal[076],AllTrim(SM0->M0_CEPENT),Alltrim(SA1->A1_CEP))
    (PRE) _aTotal[111] := IIf(_aTotal[076],Alltrim(SM0->M0_DSCCNA),Alltrim(AI0->AI0_REGFIS))
    (PRE) _aTotal[112] := FormPagGlo(SF2->F2_DOC,SF2->F2_SERIE)
    (PRE) _aTotal[113] := IIf(!_aTotal[039] .Or. (_aTotal[039] .And. Empty(SF2->F2_TIPOPE)),"01",IIf(SF2->F2_CVEPED !="A1" .Or. Alltrim(SF2->F2_TIPOPE)== "3","04","02"))
    (PRE) _aTotal[114] := IIf(_aTotal[113] == "04" .And.( Empty(SF2->F2_CERORI) .Or. Empty(SF2->F2_INCOTER) .Or. Empty(SF2->F2_SUBDIV) .Or. Empty(SF2->F2_TCUSD) .Or. Empty(SF2->F2_TOTUSD)) ,.F.,.T.)

    (PRE) lCCCE        := .F.
    (PRE) cNodoCCE     := ""
    (PREREG) FsQuery(_aTotal[097],1,"D2_DOC='" + SF2->F2_DOC + "' AND D2_SERIE='" + SF2->F2_SERIE + "' AND D2_CLIENTE='" + SF2->F2_CLIENTE + "' AND D2_LOJA='" + SF2->F2_LOJA + "'","SD2->D2_DOC=SF2->F2_DOC .AND. SD2->D2_SERIE=SF2->F2_SERIE .AND. SD2->D2_CLIENTE=SF2->F2_CLIENTE .AND. SD2->D2_LOJA=SF2->F2_LOJA","D2_ITEM") .And. .T.

    (PRE) fImptosD(SF2->F2_DOC,SF2->F2_SERIE,SF2->F2_CLIENTE,SF2->F2_LOJA,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),"SD2", SF2->F2_GLOBAL == "1",@(_aTotal[036]),_aTotal[104],@_aTotal[037], @_aTotal[038] ) 

    [SD2 CADENAORIGINAL_SELLO]
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SA2->(MSSeek(xFilial("SA2")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SYA->(MsSeek(xFilial("SYA")+SA2->A2_PAIS)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",CTO->(MsSeek(xFilial("CTO")+Strzero(SF2->F2_MOEDA,2))) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",CTO->(MsSeek(xFilial("CTO")+Strzero(SF2->F2_MOEDA,2))) , .T.)
    //////////////////////////////////////////////CADENA ORIGINAL//////////////////////////////////////////////
    (PRE) cCadOrig   := _aTotal[099]
    (PRE) lCCCE      := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE)  .And. _aTotal[114], .T., .F.)
    (PRE) cCadOriCCE := ""

    //Cadena Original | Complemento de Comercio Exterior (Mercancias)
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_ITEM + SD2->D2_COD), (cCadOriCCE += Alltrim(SD2->D2_ITEM + SD2->D2_COD) + _aTotal[098],.T.),("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), (cCadOriCCE += Alltrim(SD2->D2_FRACCA) + Alltrim(SD2->D2_NICO) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_CANADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_CANADU)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), (cCadOriCCE += AllTrim(ObtColSAT("S014",AllTrim(SD2->D2_FRACCA),1,8,9,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_VALADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_VALADU,14,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_USDADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_USDADU,14,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. SA1->A1_CONTRBE=="1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", (cCadOriCCE += '1.0' +_aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. SA1->A1_CONTRBE=="1" .And. SF2->F2_CONUNI=="1", (cCadOriCCE += 'IMMEX:' + ALLTRIM(SA1->A1_PFISICA) + ' ' + _aTotal[101] + _aTotal[098],.T.), IIf (lCCCE .And. SA1->A1_CONTRBE=="1" .And. SF2->F2_CONUNI=="2", (cCadOriCCE += 'IMMEX:' + ALLTRIM(SA1->A1_PFISICA) + ' ' + _aTotal[102] + _aTotal[098],.T.), ("",,.T.)))

    ///////////DATOS DE LA FACTURA/////////////////
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    //Version
    (PRE) cCadOrig += "4.0" + _aTotal[098]
    //Serie
    (PRE) cCadOrig += Alltrim(SF2->F2_SERIE) + _aTotal[098]
    //Folio
    (PRE) cCadOrig += Alltrim(SF2->F2_DOC) + _aTotal[098]
    //Fecha
    (PRE) cCadOrig += Alltrim(_aTotal[096]) + _aTotal[098]
    //FormaPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", IIf(SF2->F2_GLOBAL == '1',IIf(!Empty(_aTotal[112]),_aTotal[112],_aTotal[107]),IIf(Empty(_aTotal[107]).Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",_aTotal[107])) + _aTotal[098] )
    //NoCertificado
    (PRE) cCadOrig += Alltrim(SF2->F2_CERTFOL) + _aTotal[098]
    //CondicionesDePago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + _aTotal[098] ) 
    //Subtotal
    (PRE) cCadOrig += Alltrim(STR(IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, (SF2->(F2_VALMERC+F2_FRETE+F2_SEGURO+F2_DESPESA) + _aTotal[103] + SF2->F2_DESCONT) - _aTotal[036] - _aTotal[037]),14,_aTotal[106])) + _aTotal[098]
    //Descuento
    (PRE) cCadOrig += IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", "", IIf( SF2->F2_DESCONT == 0, "", Alltrim(STR(SF2->F2_DESCONT,14,2)) + _aTotal[098]) )
    //Moneda
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21","XXX",Alltrim(CTO->CTO_MOESAT)) + _aTotal[098]
    //TipoCambio
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21","",IIf(Alltrim(CTO->CTO_MOESAT) <> "MXN", Alltrim(STR(SF2->F2_TXMOEDA,14,2)), "1") + _aTotal[098])
    //Total
    (PRE) cCadOrig += Alltrim(Str(IIf(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, iif(GetSx3Cache("F2_VALBRUT","X3_DECIMAL")<= 2,SF2->F2_VALBRUT + _aTotal[103]- _aTotal[037],Round(SF2->F2_VALBRUT,2) + _aTotal[103] - _aTotal[037])),14,_aTotal[106])) + _aTotal[098]
    //TipoDeComprobante
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_ESPECIE) == "NF",IIf(ALLTRIM(SF2->F2_TIPODOC) == "21", "T", "I" ), "E") + _aTotal[098]
    //Exportacion
    (PRE) cCadOrig += IIf(!Empty(_aTotal[113]),_aTotal[113],"01") + _aTotal[098]
    //MetodoPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", Alltrim(SE4->E4_MPAGSAT) + _aTotal[098] )
    //LugarExpedicion
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + _aTotal[098]
    //Periodicidad
    (PRE) cCadOrig += IIf(SF2->(ColumnPos("F2_IDCBAJA")) > 0 .And. SF2->F2_GLOBAL == "1", SF2->F2_IDCBAJA + _aTotal[098],"")
    //Meses
    (PRE) cCadOrig += IIf(SF2->(ColumnPos("F2_MODCONS")) > 0 .And. SF2->F2_GLOBAL == "1", SF2->F2_MODCONS + _aTotal[098],"")
    //Año
    (PRE) cCadOrig += IIf(SF2->(ColumnPos("F2_PTOEMIS")) > 0 .And. SF2->F2_GLOBAL == "1", SF2->F2_PTOEMIS + _aTotal[098],"")

    //////////////////////CFDI Relacionados//////////////////////////
    (PREREG)!Empty(SF2->F2_RELSAT).Or. !Empty(SF2->F2_SERMAN).Or. !Empty(SF2->F2_DOCMAN)
    (PRE) IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","",fGetFolRel("S",.T.))

    ///////////DATOS DEL EMISOR///////////////////////
    //Rfc
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CGC),.F.) + _aTotal[098]
    //Nombre
    (PRE) cCadOrig += CFDCarEsp(_aTotal[075],.F.) + _aTotal[098]
    //RegimenFiscal
    (PRE) cCadOrig += CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + _aTotal[098]

    //////////////////////DATOS DEL RECEPTOR//////////////////////////
    (PRE) AllTrim(SF2->F2_ESPECIE) <> "NDI"
    (PRE) SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA))
    (PRE) SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS))
    //Rfc
    (PRE) (cCadOrig += IIf(!_aTotal[104] .And. ((ALLTRIM(SF2->F2_TIPODOC) == "21" .And. !lCCCE) .Or. SF2->F2_GLOBAL == "1"), "XAXX010101000", CFDCarEsp(_aTotal[108], .F.)) + _aTotal[098])
    //Nombre
    (PRE) (cCadOrig += IIF(SF2->F2_GLOBAL == "1", "PUBLICO EN GENERAL",CFDCarEsp(_aTotal[109],.F.)) + _aTotal[098], .T.)
    //DomicilioFiscalReceptor
    (PRE) (cCadOrig += CFDCarEsp(_aTotal[110],.F.) + _aTotal[098], .T.)
    //ResidenciaFiscal
    (PRE) IIf(lCCCE .And. !Empty(CFDCarEsp(Alltrim(SF2->F2_RESIDE))) .And. !_aTotal[076], cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SF2->F2_RESIDE,"YA_CCESAT")) + _aTotal[098], "")
    //NumRegIdTrib
    (PRE) IIf(lCCCE .And. !Empty(CFDCarEsp(Alltrim(SF2->F2_IDTRIB))) .And. !_aTotal[076], cCadOrig += CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + _aTotal[098], "")
    //RegimenFiscalReceptor
    (PRE) (cCadOrig += IIf(AI0->(ColumnPos("AI0_REGFIS")) > 0,CFDCarEsp(_aTotal[111],.F.) + _aTotal[098],""), .T.)
    //UsoCFDI
    (PRE) (cCadOrig += Alltrim(SF2->F2_USOCFDI) + _aTotal[098], .T.)

    (PRE) (cCadOrig += fXMLFUN("CO",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.)
    (PRE) (cCadOrig += fXMLFUN("TI",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)
    (PRE) (cCadOrig += fXMLFUN("IL",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)

    (POS) IIf(lCCCE , cCadOrig += "1.1" + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_TRASLA), cCadOrig += Alltrim(SF2->F2_TRASLA) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_TIPOPE), cCadOrig += IIf(Alltrim(SF2->F2_TIPOPE)=="3","2",Alltrim(SF2->F2_TIPOPE)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_CVEPED), cCadOrig += Alltrim(SF2->F2_CVEPED) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_CERORI), cCadOrig += Alltrim(SF2->F2_CERORI) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_NUMCER), cCadOrig += Alltrim(SF2->F2_NUMCER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_EXPCONF), cCadOrig += Alltrim(SF2->F2_EXPCONF) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_INCOTER), cCadOrig += Alltrim(SF2->F2_INCOTER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_SUBDIV), cCadOrig += Alltrim(SF2->F2_SUBDIV) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. SF2->(ColumnPos("F2_OBSCE")) > 0 .And. !Empty(SF2->F2_OBSCE), cCadOrig += CFDCarEsp(AllTrim(SF2->F2_OBSCE), .F.) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF2->F2_TCUSD)), cCadOrig += Alltrim(Str(SF2->F2_TCUSD)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF2->F2_TOTUSD)), cCadOrig += Alltrim(Str(SF2->F2_TOTUSD,14,2)) + _aTotal[098], "")

    //Emisor
    (POS) IIf(lCCCE , cCadOrig += CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CEPENT), cCadOrig += CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CODZOSE)+ALLTRIM(SM0->M0_CEPENT),1,9,1,4))) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CODMUN), cCadOrig += AllTrim(SM0->M0_CODMUN) + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += "MEX" + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += AllTrim(SM0->M0_CEPENT) + _aTotal[098], "")

    //Receptor Domicilio
    (POS) IIf(lCCCE .And. _aTotal[108] == "XEXX010101000", cCadOrig += CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(AllTrim(SA1->A1_END)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), cCadOrig += AllTrim(SA1->A1_NR_END) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), cCadOrig += AllTrim(SA1->A1_NROINT) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), cCadOrig +=  CFDCarEsp(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))) + _aTotal[098],"")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_MUN))), cCadOrig +=  CFDCarEsp(AllTrim(SA1->A1_MUN),.F.) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(SA1->A1_CEP) + _aTotal[098], "")

    (POS) cCadOrig += IIf(!Empty(cCadOriCCE), cCadOriCCE, "")

    //Carta Porte
    (POS) IIf(_aTotal[011],(cCadOrig += LxFunaCaPo(SF2->F2_FILIAL,SF2->F2_DOC,SF2->F2_SERIE,.T.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.),"")

    (POS) cCadOrig += _aTotal[098]
    (POS) _aTotal[033] := cCadOrig

    //SELLO
    (POS) _aTotal[100] := EVPDigest(cCadOrig,5)
    (POS) _aTotal[100] := PrivSignRSA(&(SuperGetMv("MV_CFDDIRS",,""))+SuperGetMv("MV_CFDARQS",,""),_aTotal[100],6,"assinatura")
    (POS) _aTotal[100] := ENCODE64(_aTotal[100])
    [XXX CABECERA]
    Linha1     C 041 0 Chr(239) + Chr(187) + Chr(191) + '<?xml version="1.0" encoding="UTF-8"?>'
    [XXX FACTURA]
    //Certificado del SAT incluido para pruebas 
    (PRE) cCert := "MIIFyDCCA7CgAwIBAgIUMzAwMDEwMDAwMDA0MDAwMDI0NDMwDQYJKoZIhvcNAQEL"
    (PRE) cCert += "BQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFE"
    (PRE) cCert += "TUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9y"
    (PRE) cCert += "aXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0w"
    (PRE) cCert += "GwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWRpejEOMAwGA1UEEQwFMDYzNzAxCzAJ"
    (PRE) cCert += "BgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhD"
    (PRE) cCert += "T1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3Bv"
    (PRE) cCert += "bnNhYmxlOiBBQ0RNQS1TQVQwHhcNMTkwNjE3MjA0MDUxWhcNMjMwNjE3MjA0MDUx"
    (PRE) cCert += "WjCB7zEqMCgGA1UEAxMhWEVOT04gSU5EVVNUUklBTCBBUlRJQ0xFUyBTIERFIENW"
    (PRE) cCert += "MSowKAYDVQQpEyFYRU5PTiBJTkRVU1RSSUFMIEFSVElDTEVTIFMgREUgQ1YxKjAo"
    (PRE) cCert += "BgNVBAoTIVhFTk9OIElORFVTVFJJQUwgQVJUSUNMRVMgUyBERSBDVjElMCMGA1UE"
    (PRE) cCert += "LRMcWElBMTkwMTI4SjYxIC8gS0FITzY0MTEwMUIzOTEeMBwGA1UEBRMVIC8gS0FI"
    (PRE) cCert += "TzY0MTEwMUhOVExLUzA2MSIwIAYDVQQLExlYZW5vbiBJbmR1c3RyaWFsIEFydGlj"
    (PRE) cCert += "bGVzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiJQ5YcSgjwsGf29+"
    (PRE) cCert += "3go7VGdtMZCcH9wUpn46ZMAlFwUojnCPTvwJ3+cSwjqJnw8ahr3DuRwekvGR4BJA"
    (PRE) cCert += "b5b9Xi8kyoiWtwcGOSWxO38Bp9J1e/BO9HMbQBPAtLDuG47oqnH8zWLOeaoYRJDp"
    (PRE) cCert += "ARw4RX1ko2+9tbj0ntBtM7Vk1E8EWiA/h2Meq0LIv1+ySGTUrEW46FM01J5pzELv"
    (PRE) cCert += "5XupBghuJxR5DG9fiOW7u3dR5s3tZoVLwA1KdjJtY0mmnfCwxg6i5AqhvY+FAI5D"
    (PRE) cCert += "6CF6/lHA8PWg63WasvrhuIv70xCLjgPT/j00ZcPrLvBf1DefGVic980Ch/SDvC+M"
    (PRE) cCert += "dJ1F5wIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG"
    (PRE) cCert += "9w0BAQsFAAOCAgEACjfTPoKY2N5MxjmAMltd5XZCV1vgAwEtrIRYTodhE8R0Tp1Q"
    (PRE) cCert += "anAXb0luPyBv5hIXWK4VqAI4fcTtP+n7kkrwfha6ErkPWFNJWJm8ZsMmby/3WgVo"
    (PRE) cCert += "JkOFyRYQqr5Il3N6wMa5kiDBtDRbqB3iEXmvtrvjWSHyxAER+zo3jWGFlhBZ0nQN"
    (PRE) cCert += "Rtjx8sPFihVc5TUH682HJiU4oWvT63Dnra8ncqiW/uCuY86crnUq0fW7Lw/3+PY5"
    (PRE) cCert += "xXjNxR/Hh3sUPITfJrGaLWurD1J9npr9yGAJ6t9zrhhZnepIC0DUMc5+j4pg1DrO"
    (PRE) cCert += "32jzwUOLQqErDizh84NoJCWwbg+US8wi3zD0ZKiDv7XsTNWAW2Ap2JkzykKHjFTZ"
    (PRE) cCert += "iEm3uZOkJNfcu3o+kefr5HfXFT+iN9K5FUEhaQwgUeZBRJ8V5F6gmhz3d6ixVbiZ"
    (PRE) cCert += "oFNhYR8e2k8gF9gGrVMrEbJGQrl+6+ZYQLFiauXeG7fu1svk19PuyredRJGnseJq"
    (PRE) cCert += "yV4RzcRGhJA+cLnmpdDOTEhignnvnhEuY6HVRYYXhOTyeeluET7KRCxbJGqO7TdW"
    (PRE) cCert += "gjrHL3HRbNE4NY5GAdOZuLaWxElG5ZVCHqtG0Nh7UQAhcz+EKyZBAewv5XuH0Oom"
    (PRE) cCert += "ZXw6mM2mY2soL6z1224NusM8/BbJcYTQUlAEKblEChhGK1XlxiVOU2nc9KE="

    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114], .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SYA->(MsSeek(xFilial("SYA")+SA2->A2_PAIS)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) _aTotal[001] := '<cfdi:Comprobante'
    (PRE) _aTotal[001] += ' xmlns:cfdi="http://www.sat.gob.mx/cfd/4"'
    (PRE) _aTotal[001] += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
    (PRE) _aTotal[001] += Iif(_aTotal[104],' xmlns:cartaporte20="http://www.sat.gob.mx/CartaPorte20"','')
    (PRE) _aTotal[001] += ' xmlns:implocal="http://www.sat.gob.mx/implocal"'
    (PRE) _aTotal[001] += IIf(lCCCE .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", ' xmlns:leyendasFisc="http://www.sat.gob.mx/leyendasFiscales"' , "")
    (PRE) _aTotal[001] += ' xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd '
    (PRE) _aTotal[001] += IIF(lCCCE,'http://www.sat.gob.mx/ComercioExterior11 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd ','http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd')
    (PRE) _aTotal[001] += IIf(_aTotal[104],'http://www.sat.gob.mx/CartaPorte20 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte20.xsd','')
    (PRE) _aTotal[001] += IIf(lCCCE .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", ' http://www.sat.gob.mx/leyendasFiscales http://www.sat.gob.mx/sitio_internet/cfd/leyendasFiscales/leyendasFisc.xsd"' , '"')
    (PRE) _aTotal[001] += IIf(lCCCE, ' xmlns:cce11="http://www.sat.gob.mx/ComercioExterior11"' , "")
    (PRE) _aTotal[001] += ' Version="4.0"'
    (PRE) _aTotal[001] += ' Serie="' + Alltrim(SF2->F2_SERIE) + '"'
    (PRE) _aTotal[001] += ' Folio="' + Alltrim(SF2->F2_DOC) + '"'
    (PRE) _aTotal[001] += ' Fecha="' + Alltrim(_aTotal[096]) + '"'
    (PRE) _aTotal[001] += ' Sello="' + Alltrim(_aTotal[100]) + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' FormaPago="' +  IIf(SF2->F2_GLOBAL == '1',IIf(!Empty(_aTotal[112]),_aTotal[112],_aTotal[107]),IIf(Empty(_aTotal[107]) .Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",_aTotal[107])) + '"' )
    (PRE) _aTotal[001] += ' NoCertificado="' + Alltrim(SF2->F2_CERTFOL) + '"'
    (PRE) _aTotal[001] += ' Certificado="' + cCert + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' CondicionesDePago="' +  CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + '"' ) 
    (PRE) _aTotal[001] += ' SubTotal="' + Alltrim(STR(IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, (SF2->(F2_VALMERC+F2_FRETE+F2_SEGURO+F2_DESPESA)  + _aTotal[103] + SF2->F2_DESCONT) - _aTotal[036] - _aTotal[037] ),14,_aTotal[106])) + '"'
    (PRE) _aTotal[001] += IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", "", IIf( SF2->F2_DESCONT == 0, "", ' Descuento="' + Alltrim(STR(SF2->F2_DESCONT,14,2)) + '"' ))
    (PRE) _aTotal[001] += ' Moneda="' + IIf(Alltrim(SF2->F2_TIPODOC) == "21","XXX",Alltrim(CTO->CTO_MOESAT)) + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' TipoCambio="' + IIf(Alltrim(CTO->CTO_MOESAT) <> "MXN", Alltrim(STR(SF2->F2_TXMOEDA,14,2)), "1") + '"') 
    (PRE) _aTotal[001] += ' Total="' + Alltrim(Str(IIf(Alltrim(SF2->F2_TIPODOC) == "21", 0, IIf(GetSx3Cache("F2_VALBRUT","X3_DECIMAL") <= 2,SF2->F2_VALBRUT + _aTotal[103] - _aTotal[037] - _aTotal[038] ,Round(SF2->F2_VALBRUT,2) + _aTotal[103] - _aTotal[037] - _aTotal[038])),14,_aTotal[106])) +  '"'
    (PRE) _aTotal[001] += ' TipoDeComprobante="' + IIf(Alltrim(SF2->F2_ESPECIE) == "NF",IIf(Alltrim(SF2->F2_TIPODOC) == "21", "T", "I"), "E") + '"'
    (PRE) _aTotal[001] += ' Exportacion="'+IIf(!Empty(_aTotal[113]),_aTotal[113],"01")+'"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' MetodoPago="' +  Alltrim(SE4->E4_MPAGSAT) + '"' )
    (PRE) _aTotal[001] += ' LugarExpedicion="' + CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + '"'
    (PRE) _aTotal[001] += '>'
    (PREREG) _aTotal[001]

    (POS) cNodoCCE := IIf(lCCCE, '        <cce11:ComercioExterior' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' Version="1.1"' , "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_TRASLA), ' MotivoTraslado="' + Alltrim(SF2->F2_TRASLA) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_TIPOPE), ' TipoOperacion="' + IIF(Alltrim(SF2->F2_TIPOPE)== "3","2",Alltrim(SF2->F2_TIPOPE)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_CVEPED), ' ClaveDePedimento="' + Alltrim(SF2->F2_CVEPED) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_CERORI), ' CertificadoOrigen="' + Alltrim(SF2->F2_CERORI) +'"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_NUMCER), ' NumCertificadoOrigen="' + Alltrim(SF2->F2_NUMCER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_EXPCONF), ' NumeroExportadorConfiable="' + Alltrim(SF2->F2_EXPCONF) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_INCOTER), ' Incoterm="' + Alltrim(SF2->F2_INCOTER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_SUBDIV), ' Subdivision="' + Alltrim(SF2->F2_SUBDIV) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. SF2->(ColumnPos("F2_OBSCE")) > 0 .And. !Empty(SF2->F2_OBSCE), ' Observaciones="' + CFDCarEsp(AllTrim(SF2->F2_OBSCE), .T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF2->F2_TCUSD)), ' TipoCambioUSD="' + Alltrim(Str(SF2->F2_TCUSD)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF2->F2_TOTUSD)), ' TotalUSD="' + Alltrim(Str(SF2->F2_TOTUSD,14,2)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "")
    (POS) _aTotal[094] := cNodoCCE

    [XXX CFDIREL]
    (PREREG) !Empty(SF2->F2_RELSAT).Or. !Empty(SF2->F2_SERMAN).Or. !Empty(SF2->F2_DOCMAN)
    (PREREG) (_aTotal[001] := IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","",fGetFolRel("S")))
    (PREREG) _aTotal[001]

    [XXX FACTURA GLOBAL]
    (PRE) (_aTotal[001] := IIF(SF2->F2_GLOBAL == "1",'    <cfdi:InformacionGlobal ',""))
    (PRE) (_aTotal[001] += Iif(SF2->(ColumnPos("F2_IDCBAJA")) > 0 .and. SF2->F2_GLOBAL == "1" ,' Periodicidad="' + SF2->F2_IDCBAJA  + '"',""))
    (PRE) (_aTotal[001] += Iif(SF2->(ColumnPos("F2_MODCONS")) > 0 .and. SF2->F2_GLOBAL == "1" ,' Meses="' + SF2->F2_MODCONS  + '"',""))
    (PRE) (_aTotal[001] += Iif(SF2->(ColumnPos("F2_PTOEMIS")) > 0 .and. SF2->F2_GLOBAL == "1" ,' Año="' + SF2->F2_PTOEMIS  + '"',""))
    (PRE) (_aTotal[001] += IIF(SF2->F2_GLOBAL == "1",'/>' ,""))
    (PRE) (_aTotal[001] := IIF(SF2->F2_GLOBAL == "1",_aTotal[001] ,""))
    (PREREG) _aTotal[001]

    [XXX EMISOR]
    (PRE) (_aTotal[001] := '    <cfdi:Emisor'  , .T.)
    (PRE) (_aTotal[001] += ' Rfc="' + CFDCarEsp(AllTrim(SM0->M0_CGC))+ '"'  , .T.)
    (PRE) (_aTotal[001] += ' Nombre="' + CFDCarEsp(_aTotal[075],.T.) + '"'  , .T.)
    (PRE) (_aTotal[001] += ' RegimenFiscal="' + CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + '"'  , .T.)
    (PRE) (_aTotal[001] += '/>'  , .T.)
    (PRE) (_aTotal[001] := _aTotal[001]  , .T.)
    (PREREG) _aTotal[001]

    [XXX RECEPTOR_CLIENTE]

    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114], .T., .F.)
    (PRE) cNodoCCE := ""

    (PREREG) AllTrim(SF2->F2_ESPECIE) <> "NDI"
    (PREREG) (SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PREREG) (SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PREREG) (_aTotal[001] := '    <cfdi:Receptor' , .T.)
    (PREREG) (_aTotal[001] += ' Rfc="' + CFDCarEsp(IIf(!_aTotal[104] .And.((Alltrim(SF2->F2_TIPODOC) == "21" .And. !lCCCE) .Or. SF2->F2_GLOBAL == "1"), "XAXX010101000", _aTotal[108])) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' Nombre="' + iif(SF2->F2_GLOBAL == "1","PUBLICO EN GENERAL",CFDCarEsp(_aTotal[109],.T.)) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' DomicilioFiscalReceptor="' + _aTotal[110] + '"' , .T.)
    (PREREG) (_aTotal[001] += Iif(AI0->(ColumnPos("AI0_REGFIS")) > 0,' RegimenFiscalReceptor="' + _aTotal[111] + '"',""), .T.)
    (PREREG) (_aTotal[001] += ' UsoCFDI="' + Alltrim(SF2->F2_USOCFDI) + '"' , .T.)
    (PREREG) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB)))) .And. !_aTotal[076], (_aTotal[001] += ' NumRegIdTrib="' + CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + '"' , .T.), "") 
    (PREREG) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(AllTrim(SF2->F2_RESIDE)))) .And. !_aTotal[076], (_aTotal[001] += ' ResidenciaFiscal="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SF2->F2_RESIDE,"YA_CCESAT")) + '"' , .T.), "")
    (PREREG) (_aTotal[001] += '/>' ,.T.)
    (PREREG) (_aTotal[001] := _aTotal[001] , .T.)
    (PREREG) _aTotal[001]

    (POS) cNodoCCE += IIf(lCCCE, '            <cce11:Emisor' , "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 
    (POS) cNodoCCE += IIf(lCCCE, '                <cce11:Domicilio' , "")        
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))), ' Colonia="' + CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CODZOSE)+ALLTRIM(SM0->M0_CEPENT),1,9,1,4))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SM0->M0_CEPENT))), ' Municipio="' + CFDCarEsp(AllTrim(SM0->M0_CODMUN)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim("MEX") + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SM0->M0_CEPENT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            </cce11:Emisor>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            <cce11:Receptor ' + IIf(_aTotal[108]=="XEXX010101000", 'NumRegIdTrib="' + CFDCarEsp(AllTrim(SF2->F2_IDTRIB)) + '"',""), "")     
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 
    (POS) cNodoCCE += IIf(lCCCE, '                <cce11:Domicilio' , "")        
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SA1->A1_END)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), ' NumeroExterior="' + AllTrim(SA1->A1_NR_END) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), ' NumeroInterior="' + AllTrim(SA1->A1_NROINT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), ' Colonia="' + CFDCarEsp(AllTrim(SA1->A1_BAIRRO)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_MUN)), ' Municipio="' + CFDCarEsp(AllTrim(SA1->A1_MUN),.T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SA1->A1_CEP) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            </cce11:Receptor>' + ( chr(13)+chr(10) ), "") 

    (POS) (cNodoCCE += IIf(lCCCE, '            <cce11:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    [SD2 CONCEPTO]
    (PRE) lCCCE    := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114] , .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) DbGoTop()

    (PREREG) (cNodoCCE += IIf(lCCCE, '                  <cce11:Mercancia' , ""),.T.)      
    (PREREG) (cNodoCCE += IIf(lCCCE , ' NoIdentificacion="' + Alltrim(SD2->D2_ITEM + SD2->D2_COD) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), ' FraccionArancelaria="' + Alltrim(SD2->D2_FRACCA) + Alltrim(SD2->D2_NICO) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD2->D2_CANADU)), ' CantidadAduana="' + Alltrim(Str(SD2->D2_CANADU)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), ' UnidadAduana="' + AllTrim(ObtColSAT("S014",AllTrim(SD2->D2_FRACCA),1,8,9,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD2->D2_VALADU)), ' ValorUnitarioAduana="' + Alltrim(Str(SD2->D2_VALADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, ' ValorDolares="' + Alltrim(Str(SD2->D2_USDADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ) , ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '                  </cce11:Mercancia>' + ( chr(13)+chr(10) ), ""),.T.)

    (POS) (cNodoCCE += IIf(lCCCE, '            </cce11:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) (cNodoCCE += IIf(lCCCE, '        </cce11:ComercioExterior>' , ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    (POS) (_aTotal[034] := fXMLFUN("CO",.F., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.)
     
    [XXX CONCEPTOS]
    (POS) FsQuery(_aTotal[097],2)

    (PREREG) (_aTotal[001] := _aTotal[034] ,.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOS]
    (PREREG) (_aTotal[002] := fXMLFUN("TI",.F.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)
    (PREREG) _aTotal[002]

    //IMPUESTOS LOCALES//
    (PRE) (_aTotal[095] := fXMLFUN("IL",.F.),.T.)

    [XXX COMPLEMENT]
    (PREREG) IIf(_aTotal[011],_aTotal[105] := LxFunaCaPo(SF2->F2_FILIAL,SF2->F2_DOC,SF2->F2_SERIE,.F.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),"")
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095] ) .Or. !Empty(_aTotal[105]) .or. _aTotal[104] , '    <cfdi:Complemento', ""), .T.)
    (PREREG) (_aTotal[001] += IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095] ) .Or. !Empty(_aTotal[105]),'>',""),.T.)
    (PREREG) _aTotal[001]
    COMPLEMENT  C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.T.,.F.,4))


    [XXX COMERCIOEX]
    (PREREG) (_aTotal[001] := _aTotal[094],.T.)
    (PREREG) _aTotal[001]

    [XXX CARTAPORTE]
    (PREREG) (_aTotal[001] := _aTotal[105],.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOLOC]
    (PREREG) (_aTotal[001] := _aTotal[095],.T.)
    (PREREG) _aTotal[001]

    [XXX LEYENDASFIS]
    (PREREG) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114], .T., .F.) .And. SF2->(FieldPos("F2_CONUNI")) > 0
    (PREREG) lCCCE
    (PREREG) (_aTotal[001] := IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF" , '        <leyendasFisc:LeyendasFiscales version="1.0" >'+ ( chr(13)+chr(10) ), ""), .T.)
    (PREREG) (_aTotal[001] += IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF" , '            <leyendasFisc:Leyenda textoLeyenda=', ""), .T.)
    (PREREG) (_aTotal[001] += IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. SF2->F2_CONUNI=="1" .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", '"IMMEX:'+ AllTrim(SA1->A1_PFISICA) +' ' + _aTotal[101] +'" />', IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. SF2->F2_CONUNI=="2" .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF",'"IMMEX:'+ AllTrim(SA1->A1_PFISICA) + ' ' + _aTotal[102] +'" />',"")), .T.)
    (PREREG) _aTotal[001]
    (PREREG) (_aTotal[001] := IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF",'        </leyendasFisc:LeyendasFiscales>', ""), .T.)
    (PREREG) _aTotal[001]


    [XXX COMPLEMENT]
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094]) .or. !EMPTY(_aTotal[095]) .or. !EMPTY(_aTotal[105]),'    </cfdi:Complemento>',""), .T.)
    (PREREG) _aTotal[001]
    COMPLEMENT  C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.F.,.T.,4))

    //[XXX CAD_ORIG]
    //(PREREG) _aTotal[033] 

    [XXX FACTURA]
    (PRE) _aTotal[095] := &(GetNewPar("MV_CFDNAF2","Lower(AllTrim(SF2->F2_ESPECIE)) + '_' + Lower(AllTrim(SF2->F2_SERIE)) + '_'  + Lower(AllTrim(SF2->F2_DOC)) + '.xml'"))
    (ARQ) _aTotal[095]
    FACTURA    C 019 0 ENCODEUTF8(XMLConv("",,,"cfdi:Comprobante",.F.,.T.,0))


    En caso de tener personalizaciones en el archivo FATEMEX.INI se debe hacer los ajustes que se enmarcan a continuación:

    Painel
    titleFATEMEX.INI

    //FATEMEX.INI V4.0 --- Modelo 2022
    [XXX POSICIONAMENTOS]
    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",SA2->(MSSeek(xFilial("SA2")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)<>"NCC",SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF1->F1_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)

    [XXX INICIALIZACION]
    (PRE) SD1->(DbSetOrder(1))
    (PRE) SB1->(DbSetOrder(1))
    (PRE) SYA->(DbSetOrder(1))
    (PRE) SC6->(DbSetOrder(1))
    (PRE) SE4->(DbSetOrder(1)) 
    (PRE) CTO->(DbSetOrder(1)) 
    (PRE) SAH->(DbSetOrder(1)) 
    (PRE) _aTotal[094] := ""
    (PRE) _aTotal[095] := ""
    (PRE) _aTotal[033] := ""
    (PRE) _aTotal[034] := ""
    (PRE) _aTotal[035] := ""
    (PRE) _aTotal[036] := 0
    (PRE) _aTotal[037] := SuperGetMV("MV_CFDIEXP",.F.,.F.)
    (PRE) _aTotal[075] := Alltrim(SM0->M0_NOMECOM)
    (PRE) _aTotal[096] := DtoS(SF1->F1_EMISSAO)
    (PRE) _aTotal[096] := Left(_aTotal[096],4) + "-" + Substr(_aTotal[096],5,2)+ "-" + Right(_aTotal[096],2)
    (PRE) _aTotal[096] += "T" + SF1->F1_HORA
    (PRE) _aTotal[097] := {"SD1",""}
    (PRE) _aTotal[098] := "|"
    (PRE) _aTotal[099] := "||"
    (PRE) _aTotal[100] := ""
    (PRE) _aTotal[101] := IIF(SuperGetMv("MV_DESCSAI",.T.,"2") == "1", .T., .F.) 
    (PRE) _aTotal[102] := IIf(SF1->(ColumnPos("F1_TPDOC")) > 0,AllTrim(SF1->F1_TPDOC),AllTrim(AI0->AI0_MPAGO))                                                                                                          
    (PRE) lCCCE := .F.
    (PRE) cNodoCCE := ""
    (PRE) _aTotal[103] := IIf(!_aTotal[037] .Or. (_aTotal[037] .And. Empty(SF1->F1_CVEPED)),"01",IIf(SF1->F1_CVEPED!="A1" .or. Alltrim(SF1->F1_TIPOPE)== "3","04","02"))
    (PRE) _aTotal[104] := IIf(_aTotal[103] == "04" .And.( Empty(SF1->F1_CERORI) .Or. Empty(SF1->F1_INCOTER) .Or. Empty(SF1->F1_SUBDIV) .Or. Empty(SF1->F1_TCUSD) .Or. Empty(SF1->F1_TOTUSD)) ,.F.,.T.)

    (PREREG) FsQuery(_aTotal[097],1,"D1_DOC='" + SF1->F1_DOC + "' AND D1_SERIE='" + SF1->F1_SERIE + "' AND D1_FORNECE='" + SF1->F1_FORNECE + "' AND D1_LOJA='" + SF1->F1_LOJA + "'","SD1->D1_DOC=SF1->F1_DOC .AND. SD1->D1_SERIE=SF1->F1_SERIE .AND. SD1->D1_FORNECE=SF1->F1_FORNECE .AND. SD1->D1_LOJA=SF1->F1_LOJA","D1_ITEM") .And. .T.

    (PRE) fImptosD(SF1->F1_DOC,SF1->F1_SERIE,SF1->F1_FORNECE,SF1->F1_LOJA, .F. , "SD1", .F., @(_aTotal[036]))

    [SD1 CADENAORIGINAL_SELLO]
    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",CTO->(MsSeek(xFilial("CTO")+Strzero(SF1->F1_MOEDA,2))) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)<>"NCC",SA2->(MSSeek(xFilial("SA2")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)<>"NCC",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)<>"NCC",CTO->(MsSeek(xFilial("CTO")+Strzero(SF1->F1_MOEDA,2))) , .T.)
    //////////////////////////////////////////////CADENA ORIGINAL//////////////////////////////////////////////
    (PRE) cCadOrig := _aTotal[099]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF1->F1_TIPOPE) .And. _aTotal[104] , .T., .F.)
    (PRE) cCadOriCCE := ""

    //Cadena Original | Complemento de Comercio Exterior
    (PREREG) IIf(lCCCE .And. !Empty(SD1->D1_ITEM + SD1->D1_COD), (cCadOriCCE += Alltrim(SD1->D1_ITEM + SD1->D1_COD) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD1->D1_FRACCA), (cCadOriCCE += Alltrim(SD1->D1_FRACCA) + Alltrim(SD1->D1_NICO) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD1->D1_CANADU)), (cCadOriCCE += Alltrim(Str(SD1->D1_CANADU)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD1->D1_FRACCA), (cCadOriCCE += AllTrim(ObtColSAT("S014",AllTrim(SD1->D1_FRACCA),1,8,9,2))  + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD1->D1_VALADU)), (cCadOriCCE += Alltrim(Str(SD1->D1_VALADU,14,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD1->D1_USDADU)), (cCadOriCCE += Alltrim(Str(SD1->D1_USDADU,14,2)) + _aTotal[098],.T.), ("",,.T.))

    //Cadena Original | Complemento de Comercio Exterior
    (POS) IIf(lCCCE, cCadOrig += "1.1" + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_TRASLA), cCadOrig += Alltrim(SF1->F1_TRASLA) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_TIPOPE), cCadOrig += IIF(Alltrim(SF1->F1_TIPOPE)== "3","2",Alltrim(SF1->F1_TIPOPE)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_CVEPED), cCadOrig += Alltrim(SF1->F1_CVEPED) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_CERORI), cCadOrig += Alltrim(SF1->F1_CERORI) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_NUMCER), cCadOrig += Alltrim(SF1->F1_NUMCER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_EXPCONF), cCadOrig += Alltrim(SF1->F1_EXPCONF) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_INCOTER), cCadOrig += Alltrim(SF1->F1_INCOTER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_SUBDIV), cCadOrig += Alltrim(SF1->F1_SUBDIV) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. SF1->(ColumnPos("F1_OBSCE")) > 0 .And. !Empty(SF1->F1_OBSCE), cCadOrig += CFDCarEsp(Alltrim(SF1->F1_OBSCE),.F.) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF1->F1_TCUSD)), cCadOrig += Alltrim(Str(SF1->F1_TCUSD)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF1->F1_TOTUSD)), cCadOrig += Alltrim(Str(SF1->F1_TOTUSD,14,2)) + _aTotal[098], "")

    ///////////DATOS DE LA FACTURA/////////////////
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF1->F1_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    //Version
    (PRE) cCadOrig += "4.0" + _aTotal[098]
    //Serie
    (PRE) cCadOrig += Alltrim(SF1->F1_SERIE) + _aTotal[098]
    //Folio
    (PRE) cCadOrig += Alltrim(SF1->F1_DOC) + _aTotal[098]
    //Fecha
    (PRE) cCadOrig += Alltrim(_aTotal[096]) + _aTotal[098]
    //FormaPago
    (PRE) cCadOrig += IIf(Empty(_aTotal[102]),"99",_aTotal[102]) + _aTotal[098]
    //NoCertificado
    (PRE) cCadOrig += Alltrim(SF1->F1_CERTFOL) + _aTotal[098]
    //CondicionesDePago
    (PRE) cCadOrig += CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + _aTotal[098]
    //Subtotal
    (PRE) cCadOrig += Alltrim(STR((SF1->F1_VALMERC + IIF(_aTotal[101], SF1->F1_DESCONT, 0 )) - _aTotal[036],14,2)) + _aTotal[098]
    //Descuento
    (PRE) cCadOrig += IIf(SF1->F1_DESCONT==0, "", Alltrim(STR(SF1->F1_DESCONT,14,2)) + _aTotal[098])
    //Moneda
    (PRE) cCadOrig += Alltrim(CTO->CTO_MOESAT) + _aTotal[098]
    //TipoCambio
    (PRE) cCadOrig += IIf(!(Alltrim(CTO->CTO_MOESAT) $ "MXN|XXX"), Alltrim(STR(SF1->F1_TXMOEDA,14,2)), "1") + _aTotal[098]
    //Total
    (PRE) cCadOrig += Alltrim(STR(iif(GetSx3Cache("F1_VALBRUT","X3_DECIMAL")<= 2,SF1->F1_VALBRUT,Round(SF1->F1_VALBRUT,2)),14,2)) + _aTotal[098]
    //TipoDeComprobante
    (PRE) cCadOrig += IIf(Alltrim(SF1->F1_ESPECIE) == "NF", "I", "E") + _aTotal[098]
    //Exportacion
    (PRE) cCadOrig += IIf(!Empty(_aTotal[103]) .And. Alltrim(SF1->F1_ESPECIE) == "NCC",_aTotal[103],"01") + _aTotal[098]
    //MetodoPago
    (PRE) cCadOrig += IIf(Alltrim(SF1->F1_TIPODOC) == "21", "", Alltrim(SE4->E4_MPAGSAT) + _aTotal[098] )
    //LugarExpedicion
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + _aTotal[098]
    //Confirmacion
    //(PRE) cCadOrig += "ClavePAC" + _aTotal[098]

    //////////////////////CFDI Relacionados//////////////////////////
    (PREREG) !Empty(SF1->F1_RELSAT).Or. !Empty(SF1->F1_SERMAN).Or. !Empty(SF1->F1_DOCMAN)
    (PRE) fGetFolRel("E",.T.)

    ///////////DATOS DEL EMISOR///////////////////////
    //Rfc
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CGC),.F.) + _aTotal[098]
    //Nombre
    (PRE) cCadOrig += CFDCarEsp(_aTotal[075],.F.) + _aTotal[098]
    //RegimenFiscal
    (PRE) cCadOrig += CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + _aTotal[098]

    //////////////////////DATOS DEL RECEPTOR//////////////////////////
    (PRE) AllTrim(SF1->F1_ESPECIE) == "NCC"
    (PRE) SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA))
    (PRE) SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS))
    //Rfc
    (PRE) (cCadOrig += CFDCarEsp(AllTrim(SA1->A1_CGC), .F.) + _aTotal[098], .T.)
    //Nombre
    (PRE) (cCadOrig += CFDCarEsp(Alltrim(SA1->A1_NOME),.F.) + _aTotal[098], .T.)
    //DomicilioFiscalReceptor
    (PRE) (cCadOrig += CFDCarEsp(Alltrim(SA1->A1_CEP),.F.) + _aTotal[098], .T.)
    //ResidenciaFiscal
    (PRE) IIf(lCCCE,(cCadOrig += Alltrim(SYA->YA_CCESAT) + _aTotal[098], .T.),"")
    //NumRegIdTrib
    (PRE) IIf(lCCCE,(cCadOrig += Alltrim(AI0->AI0_IDFIS) + _aTotal[098], .T.),"")
    //RegimenFiscalReceptor
    (PRE) (cCadOrig += IIf(AI0->(ColumnPos("AI0_REGFIS")) > 0,CFDCarEsp(Alltrim(AI0->AI0_REGFIS),.F.) + _aTotal[098],""), .T.)
    //UsoCFDI
    (PRE) (cCadOrig += Alltrim(SF1->F1_USOCFDI) + _aTotal[098], .T.)

    (PRE) (cCadOrig += fXMLFUN("CO",.T.,  .F. ,.F.))
    (PRE) (cCadOrig += fXMLFUN("TI",.T.,  .F. ,.T.))
    (PRE) (cCadOrig += fXMLFUN("IL",.T.,  .F. ,.T.))

    //Cadena Original | Complemento de Comercio Exterior

    //Emisor
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_BAIRENT), cCadOrig += ObtColSAT("S015",AllTrim(SM0->M0_CEPENT),5,5,1,4) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CODMUN), cCadOrig += AllTrim(SM0->M0_CODMUN) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += "MEX" + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(SM0->M0_CEPENT) + _aTotal[098], "")

    //Receptor Domicilio
    (POS) IIf(lCCCE .And. AllTrim(SA1->A1_CGC) == "XEXX010101000", cCadOrig += CFDCarEsp(AllTrim(AllTrim(SF1->F1_IDTRIB))) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(AllTrim(SA1->A1_END)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), cCadOrig += AllTrim(SA1->A1_NR_END) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), cCadOrig += AllTrim(SA1->A1_NROINT) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), cCadOrig +=  CFDCarEsp(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))) + _aTotal[098],"")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_MUN))), cCadOrig +=  CFDCarEsp(AllTrim(SA1->A1_MUN),.F.) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + _aTotal[098],"")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_PAIS)), cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_CEP)), cCadOrig += AllTrim(SA1->A1_CEP) + _aTotal[098], "")

    (POS) cCadOrig += IIf(!Empty(cCadOriCCE), cCadOriCCE, "")

    (POS) cCadOrig += _aTotal[098]
    (POS) _aTotal[033] := cCadOrig

    //SELLO
    (POS) _aTotal[100] := EVPDigest(cCadOrig,5)
    (POS) _aTotal[100] := PrivSignRSA(&(SuperGetMv("MV_CFDDIRS",,""))+SuperGetMv("MV_CFDARQS",,""),_aTotal[100],6,"assinatura")
    (POS) _aTotal[100] := ENCODE64(_aTotal[100])

    [XXX CABECERA]
    Linha1     C 041 0 Chr(239) + Chr(187) + Chr(191) + '<?xml version="1.0" encoding="UTF-8"?>'

    [XXX FACTURA]
    //Certificado del SAT incluido para pruebas 
    (PRE) cCert := "MIIFyDCCA7CgAwIBAgIUMzAwMDEwMDAwMDA0MDAwMDI0NDMwDQYJKoZIhvcNAQEL"
    (PRE) cCert += "BQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFE"
    (PRE) cCert += "TUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9y"
    (PRE) cCert += "aXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0w"
    (PRE) cCert += "GwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWRpejEOMAwGA1UEEQwFMDYzNzAxCzAJ"
    (PRE) cCert += "BgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhD"
    (PRE) cCert += "T1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3Bv"
    (PRE) cCert += "bnNhYmxlOiBBQ0RNQS1TQVQwHhcNMTkwNjE3MjA0MDUxWhcNMjMwNjE3MjA0MDUx"
    (PRE) cCert += "WjCB7zEqMCgGA1UEAxMhWEVOT04gSU5EVVNUUklBTCBBUlRJQ0xFUyBTIERFIENW"
    (PRE) cCert += "MSowKAYDVQQpEyFYRU5PTiBJTkRVU1RSSUFMIEFSVElDTEVTIFMgREUgQ1YxKjAo"
    (PRE) cCert += "BgNVBAoTIVhFTk9OIElORFVTVFJJQUwgQVJUSUNMRVMgUyBERSBDVjElMCMGA1UE"
    (PRE) cCert += "LRMcWElBMTkwMTI4SjYxIC8gS0FITzY0MTEwMUIzOTEeMBwGA1UEBRMVIC8gS0FI"
    (PRE) cCert += "TzY0MTEwMUhOVExLUzA2MSIwIAYDVQQLExlYZW5vbiBJbmR1c3RyaWFsIEFydGlj"
    (PRE) cCert += "bGVzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiJQ5YcSgjwsGf29+"
    (PRE) cCert += "3go7VGdtMZCcH9wUpn46ZMAlFwUojnCPTvwJ3+cSwjqJnw8ahr3DuRwekvGR4BJA"
    (PRE) cCert += "b5b9Xi8kyoiWtwcGOSWxO38Bp9J1e/BO9HMbQBPAtLDuG47oqnH8zWLOeaoYRJDp"
    (PRE) cCert += "ARw4RX1ko2+9tbj0ntBtM7Vk1E8EWiA/h2Meq0LIv1+ySGTUrEW46FM01J5pzELv"
    (PRE) cCert += "5XupBghuJxR5DG9fiOW7u3dR5s3tZoVLwA1KdjJtY0mmnfCwxg6i5AqhvY+FAI5D"
    (PRE) cCert += "6CF6/lHA8PWg63WasvrhuIv70xCLjgPT/j00ZcPrLvBf1DefGVic980Ch/SDvC+M"
    (PRE) cCert += "dJ1F5wIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG"
    (PRE) cCert += "9w0BAQsFAAOCAgEACjfTPoKY2N5MxjmAMltd5XZCV1vgAwEtrIRYTodhE8R0Tp1Q"
    (PRE) cCert += "anAXb0luPyBv5hIXWK4VqAI4fcTtP+n7kkrwfha6ErkPWFNJWJm8ZsMmby/3WgVo"
    (PRE) cCert += "JkOFyRYQqr5Il3N6wMa5kiDBtDRbqB3iEXmvtrvjWSHyxAER+zo3jWGFlhBZ0nQN"
    (PRE) cCert += "Rtjx8sPFihVc5TUH682HJiU4oWvT63Dnra8ncqiW/uCuY86crnUq0fW7Lw/3+PY5"
    (PRE) cCert += "xXjNxR/Hh3sUPITfJrGaLWurD1J9npr9yGAJ6t9zrhhZnepIC0DUMc5+j4pg1DrO"
    (PRE) cCert += "32jzwUOLQqErDizh84NoJCWwbg+US8wi3zD0ZKiDv7XsTNWAW2Ap2JkzykKHjFTZ"
    (PRE) cCert += "iEm3uZOkJNfcu3o+kefr5HfXFT+iN9K5FUEhaQwgUeZBRJ8V5F6gmhz3d6ixVbiZ"
    (PRE) cCert += "oFNhYR8e2k8gF9gGrVMrEbJGQrl+6+ZYQLFiauXeG7fu1svk19PuyredRJGnseJq"
    (PRE) cCert += "yV4RzcRGhJA+cLnmpdDOTEhignnvnhEuY6HVRYYXhOTyeeluET7KRCxbJGqO7TdW"
    (PRE) cCert += "gjrHL3HRbNE4NY5GAdOZuLaWxElG5ZVCHqtG0Nh7UQAhcz+EKyZBAewv5XuH0Oom"
    (PRE) cCert += "ZXw6mM2mY2soL6z1224NusM8/BbJcYTQUlAEKblEChhGK1XlxiVOU2nc9KE="

    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF1->F1_TIPOPE) .And. _aTotal[104], .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF1->F1_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) _aTotal[001] := '<cfdi:Comprobante'
    (PRE) _aTotal[001] += ' xmlns:cfdi="http://www.sat.gob.mx/cfd/4"'
    (PRE) _aTotal[001] += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
    (PRE) _aTotal[001] += ' xmlns:implocal="http://www.sat.gob.mx/implocal"'
    (PRE) _aTotal[001] += ' xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd '
    (PRE) _aTotal[001] += IIF(lCCCE,'http://www.sat.gob.mx/ComercioExterior11 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd "','"')
    (PRE) _aTotal[001] += IIf(lCCCE, ' xmlns:cce11="http://www.sat.gob.mx/ComercioExterior11"' , "")
    (PRE) _aTotal[001] += ' Version="4.0"'
    (PRE) _aTotal[001] += ' Serie="' + Alltrim(SF1->F1_SERIE) + '"'
    (PRE) _aTotal[001] += ' Folio="' + Alltrim(SF1->F1_DOC) + '"'
    (PRE) _aTotal[001] += ' Fecha="' + Alltrim(_aTotal[096]) + '"'
    (PRE) _aTotal[001] += ' Sello="' + Alltrim(_aTotal[100]) + '"'
    (PRE) _aTotal[001] += ' FormaPago="' + Iif(Empty(_aTotal[102]),"99",_aTotal[102]) + '"'
    (PRE) _aTotal[001] += ' NoCertificado="' + Alltrim(SF1->F1_CERTFOL) + '"'
    (PRE) _aTotal[001] += ' Certificado="' + cCert + '"'
    (PRE) _aTotal[001] += ' CondicionesDePago="' + CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + '"'
    (PRE) _aTotal[001] += ' SubTotal="' + Alltrim(STR((SF1->F1_VALMERC + IIF(_aTotal[101], SF1->F1_DESCONT, 0 )) - _aTotal[036],14,2)) + '"'
    (PRE) _aTotal[001] += IIf(SF1->F1_DESCONT==0, "", ' Descuento="' + Alltrim(STR(SF1->F1_DESCONT,14,2)) + '"')
    (PRE) _aTotal[001] += ' Moneda="' + Alltrim(CTO->CTO_MOESAT) + '"'
    (PRE) _aTotal[001] += ' TipoCambio="' + IIf(Alltrim(CTO->CTO_MOESAT) <> "MXN", Alltrim(STR(SF1->F1_TXMOEDA,14,2)), "1") + '"'
    (PRE) _aTotal[001] += ' Total="' + Alltrim(STR(iif(GetSx3Cache("F1_VALBRUT","X3_DECIMAL")<= 2,SF1->F1_VALBRUT,Round(SF1->F1_VALBRUT,2)),14,2)) + '"'
    (PRE) _aTotal[001] += ' TipoDeComprobante="' + IIf(Alltrim(SF1->F1_ESPECIE) == "NF", "I", "E") + '"'
    (PRE) _aTotal[001] += ' Exportacion="'+ IIf(!Empty(_aTotal[103]) .And. Alltrim(SF1->F1_ESPECIE) == "NCC",_aTotal[103],"01") +'"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF1->F1_TIPODOC) == "21", "", ' MetodoPago="' + Alltrim(SE4->E4_MPAGSAT) + '"' )
    (PRE) _aTotal[001] += ' LugarExpedicion="' + CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + '"'
    (PRE) _aTotal[001] += '>'
    (PREREG) _aTotal[001]

    (POS) cNodoCCE := IIf(lCCCE, '        <cce11:ComercioExterior' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' Version="1.1"' , "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_TRASLA), ' MotivoTraslado="' + Alltrim(SF1->F1_TRASLA) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_TIPOPE), ' TipoOperacion="' + IIF(Alltrim(SF1->F1_TIPOPE)== "3","2",Alltrim(SF1->F1_TIPOPE)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_CVEPED), ' ClaveDePedimento="' + Alltrim(SF1->F1_CVEPED) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_CERORI), ' CertificadoOrigen="' + Alltrim(SF1->F1_CERORI) +'"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_NUMCER), ' NumCertificadoOrigen="' + Alltrim(SF1->F1_NUMCER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_EXPCONF), ' NumeroExportadorConfiable="' + Alltrim(SF1->F1_EXPCONF) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_INCOTER), ' Incoterm="' + Alltrim(SF1->F1_INCOTER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_SUBDIV), ' Subdivision="' + Alltrim(SF1->F1_SUBDIV) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. SF1->(ColumnPos("F1_OBSCE")) > 0 .And. !Empty(SF1->F1_OBSCE), ' Observaciones="' + CFDCarEsp(Alltrim(SF1->F1_OBSCE), .F.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF1->F1_TCUSD)), ' TipoCambioUSD="' + Alltrim(Str(SF1->F1_TCUSD)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF1->F1_TOTUSD)), ' TotalUSD="' + Alltrim(Str(SF1->F1_TOTUSD,14,2)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "")
    (POS) _aTotal[094] := cNodoCCE

    [XXX CFDIREL]
    (PREREG) !Empty(SF1->F1_RELSAT).Or. !Empty(SF1->F1_SERMAN).Or. !Empty(SF1->F1_DOCMAN)
    (PREREG) (_aTotal[001] := fGetFolRel("E"),.T.)
    (PREREG) _aTotal[001]

    [XXX EMISOR]
    (PRE) _aTotal[001] := '    <cfdi:Emisor'
    (PRE) _aTotal[001] += ' Rfc="' + CFDCarEsp(AllTrim(SM0->M0_CGC)) + '"'
    (PRE) _aTotal[001] += ' Nombre="' + CFDCarEsp(_aTotal[075],.T.) + '"'
    (PRE) _aTotal[001] += ' RegimenFiscal="' + CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + '"'
    (PRE) _aTotal[001] += '/>'
    (PREREG) _aTotal[001]

    [XXX RECEPTOR_CLIENTE]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF1->F1_TIPOPE) .And. _aTotal[104], .T., .F.)
    (PRE) cNodoCCE := ""

    (PREREG) AllTrim(SF1->F1_ESPECIE) == "NCC"
    (PREREG) (SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PREREG) (SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PREREG) (_aTotal[001] := '    <cfdi:Receptor' , .T.)
    (PREREG) (_aTotal[001] += ' Rfc="' + CFDCarEsp(AllTrim(SA1->A1_CGC)) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' Nombre="' + CFDCarEsp(Alltrim(SA1->A1_NOME),.T.) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' DomicilioFiscalReceptor="' + Alltrim(SA1->A1_CEP) + '"' , .T.)
    (PREREG) (_aTotal[001] += Iif(AI0->(ColumnPos("AI0_REGFIS")) > 0,' RegimenFiscalReceptor="' + Alltrim(AI0->AI0_REGFIS) + '"',""), .T.)
    (PREREG) IIf(lCCCE,(_aTotal[001] += ' ResidenciaFiscal="' + Alltrim(SYA->YA_CCESAT) + '"' , .T.),"")
    (PREREG) IIf(lCCCE,(_aTotal[001] += ' NumRegIdTrib="' + Alltrim(AI0->AI0_IDFIS) + '"' , .T.),"")
    (PREREG) (_aTotal[001] += ' UsoCFDI="' + Alltrim(SF1->F1_USOCFDI) + '"' , .T.)
    (PREREG) (_aTotal[001] += '/>' ,.T.)
    (PREREG) _aTotal[001]

    //Emisor
    (POS) cNodoCCE += IIf(lCCCE, '            <cce11:Emisor' , "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 
    (POS) cNodoCCE += IIf(lCCCE, '                <cce11:Domicilio' , "")        
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))), ' Colonia="' + CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CEPENT),5,5,1,4))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SM0->M0_CEPENT))), ' Municipio="' + CFDCarEsp(AllTrim(SM0->M0_CODMUN)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim("MEX") + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SM0->M0_CEPENT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            </cce11:Emisor>' + ( chr(13)+chr(10) ), "")

    //Receptor
    (POS) cNodoCCE += IIf(lCCCE, '            <cce11:Receptor ' + IIf(AllTrim(SA1->A1_CGC)=="XEXX010101000", 'NumRegIdTrib="' + CFDCarEsp(AllTrim(SF1->F1_IDTRIB)) + '"',""), "")  
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 

    //Domicilio Receptor
    (POS) cNodoCCE += IIf(lCCCE, '                <cce11:Domicilio' , "")        
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SA1->A1_END)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), ' NumeroExterior="' + AllTrim(SA1->A1_NR_END) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), ' NumeroInterior="' + AllTrim(SA1->A1_NROINT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), ' Colonia="' + CFDCarEsp(AllTrim(SA1->A1_BAIRRO)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_MUN)), ' Municipio="' + CFDCarEsp(AllTrim(SA1->A1_MUN),.T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SA1->A1_CEP) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            </cce11:Receptor>' + ( chr(13)+chr(10) ), "") 

    (POS) (cNodoCCE += IIf(lCCCE, '            <cce11:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    [SD1 CONCEPTO]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF1->F1_TIPOPE) .And. _aTotal[104], .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) DbGoTop()
     
    (PREREG) (cNodoCCE += IIf(lCCCE, '                  <cce11:Mercancia' , ""),.T.)      
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD1->D1_ITEM + SD1->D1_COD), ' NoIdentificacion="' + Alltrim(SD1->D1_ITEM + SD1->D1_COD) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD1->D1_FRACCA), ' FraccionArancelaria="' + Alltrim(SD1->D1_FRACCA) + Alltrim(SD1->D1_NICO) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD1->D1_CANADU)), ' CantidadAduana="' + Alltrim(Str(SD1->D1_CANADU)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD1->D1_FRACCA), ' UnidadAduana="' + AllTrim(ObtColSAT("S014",AllTrim(SD1->D1_FRACCA),1,8,9,2))  + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD1->D1_VALADU)), ' ValorUnitarioAduana="' + Alltrim(Str(SD1->D1_VALADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD1->D1_USDADU)), ' ValorDolares="' + Alltrim(Str(SD1->D1_USDADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ) , ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '                  </cce11:Mercancia>' + ( chr(13)+chr(10) ), ""),.T.)

    (POS) (cNodoCCE += IIf(lCCCE, '            </cce11:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) (cNodoCCE += IIf(lCCCE, '           </cce11:ComercioExterior>'  , ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    (POS) (_aTotal[034] := fXMLFUN("CO",.F.,  .F. ,.F.))
     
    [XXX CONCEPTOS]
    (POS) FsQuery(_aTotal[097],2)
    (PREREG) (_aTotal[001] := _aTotal[034],.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOS]
    (PREREG) (_aTotal[002] := fXMLFUN("TI",.F., .F. ,.T.))
    (PREREG) _aTotal[002]

    //IMPUESTOS LOCALES//
    (PRE) (_aTotal[095] := fXMLFUN("IL",.F.),.T.)

    [XXX COMPLEMENT]
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095]), '    <cfdi:Complemento', ""), .T.)
    (PREREG) (_aTotal[001] += IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095]),'>',""),.T.)
    (PREREG) _aTotal[001]
    COMPLEMENT  C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.T.,.F.,4))

    [XXX COMERCIOEX]
    (PREREG) (_aTotal[001] := _aTotal[094],.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOLOC]
    (PREREG) (_aTotal[001] := _aTotal[095],.T.)
    (PREREG) _aTotal[001]

    [XXX COMPLEMENT]
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094]) .or. !EMPTY(_aTotal[095]) ,'    </cfdi:Complemento>',""), .T.)
    (PREREG) _aTotal[001]
    COMPLEMENT  C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.F.,.T.,4))

    //[XXX CAD_ORIG]
    //(PREREG) _aTotal[033]

    [XXX FACTURA]
    (PRE) _aTotal[095] := &(GetNewPar("MV_CFDNAF1","Lower(AllTrim(SF1->F1_ESPECIE)) + '_' + Lower(AllTrim(SF1->F1_SERIE)) + '_'  + Lower(AllTrim(SF1->F1_DOC)) + '.xml'"))
    (ARQ) _aTotal[095]
    FACTURA    C 019 0 ENCODEUTF8(XMLConv("",,,"cfdi:Comprobante",.F.,.T.,0))



    Ajuste al diccionario de Datos:

    Se modifican los campos de la tabla SF1 - Encabezado de Doc de Entrada

    CampoF1_TIPOPE
    TituloTipo Opera  
    Opciones1=Exportación de servicios;2=Exportación;3=Exportación sin enajenación                                                          
    Val SistemaVazio() .Or. (Pertence('123') .And. ValTipoOpe(1))                                                                              


    Se modifican los campos de la tabla SF2 - Encabezado de Doc de Salida

    CampoF2_TIPOPE
    TituloTipo Opera  
    Opciones1=Exportación de servicios;2=Exportación;3=Exportación sin enajenación                                                          
    Val SistemaVazio() .Or. (Pertence('123') .And. ValTipoOpe(2))                                                                      

    5.9 Activación de generación de XML de Nota de Crédito mediante rutina FATEMEX.PRW



    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT -  Facturación
    Función:

    Rutina

    Nombre Técnico

    Fecha

    FATEMEX.PRWGeneración de XML para Documentos de Entrada15/06/2023
    LOCXFUNA.PRXFunciones Genéricas para Notas Fiscales12/06/2023
    Rutina involucradaNombre TécnicoFecha
    FATXFUMI.PRWFunciones genéricas para Facturación - Mercado Internacional24/05/2023
    País:México
    Ticket:No aplica
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-19160


    Se solicita activar la funcionalidad para que la generación del Comprobante Fiscal Digital por Internet (CFDI) para Nota de Crédito, sea realizada a través del uso de la rutina FATEMEX.PRW, para evitar el uso del archivo FATEMEX.INI.

    SOLUCION

    Se crea la rutina de Generación de XML para Documentos de Entrada (FATEMEX), para la generación del Comprobante Fiscal Digital por Internet (CFDI) de documentos de tipo Entrada, la cual genera los siguientes nodos:

        • cfdi:Conceptos
        • cfdi:Impuestos
        • cfdi:Retenciones

    En la rutina de Funciones genéricas para Notas Fiscales (LOCXFUNA), se habilita la funcionalidad de la generación del archivo XML por medio de la rutina FATEMEX.PRW cuando es una Nota de Crédito y se encuentra configurado el parámetro MV_FEXML = S.

    Para activar la funcionalidad de generación del XML  a través de la rutina FATEMEX.PRW se debe crear el parámetro MV_FEXML en la tabla SX6 - Parámetros y configurarse con el valor S:

    Campo

    Valor

    Nombre de Var.MV_FEXML
    Tipo1 - Caracteres
    Cont. Esp
    Descripción

    Permite activar la funcionalidad para generar XML a través de rutina, evitando el uso de archivos .INI. S - Realizara la creación de archivos XML y no hará uso de los actuales archivo INI.


    Consideraciones importantes para el timbrado a través del uso de la rutina FATEMEX.PRW:

    1. Configurar el parámetro MV_FEXML.
    2. Configurar el parámetro MV_CFDDIRS con la ruta donde se encuentran las llaves y certificados.
    3. Configurar el parámetro MV_CFDI_CP con el nombre y extensión del Archivo de la clave privada (.pem).
    4. Configurar los parámetros MV_IVATRAS y MV_RETIVAM con los códigos de Impuestos y Retenciones.
    5. Ingresar al módulo Libros Fiscales (SIGAFIS), ir al menú Actualizaciones | Archivos | Contr. Formularios (MATA992)
      • Configurar los datos para la Serie de la Factura informando los campos No. Inicial, No. Final, Fch Validez y Certificado
    6. En la ruta configurada en el parámetro MV_CFDDIRS debe existir el archivo que se configuró en el parámetro MV_CFDI_CP, ya que con este archivo es generado el atributo Certificado en el XML del CFDI.


    5.10 Activación de nodo de Destinatarios en complemento de Comercio Exterior.


    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación
    Función:

    Rutinas

    Nombre Técnico

    Fecha

    MATA489Registro de Destinatarios del Cliente25/07/2023
    FATXFUMIFunciones genéricas para Facturación - Mercado Internacional24/07/2023
    LOCXMEXFunciones de Genéricas de Documentos Fiscales para el país México24/07/2023
    MATN030Funciones Complementarias de Registro de Clientes24/07/2023
    CRMA980MEXCatálogo de Clientes Localizado para México17/07/2023
    FATSMEX.INIGeneración de XML de Documentos de Salida21/07/2023
    OUTPUTFIELDSMEXEstructura de Campos de Documentos de Salida17/07/2023
    País:México (Pacote: 012477)
    Ticket:

    17141182

    Requisito/Story/Issue (informe el requisito vinculado):DMINA-19736


    Se solicita habilitar para el CFDI de las Facturas de Venta (NF) con Complemento de Comercio Exterior, el nodo cce11:Destinatario, ya que de acuerdo a lo indicado por el SAT, el nodo Destinatario sirve para expresar los datos del destinatario de la mercancía cuando este sea distinto del Receptor del comprobante, o bien cuando el domicilio se trate de alguna sucursal. Por lo tanto en los casos que el envío sea a una dirección diferente a la de la empresa deberá informase en este nodo.

    Sustento Legal: http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/GuiaComercioExterior311221.pdf (Pág. 46).


    En la rutina de Funciones Complementarias de Registro de Clientes (MATN030):

    En la función que permite la Actualización de los Clientes (A30Altera), se activa el llamado a la función FATXMI030() para permitir agregar Otras acciones para Mercado internacional.

    Se creó la rutina Registro de Destinatarios del Cliente (MATA489), para permitir relacionar uno o varios Destinatarios al Cliente, utilizando la tabla AIT.

    En la rutina de Funciones genéricas para Facturación - Mercado Internacional (FAXFUMI):

    Se creó la Función para agregar acciones en modificación de clientes - Mercado Internacional (FATXMI030) para permitir agregar Otras acciones para Mercado internacional.

    Se creó la Función que genera el nodo cce11:Destinatario en el XML y Cadena Original en el Complemento de Comercio exterior (LxCEDest), el nodo solo es generado si el campo Destinos (F2_ACOPLA) tiene registros, generado el nodo con los siguientes atributos:

    Atributo

    Campo

    Nodo

    NombreAIT_TIPO\cfdi:Complemento\cce11:Destinatario
    NumRegIdTribAIT_CODTRI\cfdi:Complemento\cce11:Destinatario
    CalleAIT_REG\cfdi:Complemento\cce11:Destinatario\cce11:Domicilio
    NumeroExteriorAIT_NUMEXT\cfdi:Complemento\cce11:Destinatario\cce11:Domicilio
    NumeroInteriorAIT_NUMINT\cfdi:Complemento\cce11:Destinatario\cce11:Domicilio
    ColoniaAIT_COLON\cfdi:Complemento\cce11:Destinatario\cce11:Domicilio
    LocalidadAIT_LOCALI\cfdi:Complemento\cce11:Destinatario\cce11:Domicilio
    MunicipioAIT_MUNICI\cfdi:Complemento\cce11:Destinatario\cce11:Domicilio
    EstadoAIT_ESTADO\cfdi:Complemento\cce11:Destinatario\cce11:Domicilio
    PaísAIT_PAIS\cfdi:Complemento\cce11:Destinatario\cce11:Domicilio
    CodigoPostalAIT_CODPOS\cfdi:Complemento\cce11:Destinatario\cce11:Domicilio


    En la rutina de Funciones de Genéricas de Documentos Fiscales para el país México (LOCXMEX):

    Se activa el campo Destinos (F2_ACOPLA), para que sea visualizado para las Facturas de Venta de tipo Ingreso (Normal) y Traslado.

    Se creó la Función que despliega los Destinatarios relacionados al Cliente en la tabla AIT (LxMexDest), para que se seleccionen y que sean informados los Código de ítem (AIT_CODRES) en el campo Destinos (F2_ACOPLA)

    Se creó la Función que valida valor de Destinos en el campo Destinos (F2_ACOPLA) (LxVldDest), para realizar la siguientes validaciones:

    • Si el tipo de Documento es 21 - Factura de Tipo Traslado, si se selecciona más de un destino se visualiza el mensaje: "Para Facturas de Venta de tipo Traslado, no se debe seleccionar más de un Destinatario.".
    • Si el tipo de Documento es 01 - Factura de Tipo Normal, si se seleccionan más de diez destinos se visualiza el mensaje: "Para Facturas de Venta de tipo Normal, no se deben seleccionar más de diez Destinatarios.".


    Informações
    titleIMPORTANTE

    El campo Destinos (F2_ACOPLA), solo se visualizará para los Documentos de Factura de Venta de tipo Normal y Traslado.



    Diccionario de Datos 


    SX2 -Tabla

    ClaveAIT
    NombreDestinatarios
    ModoC - Compartido


    SIX- Índice

    ClaveAIT_FILIAL+AIT_CODCLI+AIT_LOJA+AIT_CODRES                                                                                                                       
    DescripciónCód. Cliente + Tienda + Item                                          


    SX3 - Campos

    CampoAIT_FILIAL
    TipoC - Caracter
    Tamaño8
    Formato@!
    TítuloSucursal
    DescripciónSucursal
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo


    CampoAIT_CODCLI
    TipoC - Caracter
    Tamaño6
    Formato@!
    TítuloCód. Cliente
    DescripciónCódigo Cliente
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpCódigo que individualiza a cada uno de los clientes de la empresa. Se complementa con el código de la tienda.


    CampoAIT_LOJA 
    TipoC - Caracter
    Tamaño2
    Formato@!
    TítuloTienda
    DescripciónCódigo de la Tienda
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpCódigo de la Tienda del cliente al que se le indicarán los destinatarios



    CampoAIT_CODRES
    TipoC - Caracter
    Tamaño2
    Formato@!
    TítuloItem
    DescripciónNúmero de Item
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpNúmero de ítem del destinatario


    CampoAIT_CODTRI
    TipoC - Caracter
    Tamaño40
    Formato@!
    TítuloNúm. ID Trib
    DescripciónNúmero de Item
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpNúmero de identificación o registro fiscal, del país de residencia para efectos fiscales del destinatario de la mercancía exportada y puede conformarse desde 6 hasta 40 caracteres numéricos.


    CampoAIT_TIPO  
    TipoC - Caracter
    Tamaño50
    Formato@!
    TítuloNombre
    DescripciónNombre Destinatario
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpNombre completo, denominación o razón social del destinatario de la mercancía exportada.


    CampoAIT_REG   
    TipoC - Caracter
    Tamaño40
    Formato@!
    TítuloCalle
    DescripciónCalle Destinatario
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpCalle en que está ubicado el domicilio del destinatario de la mercancía.


    CampoAIT_NUMEXT
    TipoC - Caracter
    Tamaño5
    Formato@!
    TítuloNúm. Ext. 
    DescripciónNúmero Exterior
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpNúmero exterior en donde se ubica el domicilio del destinatario de la mercancía.


    CampoAIT_NUMINT
    TipoC - Caracter
    Tamaño5
    Formato@!
    TítuloNúm. Int.   
    DescripciónNúmero Interior          
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpNúmero interior en donde se ubica el domicilio del destinatario de la mercancía.


    CampoAIT_COLON
    TipoC - Caracter
    Tamaño50
    Formato@!
    TítuloColonia
    DescripciónColonia Destinatario
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpNombre de la colonia o dato análogo en donde se ubica el domicilio del destinatario de la mercancía.


    CampoAIT_LOCALI
    TipoC - Caracter
    Tamaño50
    Formato@!
    TítuloLocalidad
    DescripciónLocalidad Destinatario
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpNombre de la ciudad, población, distrito u otro análogo en donde se ubica el domicilio del destinatario de la mercancía.


    CampoAIT_REF   
    TipoC - Caracter
    Tamaño30
    Formato@!
    TítuloReferencia
    DescripciónReferencia
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpReferencia geográfica de la dirección del destinatario, donde se realizará la entrega. Por ejemplo, las coordenadas GPS.


    CampoAIT_MUNICI
    TipoC - Caracter
    Tamaño50
    Formato@!
    TítuloMunicipio
    DescripciónMunicipio Destinario
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpNombre del municipio, delegación, condado u otro análogo en donde se encuentra ubicado el destinatario de la mercancía.
    CampoAIT_ESTADO
    TipoC - Caracter
    Tamaño3
    Formato@!
    TítuloEstado
    DescripciónEstado Destinario
    Nivel1
    ConsultaMEX025
    Val. SistemaVazio() .or. ValidF3I("S025", M->AIT_ESTADO,1,3) 
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    Help

    Código del estado en donde se encuentra ubicado el destinatario de la mercancía.
    Debe contener una clave del catálogo S025 - Estados.


    CampoAIT_PAIS  
    TipoC - Caracter
    Tamaño3
    Formato@!
    TítuloPaís
    DescripciónPaís Destinario
    Nivel1
    ConsultaMEX009
    Val. SistemaVazio() .or. ValidF3I("S009", M->AIT_PAIS,1,3) 
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpClave del país donde se encuentra ubicado el destinatario de la mercancía, conforme con el catálogo S009-Paises.


    CampoAIT_CODPOS
    TipoC - Caracter
    Tamaño5
    Formato@!
    TítuloC.P.        
    DescripciónC.P.  Destinario
    Nivel1
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpCódigo postal (PO, BOX) en donde se encuentra ubicado el domicilio del destinatario de la mercancía.


    CampoF2_ACOPLA
    TipoC - Caracter
    Tamaño30
    Formato@!
    TítuloDestinos
    DescripciónDestinos
    Nivel1
    Val. SistemaLxMexDest(M->F2_CLIENTE,M->F2_LOJA) .And. LxVldDest(M->F2_ACOPLA)
    UtilizadoSi
    ObligatorioNo
    BrowseNo
    HelpSeleccione uno o varios de los destinos de la entrega de mercancía para Comercio Exterior. 

    5.11 Activación de Complemento de Comercio Exterior 1.1 y Carta Porte 2.0 en NF de Traslado con rutina FATSMEX.PRW



    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT -  Facturación
    Función:

    Rutina

    Nombre Técnico

    Fecha

    FATSMEX.PRWGeneración de XML para Documentos de Salida02/08/2023
    LOCXFUNAFunciones Genéricas para Notas Fiscales25/07/2023
    FATXFUMIFunciones genéricas para Facturación - Mercado Internacional24/07/2023
    País:México
    Ticket:No aplica
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-17258


    Se solicita que cuando el parámetro MV_FEXML se encuentre configurado con el valor S, al realizarse la generación del Comprobante Fiscal Digital por Internet (CFDI) en la Factura de Venta de tipo Traslado, sea realizada a través del uso de la rutina FATSMEX.PRW, y se permita la generación del nodo para el Complemento de Comercio Exterior versión 1.1 y Carta Porte versión 2.0.

    SOLUCION

    En la rutina de Generación de XML para Documentos de Salida (FATSMEX.PRW):

    Se realiza ajuste para realizar el llamado a la función que Genera la cadena original y nodo para complemento de Carta Porte (LxFunaCaPo), para que si el campo ¿Carta Porte? (F2_TPCOMPL) existe y está configurado con el valor S - Sí, se genere el nodo cfdi:Complemento\cartaporte20:CartaPorte.

    Se agrega el URL "http://www.sat.gob.mx/CartaPorte20 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte20.xsd" cuando el documento generado se trata de una Carta Porte.

    En la rutina de Funciones genéricas para Facturación - Mercado Internacional (FATXFUMI):

      • Se realizaron ajustes en la función que Genera la Cadena original y Nodo de cfdi:Receptor (FATSMIRECE) para que los atributos Rfc, Nombre, DomicilioFiscalReceptor, NumRegIdTrib, y ResidenciaFiscal, sean creados de acuerdo a las validaciones de Comercio Exterior y tipo de documento de Traslado.
      • Se creó la función que Genera la Cadena Original y el nodo en el XML para informar los datos correspondientes al Complemento de Comercio Exterior (FATXCOMEXT).

    En la rutina de Generación de XML para Documentos de Salida (FATSMEX):

      • Se realizan ajustes para permitir la generación de los nodos que aplican para el complemento de Comercio Exterior versión 1.1, a través del llamado a las funciones FATXCOMEXT() de la rutina de Funciones genéricas para Facturación - Mercado Internacional (FATXFUMI)

    En la rutina de Funciones Genéricas para Notas Fiscales (LOCXFUNA):

    Se realiza ajuste en la función que llena el arreglo para hacer cuadre por centavos a estructura y cadena de XML (fImptosD) para almacenar en un arreglo con los valores que se informarán en el nodo cce11:Mercancia del nodo cfdi:Comprobante\cfdi:Complemento\cce11:ComercioExterior\cce11:Mercancias.

    5.12 Activación de PE para modificar nodos Emisor y Receptor para XML de Documentos de Entrada y Salida con MV_FEXML activo



    Producto

    TOTVS Backoffice

    Línea de prducto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación
    Función:

    Rutina

    Nombre Técnico

    Fecha

    FATXFUMIFunciones genéricas para Facturación - Mercado Internacional23/09/2023
    País:México (MEX)
    Ticket:No aplica.
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-20949


    Para la funcionalidad de generación del XML de los Comprobantes Fiscales Digitales por Internet (CFDI), a través de las rutinas de Generación de XML para Documentos de Salida (FATSMEX.PRW) y Generación de XML para Documentos de Entrada (FATEMEX.PRW) para el país México, es decir, cuando el parámetro MV_FEXML se encuentra configurado con el valor S, se solicita activar un Punto de Entrada, que permitan las siguientes acciones:

    • Modificar en el nodo de cfdi:Emisor, los valores de los atributos "RFC, Nombre, RegimenFiscal"
    • Modificar en el nodo de cfdi:Receptor, los valores de los atributos "RFC, Nombre, DomicilioFiscalReceptor, RégimenFiscal"

    SOLUCION

    En la rutina deFunciones genéricas para Facturación - Mercado Internacional - (FATXFUMI):

    Se activó el Punto de Entrada PEEMIREC, que permite modificar los atributos RFC, Nombre y RegimenFiscal nodo cfdi:Emisor y los atributos RFC, Nombre, DomicilioFiscalReceptor y RegimenFiscal del nodo cfdi:Receptor, según las posiciones enviadas en el Punto de Entrada, cuando exista esté validará que contenga información en la posición correspondiente en caso contrario indicará la información que se tiene por estándar.


    Informações

    El Punto de Entrada PEEMIREC recibe como parámetro la opción de tipo Caracter, mediante el cual se tienen disponibles las siguientes opciones:

    Si opción es "E", se permite la modificación del Nodo de cfdi:Emisor, tomando en cuenta las siguientes posiciones:

    • [1] - Valor para el atributo Rfc
    • [2] - Valor para el atributo Nombre
    • [3] - Valor para el atributo RegimenFiscal

    Image Added

    Si opción es "R", se permite la modificación del Nodo de cfdi:Receptor, tomando en cuenta las siguientes posiciones:

    • [1] - Valor para el atributo Rfc
    • [2] - Valor para el atributo Nombre
    • [3] - Valor para el atributo RegimenFiscalReceptor
    • [4] - Valor para el atributo DomicilioFiscalReceptor

    Image Added


    Ejemplo de los Puntos de Entrada:

    Bloco de código
    titlePEEMIREC
    User Function PEEMIREC()
    	Local cArea   := GetArea()
    	Local cOpcion := PARAMIXB[1] // E - Emisor o R - Receptor
    	Local aEmiRec := {"","","",""} // Arreglo que contiene la información del Emisor o Receptor.
    	/* Posiciones del atributo que se puede modificar en el XML para Emisor y Receptor
    	aEmiRec[1] := RFC
    	aEmiRec[2] := Nombre
    	aEmiRec[3] := RegimenFiscal
    	aEmiRec[4] := DomicilioFiscal Solo Receptor
    	*/
    
    	If cOpcion =='E'
       		aEmiRec[2] := "TOTVS SA"
    	EndIf
    	If cOpcion =='R' .And. Alltrim(cEspecie) $ "NF"
       		aEmiRec[2] := "Prueba PE Receptor RFC"
        	aEmiRec[3] := "605"
        	aEmiRec[4] := "54910"
    	EndIf
    
    Return aEmiRec
     
    Informações
    titleInformación

    En el Punto de Entrada PEEMIREC, se tienen disponibles los siguientes datos:

    La variable cEspecie, la cual puede ser utilizada para personalizar para que la funcionalidad aplique solo para ciertos documentos, ya que contiene la especie del documento  (por ejemplo NF para Factura de Venta, NDC para Nota de Débito de Cliente o NCC para Nota de Crédito de Cliente).

    Posicionamiento del registro del Documento en la tabla SF1 - Encabezado de Fact. de Entrada para los documento de Entrada. 

    Posicionamiento del registro del Documento en la tabla SF2 - Encabezado de Fact. de Salida para los documento de Salida.

    En el Punto de Entrada PEEMIREC, se debe inicializar la variable de retorno de tipo arreglo, con 4 posiciones de tipo caracter vacías, por ejemplo: Local aEmiRec := {"","","",""} y solo actualizar la posición que sea personalizar en el nodo.

    5.13 Activación de PE para ajustar datos de Conceptos, Impuestos por ítem, Información Aduanera, Cuenta Predial e Impuestos Totales para FATSMEX.PRW y FATEMEX.PRW

    Producto

    Solucoes_espanhol
    SolucaoTOTVS Backoffice

    Línea de producto: 

    Linhas_totvs_espanhol
    LinhaLínea Protheus

    Segmento:

    Segmentos_totvs_espanhol
    SegmentoBackoffice

    Módulo:SIGAFAT- Facturación
    Función:
    RutinaNombre TécnicoFecha
    LOCXFUNAFunciones genéricas de localizaciones24/09/2023
    FATSMEX.PRWGeneración de XML para Documentos de Salida24/09/2023
    FATEMEX.PRWGeneración de XML para Documentos de Entrada24/09/2023
    País:México (MEX)
    Ticket:No aplica
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-20950


    SITUACIÓN:

    Para la funcionalidad de generación del XML de los Comprobantes Fiscales Digitales por Internet (CFDI) a través de las rutinas de Generación de XML para Documentos de Salida (FATSMEX.PRW) y Generación de XML para Documentos de Entrada (FATEMEX.PRW) para el país México, es decir, cuando el parámetro MV_FEXML se encuentra configurado con el valor S, se solicita activar Puntos de Entrada, que permitan las siguientes acciones:

    • En el nodo cfdi:Comprobante\cfdi:Conceptos\cfdi:Concepto, permitir modificar los atributos ValorUnitario, Importe y Descuento.
    • En el nodo cfdi:Comprobante\cfdi:Conceptos\cfdi:Concepto, permitir modificar del nodo de cfdi:Impuestos por ítem.
    • En el nodo cfdi:Comprobante\cfdi:Conceptos, permitir personalizar la generación del nodo de cfdi:InformacionAduanera
    • En el nodo cfdi:Comprobante\cfdi:Conceptos, permitir personalizar la generación del nodo de cfdi:CuentaPredial.
    • En el nodo cfdi:Comprobante, permitir personalizar el nodo de cfdi:Impuestos (Impuestos Totales).

    SOLUCIÓN:

    En la rutina de Funciones Genéricas de Localizaciones (LOCXFUNA):

    Se realizó ajuste para que el Punto de Entrada LOCXCONCEP, permita:

    • En el nodo cfdi:Comprobante\cfdi:Conceptos\cfdi:Concepto, personalizar el valor del atributo ValorUnitario con la pósición 7 del arreglo retornado por el Punto de Entrada (el retorno debe ser de tipo Caracter).
    • En el nodo cfdi:Comprobante\cfdi:Conceptos\cfdi:Concepto, personalizar el valor del atributo Importe con la posición 8 del arreglo retornado por el Punto de Entrada (el retorno debe ser de tipo Caracter).
    • En el nodo cfdi:Comprobante\cfdi:Conceptos\cfdi:Concepto, personalizar el valor del atributo Descuento con la posición 9 del arreglo retornado por el Punto de Entrada (el retorno debe ser de tipo Caracter).

    Se activó el Punto de Entrada PEDETIMP, el cual permite:

    • Modificar en el nodo cfdi:Comprobante\cfdi:Conceptos\cfdi:Concepto el nodo cfdi:Impuestos por ítem.

      Informações
      titleInformación

      El punto de Entrada PEDETIMP, recibe 4 parámetros, donde:

      El primer parámetro es de tipo carácter, con las opciones IT para personalizar el nodo cfdi:Impuestos para Impuestos de Traslados e IR para personalizar el nodo cfdi:Impuestos para Impuestos de Retenciones.

      El segundo parámetro recibe el valor lógico .T. o .F., que indica si se va a generar la Cadena Original o el XML (.T. es igual a generar la Cadena Original y .F. es igual a generar el XML).

      El tercer parámetro corresponde del código del Producto.

      El cuarto parámetro corresponde del número del ítem.

      El retorno debe ser un arreglo con valores de tipo caracter.

    Se activó el Punto de Entrada PECOMPCON, el cual permite:

    • Personalizar el nodo cfdi:InformacionAduanera
    • Personalizar el nodo cfdi:cfdi:CuentaPredial


      Informações
      titleInformación

      El punto de Entrada PECOMPCON, recibe 2 parámetros, donde:

      El primer parámetro es de tipo carácter, con las opciones IA para personalizar el nodo de Información Aduanera, CP para personalizar el nodo de Cuenta Predial y P para personalizar el nodo de Partes.

      El segundo parámetro recibe el valor lógico .T. o .F., que indica si se va a generar la Cadena Original o el XML (.T. es igual a generar la Cadena Original y .F. es igual a generar el XML).

      El retorno debe ser un valor de tipo carácter.

    En la rutinas de Generación de XML para Documentos de Salida (FATSMEX.PRW) y Generación de XML para Documentos de Entrada (FATEMEX.PRW):

    Se activó el Punto de Entrada PEXMLDOC, el cual permite:

    • En el nodo cfdi:Comprobante, permitir personalizar los atributos:
      • Total
      • Subtotal
      • Fecha
      • Descuento
      • TipoCambio
      • LugarExpedicion
      • Moneda
      • FormaPago
      • MetodoPago
      • Exportación
    • Personalizar el nodo cfdi:Impuestos que corresponde a los Impuestos Totales del Documentos.


      Informações
      titleInformación

      El punto de Entrada PEXMLDOC,recibe 2 parámetros, donde:

      El primer parámetro es de tipo caracter, con las siguientes opciones:

      • ST para personalizar el valor del atributo SubTotal
      • T personalizar el valor del atributo Total
      • FE personalizar el valor del atributo Fecha
      • D personalizar el valor atributo Descuento
      • TC personalizar el valor del atributo TipoCambio
      • LE personalizar el valor de atributo LugarExpedicion
      • MO personalizar el valor del atributo Moneda
      • FP personalizar el valor del atributo FormaPago
      • MP personalizar el valor del atributo MetodoPago
      • TI para personalizar el nodo cfdi:Impuestos de los impuestos totales del documento.
      • CO para personalizar el nodo cfdi:Conceptos
      • E para personalizar el valor del atributo SubTotal

      El segundo parámetro recibe el valor lógico .T. o .F., que indica si se va a generar la Cadena Original o el XML (.T. es igual a generar la Cadena Original y .F. es igual a generar el XML, y este parámetro no aplica para las opciones ST - Subtotal  y T -  Total).

      El retorno debe ser un valor de tipo carácter.

      Aviso
      titleImportante

      Para los Puntos de Entrada PECOMPCON, PEXMLDOC, PEDETIMP y LOCXCONCEP se tiene acceso a las tablas SF1 - Encabezado de Fact. de Entrada y SF2 - Encabezado de Fact. de Salida.


      Ejemplos de los Puntos de Entrada:

      Bloco de código
      titlePECOMPCON
      #include 'protheus.ch'
      #INCLUDE "FWMVCDEF.CH"
      #include "FILEIO.CH"
      
      User Function PECOMPCON()
      	Local cXMLCon   := ""
      	Local cCRLF  := (chr(13)+chr(10))
      	Local cOpc   := PARAMIXB[1] //Opción donde IA - Información Aduanera, CP - Cuenta Predial
      	Local lCadO  := PARAMIXB[2] //Indica si es Cadena Original .T. = Si y .F. = No
      	Local cSepa  := "|"
      	Local cNPed  := "23  47  3807  8003832"
      	Local cCtaP  := "15956011002"
          Local cClaveP:= "10101504"
          Local cNoId  := "9642000000000002"
          Local cCant  := "1"
          Local cUnid  := "UN"
          Local cDesc  := "MOUSE"   If Alltrim(cEspecie) $ "NF|NCC"
      
      		If lCadO
      			If cOpc == "IA" //Información Aduanera
      				cXMLCon := StrTran(cNPed,"  "," ") + cSepa
      			ElseIf cOpc == "CP" //Cuenta Predial
      				cXMLCon := cCtaP + cSepa
      			ElseIf cOpc == "P" //Partes
       				cXMLCon := cClaveP + cSepa + cNoId + cSepa + cCant + cSepa + cUnid + cSepa + cDesc + cSepa
      			EndIf
      		Else
      			If cOpc == "IA" //Información Aduanera
      				cXMLCon := Space(12) + '<cfdi:InformacionAduanera NumeroPedimento="' + cNPed + '"/>' + cCRLF
      			ElseIf cOpc == "CP" //Cuenta Predial
      				cXMLCon := Space(12) + '<cfdi:CuentaPredial Numero="' + cCtaP + '"/>' + cCRLF
      			ElseIf cOpc == "CP" //Cuenta Predial
      				cXMLCon := Space(12) + '  <cfdi:Parte ClaveProdServ="'+ cClaveP +'" NoIdentificacion="'+ cNoId +'" Cantidad="'+ cCant +'" 			Unidad="'+cUnid+'" Descripcion="'+cDesc+'"/> '+ cCRLF
      			EndIf
      		EndIf
      	EndIf
      Return cXMLCon
      Bloco de código
      titlePEXMLDOC
      #include 'protheus.ch'
      #INCLUDE "FWMVCDEF.CH"
      #include "FILEIO.CH"
      
      User Function PEXMLDOC()
      	Local cOpc    := PARAMIXB[1] //Opción para indicar el atributo o el nodo a personalizar
      	Local lCadO   := PARAMIXB[2] //Indica si es Cadena Original .T. = Si y .F. = No
      	Local cXMLRet := ""
      	Local cSepa   := "|"
      	Local cSubT   := "0.01"
      	Local cTot    := "0.01"
      	Local cCRLF   := (chr(13)+chr(10))
      
      	//Datos Impuestos Totales
      	Local cTotIT := "0.00"
      	Local cBasIT := "0.01"
      	Local cImpT  := "002"
      	Local cTpFac := "Tasa"
      	Local cTasCuo := "0.000000"
      	Local cValor  := "0.00"
      
      	If Alltrim(cEspecie) $ "NF|NCC"
      		If cOpc == "ST" //SubTotal
      			cXMLRet := cSubT
      		ElseIf cOpc == "T" //Total
      			cXMLRet := cTot
      		ElseIf cOpc == "D" //Descuento
      			cXMLRet := "20.00"
      		ElseIf cOpc == "FE" //Fecha de emisión
                  cXMLRet := ""
       		ElseIf cOpc == "FP" //FormaPago
                  cXMLRet := ""
              ElseIf cOpc == "TC" //TipoCambio
                  cXMLRet := ""
              ElseIf cOpc == "LE" //LugarExpedición
                  cXMLRet := ""     
              ElseIf cOpc == "MO" //Moneda
                  cXMLRet := ""
      	 	ElseIf cOpc == "E"  //Exportación
      	 	 cXMLRet := IIf(!Empty(SF2->F2_TIPOPE) .And. Alltrim(SF2->F2_ESPECIE) == "NF","02", "01")
              EndIf      
      
      		If lCadO
      		 	If cOpc == "CO"
      				cXMLRet := U_GROUPCAD(SF2->F2_DOC)
      			elseIf cOpc == "TI" //Total de Impuestos
      				cXMLRet := cBasIT + cSepa + cImpT + cSepa + cTpFac + cSepa + cTasCuo + cSepa + cValor + cSepa + cTotIT + cSepa
      			EndIf
      		Else
      			If cOpc == "CO"
       				cXMLRet := space(3) + '<cfdi:Conceptos>' + cCRLF
      				cXMLRet += U_GROUPPED(SF2->F2_DOC)	
      				cXMLRet += space(3) + '</cfdi:Conceptos>' + cCRLF
      			elseIf cOpc == "TI" ////Total de Impuestos
      				cXMLRet := cCRLF + Space(5) + '<cfdi:Impuestos TotalImpuestosTrasladados="' + cTotIT + '" >' + cCRLF
      				cXMLRet += Space(10) + '<cfdi:Traslados>' + cCRLF
      				cXMLRet += Space(15) + '<cfdi:Traslado Base="' + cBasIT + '" Impuesto="' + cImpT + '" TipoFactor="' + cTpFac + '" TasaOCuota="' + cTasCuo + '" Importe="' + cValor + '"/>' + cCRLF
      				cXMLRet += Space(10) + '</cfdi:Traslados>' + cCRLF
          			cXMLRet += Space(5) + '</cfdi:Impuestos>' + cCRLF
      			EndIf
      		EndIf
      	EndIf
      Return cXMLRet
      Aviso
      titleImportante

      Para las opciones  MO para Moneda,  TC para TipoCambio y LE para LugarExpedición la rutina FATEMEX.PRW debe tener fecha igual o superior a 13/02/2024 y la rutina FATSMEX.PRW debe tener fecha igual o superior a 15/02/2024.

      Bloco de código
      titleLOCXCONCEP
      #include 'protheus.ch'
      #INCLUDE "FWMVCDEF.CH"
      #include "FILEIO.CH"
      
      User function LOCXCONCEP()
      	Local cArea := GetArea()
          Local cCodProd := PARAMIXB[1] // Código del producto.
          Local cItem := PARAMIXB[2] // Número Item   
          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[7] := ValorUnitario
      	aDetFac[8] := Importe
      	aDetFac[9] := Descuento
      	*/
      
      	If Alltrim(cEspecie) $ "NF|NCC"
      		aDetFac[7] := "0.01"
      		aDetFac[8] := "0.01"
      		aDetFac[9] := "0.00"
      	EndIf
      
      	RestArea(cArea)
      Return aDetFac
      Bloco de código
      titlePEDETIMP
      #include 'protheus.ch'
      #INCLUDE "FWMVCDEF.CH"
      #include "FILEIO.CH"
      
      User Function PEDETIMP()
      	Local cOpc   := PARAMIXB[1] //Opción donde IA - Información Aduanera, CP - Cuenta Predial
      	Local lCadO  := PARAMIXB[2] //Indica si es Cadena Original .T. = Si y .F. = No
      	Local cProd  := PARAMIXB[3] //Código del Producto
      	Local cItem  := PARAMIXB[4] //Número de ítem
      	Local aImpDet := {}
      	Local cRetImp := ""
      	Local cBaseI := "0.01"
      	Local cImpto := "002"
      	Local cTipoF := "Tasa"
      	Local cTsaC  := "0.000000"
      	Local cImpI  := "0.00"
      	Local cCRLF  := (chr(13)+chr(10))
      	Local cSepa  := "|"
      
      	If Alltrim(cEspecie) $ "NF|NCC"
      		If lCadO 
      			If cOpc == "IT"
      				cRetImp := cBaseI + cSepa + cImpto + cSepa + cTipoF + cSepa + cTsaC + cSepa + cImpI + cSepa
      			EndIf
      		Else
      			If cOpc == "IT"
      				cRetImp := Space(20) + '<cfdi:Traslado Base="' + cBaseI + '" Impuesto="' + cImpto + '" TipoFactor="' + cTipoF + '" TasaOCuota="' + cTsaC + '" Importe="' + cImpI + '"/>' + cCRLF
      			EndIf
      		EndIf
      		aAdd(aImpDet, cRetImp)
      	EndIf
      Return aImpDet

    5.14 Activación de PE para incorporar datos adicionales al final del XML para FATSMEX.PRW y FATEMEX.PRW

    Producto

    Solucoes_espanhol
    SolucaoTOTVS Backoffice

    Línea de producto: 

    Linhas_totvs_espanhol
    LinhaLínea Protheus

    Segmento:

    Segmentos_totvs_espanhol
    SegmentoBackoffice

    Módulo:

    SIGAFAT - Facturación

    Función:

    Rutina

    Nombre Técnico

    Fecha

    FATSMEX.PRWGeneración de XML para Documentos de Salida28/09/2023
    FATEMEX.PRWGeneración de XML para Documentos de Entrada28/09/2023
    País:México (MEX)
    Ticket:No aplica.
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-20951


    SITUACIÓN:

    Para la funcionalidad de generación del XML de los Comprobantes Fiscales Digitales por Internet (CFDI) a través de las rutinas de Generación de XML para Documentos de Salida (FATSMEX.PRW) y Generación de XML para Documentos de Entrada (FATEMEX.PRW) para el país México, es decir, cuando el parámetro MV_FEXML se encuentra configurado con el valor S, se solicita activar Puntos de Entrada, que permitan :

    • En el nodo cfdi:Comprobante al final del XML indicar información adicional informativa que no es requerida por el SAT y por lo tanto no afecta la cadena original para el timbrado.


    SOLUCIÓN:

    En la rutinas de Generación de XML para Documentos de Salida (FATSMEX.PRW) y Generación de XML para Documentos de Entrada (FATEMEX.PRW):

    Se activó el Punto de Entrada PEXMLADIC, el cual permite:

    • Personalizar el final del archivo XML información solo de manera informativa que no afecta a la cadena original.


    Ejemplo de los Puntos de Entrada:

    Bloco de código
    titlePEXMLADIC
    #include "protheus.ch" 
    User Function PEXMLADIC()    
        Local cCRLF    := (chr(13)+chr(10))
        Local cXMLPE := "" 
      
        If Alltrim(cEspecie) $ "NF|NCC"  
            cXMLPE += '    <cfdi:Addenda>' + cCRLF
            cXMLPE += '        <Addenda xmlns:Addenda="http://www.Addenda/" schemaLocation="http://www.addenda.xsd" version="1.0">' + cCRLF
            cXMLPE += '            <Addenda:Datos>' + cCRLF
            cXMLPE += '                <Addenda:Detalle>abc</Addenda:Detalle>' + cCRLF
            cXMLPE += '            </Addenda:Datos>' + cCRLF
            cXMLPE += '        </Addenda>' + cCRLF
            cXMLPE += '    </cfdi:Addenda>' + cCRLF
    	EndIf
    
    Return cXMLPE
    
    
    Informações

    La variable cEspecie, la cual puede ser utilizada para personalizar para que la funcionalidad aplique solo para ciertos documentos, ya que contiene la especie del documento  (por ejemplo NF para Factura de Venta, NDC para Nota de Débito de Cliente o NCC para Nota de Crédito de Cliente).

    5.15 Facilitador de CFDI (Fracción Arancelaria, Unidad de Medida Aduana y Eliminación de Espacios en Nombre del Receptor)

    Producto

    Solucoes_espanhol
    SolucaoTOTVS Backoffice

    Línea de producto: 

    Linhas_totvs_espanhol
    LinhaLínea Protheus

    Segmento:

    Segmentos_totvs_espanhol
    SegmentoBackoffice

    Módulo:

    SIGAFAT - Facturación

    Función:
    RutinaNombre TécnicoFecha
    LOCXMEXFunciones Genéricas para Documentos Fiscales para México.02/10/2023
    FATXFUMIFunciones genéricas para Facturación - Mercado Internacional02/10/2023
    FATSMEX.INIGeneración de XML para Documentos de Salida02/10/2023
    FATEMEX.INIGeneración de XML para Documentos de Entrada.02/10/2023
    País:México 
    Ticket:No aplica.
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-20951


    SITUACIÓN:

    Para la generación de Pedido de Venta, si el parámetro MV_CFDIEXP (¿Genera Complemento de Comercio Exterior en CFDI?) está configurado con el valor .T. y el campo Tipo Opera. (C5_TIPOPE) contiene información, se solicitan los siguientes ajustes:

    • En el detalle del Pedido de Venta, al informar el campo Producto (C6_PRODUTO), si el producto tiene configurado el campo Fracc Arance (B1_CODICE), se deberá llenar en automático el campo Frac. arance (C6_FRACCA) con el valor del campo Fracc Arance (B1_CODICE) y el campo Unidad Adua. (C6_UNIADU) con el valor del campo UnidMedi de la tabla S014 - Catálogo Fraccion Arancelaria del Mantenimiento de Catálogos (Tablas F3H y F3I) que corresponde para la Fracción Arancelaria.
    • En el detalle del Pedido de Venta, al informar o modificar el campo Frac. arance (C6_FRACCA), se deberá de informar en automático el campo Unidad Adua. (C6_UNIADU) con el valor del campo UnidMedi de la tabla S014 - Catálogo Fraccion Arancelaria del Mantenimiento de Catálogos (Tablas F3H y F3I) que corresponde para la Fracción Arancelaria.

    Para la generación de Factura de Venta (NF), desde la rutina Facturaciones (MATA467), si el parámetro MV_CFDIEXP está configurado con el valor .T. y el campo Tipo Opera. (F2_TIPOPE) es diferente de vacío, se solicitan los siguientes ajustes:

    • En el detalle de la Factura de Venta (NF), al informar el campo Producto (D2_COD), si el producto tiene configurado el campo Fracc Arance (B1_CODICE), se deberá llenar en automático el campo Frac. Arance (D2_FRACCA) con el valor del campo Fracc Arance (B1_CODICE) y el campo Unidad Adua. (D2_UNIADU) con el valor del campo UnidMedi de la tabla S014 - Catálogo Fraccion Arancelaria del Mantenimiento de Catálogos (Tablas F3H y F3I) que corresponde para la Fracción Arancelaria.
    • En el detalle de la Factura de Venta (NF), al informar o modificar el campo Frac. Arance (D2_FRACCA), se deberá de informar en automático el campo Unidad Adua. (D2_UNIADU) con el valor del campo UnidMedi de la tabla S014 - Catálogo Fraccion Arancelaria del Mantenimiento de Catálogos (Tablas F3H y F3I) que corresponde para la Fracción Arancelaria.
    • En el campo Fracc Arance (B1_CODICE del Producto, la consulta debe mostrar los valores a través de la consulta MEX014.

    Crear una nueva función que permita sustituir por un espacio cuando existen más de un espacio entre palabra de una cadena de texto.


    SOLUCIÓN:

    En la rutina de Funciones Genéricas para Documentos Fiscales para México (LOCXMEX):

    Se creó la función LxFraccAra(), que retorna la Fracción Arancelaria del campo Fracc Arance (B1_CODICE), realizando búsqueda por el Código del Producto.

    Se creÓ la función LxUMFracc(), que retorna la Unidad de Medida Aduanera, obteniendo el valor del campo UnidMedi de la tabla S014 - Catálogo Fraccion Arancelaria del Mantenimiento de Catálogos (Tablas F3H y F3I) que corresponde para la Fracción Arancelaria.

    En la rutina Funciones genéricas para Facturación - Mercado Internacional (FATXFUMI):

    Se creó la función FxDelExp(), que permite eliminar más de espacio entre palabras en una cadena de texto, y colocando solo un espacio.

    En la función FATXMIRECE(), al generar el atributo Nombre, del nodo cfdi:Receptor, se hace uso de la función FxDelExp, para dar tratamiento a los espacios de más y que solo se muestre un espacio en la separación de palabas que contiene el Nombre del Cliente (el ajuste aplica cuando el parámetro MV_FEXML está configurado con el parámetro con el valor S y también se utiliza para la cadena original).

    En los archivos de la Generación de XML para Documentos de Salida (FATSMEX.INI) y Generación de XML para Documentos de Entrada (FATEMEX.INI):

    Se agrega el uso de la función FxDelExp, para dar tratamiento a los espacios de más y que solo se muestre un espacio en la separación de palabas que contiene el Nombre del Cliente (el ajuste aplica cuando el parámetro MV_FEXML está configurado con el parámetro con el valor S y también se utiliza para la cadena original).

    DICCIONARIO DE DATOS:

    Configurar los siguientes Disparadores en el archivo SX7 - Disparadores:

    Campo

    C6_PRODUTO

    Secuencia007
    Cnt. DominioC6_FRACCA
    Tipo1 - Primario
    ReglaIIf(FINDFUNCTION("LxFraccAra"),LxFraccAra(M->C6_PRODUTO, M->C5_TIPOPE),"")
    Posiciona2 - No
    Alias
    Orden0
    Clave
    Condición
    Campo

    C6_PRODUTO

    Secuencia008
    Cnt. DominioC6_UNIADU
    Tipo1 - Primario
    ReglaIIf(FINDFUNCTION("LxUMFracc"),LxUMFracc(M->C6_FRACCA, M->C5_TIPOPE),"")
    Posiciona2 - No
    Alias
    Orden0
    Clave
    Condición
    Campo

    C6_FRACCA

    Secuencia002
    Cnt. DominioC6_UNIADU
    Tipo1 - Primario
    ReglaIIf(FINDFUNCTION("LxUMFracc"),LxUMFracc(M->C6_FRACCA, M->C5_TIPOPE),"")
    Posiciona2 - No
    Alias
    Orden0
    Clave
    Condición
    Campo

    D2_COD

    Secuencia008
    Cnt. DominioD2_FRACCA
    Tipo1 - Primario
    ReglaIIf(FINDFUNCTION("LxFraccAra"),LxFraccAra(M->D2_COD, M->F2_TIPOPE),"")
    Posiciona2 - No
    Alias
    Orden0
    Clave
    Condición
    Campo

    D2_COD

    Secuencia009
    Cnt. DominioD2_UNIADU
    Tipo1 - Primario
    ReglaIIf(FINDFUNCTION("LxUMFracc"),LxUMFracc(M->D2_FRACCA, M->F2_TIPOPE),"")
    Posiciona2 - No
    Alias
    Orden0
    Clave
    Condición
    Campo

    D2_FRACCA

    Secuencia002
    Cnt. DominioD2_UNIADU
    Tipo1 - Primario
    ReglaIIf(FINDFUNCTION("LxUMFracc"),LxUMFracc(M->D2_FRACCA, M->F2_TIPOPE),"")
    Posiciona2 - No
    Alias
    Orden0
    Clave
    Condición


    Configurar el siguiente campo en el archivo SX3 - Campos:

    CampoB1_CODICE
    TipoC - Caracter
    Tamaño10
    Decimal0
    Formato@!
    ContextoReal
    PropiedadModificar
    Tit. EspañolFracc Arance
    Desc. EspañolFracción arancelaria 
    Consulta EstándarMEX014
    ValidaciónVazio() .or. ValidF3I("S014", M->B1_CODICE,1,8)
    ObligatorioNo
    UsadoSi
    Exhibe en BrowseNo
    Help

    Fracción Arancelaria aplicable a la mercancía según corresponda, conforme a la TIGIE.


    5.16 DT Acuses de cancelación guardados en una carpeta local

    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación
    Función:

    Rutinas

    Nombre Técnico

    Fecha

    FISA817Cancelación CFDI
    FISA800Timbrado CFDI
    País:México
    Ticket:No aplica.
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-20893


    SITUACIÓN

    Se requiere que al realizar la Cancelación del CFDI de los documentos "Factura de Venta (NF), Nota de Débito y Crédito (NDC/NCC)", guarde los acuses de cancelación así como XML y PDF del documento cancelado en una carpeta local y no solo en el servidor.


    SOLUCIÓN

    En las rutinas de Cancelación CFDI (FISA817):

    Se crea función F817CopAcu() que guarda en la ruta indicada en el parámetro MV_CFDCARF  los archivos ".sol", ".xml", ".pdf" de los documentos Factura de Venta (NF), Nota de Débito y Crédito (NDC/NCC)", cuando se realiza la cancelación de estos y envía mensaje al usuario indicando la ruta donde se almacenaron dichos archivos.

    En las rutinas de Timbrado CFDI (FISA800):

    Se realiza ajuste para cuando se cancela un documento con tipo de motivo de cancelación "01"  y se realiza el timbrado del nuevo documento que lo sustituye, guarde en la ruta indicada en el parámetro MV_CFDCARF  los archivos ".sol", ".xml", ".pdf" del documento que fue cancelado y envía mensaje con el folio y ruta donde se almacenaron dichos archivos.

    PROCEDIMIENTO

    Cancelación diferente de motivo 01

    1. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Facturaciones (MAT467N)
    2. Incluir y Timbrar el CFDI de una Factura de Venta (NF).
    3. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Cancelación CFDI (FISA817)
    4. En los parámetros para visualizar la Factura, indicando en la pregunta ¿Tipo de Documento? con la opción Factura.
    5. Seleccionar la Factura de Venta (NF) que fue creada y timbrada previamente, ejecutar la acción Act. Status.
    6. Validar que la Factura sea Cancelable.
    7. Seleccionar de nueva cuenta la Factura de Venta (NF), y ejecutar la acción Cancelar.
    8. En el módulo Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Cancelación de CFDI (FISA817).
    9. Informar los parámetros necesarios para visualizar la Factura de Venta (NF) que fue timbrada previamente.
    10. Seleccionar la Factura de Venta (NF) que fue timbrada previamente.
    11. Ejecutar la acción Act. Status.
    12. Confirmar la continuación con la consulta de estado del documento.
    13. Validar que el documento sea cancelable.
    14. Seleccionar de nueva cuenta la Factura de Venta (NF) que fue timbrada previamente.
    15. Ejecutar la acción Cancelar.
    16. Confirman la continuación de la solicitud de cancelación.
    17. En la pantalla Motivo Baja:
      • Informar el campo Motivo diferente de 01.
    18. Una vez finalizado el proceso de cancelación verificar que indique la ruta donde se almacenaron los archivos.
      Image Added
    19. Validar que el acuse y archivos .sol, .xml y/o .pdf se muestren en la ruta indicada.
      Image Added

    Cancelación motivo 01

    1. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Facturaciones (MAT467N)
    2. Incluir y Timbrar el CFDI de una Factura de Venta (NF).
    3. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Cancelación CFDI (FISA817)
    4. En los parámetros para visualizar la Factura, indicando en la pregunta ¿Tipo de Documento? con la opción Factura.
    5. Seleccionar la Factura de Venta (NF) que fue creada y timbrada previamente, ejecutar la acción Act. Status.
    6. Validar que la Factura sea Cancelable.
    7. Seleccionar de nueva cuenta la Factura de Venta (NF), y ejecutar la acción Cancelar.
    8. En la pantalla "Motivo baja" informar en el campo Motivo cancelación la opción 01 - Compr. Emitido c/errores c/relac., presionar Confirmar.
    9. Confirmar que se realice la anulación de la Factura, teniendo en cuenta que la solicitud de Cancelación ante el SAT no será realizada.
    10. En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Facturaciones (MAT467N)
    11. Incluir una nueva Factura de Venta (NF).
    12. En el encabezado informar en los campos Serie Sust. (F2_SERMAN) y Núm. Doc. Sust. (F2_DOCMAN) la Factura que fue anulada en Protheus pero no fue Cancelada ante el SAT.
    13. Presionar Confirmar para guardar la Factura.
    14. Confirmar la generación y timbrado del Comprobante Fiscal Digital por Internet (CFDI), validar que se haya timbrado la nueva Factura y que se haya Cancelado ante el SAT la Factura a la que se sustituye.
      Image Added
    15. Validar que el acuse y archivos .sol, .xml y/o .pdf se muestren en la ruta indicada.
      Image Added

    INFORMACIÓN ADICIONAL

    Parámetros (SX6)

    Ítems/Carpetas

    Descripción

    TipoC
    Nombre de Var.MV_CFDCARF
    DescripciónRuta local donde se guardarán los acuses de los documentos cancelados (.sol,.xml y .pdf)
    Cont. Esp


    5.17 Ajustes en atributo "ObjetoImp" de la NF

    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación 
    Función:

    Rutina

    Nombre Técnico

    Fecha

    LOCXFUNAFunciones Genéricas de Notas Fiscales29/10/2023
    LOCXMEXFunciones Genéricas para Documentos Fiscales para México.29/10/2023
    FISA814Carga de Catálogos16/10/2023
    FATSMEX.INIGeneración de XML de Documentos de Salida02/10/2023
    País:México
    Ticket:18161768
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-21137


    SITUACIÓN

    Se solicita realizar ajustes para permitir al usuario modificar el valor del atributo ObjetoImp, para el timbrado de Facturas de Venta (NF) de tipo Ingreso (Normal), permitiendo utilizar los valores que se definen en el catálogo del SAT c_ObjetoImp:

    Image Added


    SOLUCIÓN

    En la rutina de Funciones Genéricas de Notas Fiscales (LOCXFUNA):

    Se realizaron ajustes para:

      • Acumular el valor de impuestos, sumando Traslados y restando las Retenciones, para cuando el campo Objeto Imp (D2_NIT) contiene los valores 01, 03 o 04.
      • No generar el nodo de Impuestos, para los Conceptos, si el campo Objeto Imp (D2_NIT) contiene los valores 01, 03 o 04.
      • No generar el nodo de Impuestos exentos , para los Conceptos, y el campo Objeto Imp (D2_NIT) contiene los valores 01, 03 o 04.

    En el archivo de Funciones Genéricas para Documentos Fiscales para México (LOCXMEX):

    Se realizaron los siguientes ajustes:

      • Se agrega validación cuando se indica en un ítem el campo Objeto Imp (D2_NIT) el valor "01" para que solo permita indicar un Tipo de Entrada y Salida sin impuestos.
    Aviso
    titleIMPORTANTE

    La funcionalidad del campo Objeto Imp (D2_NIT), solo aplica para Facturas y en caso de no existir el campo o estar vacío, se tomará la funcionalidad anterior para la generación del nodo de Impuestos por Concepto.


    INFORMACIÓN ADICIONAL

    Âncora
    517
    517

    En el archivo FATSMEX.INI, se deberán realizar los siguientes ajustes:


    Informações
    title//FATSMEX.INI V4.0

    [XXX POSICIONAMENTOS]
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SA2->(MSSeek(xFilial("SA2")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)

    [XXX INICIALIZACION]
    (PRE) SD2->(DbSetOrder(1))
    (PRE) SB1->(DbSetOrder(1))
    (PRE) SYA->(DbSetOrder(1))
    (PRE) SC6->(DbSetOrder(1))
    (PRE) SE4->(DbSetOrder(1)) 
    (PRE) CTO->(DbSetOrder(1)) 
    (PRE) SAH->(DbSetOrder(1)) 
    (PRE) _aTotal[009] := SuperGetMV("MV_CFDICPG", .F., "")
    (PRE) _aTotal[010] := FindFunction("zh_FechaHoraUTC") .And. !Empty(_aTotal[009])
    (PRE) _aTotal[011] := FindFunction("LxFunaCaPo")
    (PRE) _aTotal[094] := ""
    (PRE) _aTotal[095] := ""
    (PRE) _aTotal[033] := ""
    (PRE) _aTotal[034] := ""
    (PRE) _aTotal[035] := ""
    (PRE) _aTotal[036] := 0
    (PRE) _aTotal[037] := 0
    (PRE) _aTotal[038] := 0
    (PRE) _aTotal[039] := SuperGetMV("MV_CFDIEXP",.F.,.F.)
    (PRE) _aTotal[075] := Alltrim(SM0->M0_NOMECOM)
    (PRE) _aTotal[076] := ((_aTotal[039] .And. !Empty(SF2->F2_TIPOPE)) .Or. SF2->(ColumnPos("F2_TPCOMPL")) > 0 .And. AllTrim(SF2->F2_TPCOMPL)=="S") .And. Alltrim(SF2->F2_TIPODOC) == "21"
    (PRE) IIf(_aTotal[010],_aTotal[096] := zh_FechaHoraUTC(Alltrim(_aTotal[009]),Alltrim(SM0->M0_CEPENT),SF2->F2_EMISSAO,SF2->F2_HORA),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] := DtoS(SF2->F2_EMISSAO),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] := Left(_aTotal[096],4) + "-" + Substr(_aTotal[096],5,2)+ "-" + Right(_aTotal[096],2),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] += "T" + SF2->F2_HORA,"")
    (PRE) _aTotal[097] := {"SD2",""}
    (PRE) _aTotal[098] := "|"
    (PRE) _aTotal[099] := "||"
    (PRE) _aTotal[100] := ""
    (PRE) _aTotal[101] := "OPERACION DE CONFORMIDAD CON EL ART. 29 FRACCION I DE LIVA Y LO ESTIPULADO EN LAS RGCE 5.2.6. FRACCION I, 5.2.7 Y 4.3.21"
    (PRE) _aTotal[102] := "OPERACION DE CONFORMIDAD CON EL ART. 29 FRACCION I DE LIVA Y LO ESTIPULADO EN LAS RGCE 5.2.6. FRACCION II, 5.2.7 Y 4.3.21"
    (PRE) _aTotal[103] := fSumBC(SF2->F2_DOC,SF2->F2_SERIE,SF2->F2_CLIENTE,SF2->F2_LOJA)
    (PRE) _aTotal[104] := IIf(SF2->(ColumnPos("F2_TPCOMPL")) > 0 .And. AllTrim(SF2->F2_TPCOMPL)=="S",.T.,.F.)
    (PRE) _aTotal[105] := ""
    (PRE) _aTotal[106] := IIf(Alltrim(SF2->F2_TIPODOC) == "21",0,2)
    (PRE) _aTotal[107] := IIf(SF2->(ColumnPos("F2_TPDOC")) > 0,ALLTRIM(SF2->F2_TPDOC),ALLTRIM(AI0->AI0_MPAGO))
    (PRE) _aTotal[108] := IIf(_aTotal[076],AllTrim(SM0->M0_CGC),AllTrim(SA1->A1_CGC))
    (PRE) _aTotal[109] := IIf(_aTotal[076],_aTotal[075],Alltrim(SA1->A1_NOME))
    (PRE) _aTotal[110] := IIf(_aTotal[076],AllTrim(SM0->M0_CEPENT),Alltrim(SA1->A1_CEP))
    (PRE) _aTotal[111] := IIf(_aTotal[076],Alltrim(SM0->M0_DSCCNA),Alltrim(AI0->AI0_REGFIS))
    (PRE) _aTotal[112] := FormPagGlo(SF2->F2_DOC,SF2->F2_SERIE)
    (PRE) _aTotal[113] := IIf(!_aTotal[039] .Or. (_aTotal[039] .And. Empty(SF2->F2_TIPOPE)),"01",IIf(SF2->F2_CVEPED !="A1" .Or. Alltrim(SF2->F2_TIPOPE)== "3","04","02"))
    (PRE) _aTotal[114] := IIf(_aTotal[113] == "04" .And.( Empty(SF2->F2_CERORI) .Or. Empty(SF2->F2_INCOTER) .Or. Empty(SF2->F2_SUBDIV) .Or. Empty(SF2->F2_TCUSD) .Or. Empty(SF2->F2_TOTUSD)) ,.F.,.T.)
    (PRE) _aTotal[115] := {}
    (PRE) lCCCE        := .F.
    (PRE) cNodoCCE     := ""
    (PREREG) FsQuery(_aTotal[097],1,"D2_DOC='" + SF2->F2_DOC + "' AND D2_SERIE='" + SF2->F2_SERIE + "' AND D2_CLIENTE='" + SF2->F2_CLIENTE + "' AND D2_LOJA='" + SF2->F2_LOJA + "'","SD2->D2_DOC=SF2->F2_DOC .AND. SD2->D2_SERIE=SF2->F2_SERIE .AND. SD2->D2_CLIENTE=SF2->F2_CLIENTE .AND. SD2->D2_LOJA=SF2->F2_LOJA","D2_ITEM") .And. .T.

    (PRE) fImptosD(SF2->F2_DOC,SF2->F2_SERIE,SF2->F2_CLIENTE,SF2->F2_LOJA,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),"SD2", SF2->F2_GLOBAL == "1",@(_aTotal[036]),_aTotal[104],@_aTotal[037], @_aTotal[038], ,@_aTotal[115]

    [SD2 CADENAORIGINAL_SELLO]
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SA2->(MSSeek(xFilial("SA2")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SYA->(MsSeek(xFilial("SYA")+SA2->A2_PAIS)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",CTO->(MsSeek(xFilial("CTO")+Strzero(SF2->F2_MOEDA,2))) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",CTO->(MsSeek(xFilial("CTO")+Strzero(SF2->F2_MOEDA,2))) , .T.)
    //////////////////////////////////////////////CADENA ORIGINAL//////////////////////////////////////////////
    (PRE) cCadOrig   := _aTotal[099]
    (PRE) lCCCE      := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE)  .And. _aTotal[114], .T., .F.)
    (PRE) cCadOriCCE := ""

    //Cadena Original | Complemento de Comercio Exterior (Mercancias)
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_ITEM + SD2->D2_COD), (cCadOriCCE += Alltrim(SD2->D2_ITEM + SD2->D2_COD) + _aTotal[098],.T.),("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), (cCadOriCCE += Alltrim(SD2->D2_FRACCA) + Alltrim(SD2->D2_NICO) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_CANADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_CANADU)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), (cCadOriCCE += AllTrim(ObtColSAT("S014",AllTrim(SD2->D2_FRACCA),1,8,9,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_VALADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_VALADU,14,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_USDADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_USDADU,14,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. SA1->A1_CONTRBE=="1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", (cCadOriCCE += '1.0' +_aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. SA1->A1_CONTRBE=="1" .And. SF2->F2_CONUNI=="1", (cCadOriCCE += 'IMMEX:' + ALLTRIM(SA1->A1_PFISICA) + ' ' + _aTotal[101] + _aTotal[098],.T.), IIf (lCCCE .And. SA1->A1_CONTRBE=="1" .And. SF2->F2_CONUNI=="2", (cCadOriCCE += 'IMMEX:' + ALLTRIM(SA1->A1_PFISICA) + ' ' + _aTotal[102] + _aTotal[098],.T.), ("",,.T.)))

    ///////////DATOS DE LA FACTURA/////////////////
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    //Version
    (PRE) cCadOrig += "4.0" + _aTotal[098]
    //Serie
    (PRE) cCadOrig += Alltrim(SF2->F2_SERIE) + _aTotal[098]
    //Folio
    (PRE) cCadOrig += Alltrim(SF2->F2_DOC) + _aTotal[098]
    //Fecha
    (PRE) cCadOrig += Alltrim(_aTotal[096]) + _aTotal[098]
    //FormaPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", IIf(SF2->F2_GLOBAL == '1',IIf(!Empty(_aTotal[112]),_aTotal[112],_aTotal[107]),IIf(Empty(_aTotal[107]).Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",_aTotal[107])) + _aTotal[098] )
    //NoCertificado
    (PRE) cCadOrig += Alltrim(SF2->F2_CERTFOL) + _aTotal[098]
    //CondicionesDePago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + _aTotal[098] ) 
    //Subtotal
    (PRE) cCadOrig += Alltrim(STR(IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, (SF2->(F2_VALMERC+F2_FRETE+F2_SEGURO+F2_DESPESA) + _aTotal[103] + SF2->F2_DESCONT) - _aTotal[036] - _aTotal[037]),14,_aTotal[106])) + _aTotal[098]
    //Descuento
    (PRE) cCadOrig += IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", "", IIf( SF2->F2_DESCONT == 0, "", Alltrim(STR(SF2->F2_DESCONT,14,2)) + _aTotal[098]) )
    //Moneda
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21","XXX",Alltrim(CTO->CTO_MOESAT)) + _aTotal[098]
    //TipoCambio
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21","",IIf(Alltrim(CTO->CTO_MOESAT) <> "MXN", Alltrim(STR(SF2->F2_TXMOEDA,14,2)), "1") + _aTotal[098])
    //Total
    (PRE) cCadOrig += Alltrim(Str(IIf(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, iif(GetSx3Cache("F2_VALBRUT","X3_DECIMAL")<= 2,SF2->F2_VALBRUT + _aTotal[103]- _aTotal[037] - IIf(Len(_aTotal[115]) > 0,_aTotal[115][1],0),Round(SF2->F2_VALBRUT,2) + _aTotal[103] - _aTotal[037] - IIf(Len(_aTotal[115]) > 0,_aTotal[115][1],0))),14,_aTotal[106])) + _aTotal[098]
    //TipoDeComprobante
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_ESPECIE) == "NF",IIf(ALLTRIM(SF2->F2_TIPODOC) == "21", "T", "I" ), "E") + _aTotal[098]
    //Exportacion
    (PRE) cCadOrig += IIf(!Empty(_aTotal[113]),_aTotal[113],"01") + _aTotal[098]
    //MetodoPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", Alltrim(SE4->E4_MPAGSAT) + _aTotal[098] )
    //LugarExpedicion
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + _aTotal[098]
    //Periodicidad
    (PRE) cCadOrig += IIf(SF2->(ColumnPos("F2_IDCBAJA")) > 0 .And. SF2->F2_GLOBAL == "1", SF2->F2_IDCBAJA + _aTotal[098],"")
    //Meses
    (PRE) cCadOrig += IIf(SF2->(ColumnPos("F2_MODCONS")) > 0 .And. SF2->F2_GLOBAL == "1", SF2->F2_MODCONS + _aTotal[098],"")
    //Año
    (PRE) cCadOrig += IIf(SF2->(ColumnPos("F2_PTOEMIS")) > 0 .And. SF2->F2_GLOBAL == "1", SF2->F2_PTOEMIS + _aTotal[098],"")

    //////////////////////CFDI Relacionados//////////////////////////
    (PREREG)!Empty(SF2->F2_RELSAT).Or. !Empty(SF2->F2_SERMAN).Or. !Empty(SF2->F2_DOCMAN)
    (PRE) IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","",fGetFolRel("S",.T.))

    ///////////DATOS DEL EMISOR///////////////////////
    //Rfc
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CGC),.F.) + _aTotal[098]
    //Nombre
    (PRE) cCadOrig += CFDCarEsp(_aTotal[075],.F.) + _aTotal[098]
    //RegimenFiscal
    (PRE) cCadOrig += CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + _aTotal[098]

    //////////////////////DATOS DEL RECEPTOR//////////////////////////
    (PRE) AllTrim(SF2->F2_ESPECIE) <> "NDI"
    (PRE) SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA))
    (PRE) SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS))
    //Rfc
    (PRE) (cCadOrig += IIf(!_aTotal[104] .And. ((ALLTRIM(SF2->F2_TIPODOC) == "21" .And. !lCCCE) .Or. SF2->F2_GLOBAL == "1"), "XAXX010101000", CFDCarEsp(_aTotal[108], .F.)) + _aTotal[098])
    //Nombre
    (PRE) (cCadOrig += IIF(SF2->F2_GLOBAL == "1", "PUBLICO EN GENERAL",CFDCarEsp(_aTotal[109],.F.)) + _aTotal[098], .T.)
    //DomicilioFiscalReceptor
    (PRE) (cCadOrig += CFDCarEsp(_aTotal[110],.F.) + _aTotal[098], .T.)
    //ResidenciaFiscal
    (PRE) IIf(lCCCE .And. !Empty(CFDCarEsp(Alltrim(SF2->F2_RESIDE))) .And. !_aTotal[076], cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SF2->F2_RESIDE,"YA_CCESAT")) + _aTotal[098], "")
    //NumRegIdTrib
    (PRE) IIf(lCCCE .And. !Empty(CFDCarEsp(Alltrim(SF2->F2_IDTRIB))) .And. !_aTotal[076], cCadOrig += CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + _aTotal[098], "")
    //RegimenFiscalReceptor
    (PRE) (cCadOrig += IIf(AI0->(ColumnPos("AI0_REGFIS")) > 0,CFDCarEsp(_aTotal[111],.F.) + _aTotal[098],""), .T.)
    //UsoCFDI
    (PRE) (cCadOrig += Alltrim(SF2->F2_USOCFDI) + _aTotal[098], .T.)

    (PRE) (cCadOrig += fXMLFUN("CO",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.)
    (PRE) (cCadOrig += fXMLFUN("TI",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)
    (PRE) (cCadOrig += fXMLFUN("IL",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.) Se debe mover después de la generación de la Cadena Original del Complemento de Carta Porte

    (POS) IIf(lCCCE, cCadOrig += "1.1" + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_TRASLA), cCadOrig += Alltrim(SF2->F2_TRASLA) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_TIPOPE), cCadOrig += IIf(Alltrim(SF2->F2_TIPOPE)=="3","2",Alltrim(SF2->F2_TIPOPE)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_CVEPED), cCadOrig += Alltrim(SF2->F2_CVEPED) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_CERORI), cCadOrig += Alltrim(SF2->F2_CERORI) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_NUMCER), cCadOrig += Alltrim(SF2->F2_NUMCER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_EXPCONF), cCadOrig += Alltrim(SF2->F2_EXPCONF) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_INCOTER), cCadOrig += Alltrim(SF2->F2_INCOTER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_SUBDIV), cCadOrig += Alltrim(SF2->F2_SUBDIV) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. SF2->(ColumnPos("F2_OBSCE")) > 0 .And. !Empty(SF2->F2_OBSCE), cCadOrig += CFDCarEsp(AllTrim(SF2->F2_OBSCE), .F.) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF2->F2_TCUSD)), cCadOrig += Alltrim(Str(SF2->F2_TCUSD)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF2->F2_TOTUSD)), cCadOrig += Alltrim(Str(SF2->F2_TOTUSD,14,2)) + _aTotal[098], "")

    //Emisor
    (POS) IIf(lCCCE , cCadOrig += CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CEPENT), cCadOrig += CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CODZOSE)+ALLTRIM(SM0->M0_CEPENT),1,9,1,4))) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CODMUN), cCadOrig += AllTrim(SM0->M0_CODMUN) + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += "MEX" + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += AllTrim(SM0->M0_CEPENT) + _aTotal[098], "")

    //Receptor Domicilio
    (POS) IIf(lCCCE .And. _aTotal[108] == "XEXX010101000", cCadOrig += CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(AllTrim(SA1->A1_END)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), cCadOrig += AllTrim(SA1->A1_NR_END) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), cCadOrig += AllTrim(SA1->A1_NROINT) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), cCadOrig +=  CFDCarEsp(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))) + _aTotal[098],"")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_MUN))), cCadOrig +=  CFDCarEsp(AllTrim(SA1->A1_MUN),.F.) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(SA1->A1_CEP) + _aTotal[098], "")

    (POS) cCadOrig += IIf(!Empty(cCadOriCCE), cCadOriCCE, "")

    //Carta Porte
    (POS) IIf(_aTotal[011],(cCadOrig += LxFunaCaPo(SF2->F2_FILIAL,SF2->F2_DOC,SF2->F2_SERIE,.T.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.),"")

    (POS) (cCadOrig += fXMLFUN("IL",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)

    (POS) cCadOrig += _aTotal[098]
    (POS) _aTotal[033] := cCadOrig

    //SELLO
    (POS) _aTotal[100] := EVPDigest(cCadOrig,5)
    (POS) _aTotal[100] := PrivSignRSA(&(SuperGetMv("MV_CFDDIRS",,""))+SuperGetMv("MV_CFDARQS",,""),_aTotal[100],6,"assinatura")
    (POS) _aTotal[100] := ENCODE64(_aTotal[100])
    [XXX CABECERA]
    Linha1     C 041 0 Chr(239) + Chr(187) + Chr(191) + '<?xml version="1.0" encoding="UTF-8"?>'
    [XXX FACTURA]
    //Certificado del SAT incluido para pruebas 
    (PRE) cCert := "MIIF5TCCA82gAwIBAgIUMDAwMDEwMDAwMDA1MDI2MzYxOTcwDQYJKoZIhvcNAQEL"
    (PRE) cCert += "BQAwggGEMSAwHgYDVQQDDBdBVVRPUklEQUQgQ0VSVElGSUNBRE9SQTEuMCwGA1UE"
    (PRE) cCert += "CgwlU0VSVklDSU8gREUgQURNSU5JU1RSQUNJT04gVFJJQlVUQVJJQTEaMBgGA1UE"
    (PRE) cCert += "CwwRU0FULUlFUyBBdXRob3JpdHkxKjAoBgkqhkiG9w0BCQEWG2NvbnRhY3RvLnRl"
    (PRE) cCert += "Y25pY29Ac2F0LmdvYi5teDEmMCQGA1UECQwdQVYuIEhJREFMR08gNzcsIENPTC4g"
    (PRE) cCert += "R1VFUlJFUk8xDjAMBgNVBBEMBTA2MzAwMQswCQYDVQQGEwJNWDEZMBcGA1UECAwQ"
    (PRE) cCert += "Q0lVREFEIERFIE1FWElDTzETMBEGA1UEBwwKQ1VBVUhURU1PQzEVMBMGA1UELRMM"
    (PRE) cCert += "U0FUOTcwNzAxTk4zMVwwWgYJKoZIhvcNAQkCE01yZXNwb25zYWJsZTogQURNSU5J"
    (PRE) cCert += "U1RSQUNJT04gQ0VOVFJBTCBERSBTRVJWSUNJT1MgVFJJQlVUQVJJT1MgQUwgQ09O"
    (PRE) cCert += "VFJJQlVZRU5URTAeFw0yMDAxMDYyMjIwMzhaFw0yNDAxMDYyMjIwMzhaMIGzMR4w"
    (PRE) cCert += "HAYDVQQDExVUT1RWUyBNRVhJQ08gU0EgREUgQ1YxHjAcBgNVBCkTFVRPVFZTIE1F"
    (PRE) cCert += "WElDTyBTQSBERSBDVjEeMBwGA1UEChMVVE9UVlMgTUVYSUNPIFNBIERFIENWMSUw"
    (PRE) cCert += "IwYDVQQtExxUTUUwMzExMTJCQzAgLyBIRVJNNjcwODI4MkU0MR4wHAYDVQQFExUg"
    (PRE) cCert += "LyBIRVJNNjcwODI4SERGUkJOMDMxCjAIBgNVBAsTATEwggEiMA0GCSqGSIb3DQEB"
    (PRE) cCert += "AQUAA4IBDwAwggEKAoIBAQDSxcVwA52Ec5xakhUEyuaeozyzccDhukYJuXYDuLxH"
    (PRE) cCert += "lDtiTdCE5Bof3c1wVN+EAvTvOBCvXcCOeLgo6EJlc6hArdFIKaiH+Ylf2xmq3u89"
    (PRE) cCert += "X1JgwwbrqyTJoC6bw1fbyeDAGVsV7yGRs8YsZ65AU2RKK6L5GiyQKampRpaTiBoU"
    (PRE) cCert += "pp5NR+B41+lc46rFI2wQrXGzry+vIkCnyJSH7w0XUgrDChyk8ORLdmQicUY0xkcy"
    (PRE) cCert += "b3ql5Uvkd3AF+7RMck8gow8dby10rctjoCN4KY/wyWu5j7PHguH9rgbuOpo14hON"
    (PRE) cCert += "Hx7720Eo1KA6GK3jPqVdpG7wfm6EVE0Kf9K7F471wZoRAgMBAAGjHTAbMAwGA1Ud"
    (PRE) cCert += "EwEB/wQCMAAwCwYDVR0PBAQDAgbAMA0GCSqGSIb3DQEBCwUAA4ICAQBa+6i9/Qto"
    (PRE) cCert += "ouwZNQIOZALwkAzEJfEasxQkm+Ggu2xhNJc75A1/qMxaKi84YCFDMr1eWwjQEs9H"
    (PRE) cCert += "nfdwZKjkF/55vgQoTMEZBlemG5IJPwMDy01ho4FAShYG780sdPpa9RMYzjE1o82O"
    (PRE) cCert += "226yv5ksy1yBySoGY7NWyRj1f5zCXQfyE8fAwAkaNiMmZYljztWg0cPvEG+gOgFl"
    (PRE) cCert += "aLhy9YFMkFp3wEZjn/vZP5tbMvXCm3wRbf5ncJUCbr0xkpkDMIvgV/obTAfllvB0"
    (PRE) cCert += "mQuVjLsTTA43NkvmpaV9+yYhvvzD24TOnZE8goB6C1bu8MooyMnVg6+RthZxLmzb"
    (PRE) cCert += "syw+FkMzpjfMJU/J5nZL9VAZgdDX4H3wtmupAfKmL1hm95D9s0VA7sSFeAJkPvWG"
    (PRE) cCert += "8ZcjlridsAFbSIFcfc8S8+NqBMKNFJsRF4X2Yj2Wxq3ZrNe9lPeq5skot9iJ9bz/"
    (PRE) cCert += "1sfVTTqmqw1S3w13aCIqkwzU2aFpC7aMHT13Fx2SK5djvlnR0aHNycGxjA46iq+b"
    (PRE) cCert += "vdHtC2Tqf/ZHJB/jeogiUeISbJ+uUHNEbXaE3YLsuhEsbNi7E++MRS/CtUeOxXZx"
    (PRE) cCert += "FgnV6luIS1kzu+7aj4WR+m3Gweo6pOuz2s1MhtASDIucGWMyJm30DiWSZkrKmyTr"
    (PRE) cCert += "OG6983CcMAhLkT16E0a32/Fn9OgZfiSMsg=="

    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114], .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SYA->(MsSeek(xFilial("SYA")+SA2->A2_PAIS)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) _aTotal[001] := '<cfdi:Comprobante'
    (PRE) _aTotal[001] += ' xmlns:cfdi="http://www.sat.gob.mx/cfd/4"'
    (PRE) _aTotal[001] += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
    (PRE) _aTotal[001] += Iif(_aTotal[104],' xmlns:cartaporte20="http://www.sat.gob.mx/CartaPorte20"','')
    (PRE) _aTotal[001] += ' xmlns:implocal="http://www.sat.gob.mx/implocal"'
    (PRE) _aTotal[001] += IIf(lCCCE .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", ' xmlns:leyendasFisc="http://www.sat.gob.mx/leyendasFiscales"' , "")
    (PRE) _aTotal[001] += ' xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd '
    (PRE) _aTotal[001] += IIF(lCCCE,'http://www.sat.gob.mx/ComercioExterior11 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd ','http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd')
    (PRE) _aTotal[001] += IIf(_aTotal[104],'http://www.sat.gob.mx/CartaPorte20 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte20.xsd','')
    (PRE) _aTotal[001] += IIf(lCCCE .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", ' http://www.sat.gob.mx/leyendasFiscales http://www.sat.gob.mx/sitio_internet/cfd/leyendasFiscales/leyendasFisc.xsd"' , '"')
    (PRE) _aTotal[001] += IIf(lCCCE, ' xmlns:cce11="http://www.sat.gob.mx/ComercioExterior11"' , "")
    (PRE) _aTotal[001] += ' Version="4.0"'
    (PRE) _aTotal[001] += ' Serie="' + Alltrim(SF2->F2_SERIE) + '"'
    (PRE) _aTotal[001] += ' Folio="' + Alltrim(SF2->F2_DOC) + '"'
    (PRE) _aTotal[001] += ' Fecha="' + Alltrim(_aTotal[096]) + '"'
    (PRE) _aTotal[001] += ' Sello="' + Alltrim(_aTotal[100]) + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' FormaPago="' +  IIf(SF2->F2_GLOBAL == '1',IIf(!Empty(_aTotal[112]),_aTotal[112],_aTotal[107]),IIf(Empty(_aTotal[107]) .Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",_aTotal[107])) + '"' )
    (PRE) _aTotal[001] += ' NoCertificado="' + Alltrim(SF2->F2_CERTFOL) + '"'
    (PRE) _aTotal[001] += ' Certificado="' + cCert + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' CondicionesDePago="' +  CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + '"' ) 
    (PRE) _aTotal[001] += ' SubTotal="' + Alltrim(STR(IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, (SF2->(F2_VALMERC+F2_FRETE+F2_SEGURO+F2_DESPESA)  + _aTotal[103] + SF2->F2_DESCONT) - _aTotal[036] - _aTotal[037] ),14,_aTotal[106])) + '"'
    (PRE) _aTotal[001] += IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", "", IIf( SF2->F2_DESCONT == 0, "", ' Descuento="' + Alltrim(STR(SF2->F2_DESCONT,14,2)) + '"' ))
    (PRE) _aTotal[001] += ' Moneda="' + IIf(Alltrim(SF2->F2_TIPODOC) == "21","XXX",Alltrim(CTO->CTO_MOESAT)) + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' TipoCambio="' + IIf(Alltrim(CTO->CTO_MOESAT) <> "MXN", Alltrim(STR(SF2->F2_TXMOEDA,14,2)), "1") + '"') 
    (PRE) _aTotal[001] += ' Total="' + Alltrim(Str(IIf(Alltrim(SF2->F2_TIPODOC) == "21", 0, IIf(GetSx3Cache("F2_VALBRUT","X3_DECIMAL") <= 2,SF2->F2_VALBRUT + _aTotal[103] - _aTotal[037] - _aTotal[038] - IIf(Len(_aTotal[115]) > 0,_aTotal[115][1],0),Round(SF2->F2_VALBRUT,2) + _aTotal[103] - _aTotal[037] - _aTotal[038] - IIf(Len(_aTotal[115]) > 0,_aTotal[115][1],0))),14,_aTotal[106])) +  '"'
    (PRE) _aTotal[001] += ' TipoDeComprobante="' + IIf(Alltrim(SF2->F2_ESPECIE) == "NF",IIf(Alltrim(SF2->F2_TIPODOC) == "21", "T", "I"), "E") + '"'
    (PRE) _aTotal[001] += ' Exportacion="'+IIf(!Empty(_aTotal[113]),_aTotal[113],"01")+'"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' MetodoPago="' +  Alltrim(SE4->E4_MPAGSAT) + '"' )
    (PRE) _aTotal[001] += ' LugarExpedicion="' + CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + '"'
    (PRE) _aTotal[001] += '>'
    (PREREG) _aTotal[001]

    (POS) cNodoCCE := IIf(lCCCE, '        <cce11:ComercioExterior' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' Version="1.1"' , "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_TRASLA), ' MotivoTraslado="' + Alltrim(SF2->F2_TRASLA) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_TIPOPE), ' TipoOperacion="' + IIF(Alltrim(SF2->F2_TIPOPE)== "3","2",Alltrim(SF2->F2_TIPOPE)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_CVEPED), ' ClaveDePedimento="' + Alltrim(SF2->F2_CVEPED) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_CERORI), ' CertificadoOrigen="' + Alltrim(SF2->F2_CERORI) +'"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_NUMCER), ' NumCertificadoOrigen="' + Alltrim(SF2->F2_NUMCER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_EXPCONF), ' NumeroExportadorConfiable="' + Alltrim(SF2->F2_EXPCONF) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_INCOTER), ' Incoterm="' + Alltrim(SF2->F2_INCOTER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_SUBDIV), ' Subdivision="' + Alltrim(SF2->F2_SUBDIV) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. SF2->(ColumnPos("F2_OBSCE")) > 0 .And. !Empty(SF2->F2_OBSCE), ' Observaciones="' + CFDCarEsp(AllTrim(SF2->F2_OBSCE), .T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF2->F2_TCUSD)), ' TipoCambioUSD="' + Alltrim(Str(SF2->F2_TCUSD)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF2->F2_TOTUSD)), ' TotalUSD="' + Alltrim(Str(SF2->F2_TOTUSD,14,2)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "")
    (POS) _aTotal[094] := cNodoCCE

    [XXX CFDIREL]
    (PREREG) !Empty(SF2->F2_RELSAT).Or. !Empty(SF2->F2_SERMAN).Or. !Empty(SF2->F2_DOCMAN)
    (PREREG) (_aTotal[001] := IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","",fGetFolRel("S")))
    (PREREG) _aTotal[001]

    [XXX FACTURA GLOBAL]
    (PRE) (_aTotal[001] := IIF(SF2->F2_GLOBAL == "1",'    <cfdi:InformacionGlobal ',""))
    (PRE) (_aTotal[001] += Iif(SF2->(ColumnPos("F2_IDCBAJA")) > 0 .and. SF2->F2_GLOBAL == "1" ,' Periodicidad="' + SF2->F2_IDCBAJA  + '"',""))
    (PRE) (_aTotal[001] += Iif(SF2->(ColumnPos("F2_MODCONS")) > 0 .and. SF2->F2_GLOBAL == "1" ,' Meses="' + SF2->F2_MODCONS  + '"',""))
    (PRE) (_aTotal[001] += Iif(SF2->(ColumnPos("F2_PTOEMIS")) > 0 .and. SF2->F2_GLOBAL == "1" ,' Año="' + SF2->F2_PTOEMIS  + '"',""))
    (PRE) (_aTotal[001] += IIF(SF2->F2_GLOBAL == "1",'/>' ,""))
    (PRE) (_aTotal[001] := IIF(SF2->F2_GLOBAL == "1",_aTotal[001] ,""))
    (PREREG) _aTotal[001]

    [XXX EMISOR]
    (PRE) (_aTotal[001] := '    <cfdi:Emisor'  , .T.)
    (PRE) (_aTotal[001] += ' Rfc="' + CFDCarEsp(AllTrim(SM0->M0_CGC))+ '"'  , .T.)
    (PRE) (_aTotal[001] += ' Nombre="' + CFDCarEsp(_aTotal[075],.T.) + '"'  , .T.)
    (PRE) (_aTotal[001] += ' RegimenFiscal="' + CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + '"'  , .T.)
    (PRE) (_aTotal[001] += '/>'  , .T.)
    (PRE) (_aTotal[001] := _aTotal[001]  , .T.)
    (PREREG) _aTotal[001]

    [XXX RECEPTOR_CLIENTE]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114], .T., .F.)
    (PRE) cNodoCCE := ""

    (PREREG) AllTrim(SF2->F2_ESPECIE) <> "NDI"
    (PREREG) (SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PREREG) (SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PREREG) (_aTotal[001] := '    <cfdi:Receptor' , .T.)
    (PREREG) (_aTotal[001] += ' Rfc="' + CFDCarEsp(IIf(!_aTotal[104] .And.((Alltrim(SF2->F2_TIPODOC) == "21" .And. !lCCCE) .Or. SF2->F2_GLOBAL == "1"), "XAXX010101000", _aTotal[108])) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' Nombre="' + iif(SF2->F2_GLOBAL == "1","PUBLICO EN GENERAL",CFDCarEsp(_aTotal[109],.T.)) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' DomicilioFiscalReceptor="' + _aTotal[110] + '"' , .T.)
    (PREREG) (_aTotal[001] += Iif(AI0->(ColumnPos("AI0_REGFIS")) > 0,' RegimenFiscalReceptor="' + _aTotal[111] + '"',""), .T.)
    (PREREG) (_aTotal[001] += ' UsoCFDI="' + Alltrim(SF2->F2_USOCFDI) + '"' , .T.)
    (PREREG) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB)))) .And. !_aTotal[076], (_aTotal[001] += ' NumRegIdTrib="' + CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + '"' , .T.), "") 
    (PREREG) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(AllTrim(SF2->F2_RESIDE)))) .And. !_aTotal[076], (_aTotal[001] += ' ResidenciaFiscal="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SF2->F2_RESIDE,"YA_CCESAT")) + '"' , .T.), "")
    (PREREG) (_aTotal[001] += '/>' ,.T.)
    (PREREG) (_aTotal[001] := _aTotal[001] , .T.)
    (PREREG) _aTotal[001]

    (POS) cNodoCCE += IIf(lCCCE, '            <cce11:Emisor' , "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 
    (POS) cNodoCCE += IIf(lCCCE, '                <cce11:Domicilio' , "")        
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))), ' Colonia="' + CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CODZOSE)+ALLTRIM(SM0->M0_CEPENT),1,9,1,4))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SM0->M0_CEPENT))), ' Municipio="' + CFDCarEsp(AllTrim(SM0->M0_CODMUN)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim("MEX") + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SM0->M0_CEPENT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            </cce11:Emisor>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            <cce11:Receptor ' + IIf(_aTotal[108]=="XEXX010101000", 'NumRegIdTrib="' + CFDCarEsp(AllTrim(SF2->F2_IDTRIB)) + '"',""), "")     
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 
    (POS) cNodoCCE += IIf(lCCCE, '                <cce11:Domicilio' , "")        
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SA1->A1_END)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), ' NumeroExterior="' + AllTrim(SA1->A1_NR_END) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), ' NumeroInterior="' + AllTrim(SA1->A1_NROINT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), ' Colonia="' + CFDCarEsp(AllTrim(SA1->A1_BAIRRO)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_MUN)), ' Municipio="' + CFDCarEsp(AllTrim(SA1->A1_MUN),.T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SA1->A1_CEP) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            </cce11:Receptor>' + ( chr(13)+chr(10) ), "") 

    (POS) (cNodoCCE += IIf(lCCCE, '            <cce11:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    [SD2 CONCEPTO]
    (PRE) lCCCE    := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114] , .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) DbGoTop()

    (PREREG) (cNodoCCE += IIf(lCCCE, '                  <cce11:Mercancia' , ""),.T.)      
    (PREREG) (cNodoCCE += IIf(lCCCE , ' NoIdentificacion="' + Alltrim(SD2->D2_ITEM + SD2->D2_COD) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), ' FraccionArancelaria="' + Alltrim(SD2->D2_FRACCA) + Alltrim(SD2->D2_NICO) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD2->D2_CANADU)), ' CantidadAduana="' + Alltrim(Str(SD2->D2_CANADU)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), ' UnidadAduana="' + AllTrim(ObtColSAT("S014",AllTrim(SD2->D2_FRACCA),1,8,9,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD2->D2_VALADU)), ' ValorUnitarioAduana="' + Alltrim(Str(SD2->D2_VALADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, ' ValorDolares="' + Alltrim(Str(SD2->D2_USDADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ) , ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '                  </cce11:Mercancia>' + ( chr(13)+chr(10) ), ""),.T.)

    (POS) (cNodoCCE += IIf(lCCCE, '            </cce11:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) (cNodoCCE += IIf(lCCCE, '        </cce11:ComercioExterior>' , ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    (POS) (_aTotal[034] := fXMLFUN("CO",.F., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.)
     
    [XXX CONCEPTOS]
    (POS) FsQuery(_aTotal[097],2)

    (PREREG) (_aTotal[001] := _aTotal[034] ,.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOS]
    (PREREG) (_aTotal[002] := fXMLFUN("TI",.F.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)
    (PREREG) _aTotal[002]

    //IMPUESTOS LOCALES//
    (PRE) (_aTotal[095] := fXMLFUN("IL",.F.),.T.)

    [XXX COMPLEMENT]
    (PREREG) IIf(_aTotal[011],_aTotal[105] := LxFunaCaPo(SF2->F2_FILIAL,SF2->F2_DOC,SF2->F2_SERIE,.F.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),"")
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095] ) .Or. !Empty(_aTotal[105]) .or. _aTotal[104] , '    <cfdi:Complemento', ""), .T.)
    (PREREG) (_aTotal[001] += IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095] ) .Or. !Empty(_aTotal[105]),'>',""),.T.)
    (PREREG) _aTotal[001]
    COMPLEMENT  C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.T.,.F.,4))


    [XXX COMERCIOEX]
    (PREREG) (_aTotal[001] := _aTotal[094],.T.)
    (PREREG) _aTotal[001]

    [XXX CARTAPORTE]
    (PREREG) (_aTotal[001] := _aTotal[105],.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOLOC]
    (PREREG) (_aTotal[001] := _aTotal[095],.T.)
    (PREREG) _aTotal[001]

    [XXX LEYENDASFIS]
    (PREREG) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114], .T., .F.) .And. SF2->(FieldPos("F2_CONUNI")) > 0
    (PREREG) lCCCE
    (PREREG) (_aTotal[001] := IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF" , '        <leyendasFisc:LeyendasFiscales version="1.0" >'+ ( chr(13)+chr(10) ), ""), .T.)
    (PREREG) (_aTotal[001] += IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF" , '            <leyendasFisc:Leyenda textoLeyenda=', ""), .T.)
    (PREREG) (_aTotal[001] += IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. SF2->F2_CONUNI=="1" .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", '"IMMEX:'+ AllTrim(SA1->A1_PFISICA) +' ' + _aTotal[101] +'" />', IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. SF2->F2_CONUNI=="2" .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF",'"IMMEX:'+ AllTrim(SA1->A1_PFISICA) + ' ' + _aTotal[102] +'" />',"")), .T.)
    (PREREG) _aTotal[001]
    (PREREG) (_aTotal[001] := IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF",'        </leyendasFisc:LeyendasFiscales>', ""), .T.)
    (PREREG) _aTotal[001]


    [XXX COMPLEMENT]
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094]) .or. !EMPTY(_aTotal[095]) .or. !EMPTY(_aTotal[105]),'    </cfdi:Complemento>',""), .T.)
    (PREREG) _aTotal[001]
    COMPLEMENT  C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.F.,.T.,4))

    //[XXX CAD_ORIG]
    //(PREREG) _aTotal[033] 

    [XXX FACTURA]
    (PRE) _aTotal[095] := &(GetNewPar("MV_CFDNAF2","Lower(AllTrim(SF2->F2_ESPECIE)) + '_' + Lower(AllTrim(SF2->F2_SERIE)) + '_'  + Lower(AllTrim(SF2->F2_DOC)) + '.xml'"))
    (ARQ) _aTotal[095]
    FACTURA    C 019 0 ENCODEUTF8(XMLConv("",,,"cfdi:Comprobante",.F.,.T.,0))


    Catálogo de Objeto Impuesto:

    Informações

    View file
    namec_ObjetoImp.zip
    height250


    Actualizaciones en la tabla SXB-Consultas Estándar.

    Creación de la consulta específica MEX031 - Objeto Impuesto.

    Alias

    Tipo

    Secuencia

    Columna

    Descripción

    Contenido

    MEX031101REObjeto ImpuestoF3I
    MEX03120101
    F812SXB("S031","Codigo")
    MEX031501

    VAR_IXB

    Activar el siguiente campo en la tabla SD2 - Ítems de Venta de la Fact:

    Campo

    Contenido

    CampoD2_NIT
    Tipo1 - Caracter
    Tamaño2
    Decimal0
    Formato@!
    ContextoReal
    PropiedadModificar
    Tit. EspañolObjeto Imp
    Des. EspañolObjeto Impuesto
    ValidaciónVazio() .or. ValidF3I("S031", M->D2_NIT,1,2)
    UsadoSi
    HelpIndica si el Concepto del CFDI es Objeto de Impuesto, y el valor debe corresponder a un valor del catálogo c_ObjetoImp definido por el SAT. (Tabla S031 - Catálogo Objeto Impuesto), si el código es 01, 03 o 04 no se generará el nodo de Impuestos del Concepto.



    5.18 Actualización Facturación electrónica Complemento de Comercio Exterior versión 2.0


    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación
    Función:

    Rutina

    Nombre

    Fecha

    LOCXMEX.prwFunciones Genéricas para Documentos Fiscales para México.26/01/2024
    FATXFUMI.prwFunciones genéricas para Facturación - Mercado Internacional26/01/2024
    FATSMEX.prwGeneración de XML para Documentos de Salida26/01/2024
    FATEMEX.prwGeneración de XML para Documentos de Entrada26/01/2024
    FATSMEX.iniScript de generación de los archivos XML para Notas Fiscales de Salida.26/01/2024
    FATEMEX.iniScript de generación de los archivos XML para Notas Fiscales de Entrada.26/01/2024
    INPUTFIELDSMEX.TLPPGeneración de estructuras para campos de entrada de México.26/01/2024
    OUTPUTFIELDSMEX.TLPP

    Generación de estructuras para campos de salidas de México.

    26/01/2024
    País:MEX
    Ticket:19082264 
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-22099


    SITUACIÓN/REQUISITO

    De acuerdo a lo publicado por el SAT el 18/01/2024 entró en vigor los cambios del complemento de comercio exterior 2.0, sin embargo actualmente el sistema solo considera la versión 1.1 de dicho complemento. Por lo anterior, se solicita la funcionalidad y/o documentación para implementar el complemento de comercio exterior 2.0.

    Sustento Legal:

    Factura de Comercio Exterior 2.0 SAT
    Estándar del Complemento de Comercio Exterior 2.0

    SOLUCIÓN

    Dentro de la rutina Funciones Genéricas para Documentos Fiscales para México(LOCXMEX), se realizan los siguientes ajustes:

    • En la función encargada de cargar los campos del encabezado de los documentos fiscales (LxCposMex), se realiza la omisión del campo Subdivisión (F2_SUBDIV | F1_SUBDIV) para que ya no sea mostrado en el encabezado de las Facturas de Venta (NF), Notas de Débito de Cliente (NDC) y Notas de Crédito de Cliente (NCC).
    • En la función encargada de Valida campos de encabezado de documento fiscal, para complemento de comercio exterior (xVldCmObCE), se omiten las validaciones del campo Subdivisión (F2_SUBDIV | F1_SUBDIV).

     Dentro de la rutina Funciones genéricas para Facturación - Mercado Internacional(FATXFUMI), se realizan los siguientes ajustes:

    • Dentro de la función encargada de Generar la Cadena Original y nodo en el XML para informar los datos correspondientes al Complemento de Comercio Exterior (FATXCOMEXT), se realiza la actualización de los nodos de Complemento de comercio exterior de la versión 1.1 a la nueva versión 2.0. Se cambia el identificador cce11 por cce20.
    • Se omite la impresión de los 2 nodos TipoOperacion y Subdivisión, ya que para la nueva versión ya no son requeridos.


    INFORMACIÓN ADICIONAL


    Configuración de archivos INI.

    En los script de "Generación de XML de documentos de salida."(FATSMEX.INI) y "Generación de XML de documentos de entrada."(FATEMEX).INI) se realizan los ajustes:



    Aviso
    titleImportante
    • Los nodos TipoOperacion y Subdivisión ya no son requeridos, por lo que deben ser omitidos para que no sean mostrados en el XML y cadena orginal.
    • El atributo NumRegIdTrib para los nodos de cfdi:Receptor y cce20:Receptor es requerido. En caso del nodo cce20:Receptor, si el nodo TipoDeComprobante es igual a "T", el  atributo NumRegIdTrib no es requerido.
    Aviso
    titleImportante
    • En el caso de estar utilizando el Proveedor Autorizado de Certificación (PAC) denominado como InvoiceOne, cuando el atributo "CodigoPostal" del nodo cce20:Domicilio cuente con una localidad ligada conforme al catalogo del SAT c_CodigoPostal(http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/c_CodigoPostal_V_4_20231219.xls), el atributo "Localidad" debe existir como en el siguiente ejemplo:
      • Image Added 
    • Para este ajuste es necesario contar con el catálogo c_CodigoPostal(http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/c_CodigoPostal_V_4_20231219.xlsactualizado y contan con los siguientes ajustes en el los archivos .INI:
      • Para cadena original:
        • (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))) .And. !Empty(CFDCarEsp(AllTrim(ObtColSAT("S004",ALLTRIM(SM0->M0_CEPENT)+CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + AllTrim(SM0->M0_CODMUN),1,11,12,2)))), cCadOrig += CFDCarEsp(AllTrim(ObtColSAT("S004",ALLTRIM(SM0->M0_CEPENT)+CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + AllTrim(SM0->M0_CODMUN),1,11,12,2)))+ _aTotal[098], "")


          Painel
          titleDatos Emisor Comercio Exterior

          //Emisor
          (POS) IIf(lCCCE , cCadOrig += CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + _aTotal[098], "")
          (POS) IIf(lCCCE .And. !Empty(SM0->M0_CEPENT), cCadOrig += CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CODZOSE)+ALLTRIM(SM0->M0_CEPENT),1,9,1,4))) + _aTotal[098], "")
          (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))) .And. !Empty(CFDCarEsp(AllTrim(ObtColSAT("S004",ALLTRIM(SM0->M0_CEPENT)+CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + AllTrim(SM0->M0_CODMUN),1,11,12,2)))), cCadOrig += CFDCarEsp(AllTrim(ObtColSAT("S004",ALLTRIM(SM0->M0_CEPENT)+CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + AllTrim(SM0->M0_CODMUN),1,11,12,2)))+ _aTotal[098], "")
          (POS) IIf(lCCCE .And. !Empty(SM0->M0_CODMUN), cCadOrig += AllTrim(SM0->M0_CODMUN) + _aTotal[098], "")
          (POS) IIf(lCCCE , cCadOrig += CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + _aTotal[098], "")
          (POS) IIf(lCCCE , cCadOrig += "MEX" + _aTotal[098], "")
          (POS) IIf(lCCCE , cCadOrig += AllTrim(SM0->M0_CEPENT) + _aTotal[098], "")

      • Para XML:
        • (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))) .And. !Empty(CFDCarEsp(AllTrim(ObtColSAT("S004",ALLTRIM(SM0->M0_CEPENT)+CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + AllTrim(SM0->M0_CODMUN),1,11,12,2)))), ' Localidad="' + CFDCarEsp(AllTrim(ObtColSAT("S004",ALLTRIM(SM0->M0_CEPENT)+CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + AllTrim(SM0->M0_CODMUN),1,11,12,2)))+ '"', "")


          Painel
          titleDatos Emisor Comercio Exterior

          (POS) cNodoCCE += IIf(lCCCE, '            <cce20:Emisor' , "")
          (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 
          (POS) cNodoCCE += IIf(lCCCE, '                <cce20:Domicilio' , "")        
          (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + '"', "")
          (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))), ' Colonia="' + CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CODZOSE)+ALLTRIM(SM0->M0_CEPENT),1,9,1,4))) + '"', "")
          (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))) .And. !Empty(CFDCarEsp(AllTrim(ObtColSAT("S004",ALLTRIM(SM0->M0_CEPENT)+CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + AllTrim(SM0->M0_CODMUN),1,11,12,2)))), ' Localidad="' + CFDCarEsp(AllTrim(ObtColSAT("S004",ALLTRIM(SM0->M0_CEPENT)+CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + AllTrim(SM0->M0_CODMUN),1,11,12,2)))+ '"', "")
          (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SM0->M0_CEPENT))), ' Municipio="' + CFDCarEsp(AllTrim(SM0->M0_CODMUN)) + '"', "")
          (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + '"', "")
          (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim("MEX") + '"', "")
          (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SM0->M0_CEPENT) + '"', "")
          (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
          (POS) cNodoCCE += IIf(lCCCE, '            </cce20:Emisor>' + ( chr(13)+chr(10) ), "")

    Informações
    titleInformación


    • Desde la versión anterior de Complemento de Comercio exterior, para el nodo NumeroExportadorConfiable se debe cumplir la siguiente regla según la guia del SAT(http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/EstandarComercioExterior_v20.pdf):
      • Si la clave de país del receptor o del destinatario no corresponde a un país del catálogo c_Pais del comprobante fiscal, donde la columna “Agrupación” tenga el valor “Unión Europea”, este campo no debe registrarse.
        Ejemplo:
        NumeroExportadorConfiable= Az3Ññ&-wdctghnujk9\, ó
        A569874-35
    • Para el ValorUnitarioAduana  ahora es posible informar hasta 6 decimales. El usuario tiene la libertad de configurar los decimales de necesite usando la función STR, a continuación un se muestra un ejemplo a 2, 4 y 6 decimales:
      • Para 2 decimales - "ValorUnitarioAduana="' + Alltrim(Str(SD1->D1_VALADU,14,2)) + '"' 
      • Para 4 decimales - ValorUnitarioAduana="' + Alltrim(Str(SD1->D1_VALADU,14,4)) + '"'
      • Para 6 decimales - ValorUnitarioAduana="' + Alltrim(Str(SD1->D1_VALADU,14,6)) + '"'
    • Para el ValorUSD ahora es posible informar hasta 4 decimales. El usuario tiene la libertad de configurar los decimales de necesite usando la función STR, a continuación un se muestra un ejemplo a 2, 4 y 6 decimales:
      • Para 2 decimales - "ValorUnitarioAduana="' + Alltrim(Str(SD1->D1_USDADU,14,2)) + '"' 
      • Para 4 decimales - ValorUnitarioAduana="' + Alltrim(Str(SD1->D1_USDADU,14,4)) + '"'
      • Para 6 decimales - ValorUnitarioAduana="' + Alltrim(Str(SD1->D1_USDADU,14,6)) + '"',


    A continuación se muestran marcados con color rojo los cambios que son necesarios realizar en los archivos de configuración FATSMEX.ini y FATEMEX.ini:

    Painel
    borderWidth2
    titleBGColorlightblue
    borderStylesolid
    titleFATSMEX.INI

    //FATSMEX.INI V4.0 --- Modelo 2022

    [XXX POSICIONAMENTOS]
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SA2->(MSSeek(xFilial("SA2")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)

    [XXX INICIALIZACION]
    (PRE) SD2->(DbSetOrder(1))
    (PRE) SB1->(DbSetOrder(1))
    (PRE) SYA->(DbSetOrder(1))
    (PRE) SC6->(DbSetOrder(1))
    (PRE) SE4->(DbSetOrder(1)) 
    (PRE) CTO->(DbSetOrder(1)) 
    (PRE) SAH->(DbSetOrder(1)) 
    (PRE) _aTotal[009] := SuperGetMV("MV_CFDICPG", .F., "")
    (PRE) _aTotal[010] := FindFunction("zh_FechaHoraUTC") .And. !Empty(_aTotal[009])
    (PRE) _aTotal[011] := FindFunction("LxFunaCaPo")
    (PRE) _aTotal[094] := ""
    (PRE) _aTotal[095] := ""
    (PRE) _aTotal[033] := ""
    (PRE) _aTotal[034] := ""
    (PRE) _aTotal[035] := ""
    (PRE) _aTotal[036] := 0
    (PRE) _aTotal[037] := 0
    (PRE) _aTotal[038] := 0
    (PRE) _aTotal[039] := SuperGetMV("MV_CFDIEXP",.F.,.F.)
    (PRE) _aTotal[075] := Alltrim(SM0->M0_NOMECOM)
    (PRE) _aTotal[076] := ((_aTotal[039] .And. !Empty(SF2->F2_TIPOPE)) .Or. SF2->(ColumnPos("F2_TPCOMPL")) > 0 .And. AllTrim(SF2->F2_TPCOMPL)=="S") .And. Alltrim(SF2->F2_TIPODOC) == "21"
    (PRE) IIf(_aTotal[010],_aTotal[096] := zh_FechaHoraUTC(Alltrim(_aTotal[009]),Alltrim(SM0->M0_CEPENT),SF2->F2_EMISSAO,SF2->F2_HORA),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] := DtoS(SF2->F2_EMISSAO),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] := Left(_aTotal[096],4) + "-" + Substr(_aTotal[096],5,2)+ "-" + Right(_aTotal[096],2),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] += "T" + SF2->F2_HORA,"")
    (PRE) _aTotal[097] := {"SD2",""}
    (PRE) _aTotal[098] := "|"
    (PRE) _aTotal[099] := "||"
    (PRE) _aTotal[100] := ""
    (PRE) _aTotal[101] := "OPERACION DE CONFORMIDAD CON EL ART. 29 FRACCION I DE LIVA Y LO ESTIPULADO EN LAS RGCE 5.2.6. FRACCION I, 5.2.7 Y 4.3.21"
    (PRE) _aTotal[102] := "OPERACION DE CONFORMIDAD CON EL ART. 29 FRACCION I DE LIVA Y LO ESTIPULADO EN LAS RGCE 5.2.6. FRACCION II, 5.2.7 Y 4.3.21"
    (PRE) _aTotal[103] := fSumBC(SF2->F2_DOC,SF2->F2_SERIE,SF2->F2_CLIENTE,SF2->F2_LOJA)
    (PRE) _aTotal[104] := IIf(SF2->(ColumnPos("F2_TPCOMPL")) > 0 .And. AllTrim(SF2->F2_TPCOMPL)=="S",.T.,.F.)
    (PRE) _aTotal[105] := ""
    (PRE) _aTotal[106] := IIf(Alltrim(SF2->F2_TIPODOC) == "21",0,2)
    (PRE) _aTotal[107] := IIf(SF2->(ColumnPos("F2_TPDOC")) > 0,ALLTRIM(SF2->F2_TPDOC),ALLTRIM(AI0->AI0_MPAGO))
    (PRE) _aTotal[108] := IIf(_aTotal[076],AllTrim(SM0->M0_CGC),AllTrim(SA1->A1_CGC))
    (PRE) _aTotal[109] := IIf(FindFunction("FxDelExp"),FxDelExp(IIf(_aTotal[076],_aTotal[075],Alltrim(SA1->A1_NOME))),IIf(_aTotal[076],_aTotal[075],Alltrim(SA1->A1_NOME)))
    (PRE) _aTotal[110] := IIf(_aTotal[076],AllTrim(SM0->M0_CEPENT),Alltrim(SA1->A1_CEP))
    (PRE) _aTotal[111] := IIf(_aTotal[076],Alltrim(SM0->M0_DSCCNA),Alltrim(AI0->AI0_REGFIS))
    (PRE) _aTotal[112] := FormPagGlo(SF2->F2_DOC,SF2->F2_SERIE)
    (PRE) _aTotal[113] := IIf(!_aTotal[039] .Or. (_aTotal[039] .And. Empty(SF2->F2_TIPOPE)),"01",IIf(SF2->F2_CVEPED !="A1" .Or. Alltrim(SF2->F2_TIPOPE)== "3","04","02"))
    (PRE) _aTotal[114] := IIf(_aTotal[113] == "04" .And.( Empty(SF2->F2_CERORI) .Or. Empty(SF2->F2_INCOTER) .Or. Empty(SF2->F2_SUBDIV) .Or. Empty(SF2->F2_TCUSD) .Or. Empty(SF2->F2_TOTUSD)) ,.F.,.T.)
    (PRE) _aTotal[115] := {}
    (PRE) lCCCE        := .F.
    (PRE) cNodoCCE     := ""
    (PREREG) FsQuery(_aTotal[097],1,"D2_DOC='" + SF2->F2_DOC + "' AND D2_SERIE='" + SF2->F2_SERIE + "' AND D2_CLIENTE='" + SF2->F2_CLIENTE + "' AND D2_LOJA='" + SF2->F2_LOJA + "'","SD2->D2_DOC=SF2->F2_DOC .AND. SD2->D2_SERIE=SF2->F2_SERIE .AND. SD2->D2_CLIENTE=SF2->F2_CLIENTE .AND. SD2->D2_LOJA=SF2->F2_LOJA","D2_ITEM") .And. .T.

    (PRE) fImptosD(SF2->F2_DOC,SF2->F2_SERIE,SF2->F2_CLIENTE,SF2->F2_LOJA,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),"SD2", SF2->F2_GLOBAL == "1",@(_aTotal[036]),_aTotal[104],@_aTotal[037], @_aTotal[038], ,@_aTotal[115]) 

    [SD2 CADENAORIGINAL_SELLO]
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SA2->(MSSeek(xFilial("SA2")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SYA->(MsSeek(xFilial("SYA")+SA2->A2_PAIS)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",CTO->(MsSeek(xFilial("CTO")+Strzero(SF2->F2_MOEDA,2))) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",CTO->(MsSeek(xFilial("CTO")+Strzero(SF2->F2_MOEDA,2))) , .T.)
    //////////////////////////////////////////////CADENA ORIGINAL//////////////////////////////////////////////
    (PRE) cCadOrig   := _aTotal[099]
    (PRE) lCCCE      := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE)  .And. _aTotal[114], .T., .F.)
    (PRE) cCadOriCCE := ""

    //Cadena Original | Complemento de Comercio Exterior (Mercancias)
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_ITEM + SD2->D2_COD), (cCadOriCCE += Alltrim(SD2->D2_ITEM + SD2->D2_COD) + _aTotal[098],.T.),("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), (cCadOriCCE += Alltrim(SD2->D2_FRACCA) + Alltrim(SD2->D2_NICO) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_CANADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_CANADU)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), (cCadOriCCE += AllTrim(ObtColSAT("S014",AllTrim(SD2->D2_FRACCA),1,8,9,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_VALADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_VALADU,14,2)) + _aTotal[098],.T.), ("",,.T.))// Puede aceptar hasta 6 decimales
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_USDADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_USDADU,14,2)) + _aTotal[098],.T.), ("",,.T.)) // Puede aceptar hasta 4 decimales
    (PREREG) IIf(lCCCE .And. SA1->A1_CONTRBE=="1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", (cCadOriCCE += '1.0' +_aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. SA1->A1_CONTRBE=="1" .And. SF2->F2_CONUNI=="1", (cCadOriCCE += 'IMMEX:' + ALLTRIM(SA1->A1_PFISICA) + ' ' + _aTotal[101] + _aTotal[098],.T.), IIf (lCCCE .And. SA1->A1_CONTRBE=="1" .And. SF2->F2_CONUNI=="2", (cCadOriCCE += 'IMMEX:' + ALLTRIM(SA1->A1_PFISICA) + ' ' + _aTotal[102] + _aTotal[098],.T.), ("",,.T.)))

    ///////////DATOS DE LA FACTURA/////////////////
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    //Version
    (PRE) cCadOrig += "4.0" + _aTotal[098]
    //Serie
    (PRE) cCadOrig += Alltrim(SF2->F2_SERIE) + _aTotal[098]
    //Folio
    (PRE) cCadOrig += Alltrim(SF2->F2_DOC) + _aTotal[098]
    //Fecha
    (PRE) cCadOrig += Alltrim(_aTotal[096]) + _aTotal[098]
    //FormaPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", IIf(SF2->F2_GLOBAL == '1',IIf(!Empty(_aTotal[112]),_aTotal[112],_aTotal[107]),IIf(Empty(_aTotal[107]).Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",_aTotal[107])) + _aTotal[098] )
    //NoCertificado
    (PRE) cCadOrig += Alltrim(SF2->F2_CERTFOL) + _aTotal[098]
    //CondicionesDePago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + _aTotal[098] ) 
    //Subtotal
    (PRE) cCadOrig += Alltrim(STR(IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, (SF2->(F2_VALMERC+F2_FRETE+F2_SEGURO+F2_DESPESA) + _aTotal[103] + SF2->F2_DESCONT) - _aTotal[036] - _aTotal[037]),14,_aTotal[106])) + _aTotal[098]
    //Descuento
    (PRE) cCadOrig += IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", "", IIf( SF2->F2_DESCONT == 0, "", Alltrim(STR(SF2->F2_DESCONT,14,2)) + _aTotal[098]) )
    //Moneda
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21","XXX",Alltrim(CTO->CTO_MOESAT)) + _aTotal[098]
    //TipoCambio
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21","",IIf(Alltrim(CTO->CTO_MOESAT) <> "MXN", Alltrim(STR(SF2->F2_TXMOEDA,14,2)), "1") + _aTotal[098])
    //Total
    (PRE) cCadOrig += Alltrim(Str(IIf(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, iif(GetSx3Cache("F2_VALBRUT","X3_DECIMAL")<= 2,SF2->F2_VALBRUT + _aTotal[103]- _aTotal[037] - IIf(Len(_aTotal[115]) > 0,_aTotal[115][1],0),Round(SF2->F2_VALBRUT,2) + _aTotal[103] - _aTotal[037] - IIf(Len(_aTotal[115]) > 0,_aTotal[115][1],0))),14,_aTotal[106])) + _aTotal[098]
    //TipoDeComprobante
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_ESPECIE) == "NF",IIf(ALLTRIM(SF2->F2_TIPODOC) == "21", "T", "I" ), "E") + _aTotal[098]
    //Exportacion
    (PRE) cCadOrig += IIf(!Empty(_aTotal[113]),_aTotal[113],"01") + _aTotal[098]
    //MetodoPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", Alltrim(SE4->E4_MPAGSAT) + _aTotal[098] )
    //LugarExpedicion
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + _aTotal[098]
    //Periodicidad
    (PRE) cCadOrig += IIf(SF2->(ColumnPos("F2_IDCBAJA")) > 0 .And. SF2->F2_GLOBAL == "1", SF2->F2_IDCBAJA + _aTotal[098],"")
    //Meses
    (PRE) cCadOrig += IIf(SF2->(ColumnPos("F2_MODCONS")) > 0 .And. SF2->F2_GLOBAL == "1", SF2->F2_MODCONS + _aTotal[098],"")
    //Año
    (PRE) cCadOrig += IIf(SF2->(ColumnPos("F2_PTOEMIS")) > 0 .And. SF2->F2_GLOBAL == "1", SF2->F2_PTOEMIS + _aTotal[098],"")

    //////////////////////CFDI Relacionados//////////////////////////
    (PREREG)!Empty(SF2->F2_RELSAT).Or. !Empty(SF2->F2_SERMAN).Or. !Empty(SF2->F2_DOCMAN)
    (PRE) IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","",fGetFolRel("S",.T.))

    ///////////DATOS DEL EMISOR///////////////////////
    //Rfc
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CGC),.F.) + _aTotal[098]
    //Nombre
    (PRE) cCadOrig += CFDCarEsp(_aTotal[075],.F.) + _aTotal[098]
    //RegimenFiscal
    (PRE) cCadOrig += CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + _aTotal[098]

    //////////////////////DATOS DEL RECEPTOR//////////////////////////
    (PRE) AllTrim(SF2->F2_ESPECIE) <> "NDI"
    (PRE) SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA))
    (PRE) SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS))
    //Rfc
    (PRE) (cCadOrig += IIf(!_aTotal[104] .And. ((ALLTRIM(SF2->F2_TIPODOC) == "21" .And. !lCCCE) .Or. SF2->F2_GLOBAL == "1"), "XAXX010101000", CFDCarEsp(_aTotal[108], .F.)) + _aTotal[098])
    //Nombre
    (PRE) (cCadOrig += IIF(SF2->F2_GLOBAL == "1", "PUBLICO EN GENERAL",CFDCarEsp(_aTotal[109],.F.)) + _aTotal[098], .T.)
    //DomicilioFiscalReceptor
    (PRE) (cCadOrig += CFDCarEsp(_aTotal[110],.F.) + _aTotal[098], .T.)
    //ResidenciaFiscal
    (PRE) IIf(lCCCE .And. !Empty(CFDCarEsp(Alltrim(SF2->F2_RESIDE))) .And. !_aTotal[076], cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SF2->F2_RESIDE,"YA_CCESAT")) + _aTotal[098], "")
    //NumRegIdTrib
    (PRE) IIf(lCCCE .And. !Empty(CFDCarEsp(Alltrim(SF2->F2_IDTRIB))) .And. !_aTotal[076], cCadOrig += CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + _aTotal[098], "")
    //RegimenFiscalReceptor
    (PRE) (cCadOrig += IIf(AI0->(ColumnPos("AI0_REGFIS")) > 0,CFDCarEsp(_aTotal[111],.F.) + _aTotal[098],""), .T.)
    //UsoCFDI
    (PRE) (cCadOrig += Alltrim(SF2->F2_USOCFDI) + _aTotal[098], .T.)

    (PRE) (cCadOrig += fXMLFUN("CO",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.)
    (PRE) (cCadOrig += fXMLFUN("TI",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)

    (POS) IIf(lCCCE, cCadOrig += "2.0" + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_TRASLA), cCadOrig += Alltrim(SF2->F2_TRASLA) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_CVEPED), cCadOrig += Alltrim(SF2->F2_CVEPED) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_CERORI), cCadOrig += Alltrim(SF2->F2_CERORI) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_NUMCER), cCadOrig += Alltrim(SF2->F2_NUMCER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_EXPCONF), cCadOrig += Alltrim(SF2->F2_EXPCONF) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_INCOTER), cCadOrig += Alltrim(SF2->F2_INCOTER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. SF2->(ColumnPos("F2_OBSCE")) > 0 .And. !Empty(SF2->F2_OBSCE), cCadOrig += CFDCarEsp(AllTrim(SF2->F2_OBSCE), .F.) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF2->F2_TCUSD)), cCadOrig += Alltrim(Str(SF2->F2_TCUSD)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF2->F2_TOTUSD)), cCadOrig += Alltrim(Str(SF2->F2_TOTUSD,14,2)) + _aTotal[098], "")

    //Emisor
    (POS) IIf(lCCCE , cCadOrig += CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CEPENT), cCadOrig += CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CODZOSE)+ALLTRIM(SM0->M0_CEPENT),1,9,1,4))) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CODMUN), cCadOrig += AllTrim(SM0->M0_CODMUN) + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += "MEX" + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += AllTrim(SM0->M0_CEPENT) + _aTotal[098], "")

    //Receptor Domicilio
    (POS) IIf(lCCCE .And. _aTotal[108] == "XEXX010101000", cCadOrig += CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(AllTrim(SA1->A1_END)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), cCadOrig += AllTrim(SA1->A1_NR_END) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), cCadOrig += AllTrim(SA1->A1_NROINT) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), cCadOrig +=  CFDCarEsp(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))) + _aTotal[098],"")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_MUN))), cCadOrig +=  CFDCarEsp(AllTrim(SA1->A1_MUN),.F.) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(SA1->A1_CEP) + _aTotal[098], "")

    //Destinatarios
    (POS) IIf(lCCCE .And. FindFunction("LxCEDest") .And. SF2->(ColumnPos("F2_ACOPLA")) > 0, cCadOrig += LxCEDest(SF2->F2_CLIENTE,SF2->F2_LOJA,SF2->F2_ACOPLA, .T.), "")

    (POS) cCadOrig += IIf(!Empty(cCadOriCCE), cCadOriCCE, "")

    //Carta Porte
    (POS) IIf(_aTotal[011],(cCadOrig += LxFunaCaPo(SF2->F2_FILIAL,SF2->F2_DOC,SF2->F2_SERIE,.T.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.),"")

    (POS) (cCadOrig += fXMLFUN("IL",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)

    (POS) cCadOrig += _aTotal[098]
    (POS) _aTotal[033] := cCadOrig

    //SELLO
    (POS) _aTotal[100] := EVPDigest(cCadOrig,5)
    (POS) _aTotal[100] := PrivSignRSA(&(SuperGetMv("MV_CFDDIRS",,""))+SuperGetMv("MV_CFDARQS",,""),_aTotal[100],6,"assinatura")
    (POS) _aTotal[100] := ENCODE64(_aTotal[100])
    [XXX CABECERA]
    Linha1     C 041 0 Chr(239) + Chr(187) + Chr(191) + '<?xml version="1.0" encoding="UTF-8"?>'
    [XXX FACTURA]
    //Certificado del SAT incluido para pruebas 
    (PRE) cCert := "MIIFuTCCA6GgAwIBAgIUMzAwMDEwMDAwMDA1MDAwMDM0NDIwDQYJKoZIhvcNAQEL"
    (PRE) cCert +="BQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFE"
    (PRE) cCert +="TUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9y"
    (PRE) cCert +="aXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0w"
    (PRE) cCert +="GwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWxpejEOMAwGA1UEEQwFMDYzNzAxCzAJ"
    (PRE) cCert +="BgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhD"
    (PRE) cCert +="T1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3Bv"
    (PRE) cCert +="bnNhYmxlOiBBQ0RNQS1TQVQwHhcNMjMwNTE4MTI1OTI2WhcNMjcwNTE4MTI1OTI2"
    (PRE) cCert +="WjCB4DEqMCgGA1UEAxMhWEVOT04gSU5EVVNUUklBTCBBUlRJQ0xFUyBTIERFIENW"
    (PRE) cCert +="MSowKAYDVQQpEyFYRU5PTiBJTkRVU1RSSUFMIEFSVElDTEVTIFMgREUgQ1YxKjAo"
    (PRE) cCert +="BgNVBAoTIVhFTk9OIElORFVTVFJJQUwgQVJUSUNMRVMgUyBERSBDVjElMCMGA1UE"
    (PRE) cCert +="LRMcWElBMTkwMTI4SjYxIC8gVkFEQTgwMDkyN0RKMzEeMBwGA1UEBRMVIC8gVkFE"
    (PRE) cCert +="QTgwMDkyN0hTUlNSTDA1MRMwEQYDVQQLEwpTdWN1cnNhbCAxMIIBIjANBgkqhkiG"
    (PRE) cCert +="9w0BAQEFAAOCAQ8AMIIBCgKCAQEAga5zxQ4mEBE4LobElO0+UyMDcAYbY0NJbg4x"
    (PRE) cCert +="Nbvwd66CUuTjyK2q11Y6nTzod1I1Nhv75cfZbJzdW/4EO/1bGLEt3zpTnP0yDVh9"
    (PRE) cCert +="KL4/WJ0QW5kR4QVpxd84aBkJe7FltC5j+FUiDSCCLpSBlGvwZdFAwZhSZvHeFB1i"
    (PRE) cCert +="1pDc3rA/PvqJwn35goEdIfhgfymg+31LuL1stU30pOSYtxltiEoM3QFePVurYhYq"
    (PRE) cCert +="sxNmZMGkRvVNrf/SnZsiaLUonM8CNLfhJIFxBraH3qeZ3iCaeFgL8zO5ux+8D1XA"
    (PRE) cCert +="g2RpJLf7gFVC9fWOc9yaHKNsjkt1E2YauH9KpHxRAjt3zKniywIDAQABox0wGzAM"
    (PRE) cCert +="BgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQsFAAOCAgEAR73v"
    (PRE) cCert +="D0WGeWtnZyIFixfsNtvM3068JFvn4LJ0aF0ZZwTJhcff7OrUrpsrCjMzpIOB3Lfq"
    (PRE) cCert +="5DLtaIPNeEkSa5W4yi1XJ930kcJ4kubi16jmTIMIZ7w9fy8p99gggTMbYiFf0Jzv"
    (PRE) cCert +="fz+PQqqpsfnc3lMVV/GkHvs8QHEekZxpWHS22oE/S5wKq7b85oW649fC834EoZGI"
    (PRE) cCert +="sb80Rna4ATuDxbt3dvzTR/b/eyricihMBqQ1MPCi9D81o1/3EPEOZNYFcC+yQK7M"
    (PRE) cCert +="+/C7pivs0A972q8LYxG8DzmaKV8zLg+IR9ygdYdl/y/Snoeo0udV4yUlzug7i5IG"
    (PRE) cCert +="ZbfUh2jo3WEkEdIpty+lcVt2PtWOTdR70V0oCivE0MV0qw9GRzFAr6G71fra6r+s"
    (PRE) cCert +="UKUwxQBn07pi6hHmmZ7/DZ9QCaheqD9ttdhlQhpTTt0UPpWY9CDUJKpbWlkKYUzL"
    (PRE) cCert +="Pkdf/ppjiizbP1fqDcoIfZxl4RPKKtr0eIJWhEnuVirZ0kevHXEspI+igdMqk8MR"
    (PRE) cCert +="ndZSoohuIuLdjKjfXEGBALoqUzAB6avN2zzEy6ERRCGfR3cVhVUTcpd/iQffeGvw"
    (PRE) cCert +="7tRZZOiWgwG3Sjc/zgUppnFXfVFHCTmRz1nr0dOqKjOpMEMncRSfY2Mk+Xm8rmJ7"
    (PRE) cCert +="toBu4iAyJUDCP6v24as1uxiE9DVDaFwlugdYL9c="

    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114], .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SYA->(MsSeek(xFilial("SYA")+SA2->A2_PAIS)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) _aTotal[001] := '<cfdi:Comprobante'
    (PRE) _aTotal[001] += ' xmlns:cfdi="http://www.sat.gob.mx/cfd/4"'
    (PRE) _aTotal[001] += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
    (PRE) _aTotal[001] += Iif(_aTotal[104],' xmlns:cartaporte30="http://www.sat.gob.mx/CartaPorte30"','')
    (PRE) _aTotal[001] += ' xmlns:implocal="http://www.sat.gob.mx/implocal"'
    (PRE) _aTotal[001] += IIf(lCCCE .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", ' xmlns:leyendasFisc="http://www.sat.gob.mx/leyendasFiscales"' , "")
    (PRE) _aTotal[001] += ' xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd '
    (PRE) _aTotal[001] += IIF(lCCCE,'http://www.sat.gob.mx/ComercioExterior20 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior20/ComercioExterior20.xsd ','http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd')
    (PRE) _aTotal[001] += IIf(_aTotal[104],' http://www.sat.gob.mx/CartaPorte30 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte30.xsd','')
    (PRE) _aTotal[001] += IIf(lCCCE .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", ' http://www.sat.gob.mx/leyendasFiscales http://www.sat.gob.mx/sitio_internet/cfd/leyendasFiscales/leyendasFisc.xsd"' , '"')
    (PRE) _aTotal[001] += IIf(lCCCE, ' xmlns:cce20="http://www.sat.gob.mx/ComercioExterior20" ' , "")
    (PRE) _aTotal[001] += ' Version="4.0"'
    (PRE) _aTotal[001] += ' Serie="' + Alltrim(SF2->F2_SERIE) + '"'
    (PRE) _aTotal[001] += ' Folio="' + Alltrim(SF2->F2_DOC) + '"'
    (PRE) _aTotal[001] += ' Fecha="' + Alltrim(_aTotal[096]) + '"'
    (PRE) _aTotal[001] += ' Sello="' + Alltrim(_aTotal[100]) + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' FormaPago="' +  IIf(SF2->F2_GLOBAL == '1',IIf(!Empty(_aTotal[112]),_aTotal[112],_aTotal[107]),IIf(Empty(_aTotal[107]) .Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",_aTotal[107])) + '"' )
    (PRE) _aTotal[001] += ' NoCertificado="' + Alltrim(SF2->F2_CERTFOL) + '"'
    (PRE) _aTotal[001] += ' Certificado="' + cCert + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' CondicionesDePago="' +  CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + '"' ) 
    (PRE) _aTotal[001] += ' SubTotal="' + Alltrim(STR(IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, (SF2->(F2_VALMERC+F2_FRETE+F2_SEGURO+F2_DESPESA)  + _aTotal[103] + SF2->F2_DESCONT) - _aTotal[036] - _aTotal[037] ),14,_aTotal[106])) + '"'
    (PRE) _aTotal[001] += IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", "", IIf( SF2->F2_DESCONT == 0, "", ' Descuento="' + Alltrim(STR(SF2->F2_DESCONT,14,2)) + '"' ))
    (PRE) _aTotal[001] += ' Moneda="' + IIf(Alltrim(SF2->F2_TIPODOC) == "21","XXX",Alltrim(CTO->CTO_MOESAT)) + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' TipoCambio="' + IIf(Alltrim(CTO->CTO_MOESAT) <> "MXN", Alltrim(STR(SF2->F2_TXMOEDA,14,2)), "1") + '"') 
    (PRE) _aTotal[001] += ' Total="' + Alltrim(Str(IIf(Alltrim(SF2->F2_TIPODOC) == "21", 0, IIf(GetSx3Cache("F2_VALBRUT","X3_DECIMAL") <= 2,SF2->F2_VALBRUT + _aTotal[103] - _aTotal[037] - _aTotal[038] - IIf(Len(_aTotal[115]) > 0,_aTotal[115][1],0),Round(SF2->F2_VALBRUT,2) + _aTotal[103] - _aTotal[037] - _aTotal[038] - IIf(Len(_aTotal[115]) > 0,_aTotal[115][1],0))),14,_aTotal[106])) +  '"'
    (PRE) _aTotal[001] += ' TipoDeComprobante="' + IIf(Alltrim(SF2->F2_ESPECIE) == "NF",IIf(Alltrim(SF2->F2_TIPODOC) == "21", "T", "I"), "E") + '"'
    (PRE) _aTotal[001] += ' Exportacion="'+IIf(!Empty(_aTotal[113]),_aTotal[113],"01")+'"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' MetodoPago="' +  Alltrim(SE4->E4_MPAGSAT) + '"' )
    (PRE) _aTotal[001] += ' LugarExpedicion="' + CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + '"'
    (PRE) _aTotal[001] += '>'
    (PREREG) _aTotal[001]

    (POS) cNodoCCE := IIf(lCCCE, '        <cce20:ComercioExterior' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' Version="2.0"' , "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_TRASLA), ' MotivoTraslado="' + Alltrim(SF2->F2_TRASLA) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_CVEPED), ' ClaveDePedimento="' + Alltrim(SF2->F2_CVEPED) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_CERORI), ' CertificadoOrigen="' + Alltrim(SF2->F2_CERORI) +'"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_NUMCER), ' NumCertificadoOrigen="' + Alltrim(SF2->F2_NUMCER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_EXPCONF), ' NumeroExportadorConfiable="' + Alltrim(SF2->F2_EXPCONF) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_INCOTER), ' Incoterm="' + Alltrim(SF2->F2_INCOTER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. SF2->(ColumnPos("F2_OBSCE")) > 0 .And. !Empty(SF2->F2_OBSCE), ' Observaciones="' + CFDCarEsp(AllTrim(SF2->F2_OBSCE), .T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF2->F2_TCUSD)), ' TipoCambioUSD="' + Alltrim(Str(SF2->F2_TCUSD)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF2->F2_TOTUSD)), ' TotalUSD="' + Alltrim(Str(SF2->F2_TOTUSD,14,2)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "")
    (POS) _aTotal[094] := cNodoCCE

    [XXX CFDIREL]
    (PREREG) !Empty(SF2->F2_RELSAT).Or. !Empty(SF2->F2_SERMAN).Or. !Empty(SF2->F2_DOCMAN)
    (PREREG) (_aTotal[001] := IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","",fGetFolRel("S")))
    (PREREG) _aTotal[001]

    [XXX FACTURA GLOBAL]
    (PRE) (_aTotal[001] := IIF(SF2->F2_GLOBAL == "1",'    <cfdi:InformacionGlobal ',""))
    (PRE) (_aTotal[001] += Iif(SF2->(ColumnPos("F2_IDCBAJA")) > 0 .and. SF2->F2_GLOBAL == "1" ,' Periodicidad="' + SF2->F2_IDCBAJA  + '"',""))
    (PRE) (_aTotal[001] += Iif(SF2->(ColumnPos("F2_MODCONS")) > 0 .and. SF2->F2_GLOBAL == "1" ,' Meses="' + SF2->F2_MODCONS  + '"',""))
    (PRE) (_aTotal[001] += Iif(SF2->(ColumnPos("F2_PTOEMIS")) > 0 .and. SF2->F2_GLOBAL == "1" ,' Año="' + SF2->F2_PTOEMIS  + '"',""))
    (PRE) (_aTotal[001] += IIF(SF2->F2_GLOBAL == "1",'/>' ,""))
    (PRE) (_aTotal[001] := IIF(SF2->F2_GLOBAL == "1",_aTotal[001] ,""))
    (PREREG) _aTotal[001]

    [XXX EMISOR]
    (PRE) (_aTotal[001] := '    <cfdi:Emisor'  , .T.)
    (PRE) (_aTotal[001] += ' Rfc="' + CFDCarEsp(AllTrim(SM0->M0_CGC))+ '"'  , .T.)
    (PRE) (_aTotal[001] += ' Nombre="' + CFDCarEsp(_aTotal[075],.T.) + '"'  , .T.)
    (PRE) (_aTotal[001] += ' RegimenFiscal="' + CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + '"'  , .T.)
    (PRE) (_aTotal[001] += '/>'  , .T.)
    (PRE) (_aTotal[001] := _aTotal[001]  , .T.)
    (PREREG) _aTotal[001]

    [XXX RECEPTOR_CLIENTE]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114], .T., .F.)
    (PRE) cNodoCCE := ""

    (PREREG) AllTrim(SF2->F2_ESPECIE) <> "NDI"
    (PREREG) (SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PREREG) (SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PREREG) (_aTotal[001] := '    <cfdi:Receptor' , .T.)
    (PREREG) (_aTotal[001] += ' Rfc="' + CFDCarEsp(IIf(!_aTotal[104] .And.((Alltrim(SF2->F2_TIPODOC) == "21" .And. !lCCCE) .Or. SF2->F2_GLOBAL == "1"), "XAXX010101000", _aTotal[108])) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' Nombre="' + iif(SF2->F2_GLOBAL == "1","PUBLICO EN GENERAL",CFDCarEsp(_aTotal[109],.T.)) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' DomicilioFiscalReceptor="' + _aTotal[110] + '"' , .T.)
    (PREREG) (_aTotal[001] += Iif(AI0->(ColumnPos("AI0_REGFIS")) > 0,' RegimenFiscalReceptor="' + _aTotal[111] + '"',""), .T.)
    (PREREG) (_aTotal[001] += ' UsoCFDI="' + Alltrim(SF2->F2_USOCFDI) + '"' , .T.)
    (PREREG) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB)))) .And. !_aTotal[076], (_aTotal[001] += ' NumRegIdTrib="' + CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + '"' , .T.), "") 
    (PREREG) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(AllTrim(SF2->F2_RESIDE)))) .And. !_aTotal[076], (_aTotal[001] += ' ResidenciaFiscal="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SF2->F2_RESIDE,"YA_CCESAT")) + '"' , .T.), "")
    (PREREG) (_aTotal[001] += '/>' ,.T.)
    (PREREG) (_aTotal[001] := _aTotal[001] , .T.)
    (PREREG) _aTotal[001]

    (POS) cNodoCCE += IIf(lCCCE, '            <cce20:Emisor' , "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 
    (POS) cNodoCCE += IIf(lCCCE, '                <cce20:Domicilio' , "")        
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))), ' Colonia="' + CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CODZOSE)+ALLTRIM(SM0->M0_CEPENT),1,9,1,4))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SM0->M0_CEPENT))), ' Municipio="' + CFDCarEsp(AllTrim(SM0->M0_CODMUN)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim("MEX") + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SM0->M0_CEPENT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            </cce20:Emisor>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            <cce20:Receptor ' + IIf(_aTotal[108]=="XEXX010101000", 'NumRegIdTrib="' + CFDCarEsp(AllTrim(SF2->F2_IDTRIB)) + '"',""), "")     
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 
    (POS) cNodoCCE += IIf(lCCCE, '                <cce20:Domicilio' , "")        
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SA1->A1_END)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), ' NumeroExterior="' + AllTrim(SA1->A1_NR_END) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), ' NumeroInterior="' + AllTrim(SA1->A1_NROINT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), ' Colonia="' + CFDCarEsp(AllTrim(SA1->A1_BAIRRO)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_MUN)), ' Municipio="' + CFDCarEsp(AllTrim(SA1->A1_MUN),.T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SA1->A1_CEP) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            </cce20:Receptor>' + ( chr(13)+chr(10) ), "") 
    //Destintarios
    (POS) cNodoCCE += IIf(lCCCE .And. FindFunction("LxCEDest") .And. SF2->(ColumnPos("F2_ACOPLA")) > 0, LxCEDest(SF2->F2_CLIENTE,SF2->F2_LOJA,SF2->F2_ACOPLA,.F.),"")
    (POS) (cNodoCCE += IIf(lCCCE, '            <cce20:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    [SD2 CONCEPTO]
    (PRE) lCCCE    := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114] , .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) DbGoTop()

    (PREREG) (cNodoCCE += IIf(lCCCE, '                  <cce20:Mercancia' , ""),.T.)      
    (PREREG) (cNodoCCE += IIf(lCCCE , ' NoIdentificacion="' + Alltrim(SD2->D2_ITEM + SD2->D2_COD) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), ' FraccionArancelaria="' + Alltrim(SD2->D2_FRACCA) + Alltrim(SD2->D2_NICO) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD2->D2_CANADU)), ' CantidadAduana="' + Alltrim(Str(SD2->D2_CANADU)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), ' UnidadAduana="' + AllTrim(ObtColSAT("S014",AllTrim(SD2->D2_FRACCA),1,8,9,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD2->D2_VALADU)), ' ValorUnitarioAduana="' + Alltrim(Str(SD2->D2_VALADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, ' ValorDolares="' + Alltrim(Str(SD2->D2_USDADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ) , ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '                  </cce20:Mercancia>' + ( chr(13)+chr(10) ), ""),.T.)

    (POS) (cNodoCCE += IIf(lCCCE, '            </cce20:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) (cNodoCCE += IIf(lCCCE, '        </cce20:ComercioExterior>' , ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    (POS) (_aTotal[034] := fXMLFUN("CO",.F., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.)
     
    [XXX CONCEPTOS]
    (POS) FsQuery(_aTotal[097],2)

    (PREREG) (_aTotal[001] := _aTotal[034] ,.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOS]
    (PREREG) (_aTotal[002] := fXMLFUN("TI",.F.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)
    (PREREG) _aTotal[002]

    //IMPUESTOS LOCALES//
    (PRE) (_aTotal[095] := fXMLFUN("IL",.F.),.T.)

    [XXX COMPLEMENT]
    (PREREG) IIf(_aTotal[011],_aTotal[105] := LxFunaCaPo(SF2->F2_FILIAL,SF2->F2_DOC,SF2->F2_SERIE,.F.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),"")
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095] ) .Or. !Empty(_aTotal[105]) .or. _aTotal[104] , '    <cfdi:Complemento', ""), .T.)
    (PREREG) (_aTotal[001] += IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095] ) .Or. !Empty(_aTotal[105]),'>',""),.T.)
    (PREREG) _aTotal[001]
    COMPLEMENT  C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.T.,.F.,4))


    [XXX COMERCIOEX]
    (PREREG) (_aTotal[001] := _aTotal[094],.T.)
    (PREREG) _aTotal[001]

    [XXX CARTAPORTE]
    (PREREG) (_aTotal[001] := _aTotal[105],.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOLOC]
    (PREREG) (_aTotal[001] := _aTotal[095],.T.)
    (PREREG) _aTotal[001]

    [XXX LEYENDASFIS]
    (PREREG) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114], .T., .F.) .And. SF2->(FieldPos("F2_CONUNI")) > 0
    (PREREG) lCCCE
    (PREREG) (_aTotal[001] := IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF" , '        <leyendasFisc:LeyendasFiscales version="1.0" >'+ ( chr(13)+chr(10) ), ""), .T.)
    (PREREG) (_aTotal[001] += IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF" , '            <leyendasFisc:Leyenda textoLeyenda=', ""), .T.)
    (PREREG) (_aTotal[001] += IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. SF2->F2_CONUNI=="1" .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", '"IMMEX:'+ AllTrim(SA1->A1_PFISICA) +' ' + _aTotal[101] +'" />', IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. SF2->F2_CONUNI=="2" .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF",'"IMMEX:'+ AllTrim(SA1->A1_PFISICA) + ' ' + _aTotal[102] +'" />',"")), .T.)
    (PREREG) _aTotal[001]
    (PREREG) (_aTotal[001] := IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF",'        </leyendasFisc:LeyendasFiscales>', ""), .T.)
    (PREREG) _aTotal[001]


    [XXX COMPLEMENT]
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094]) .or. !EMPTY(_aTotal[095]) .or. !EMPTY(_aTotal[105]),'    </cfdi:Complemento>',""), .T.)
    (PREREG) _aTotal[001]
    COMPLEMENT  C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.F.,.T.,4))

    //[XXX CAD_ORIG]
    //(PREREG) _aTotal[033] 

    [XXX FACTURA]
    (PRE) _aTotal[095] := &(GetNewPar("MV_CFDNAF2","Lower(AllTrim(SF2->F2_ESPECIE)) + '_' + Lower(AllTrim(SF2->F2_SERIE)) + '_'  + Lower(AllTrim(SF2->F2_DOC)) + '.xml'"))
    (ARQ) _aTotal[095]
    FACTURA    C 019 0 ENCODEUTF8(XMLConv("",,,"cfdi:Comprobante",.F.,.T.,0))



    Painel
    borderWidth2
    titleBGColorlightblue
    borderStylesolid
    titleFATEMEX.INI

    //FATEMEX.INI V4.0 --- Modelo 2022
    [XXX POSICIONAMENTOS]
    (PRE) If(AllTrim(SF1->F1_ESPECIE)<>"NCC",SA2->(MSSeek(xFilial("SA2")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF1->F1_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)

    [XXX INICIALIZACION]
    (PRE) SD1->(DbSetOrder(1))
    (PRE) SB1->(DbSetOrder(1))
    (PRE) SYA->(DbSetOrder(1))
    (PRE) SC6->(DbSetOrder(1))
    (PRE) SE4->(DbSetOrder(1)) 
    (PRE) CTO->(DbSetOrder(1)) 
    (PRE) SAH->(DbSetOrder(1)) 
    (PRE) _aTotal[094] := ""
    (PRE) _aTotal[095] := ""
    (PRE) _aTotal[033] := ""
    (PRE) _aTotal[034] := ""
    (PRE) _aTotal[035] := ""
    (PRE) _aTotal[036] := 0
    (PRE) _aTotal[037] := SuperGetMV("MV_CFDIEXP",.F.,.F.)
    (PRE) _aTotal[075] := Alltrim(SM0->M0_NOMECOM)
    (PRE) _aTotal[096] := DtoS(SF1->F1_EMISSAO)
    (PRE) _aTotal[096] := Left(_aTotal[096],4) + "-" + Substr(_aTotal[096],5,2)+ "-" + Right(_aTotal[096],2)
    (PRE) _aTotal[096] += "T" + SF1->F1_HORA
    (PRE) _aTotal[097] := {"SD1",""}
    (PRE) _aTotal[098] := "|"
    (PRE) _aTotal[099] := "||"
    (PRE) _aTotal[100] := ""
    (PRE) _aTotal[101] := IIF(SuperGetMv("MV_DESCSAI",.T.,"2") == "1", .T., .F.) 
    (PRE) _aTotal[102] := IIf(SF1->(ColumnPos("F1_TPDOC")) > 0,AllTrim(SF1->F1_TPDOC),AllTrim(AI0->AI0_MPAGO))                                                                                                          
    (PRE) lCCCE := .F.
    (PRE) cNodoCCE := ""
    (PRE) _aTotal[103] := IIf(!_aTotal[037] .Or. (_aTotal[037] .And. Empty(SF1->F1_CVEPED)),"01",IIf(SF1->F1_CVEPED!="A1" .or. Alltrim(SF1->F1_TIPOPE)== "3","04","02"))
    (PRE) _aTotal[104] := IIf(_aTotal[103] == "04" .And.( Empty(SF1->F1_CERORI) .Or. Empty(SF1->F1_INCOTER) .Or. Empty(SF1->F1_TCUSD) .Or. Empty(SF1->F1_TOTUSD)) ,.F.,.T.)
    (PRE) _aTotal[105] := IIf(FindFunction("FxDelExp"),FxDelExp(SA1->A1_NOME),SA1->A1_NOME)    

    (PREREG) FsQuery(_aTotal[097],1,"D1_DOC='" + SF1->F1_DOC + "' AND D1_SERIE='" + SF1->F1_SERIE + "' AND D1_FORNECE='" + SF1->F1_FORNECE + "' AND D1_LOJA='" + SF1->F1_LOJA + "'","SD1->D1_DOC=SF1->F1_DOC .AND. SD1->D1_SERIE=SF1->F1_SERIE .AND. SD1->D1_FORNECE=SF1->F1_FORNECE .AND. SD1->D1_LOJA=SF1->F1_LOJA","D1_ITEM") .And. .T.

    (PRE) fImptosD(SF1->F1_DOC,SF1->F1_SERIE,SF1->F1_FORNECE,SF1->F1_LOJA, .F. , "SD1", .F., @(_aTotal[036]))

    [SD1 CADENAORIGINAL_SELLO]
    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",CTO->(MsSeek(xFilial("CTO")+Strzero(SF1->F1_MOEDA,2))) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)<>"NCC",SA2->(MSSeek(xFilial("SA2")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)<>"NCC",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) If(AllTrim(SF1->F1_ESPECIE)<>"NCC",CTO->(MsSeek(xFilial("CTO")+Strzero(SF1->F1_MOEDA,2))) , .T.)
    //////////////////////////////////////////////CADENA ORIGINAL//////////////////////////////////////////////
    (PRE) cCadOrig := _aTotal[099]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF1->F1_TIPOPE) .And. _aTotal[104] , .T., .F.)
    (PRE) cCadOriCCE := ""

    //Cadena Original | Complemento de Comercio Exterior
    (PREREG) IIf(lCCCE .And. !Empty(SD1->D1_ITEM + SD1->D1_COD), (cCadOriCCE += Alltrim(SD1->D1_ITEM + SD1->D1_COD) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD1->D1_FRACCA), (cCadOriCCE += Alltrim(SD1->D1_FRACCA) + Alltrim(SD1->D1_NICO) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD1->D1_CANADU)), (cCadOriCCE += Alltrim(Str(SD1->D1_CANADU)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD1->D1_FRACCA), (cCadOriCCE += AllTrim(ObtColSAT("S014",AllTrim(SD1->D1_FRACCA),1,8,9,2))  + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD1->D1_VALADU)), (cCadOriCCE += Alltrim(Str(SD1->D1_VALADU,14,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD1->D1_USDADU)), (cCadOriCCE += Alltrim(Str(SD1->D1_USDADU,14,2)) + _aTotal[098],.T.), ("",,.T.))

    //Cadena Original | Complemento de Comercio Exterior
    (POS) IIf(lCCCE, cCadOrig += "2.0" + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_TRASLA), cCadOrig += Alltrim(SF1->F1_TRASLA) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_CVEPED), cCadOrig += Alltrim(SF1->F1_CVEPED) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_CERORI), cCadOrig += Alltrim(SF1->F1_CERORI) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_NUMCER), cCadOrig += Alltrim(SF1->F1_NUMCER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_EXPCONF), cCadOrig += Alltrim(SF1->F1_EXPCONF) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF1->F1_INCOTER), cCadOrig += Alltrim(SF1->F1_INCOTER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. SF1->(ColumnPos("F1_OBSCE")) > 0 .And. !Empty(SF1->F1_OBSCE), cCadOrig += CFDCarEsp(Alltrim(SF1->F1_OBSCE),.F.) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF1->F1_TCUSD)), cCadOrig += Alltrim(Str(SF1->F1_TCUSD)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF1->F1_TOTUSD)), cCadOrig += Alltrim(Str(SF1->F1_TOTUSD,14,2)) + _aTotal[098], "")

    ///////////DATOS DE LA FACTURA/////////////////
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF1->F1_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    //Version
    (PRE) cCadOrig += "4.0" + _aTotal[098]
    //Serie
    (PRE) cCadOrig += Alltrim(SF1->F1_SERIE) + _aTotal[098]
    //Folio
    (PRE) cCadOrig += Alltrim(SF1->F1_DOC) + _aTotal[098]
    //Fecha
    (PRE) cCadOrig += Alltrim(_aTotal[096]) + _aTotal[098]
    //FormaPago
    (PRE) cCadOrig += IIf(Empty(_aTotal[102]) .Or. Alltrim(SE4->E4_MPAGSAT) =="PPD","99",_aTotal[102]) + _aTotal[098]
    //NoCertificado
    (PRE) cCadOrig += Alltrim(SF1->F1_CERTFOL) + _aTotal[098]
    //CondicionesDePago
    (PRE) cCadOrig += CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + _aTotal[098]
    //Subtotal
    (PRE) cCadOrig += Alltrim(STR((SF1->F1_VALMERC + IIF(_aTotal[101], SF1->F1_DESCONT, 0 )) - _aTotal[036],14,2)) + _aTotal[098]
    //Descuento
    (PRE) cCadOrig += IIf(SF1->F1_DESCONT==0, "", Alltrim(STR(SF1->F1_DESCONT,14,2)) + _aTotal[098])
    //Moneda
    (PRE) cCadOrig += Alltrim(CTO->CTO_MOESAT) + _aTotal[098]
    //TipoCambio
    (PRE) cCadOrig += IIf(!(Alltrim(CTO->CTO_MOESAT) $ "MXN|XXX"), Alltrim(STR(SF1->F1_TXMOEDA,14,2)), "1") + _aTotal[098]
    //Total
    (PRE) cCadOrig += Alltrim(STR(iif(GetSx3Cache("F1_VALBRUT","X3_DECIMAL")<= 2,SF1->F1_VALBRUT,Round(SF1->F1_VALBRUT,2)),14,2)) + _aTotal[098]
    //TipoDeComprobante
    (PRE) cCadOrig += IIf(Alltrim(SF1->F1_ESPECIE) == "NF", "I", "E") + _aTotal[098]
    //Exportacion
    (PRE) cCadOrig += IIf(!Empty(_aTotal[103]) .And. Alltrim(SF1->F1_ESPECIE) == "NCC",_aTotal[103],"01") + _aTotal[098]
    //MetodoPago
    (PRE) cCadOrig += IIf(Alltrim(SF1->F1_TIPODOC) == "21", "", Alltrim(SE4->E4_MPAGSAT) + _aTotal[098] )
    //LugarExpedicion
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + _aTotal[098]
    //Confirmacion
    //(PRE) cCadOrig += "ClavePAC" + _aTotal[098]

    //////////////////////CFDI Relacionados//////////////////////////
    (PREREG) !Empty(SF1->F1_RELSAT).Or. !Empty(SF1->F1_SERMAN).Or. !Empty(SF1->F1_DOCMAN)
    (PRE) fGetFolRel("E",.T.)

    ///////////DATOS DEL EMISOR///////////////////////
    //Rfc
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CGC),.F.) + _aTotal[098]
    //Nombre
    (PRE) cCadOrig += CFDCarEsp(_aTotal[075],.F.) + _aTotal[098]
    //RegimenFiscal
    (PRE) cCadOrig += CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + _aTotal[098]

    //////////////////////DATOS DEL RECEPTOR//////////////////////////
    (PRE) AllTrim(SF1->F1_ESPECIE) == "NCC"
    (PRE) SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA))
    (PRE) SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS))
    //Rfc
    (PRE) (cCadOrig += CFDCarEsp(AllTrim(SA1->A1_CGC), .F.) + _aTotal[098], .T.)
    //Nombre
    (PRE) (cCadOrig += CFDCarEsp(Alltrim(_aTotal[105]),.F.) + _aTotal[098], .T.)
    //DomicilioFiscalReceptor
    (PRE) (cCadOrig += CFDCarEsp(Alltrim(SA1->A1_CEP),.F.) + _aTotal[098], .T.)
    //ResidenciaFiscal
    (PRE) IIf(lCCCE,(cCadOrig += Alltrim(SYA->YA_CCESAT) + _aTotal[098], .T.),"")
    //NumRegIdTrib
    (PRE) IIf(lCCCE,(cCadOrig += Alltrim(AI0->AI0_IDFIS) + _aTotal[098], .T.),"")
    //RegimenFiscalReceptor
    (PRE) (cCadOrig += IIf(AI0->(ColumnPos("AI0_REGFIS")) > 0,CFDCarEsp(Alltrim(AI0->AI0_REGFIS),.F.) + _aTotal[098],""), .T.)
    //UsoCFDI
    (PRE) (cCadOrig += Alltrim(SF1->F1_USOCFDI) + _aTotal[098], .T.)

    (PRE) (cCadOrig += fXMLFUN("CO",.T.,  .F. ,.F.))
    (PRE) (cCadOrig += fXMLFUN("TI",.T.,  .F. ,.T.))
    (PRE) (cCadOrig += fXMLFUN("IL",.T.,  .F. ,.T.))

    //Cadena Original | Complemento de Comercio Exterior

    //Emisor
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_BAIRENT), cCadOrig += ObtColSAT("S015",AllTrim(SM0->M0_CEPENT),5,5,1,4) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CODMUN), cCadOrig += AllTrim(SM0->M0_CODMUN) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += "MEX" + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(SM0->M0_CEPENT) + _aTotal[098], "")

    //Receptor Domicilio
    (POS) IIf(lCCCE .And. AllTrim(SA1->A1_CGC) == "XEXX010101000", cCadOrig += CFDCarEsp(AllTrim(AllTrim(SF1->F1_IDTRIB))) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(AllTrim(SA1->A1_END)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), cCadOrig += AllTrim(SA1->A1_NR_END) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), cCadOrig += AllTrim(SA1->A1_NROINT) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), cCadOrig +=  CFDCarEsp(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))) + _aTotal[098],"")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_MUN))), cCadOrig +=  CFDCarEsp(AllTrim(SA1->A1_MUN),.F.) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + _aTotal[098],"")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_PAIS)), cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_CEP)), cCadOrig += AllTrim(SA1->A1_CEP) + _aTotal[098], "")

    (POS) cCadOrig += IIf(!Empty(cCadOriCCE), cCadOriCCE, "")

    (POS) cCadOrig += _aTotal[098]
    (POS) _aTotal[033] := cCadOrig

    //SELLO
    (POS) _aTotal[100] := EVPDigest(cCadOrig,5)
    (POS) _aTotal[100] := PrivSignRSA(&(SuperGetMv("MV_CFDDIRS",,""))+SuperGetMv("MV_CFDARQS",,""),_aTotal[100],6,"assinatura")
    (POS) _aTotal[100] := ENCODE64(_aTotal[100])

    [XXX CABECERA]
    Linha1     C 041 0 Chr(239) + Chr(187) + Chr(191) + '<?xml version="1.0" encoding="UTF-8"?>'

    [XXX FACTURA]
    //Certificado del SAT incluido para pruebas 
    (PRE) cCert := "MIIFuTCCA6GgAwIBAgIUMzAwMDEwMDAwMDA1MDAwMDM0NDIwDQYJKoZIhvcNAQEL"
    (PRE) cCert +="BQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFE"
    (PRE) cCert +="TUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9y"
    (PRE) cCert +="aXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0w"
    (PRE) cCert +="GwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWxpejEOMAwGA1UEEQwFMDYzNzAxCzAJ"
    (PRE) cCert +="BgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhD"
    (PRE) cCert +="T1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3Bv"
    (PRE) cCert +="bnNhYmxlOiBBQ0RNQS1TQVQwHhcNMjMwNTE4MTI1OTI2WhcNMjcwNTE4MTI1OTI2"
    (PRE) cCert +="WjCB4DEqMCgGA1UEAxMhWEVOT04gSU5EVVNUUklBTCBBUlRJQ0xFUyBTIERFIENW"
    (PRE) cCert +="MSowKAYDVQQpEyFYRU5PTiBJTkRVU1RSSUFMIEFSVElDTEVTIFMgREUgQ1YxKjAo"
    (PRE) cCert +="BgNVBAoTIVhFTk9OIElORFVTVFJJQUwgQVJUSUNMRVMgUyBERSBDVjElMCMGA1UE"
    (PRE) cCert +="LRMcWElBMTkwMTI4SjYxIC8gVkFEQTgwMDkyN0RKMzEeMBwGA1UEBRMVIC8gVkFE"
    (PRE) cCert +="QTgwMDkyN0hTUlNSTDA1MRMwEQYDVQQLEwpTdWN1cnNhbCAxMIIBIjANBgkqhkiG"
    (PRE) cCert +="9w0BAQEFAAOCAQ8AMIIBCgKCAQEAga5zxQ4mEBE4LobElO0+UyMDcAYbY0NJbg4x"
    (PRE) cCert +="Nbvwd66CUuTjyK2q11Y6nTzod1I1Nhv75cfZbJzdW/4EO/1bGLEt3zpTnP0yDVh9"
    (PRE) cCert +="KL4/WJ0QW5kR4QVpxd84aBkJe7FltC5j+FUiDSCCLpSBlGvwZdFAwZhSZvHeFB1i"
    (PRE) cCert +="1pDc3rA/PvqJwn35goEdIfhgfymg+31LuL1stU30pOSYtxltiEoM3QFePVurYhYq"
    (PRE) cCert +="sxNmZMGkRvVNrf/SnZsiaLUonM8CNLfhJIFxBraH3qeZ3iCaeFgL8zO5ux+8D1XA"
    (PRE) cCert +="g2RpJLf7gFVC9fWOc9yaHKNsjkt1E2YauH9KpHxRAjt3zKniywIDAQABox0wGzAM"
    (PRE) cCert +="BgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQsFAAOCAgEAR73v"
    (PRE) cCert +="D0WGeWtnZyIFixfsNtvM3068JFvn4LJ0aF0ZZwTJhcff7OrUrpsrCjMzpIOB3Lfq"
    (PRE) cCert +="5DLtaIPNeEkSa5W4yi1XJ930kcJ4kubi16jmTIMIZ7w9fy8p99gggTMbYiFf0Jzv"
    (PRE) cCert +="fz+PQqqpsfnc3lMVV/GkHvs8QHEekZxpWHS22oE/S5wKq7b85oW649fC834EoZGI"
    (PRE) cCert +="sb80Rna4ATuDxbt3dvzTR/b/eyricihMBqQ1MPCi9D81o1/3EPEOZNYFcC+yQK7M"
    (PRE) cCert +="+/C7pivs0A972q8LYxG8DzmaKV8zLg+IR9ygdYdl/y/Snoeo0udV4yUlzug7i5IG"
    (PRE) cCert +="ZbfUh2jo3WEkEdIpty+lcVt2PtWOTdR70V0oCivE0MV0qw9GRzFAr6G71fra6r+s"
    (PRE) cCert +="UKUwxQBn07pi6hHmmZ7/DZ9QCaheqD9ttdhlQhpTTt0UPpWY9CDUJKpbWlkKYUzL"
    (PRE) cCert +="Pkdf/ppjiizbP1fqDcoIfZxl4RPKKtr0eIJWhEnuVirZ0kevHXEspI+igdMqk8MR"
    (PRE) cCert +="ndZSoohuIuLdjKjfXEGBALoqUzAB6avN2zzEy6ERRCGfR3cVhVUTcpd/iQffeGvw"
    (PRE) cCert +="7tRZZOiWgwG3Sjc/zgUppnFXfVFHCTmRz1nr0dOqKjOpMEMncRSfY2Mk+Xm8rmJ7"
    (PRE) cCert +="toBu4iAyJUDCP6v24as1uxiE9DVDaFwlugdYL9c="

    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF1->F1_TIPOPE) .And. _aTotal[104], .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) If(AllTrim(SF1->F1_ESPECIE)=="NCC",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF1->F1_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PRE) _aTotal[001] := '<cfdi:Comprobante'
    (PRE) _aTotal[001] += ' xmlns:cfdi="http://www.sat.gob.mx/cfd/4"'
    (PRE) _aTotal[001] += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
    (PRE) _aTotal[001] += ' xmlns:implocal="http://www.sat.gob.mx/implocal"'
    (PRE) _aTotal[001] += ' xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd '
    (PRE) _aTotal[001] += IIF(lCCCE,'http://www.sat.gob.mx/ComercioExterior20 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior20/ComercioExterior20.xsd "','"')
    (PRE) _aTotal[001] += IIf(lCCCE, ' xmlns:cce20="http://www.sat.gob.mx/ComercioExterior20"' , "")
    (PRE) _aTotal[001] += ' Version="4.0"'
    (PRE) _aTotal[001] += ' Serie="' + Alltrim(SF1->F1_SERIE) + '"'
    (PRE) _aTotal[001] += ' Folio="' + Alltrim(SF1->F1_DOC) + '"'
    (PRE) _aTotal[001] += ' Fecha="' + Alltrim(_aTotal[096]) + '"'
    (PRE) _aTotal[001] += ' Sello="' + Alltrim(_aTotal[100]) + '"'
    (PRE) _aTotal[001] += ' FormaPago="' + Iif(Empty(_aTotal[102]) .Or. Alltrim(SE4->E4_MPAGSAT) =="PPD","99",_aTotal[102]) + '"'
    (PRE) _aTotal[001] += ' NoCertificado="' + Alltrim(SF1->F1_CERTFOL) + '"'
    (PRE) _aTotal[001] += ' Certificado="' + cCert + '"'
    (PRE) _aTotal[001] += ' CondicionesDePago="' + CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + '"'
    (PRE) _aTotal[001] += ' SubTotal="' + Alltrim(STR((SF1->F1_VALMERC + IIF(_aTotal[101], SF1->F1_DESCONT, 0 )) - _aTotal[036],14,2)) + '"'
    (PRE) _aTotal[001] += IIf(SF1->F1_DESCONT==0, "", ' Descuento="' + Alltrim(STR(SF1->F1_DESCONT,14,2)) + '"')
    (PRE) _aTotal[001] += ' Moneda="' + Alltrim(CTO->CTO_MOESAT) + '"'
    (PRE) _aTotal[001] += ' TipoCambio="' + IIf(Alltrim(CTO->CTO_MOESAT) <> "MXN", Alltrim(STR(SF1->F1_TXMOEDA,14,2)), "1") + '"'
    (PRE) _aTotal[001] += ' Total="' + Alltrim(STR(iif(GetSx3Cache("F1_VALBRUT","X3_DECIMAL")<= 2,SF1->F1_VALBRUT,Round(SF1->F1_VALBRUT,2)),14,2)) + '"'
    (PRE) _aTotal[001] += ' TipoDeComprobante="' + IIf(Alltrim(SF1->F1_ESPECIE) == "NF", "I", "E") + '"'
    (PRE) _aTotal[001] += ' Exportacion="'+ IIf(!Empty(_aTotal[103]) .And. Alltrim(SF1->F1_ESPECIE) == "NCC",_aTotal[103],"01") +'"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF1->F1_TIPODOC) == "21", "", ' MetodoPago="' + Alltrim(SE4->E4_MPAGSAT) + '"' )
    (PRE) _aTotal[001] += ' LugarExpedicion="' + CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + '"'
    (PRE) _aTotal[001] += '>'
    (PREREG) _aTotal[001]

    (POS) cNodoCCE := IIf(lCCCE, '        <cce20:ComercioExterior' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' Version="2.0"' , "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_TRASLA), ' MotivoTraslado="' + Alltrim(SF1->F1_TRASLA) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_CVEPED), ' ClaveDePedimento="' + Alltrim(SF1->F1_CVEPED) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_CERORI), ' CertificadoOrigen="' + Alltrim(SF1->F1_CERORI) +'"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_NUMCER), ' NumCertificadoOrigen="' + Alltrim(SF1->F1_NUMCER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_EXPCONF), ' NumeroExportadorConfiable="' + Alltrim(SF1->F1_EXPCONF) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF1->F1_INCOTER), ' Incoterm="' + Alltrim(SF1->F1_INCOTER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. SF1->(ColumnPos("F1_OBSCE")) > 0 .And. !Empty(SF1->F1_OBSCE), ' Observaciones="' + CFDCarEsp(Alltrim(SF1->F1_OBSCE), .F.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF1->F1_TCUSD)), ' TipoCambioUSD="' + Alltrim(Str(SF1->F1_TCUSD)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF1->F1_TOTUSD)), ' TotalUSD="' + Alltrim(Str(SF1->F1_TOTUSD,14,2)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "")
    (POS) _aTotal[094] := cNodoCCE

    [XXX CFDIREL]
    (PREREG) !Empty(SF1->F1_RELSAT).Or. !Empty(SF1->F1_SERMAN).Or. !Empty(SF1->F1_DOCMAN)
    (PREREG) (_aTotal[001] := fGetFolRel("E"),.T.)
    (PREREG) _aTotal[001]

    [XXX EMISOR]
    (PRE) _aTotal[001] := '    <cfdi:Emisor'
    (PRE) _aTotal[001] += ' Rfc="' + CFDCarEsp(AllTrim(SM0->M0_CGC)) + '"'
    (PRE) _aTotal[001] += ' Nombre="' + CFDCarEsp(_aTotal[075],.T.) + '"'
    (PRE) _aTotal[001] += ' RegimenFiscal="' + CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + '"'
    (PRE) _aTotal[001] += '/>'
    (PREREG) _aTotal[001]

    [XXX RECEPTOR_CLIENTE]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF1->F1_TIPOPE) .And. _aTotal[104], .T., .F.)
    (PRE) cNodoCCE := ""

    (PREREG) AllTrim(SF1->F1_ESPECIE) == "NCC"
    (PREREG) (SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA)) , .T.)
    (PREREG) (SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PREREG) (_aTotal[001] := '    <cfdi:Receptor' , .T.)
    (PREREG) (_aTotal[001] += ' Rfc="' + CFDCarEsp(AllTrim(SA1->A1_CGC)) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' Nombre="' + CFDCarEsp(Alltrim(_aTotal[105]),.T.) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' DomicilioFiscalReceptor="' + Alltrim(SA1->A1_CEP) + '"' , .T.)
    (PREREG) (_aTotal[001] += Iif(AI0->(ColumnPos("AI0_REGFIS")) > 0,' RegimenFiscalReceptor="' + Alltrim(AI0->AI0_REGFIS) + '"',""), .T.)
    (PREREG) IIf(lCCCE,(_aTotal[001] += ' ResidenciaFiscal="' + Alltrim(SYA->YA_CCESAT) + '"' , .T.),"")
    (PREREG) IIf(lCCCE,(_aTotal[001] += ' NumRegIdTrib="' + Alltrim(AI0->AI0_IDFIS) + '"' , .T.),"")
    (PREREG) (_aTotal[001] += ' UsoCFDI="' + Alltrim(SF1->F1_USOCFDI) + '"' , .T.)
    (PREREG) (_aTotal[001] += '/>' ,.T.)
    (PREREG) _aTotal[001]

    //Emisor
    (POS) cNodoCCE += IIf(lCCCE, '            <cce20:Emisor' , "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 
    (POS) cNodoCCE += IIf(lCCCE, '                <cce20:Domicilio' , "")        
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))), ' Colonia="' + CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CEPENT),5,5,1,4))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SM0->M0_CEPENT))), ' Municipio="' + CFDCarEsp(AllTrim(SM0->M0_CODMUN)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim("MEX") + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SM0->M0_CEPENT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            </cce20:Emisor>' + ( chr(13)+chr(10) ), "")

    //Receptor
    (POS) cNodoCCE += IIf(lCCCE, '            <cce20:Receptor ' + IIf(AllTrim(SA1->A1_CGC)=="XEXX010101000", 'NumRegIdTrib="' + CFDCarEsp(AllTrim(SF1->F1_IDTRIB)) + '"',""), "")  
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 

    //Domicilio Receptor
    (POS) cNodoCCE += IIf(lCCCE, '                <cce20:Domicilio' , "")        
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SA1->A1_END)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), ' NumeroExterior="' + AllTrim(SA1->A1_NR_END) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), ' NumeroInterior="' + AllTrim(SA1->A1_NROINT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), ' Colonia="' + CFDCarEsp(AllTrim(SA1->A1_BAIRRO)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_MUN)), ' Municipio="' + CFDCarEsp(AllTrim(SA1->A1_MUN),.T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SA1->A1_CEP) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            </cce20:Receptor>' + ( chr(13)+chr(10) ), "") 

    (POS) (cNodoCCE += IIf(lCCCE, '            <cce20:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    [SD1 CONCEPTO]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF1->F1_TIPOPE) .And. _aTotal[104], .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) DbGoTop()
     
    (PREREG) (cNodoCCE += IIf(lCCCE, '                  <cce20:Mercancia' , ""),.T.)      
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD1->D1_ITEM + SD1->D1_COD), ' NoIdentificacion="' + Alltrim(SD1->D1_ITEM + SD1->D1_COD) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD1->D1_FRACCA), ' FraccionArancelaria="' + Alltrim(SD1->D1_FRACCA) + Alltrim(SD1->D1_NICO) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD1->D1_CANADU)), ' CantidadAduana="' + Alltrim(Str(SD1->D1_CANADU)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD1->D1_FRACCA), ' UnidadAduana="' + AllTrim(ObtColSAT("S014",AllTrim(SD1->D1_FRACCA),1,8,9,2))  + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD1->D1_VALADU)), ' ValorUnitarioAduana="' + Alltrim(Str(SD1->D1_VALADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD1->D1_USDADU)), ' ValorDolares="' + Alltrim(Str(SD1->D1_USDADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ) , ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '                  </cce20:Mercancia>' + ( chr(13)+chr(10) ), ""),.T.)

    (POS) (cNodoCCE += IIf(lCCCE, '            </cce20:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) (cNodoCCE += IIf(lCCCE, '           </cce20:ComercioExterior>'  , ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    (POS) (_aTotal[034] := fXMLFUN("CO",.F.,  .F. ,.F.))
     
    [XXX CONCEPTOS]
    (POS) FsQuery(_aTotal[097],2)
    (PREREG) (_aTotal[001] := _aTotal[034],.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOS]
    (PREREG) (_aTotal[002] := fXMLFUN("TI",.F., .F. ,.T.))
    (PREREG) _aTotal[002]

    //IMPUESTOS LOCALES//
    (PRE) (_aTotal[095] := fXMLFUN("IL",.F.),.T.)

    [XXX COMPLEMENT]
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095]), '    <cfdi:Complemento', ""), .T.)
    (PREREG) (_aTotal[001] += IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095]),'>',""),.T.)
    (PREREG) _aTotal[001]
    COMPLEMENT  C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.T.,.F.,4))

    [XXX COMERCIOEX]
    (PREREG) (_aTotal[001] := _aTotal[094],.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOLOC]
    (PREREG) (_aTotal[001] := _aTotal[095],.T.)
    (PREREG) _aTotal[001]

    [XXX COMPLEMENT]
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094]) .or. !EMPTY(_aTotal[095]) ,'    </cfdi:Complemento>',""), .T.)
    (PREREG) _aTotal[001]
    COMPLEMENT  C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.F.,.T.,4))

    [XXX CAD_ORIG]
    (PREREG) _aTotal[033]

    [XXX FACTURA]
    (PRE) _aTotal[095] := &(GetNewPar("MV_CFDNAF1","Lower(AllTrim(SF1->F1_ESPECIE)) + '_' + Lower(AllTrim(SF1->F1_SERIE)) + '_'  + Lower(AllTrim(SF1->F1_DOC)) + '.xml'"))
    (ARQ) _aTotal[095]
    FACTURA    C 019 0 ENCODEUTF8(XMLConv("",,,"cfdi:Comprobante",.F.,.T.,0))



    5.19 Ajustes en atributo "ObjetoImp" desde el Pedido de Venta

    Producto

    TOTVS Backoffice

    Línea de producto: 

    Línea Protheus

    Segmento:

    Backoffice

    Módulo:SIGAFAT - Facturación 
    Función:
    RutinaNombre TécnicoFecha
    LOCXMEXFunciones Genéricas para Documentos Fiscales para México.15/02/2024
    MATA468NGeneración de Notas Fiscales15/02/2024
    MATV410AFunciones genéricas para Pedidos de Venta.15/02/2024

    Rutina dependiente

    Nombre Técnico

    Fecha

    LOCXFUNAFunciones Genéricas de Notas Fiscales24/01/2024
    FISA814Carga de Catálogos08/12/2023
    FATSMEX.INIGeneración de XML de Documentos de Salida26/01/2024
    País:México
    Ticket:18161768
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-21137 (pacote 031390)


    SITUACIÓN

    Se solicita realizar ajustes para permitir al usuario modificar el valor del atributo ObjetoImp, para el timbrado de Facturas de Venta (NF) de tipo Ingreso (Normal) generadas a partir de un Pedido de Venta (MATA410), permitiendo utilizar los valores que se definen en el catálogo del SAT c_ObjetoImp:

    Image Added


    SOLUCIÓN

    En el archivo de Funciones Genéricas para Documentos Fiscales para México (LOCXMEX):

    Se realizaron los siguientes ajustes:

      • Se crea función LxVldCpos(), para que cuando se indica en un ítem el campo Objeto Imp (C6_NIT) el valor "01", se realice la validación para que solo permita indicar un Tipo de Entrada y Salida sin impuestos.

    En el archivo de Generación de Notas (MATA468N):

    Se realizaron los siguientes ajustes:

      • Se copia el valor del campo Objeto Imp (C6_NIT) al campo Objeto Imp (D2_NIT), cuando ambos campos existan y se genere una Factura de Venta a partir de un Pedido de Venta.


    Aviso
    titleIMPORTANTE

    IMPORTANTE

    La funcionalidad del campo Objeto Imp (C6_NIT),  en caso de no existir el campo o estar vacío, se tomará la funcionalidad anterior para la generación del nodo de Impuestos por Concepto.


    INFORMACIÓN ADICIONAL

    Realizar los cambios de INI y diccionario indicados en la sección 5.17 Ajustes en atributo "ObjetoImp" de la NF


    Activar el siguiente campo en la tabla SC6 - Ítems de Pedido de Venta:

    Campo

    Contenido

    ValidaciónVazio() .or. ValidF3I("S031", M->C6_NIT,1,2)
    UsadoSi
    Tit. EspañolObjeto Imp
    Tipo1 - Caracter
    Tamaño2
    PropiedadModificar
    HelpIndica si el Concepto del CFDI es Objeto de Impuesto, y el valor debe corresponder a un valor del catálogo c_ObjetoImp definido por el SAT. (Tabla S031 - Catálogo Objeto Impuesto), si el código es 01, 03 o 04 no se generará el nodo de Impuestos del Concepto.
    Formato@!
    Des. EspañolObjeto Impuesto
    Decimal0
    ContextoReal
    CampoC6_NIT


    5.20 Activación de PE PEXMLCCE para personalizar nodos de Complemento de Comercio Exterior

    Producto

    Solucoes_espanhol
    SolucaoTOTVS Backoffice

    Línea de producto: 

    Linhas_totvs_espanhol
    LinhaLínea Protheus

    Segmento:

    Segmentos_totvs_espanhol
    SegmentoBackoffice

    Módulo:SIGAFAT - Facturación
    Función:
    RutinaNombreFecha
    FATEMEX.prwGeneración de XML para Documentos de Entrada29/04/2024
    FATSMEX.prwGeneración de XML para Documentos de Salida29/04/2024
    FATXFUMI.prwFunciones genéricas para Facturación - Mercado Internacional29/04/2024
    País:México (MEX)
    Ticket:No aplica.
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-23099


    SITUACIÓN:

    Para la funcionalidad de generación del XML de los Comprobantes Fiscales Digitales por Internet (CFDI), a través de las rutinas de Generación de XML para Documentos de Salida (FATSMEX.PRW) y Generación de XML para Documentos de Entrada (FATEMEX.PRW) para el país México, es decir, cuando el parámetro MV_FEXML se encuentra configurado con el valor S, se solicita realizar la implementación de personalizaciones por medio de puntos de entrada disponibles, que permitan las siguientes acciones:

    • Personalización de los nodos de Complemento de comercio exterior: cce20:Emisor, cce20:Receptor,cce20:Domicilio y cce20:Mercancia.


    SOLUCIÓN:

    En la rutina Generación de XML para Documentos de Entrada (FATEMEX) y la rutina Generación de XML para Documentos de Salida (FATSMEX) , se realizan los siguientes ajustes:

    • Se activa el punto de entrada PEXMLCCE para permitir la personalización de los nodos de Complemento de comercio exterior: cce20:Emisor, cce20:Receptor,cce20:Domicilio  y  cce20:Mercancia.
      • En el nodo cce20:Emisor\cce20:Domicilio, permitir personalizar los atributos:
        • Calle

        • Colonia

        • Municipio

        • Estado

        • Pais

        • CodigoPostal

      • En el nodo cce20:Receptor\cce20:Domicilio, permitir personalizar los atributos
        • Calle

        • NumeroExterior

        • NumeroInterior

        • Colonia

        • Municipio

        • Estado

        • Pais

        • CodigoPostal

      • En el nodo cce20:Mercancia, permitir personalizar los atributos
        • NoIdentificacion

        • FraccionArancelaria

        • CantidadAduana

        • UnidadAduana

        • ValorUnitarioAduana

        • ValorDolares


    Informações
    titleInformación

    El punto de Entrada PEXMLCCE,recibe 2 parámetros, donde:

    El primer parámetro es de tipo caracter, con las siguientes opciones:

    • EM personalizar datos del Emisor,
    • RE personalizar datos del Receptor
    • MER personalizar datos de Mercancia

    El segundo parámetro recibe es un arreglo de información, el cual cuenta con los datos del Emisor, Receptos o Mercancia dependiendo del valor del primer parámetro:

    • Si el primer parámetro contiene "EM",  el arreglo contiene datos del Emisor y se compone de los siguientes datos:
      • [1] - Contiene el valor del atributo Calle, por estandar se obtiene el valor del campo M0_ENDCOB
      • [2] - Contiene el valor del atributo Colonia, por estandar se obtiene el valor del catálogo S015 - Colonias , usando los campos M0_CEPENT  - M0_CODZOSE
      • [3] - Contiene el valor del atributo Municipio, por estandar se obtiene el valor del campo M0_CODMUN
      • [4] - Contiene el valor del atributo Estado, por estandar se obtiene el valor del catálogo S004 - Códigos Postales, usando el campo M0_CEPENT 
      • [5] - Contiene el valor del atributo Pais, por estándar el valor asignado es "MEX".
      • [6] - Contiene el valor del atributo CodigoPostal, por estandar se obtiene el valor del campo M0_CEPENT 
    • Si el primer parámetro contiene "RE",  el arreglo contiene datos del Receptor y se compone de los siguientes datos:
      • [1] - Contiene del campo RFC(A1_CGC).
      • [2] - Contiene del campo Nombre(A1_NOME).
      • [3] - Contiene del campo CP(A1_CEP).
      • [4] - Contiene el valor del atributo Calle, por estandar se obtiene el valor del campo Direccion(A1_END).
      • [5] - Contiene el valor del atributo NumeroExterior, por estandar se obtiene el valor del campo Numero exter(A1_NR_END).
      • [6] - Contiene el valor del atributo NumeroInterior, por estandar se obtiene el valor del campo Numero inter(A1_NROINT).
      • [7] - Contiene el valor del atributo Colonia, por estandar se obtiene el valor del campo Barrio(A1_BAIRRO).
      • [8] - Contiene el valor del atributo Municipio, por estandar se obtiene el valor del campo Municipio(A1_MUN).
      • [9] - Contiene el valor del atributo Estado, por estandar se obtiene el valor de la tabla SX5, usando el campo Est.Cliente(A1_EST). 
      • [10] - Contiene el valor del atributo Pais, se obtiene de la tabla SYA - Países, del campo País SAT(YA_CCESAT) , usando como busqueda el campo Pais(A1_PAIS).
      • [11] - Contiene el valor del atributo CodigoPostal, por estandar se obtiene el valor del campo CP(A1_CEP).
      • [12] - Contiene el valor del atributo NumRegIdTrib, por estandar se obtiene el valor del campo Reg. Fiscal (F2_IDTRIB).
    • Si el primer parámetro contiene "MER",  el arreglo contiene datos del Receptor y se compone de los siguientes datos:
      • [1] - Contiene del campo Item(D2_ITEM).
      • [2] - Contiene del campo Producto(D2_COD).
        • El valor del atributo NoIdentificacion se compone del valor del campo Item(D2_ITEM y del campo Producto(D2_COD).
      • [3] - Contiene del campo Frac. Arance(D2_FRACCA ).
      • [4] - Contiene del campo Num.Iden.Com(D2_NICO)
        • El valor del atributo FraccionArancelaria, por estandar se obtiene el valor de los campos Frac. Arance(D2_FRACCA ) + Num.Iden.Com(D2_NICO)
      • [5] - Contiene el valor del atributo CantidadAduana, por estandar se obtiene el valor del campo Cant. Aduana(D2_CANADU).
      • [6] - Contiene el valor del atributo ValorUnitarioAduana, por estandar se obtiene el valor del campo Val. Aduana (D2_VALADU ).
      • [7] - Contiene el valor del atributo ValorDolares, por estandar se obtiene el valor del campo Valor USD(D2_USDADU).
      • [8] - Contiene el valor del atributo UnidadAduana, por estandar se obtiene el valor catálogo S014 - Fracción Arancelaria, usando el campo Frac. Arance(D2_FRACCA ).

    El retorno debe ser el arreglo con las mismas dimensiones y solo de debe personalizar los datos que se requieran, los demás datos se quedarán con el valor estándar.


    EJEMPLO DE PUNTO DE ENTRADA:

    Bloco de código
    titlePEXMLCCE
    linenumberstrue
    #include 'protheus.ch'
    #INCLUDE "FWMVCDEF.CH"
    #include "FILEIO.CH"   User Function PEXMLCCE()
    	Local cOpc    := PARAMIXB[1] //Opión donde EM - Información Emisor Complemento de comercio,
    								// RE - Información Receptor Complemento de comercio
    								// ME - Información Mercancia Complemento de comercio
    	Local aData   := PARAMIXB[2] //Arreglo con los datos para personalización.
    
    	//Datos Emisor
     	If cOpc == "EM"
    		
    	Endif
    
    	//Datos Receptor 
    	If cOpc == "RE"
    		//Personalización atributo CodigoPostal
    		aData[11] := Alltrim(SA1->A1_COD_MUN)
    	Endif
    
      	//Datos Mercancia
    	If cOpc == "MER"
    		
    	Endif  
    
    Return aData


    5.21 Factura de Exportación Temporal


    Producto

    Solucoes_espanhol
    SolucaoTOTVS Backoffice

    Línea de producto: 

    Linhas_totvs_espanhol
    LinhaLínea Protheus

    Segmento:

    Segmentos_totvs_espanhol
    SegmentoBackoffice

    Módulo:SIGAFAT - Facturación
    Función:
    RutinaNombre TécnicoFecha
    FATSMEX.INIGeneración de XML para Documentos de Salida28/05/2024
    FATSEMEX.PRWGeneración de XML de Documentos de Salida28/05/2024
    OutputFieldsMexEstructura de Campos de Documentos de Salida28/05/2024
    FATXFUMIFunciones genéricas para Facturación - Mercado Internacional25/05/2024
    País:México (Pacote: 013995)
    Ticket:19925853 
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-23142


    SITUACIÓN/REQUISITO

    De acuerdo el articulo 29 del CFF que indica que los contribuyentes que exporten mercancías que no sean objetos de enajenación deberán expedir el comprobante fiscal digital por internet que ampare la operación. Por lo cual se solicita poder generar y timbrar una Factura de tipo "Exportación Temporal (03)" donde de acuerdo a lo definido por el SAT indica que cuando se registre la clave “03” (Temporal) se debe omitir el “Complemento para Comercio Exterior."

    En caso tener personalizaciones en el archivo FATSMEX.INI, se debe hacer los ajustes que se enmarcan a continuación:

    Informações
    titleInformación

    Los ajustes al archivo fatsmex.ini, solo aplican para cuando el parámetro MV_FEXML se encuentra configurado con un valor diferente de .T.  Para más información acerca de este parámetro, consulte el enlace DT Factura electrónica, sin uso de archivos .INI para México

    Painel
    titleFATSMEX.INI

    //FATSMEX.INI V4.0 --- Modelo 2022

    [XXX POSICIONAMENTOS]
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SA2->(MSSeek(xFilial("SA2")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)

    [XXX INICIALIZACION]
    (PRE) SD2->(DbSetOrder(1))
    (PRE) SB1->(DbSetOrder(1))
    (PRE) SYA->(DbSetOrder(1))
    (PRE) SC6->(DbSetOrder(1))
    (PRE) SE4->(DbSetOrder(1)) 
    (PRE) CTO->(DbSetOrder(1)) 
    (PRE) SAH->(DbSetOrder(1)) 
    (PRE) _aTotal[009] := SuperGetMV("MV_CFDICPG", .F., "")
    (PRE) _aTotal[010] := FindFunction("zh_FechaHoraUTC") .And. !Empty(_aTotal[009])
    (PRE) _aTotal[011] := FindFunction("LxFunaCaPo")
    (PRE) _aTotal[094] := ""
    (PRE) _aTotal[095] := ""
    (PRE) _aTotal[033] := ""
    (PRE) _aTotal[034] := ""
    (PRE) _aTotal[035] := ""
    (PRE) _aTotal[036] := 0
    (PRE) _aTotal[037] := 0
    (PRE) _aTotal[038] := 0
    (PRE) _aTotal[039] := SuperGetMV("MV_CFDIEXP",.F.,.F.)
    (PRE) _aTotal[075] := Alltrim(SM0->M0_NOMECOM)
    (PRE) _aTotal[076] := Alltrim(SF2->F2_TIPODOC) == "21" .And. ((!(Alltrim(SF2->F2_TIPOPE) $ "3|4")) .Or. SF2->(ColumnPos("F2_TPCOMPL")) > 0 .And. AllTrim(SF2->F2_TPCOMPL)=="S")
    (PRE) IIf(_aTotal[010],_aTotal[096] := zh_FechaHoraUTC(Alltrim(_aTotal[009]),Alltrim(SM0->M0_CEPENT),SF2->F2_EMISSAO,SF2->F2_HORA),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] := DtoS(SF2->F2_EMISSAO),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] := Left(_aTotal[096],4) + "-" + Substr(_aTotal[096],5,2)+ "-" + Right(_aTotal[096],2),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] += "T" + SF2->F2_HORA,"")
    (PRE) _aTotal[097] := {"SD2",""}
    (PRE) _aTotal[098] := "|"
    (PRE) _aTotal[099] := "||"
    (PRE) _aTotal[100] := ""
    (PRE) _aTotal[101] := "OPERACION DE CONFORMIDAD CON EL ART. 29 FRACCION I DE LIVA Y LO ESTIPULADO EN LAS RGCE 5.2.6. FRACCION I, 5.2.7 Y 4.3.21"
    (PRE) _aTotal[102] := "OPERACION DE CONFORMIDAD CON EL ART. 29 FRACCION I DE LIVA Y LO ESTIPULADO EN LAS RGCE 5.2.6. FRACCION II, 5.2.7 Y 4.3.21"
    (PRE) _aTotal[103] := fSumBC(SF2->F2_DOC,SF2->F2_SERIE,SF2->F2_CLIENTE,SF2->F2_LOJA)
    (PRE) _aTotal[104] := IIf(SF2->(ColumnPos("F2_TPCOMPL")) > 0 .And. AllTrim(SF2->F2_TPCOMPL)=="S",.T.,.F.)
    (PRE) _aTotal[105] := ""
    (PRE) _aTotal[106] := IIf(Alltrim(SF2->F2_TIPODOC) == "21",0,2)
    (PRE) _aTotal[107] := IIf(SF2->(ColumnPos("F2_TPDOC")) > 0,ALLTRIM(SF2->F2_TPDOC),ALLTRIM(AI0->AI0_MPAGO))
    (PRE) _aTotal[108] := IIf(_aTotal[076],AllTrim(SM0->M0_CGC),AllTrim(SA1->A1_CGC))
    (PRE) _aTotal[109] := IIf(FindFunction("FxDelExp"),FxDelExp(IIf(_aTotal[076],_aTotal[075],Alltrim(SA1->A1_NOME))),IIf(_aTotal[076],_aTotal[075],Alltrim(SA1->A1_NOME)))
    (PRE) _aTotal[110] := IIf(_aTotal[076],AllTrim(SM0->M0_CEPENT),Alltrim(SA1->A1_CEP))
    (PRE) _aTotal[111] := IIf(_aTotal[076],Alltrim(SM0->M0_DSCCNA),Alltrim(AI0->AI0_REGFIS))
    (PRE) _aTotal[112] := FormPagGlo(SF2->F2_DOC,SF2->F2_SERIE)
    (PRE) _aTotal[113] := IIf(!_aTotal[039] .Or. (_aTotal[039] .And. Empty(SF2->F2_TIPOPE)),"01",IIf(Alltrim(SF2->F2_TIPOPE)== "4","03",IIf(SF2->F2_CVEPED !="A1" .Or. Alltrim(SF2->F2_TIPOPE)== "3","04","02")))
    (PRE) _aTotal[114] := IIf(_aTotal[113] == "03" .Or.(_aTotal[113] == "04" .And.( Empty(SF2->F2_CERORI) .Or. Empty(SF2->F2_INCOTER) .Or. Empty(SF2->F2_SUBDIV) .Or. Empty(SF2->F2_TCUSD) .Or. Empty(SF2->F2_TOTUSD))) ,.F.,.T.)
    (PRE) _aTotal[115] := {}


    Realizar los siguientes ajustes en el campo F2_TIPOPE:

    CampoF2_TIPOPE
    TituloTipo Opera  
    Opciones1=Exportación de servicios;2=Exportación;3=Exportación sin enajenación;4=Exportación Temporal                                                         
    Val SistemaVazio() .Or. (Pertence('1234') .And. ValTipoOpe(2))        


    Ejemplo de Utilización

    1. En el módulo Facturación (SIGAFAT), ir al menú Actualizaciones | Facturación | Facturaciones (MATA467N).
    2. Informar en la pregunta ¿Normal/Benef./Anticipo? la opción Traslado.
    3. En el encabezado informar los campos relacionados al complemento de Comercio Exterior:
      • Tipo Opera (F2_TIPOPE) - "04 - Exportación temporal"
    4. Informar el campo Uso CFDI (F2_USOCFDI) con el valor S01 - Sin efectos fiscales.
    5. Informar el campo Carta Porte? (F2_TPCOMPL) con la opción N - No.
    6. Informar los ítems de la Factura.
    7. Dar clic en "Grabar".
    8. Confirmar la generación y timbrado del Comprobante Fiscal Digital por Internet (CFDI).
    9. Validar que el timbrado haya sido exitoso.
    10. Validar en el XML:
      Que en el nodo cfdi:Comprobante, el atributo Exportación se encuentre informado con el valor  "03".

    5.22 Activación del Complemento de Carta Porte Versión 3.1


    Producto

    Solucoes_espanhol
    SolucaoTOTVS Backoffice

    Línea de producto: 

    Linhas_totvs_espanhol
    LinhaLínea Protheus

    Segmento:

    Segmentos_totvs_espanhol
    SegmentoBackoffice

    Módulo:SIGAFAT - Facturación
    Función:
    RutinaNombre TécnicoFecha
    LOCXFUNAFunciones Generales de Documentos Fiscales05/07/2024
    MATR475Informe de Notas Fiscales05/07/2024
    FATSMEX.INIEstructura de XML para Documentos de Salida05/07/2024
    FATSMEX.PRWGeneración de XML para Documentos de Salida05/07/2024
    País:México
    Ticket:20461724
    Requisito/Story/Issue (informe el requisito vinculado):DMINA-23609


    SITUACIÓN/REQUISITO

    Se solicita realizar los ajustes para que en el sistema Protheus, se active la funcionalidad del Complemento de Carta Porte para versión 3.1:

    • El complemento Carta Porte versión 3.1, se publicó en el Portal del SAT el 17 de junio de 2024.
    • El complemento Carta Porte versión 3.1, se debe estar utilizando a partir del 17 de julio de 2024.

    SOLUCIÓN

    En la rutina de Funciones Generales de Documentos Fiscales (LOXFUNCA):

    En la función que Genera la cadena original y nodo para complemento de Carta Porte para México (LxFunaCaPo):

    Se realiza ajuste para activar el uso del prefijo cartaporte31 en el nodo de Complemento de Carta Porte y el atributo Versión como 3.1.

    Se activa la generación del nodo cartaporte31:RegimenesAduaneros para informar los códigos de Régimen Aduanero, se elima la generación del atributo RegimenAduanero del nodo ..cfdi:Complemento\cartaporte30:CartaPorte.

    Image Added

    El atributo FraccionArancelarcia se hace opcional, solo se informará si el campo Frac. Arance (D2_FRACCA) es informado, ya no depende de que el campo Transp Inter (A1X_INTERN) sea S - Si.

    Se modifica para que el atributo FraccionArancelaria sea opcional.

    En la rutina del Informe de Notas Fiscales (MATR475):

    Se realizan ajustes para permitir la impresión de los datos del complemento de Carta Porte para versión 3.1.


    Informações
    titleInformación

    Para desactivar la funcionalidad del Complemento de Carta Porte versión 3.1 se debe crear el parámetro MV_ACTCOCP de tipo lógico y configurarlo con el valor .F., con lo cual se revierten lo sajustes realizados para versión 3.1 y se generan de acuerdo a la versión 3.0.

    Para la generación del XML si se utiliza el archivo FATSMEX.INI, se debe hacer de manera manual el ajuste de las url's de la declaración del complemento de carta porte.

    Para la generación del Nodo cartaporte31:RegimenesAduaneros, actualmente el sistema Portheus sólo permite relacionar un código de Régimen Aduanero, el cual se informa en el campo Rég. Aduana (A1X_REGADU).


    Realizar los ajustes que se marcan en color Naranja en el archivo de Estructura de XML para Documentos de Salida, que corresponde a las url's del Complemento de Carta Porte: 


    Informações
    titleFATSMEX.INI

    //FATSMEX.INI V4.0 --- Modelo 2022

    [XXX POSICIONAMENTOS]
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SA2->(MSSeek(xFilial("SA2")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)

    [XXX INICIALIZACION]
    (PRE) SD2->(DbSetOrder(1))
    (PRE) SB1->(DbSetOrder(1))
    (PRE) SYA->(DbSetOrder(1))
    (PRE) SC6->(DbSetOrder(1))
    (PRE) SE4->(DbSetOrder(1)) 
    (PRE) CTO->(DbSetOrder(1)) 
    (PRE) SAH->(DbSetOrder(1)) 
    (PRE) _aTotal[009] := SuperGetMV("MV_CFDICPG", .F., "")
    (PRE) _aTotal[010] := FindFunction("zh_FechaHoraUTC") .And. !Empty(_aTotal[009])
    (PRE) _aTotal[011] := FindFunction("LxFunaCaPo")
    (PRE) _aTotal[094] := ""
    (PRE) _aTotal[095] := ""
    (PRE) _aTotal[033] := ""
    (PRE) _aTotal[034] := ""
    (PRE) _aTotal[035] := ""
    (PRE) _aTotal[036] := 0
    (PRE) _aTotal[037] := 0
    (PRE) _aTotal[038] := 0
    (PRE) _aTotal[039] := SuperGetMV("MV_CFDIEXP",.F.,.F.)
    (PRE) _aTotal[075] := Alltrim(SM0->M0_NOMECOM)
    (PRE) _aTotal[076] := Alltrim(SF2->F2_TIPODOC) == "21" .And. ((!(Alltrim(SF2->F2_TIPOPE) $ "3|4")) .Or. SF2->(ColumnPos("F2_TPCOMPL")) > 0 .And. AllTrim(SF2->F2_TPCOMPL)=="S")
    (PRE) IIf(_aTotal[010],_aTotal[096] := zh_FechaHoraUTC(Alltrim(_aTotal[009]),Alltrim(SM0->M0_CEPENT),SF2->F2_EMISSAO,SF2->F2_HORA),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] := DtoS(SF2->F2_EMISSAO),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] := Left(_aTotal[096],4) + "-" + Substr(_aTotal[096],5,2)+ "-" + Right(_aTotal[096],2),"")
    (PRE) IIf(!_aTotal[010],_aTotal[096] += "T" + SF2->F2_HORA,"")
    (PRE) _aTotal[097] := {"SD2",""}
    (PRE) _aTotal[098] := "|"
    (PRE) _aTotal[099] := "||"
    (PRE) _aTotal[100] := ""
    (PRE) _aTotal[101] := "OPERACION DE CONFORMIDAD CON EL ART. 29 FRACCION I DE LIVA Y LO ESTIPULADO EN LAS RGCE 5.2.6. FRACCION I, 5.2.7 Y 4.3.21"
    (PRE) _aTotal[102] := "OPERACION DE CONFORMIDAD CON EL ART. 29 FRACCION I DE LIVA Y LO ESTIPULADO EN LAS RGCE 5.2.6. FRACCION II, 5.2.7 Y 4.3.21"
    (PRE) _aTotal[103] := fSumBC(SF2->F2_DOC,SF2->F2_SERIE,SF2->F2_CLIENTE,SF2->F2_LOJA)
    (PRE) _aTotal[104] := IIf(SF2->(ColumnPos("F2_TPCOMPL")) > 0 .And. AllTrim(SF2->F2_TPCOMPL)=="S",.T.,.F.)
    (PRE) _aTotal[105] := ""
    (PRE) _aTotal[106] := IIf(Alltrim(SF2->F2_TIPODOC) == "21",0,2)
    (PRE) _aTotal[107] := IIf(SF2->(ColumnPos("F2_TPDOC")) > 0,ALLTRIM(SF2->F2_TPDOC),ALLTRIM(AI0->AI0_MPAGO))
    (PRE) _aTotal[108] := IIf(_aTotal[076],AllTrim(SM0->M0_CGC),AllTrim(SA1->A1_CGC))
    (PRE) _aTotal[109] := IIf(FindFunction("FxDelExp"),FxDelExp(IIf(_aTotal[076],_aTotal[075],Alltrim(SA1->A1_NOME))),IIf(_aTotal[076],_aTotal[075],Alltrim(SA1->A1_NOME)))
    (PRE) _aTotal[110] := IIf(_aTotal[076],AllTrim(SM0->M0_CEPENT),Alltrim(SA1->A1_CEP))
    (PRE) _aTotal[111] := IIf(_aTotal[076],Alltrim(SM0->M0_DSCCNA),Alltrim(AI0->AI0_REGFIS))
    (PRE) _aTotal[112] := FormPagGlo(SF2->F2_DOC,SF2->F2_SERIE)
    (PRE) _aTotal[113] := IIf(!_aTotal[039] .Or. (_aTotal[039] .And. Empty(SF2->F2_TIPOPE)),"01",IIf(Alltrim(SF2->F2_TIPOPE)== "4","03",IIf(SF2->F2_CVEPED !="A1" .Or. Alltrim(SF2->F2_TIPOPE)== "3","04","02")))
    (PRE) _aTotal[114] := IIf(_aTotal[113] == "03" .Or.(_aTotal[113] == "04" .And.( Empty(SF2->F2_CERORI) .Or. Empty(SF2->F2_INCOTER) .Or. Empty(SF2->F2_SUBDIV) .Or. Empty(SF2->F2_TCUSD) .Or. Empty(SF2->F2_TOTUSD))) ,.F.,.T.)
    (PRE) _aTotal[115] := {}
    (PRE) lCCCE        := .F.
    (PRE) cNodoCCE     := ""
    (PREREG) FsQuery(_aTotal[097],1,"D2_DOC='" + SF2->F2_DOC + "' AND D2_SERIE='" + SF2->F2_SERIE + "' AND D2_CLIENTE='" + SF2->F2_CLIENTE + "' AND D2_LOJA='" + SF2->F2_LOJA + "'","SD2->D2_DOC=SF2->F2_DOC .AND. SD2->D2_SERIE=SF2->F2_SERIE .AND. SD2->D2_CLIENTE=SF2->F2_CLIENTE .AND. SD2->D2_LOJA=SF2->F2_LOJA","D2_ITEM") .And. .T.

    (PRE) fImptosD(SF2->F2_DOC,SF2->F2_SERIE,SF2->F2_CLIENTE,SF2->F2_LOJA,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),"SD2", SF2->F2_GLOBAL == "1",@(_aTotal[036]),_aTotal[104],@_aTotal[037], @_aTotal[038], ,@_aTotal[115]) 

    [SD2 CADENAORIGINAL_SELLO]
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SA2->(MSSeek(xFilial("SA2")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SYA->(MsSeek(xFilial("SYA")+SA2->A2_PAIS)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",CTO->(MsSeek(xFilial("CTO")+Strzero(SF2->F2_MOEDA,2))) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PRE) If(AllTrim(SF2->F2_ESPECIE)<>"NDI",CTO->(MsSeek(xFilial("CTO")+Strzero(SF2->F2_MOEDA,2))) , .T.)
    //////////////////////////////////////////////CADENA ORIGINAL//////////////////////////////////////////////
    (PRE) cCadOrig   := _aTotal[099]
    (PRE) lCCCE      := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE)  .And. _aTotal[114], .T., .F.)
    (PRE) cCadOriCCE := ""

    //Cadena Original | Complemento de Comercio Exterior (Mercancias)
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_ITEM + SD2->D2_COD), (cCadOriCCE += Alltrim(SD2->D2_ITEM + SD2->D2_COD) + _aTotal[098],.T.),("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), (cCadOriCCE += Alltrim(SD2->D2_FRACCA) + Alltrim(SD2->D2_NICO) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_CANADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_CANADU)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), (cCadOriCCE += AllTrim(ObtColSAT("S014",AllTrim(SD2->D2_FRACCA),1,8,9,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_VALADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_VALADU,14,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. !Empty(Str(SD2->D2_USDADU)), (cCadOriCCE += Alltrim(Str(SD2->D2_USDADU,14,2)) + _aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. SA1->A1_CONTRBE=="1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", (cCadOriCCE += '1.0' +_aTotal[098],.T.), ("",,.T.))
    (PREREG) IIf(lCCCE .And. SA1->A1_CONTRBE=="1" .And. SF2->F2_CONUNI=="1", (cCadOriCCE += 'IMMEX:' + ALLTRIM(SA1->A1_PFISICA) + ' ' + _aTotal[101] + _aTotal[098],.T.), IIf (lCCCE .And. SA1->A1_CONTRBE=="1" .And. SF2->F2_CONUNI=="2", (cCadOriCCE += 'IMMEX:' + ALLTRIM(SA1->A1_PFISICA) + ' ' + _aTotal[102] + _aTotal[098],.T.), ("",,.T.)))

    ///////////DATOS DE LA FACTURA/////////////////
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    //Version
    (PRE) cCadOrig += "4.0" + _aTotal[098]
    //Serie
    (PRE) cCadOrig += Alltrim(SF2->F2_SERIE) + _aTotal[098]
    //Folio
    (PRE) cCadOrig += Alltrim(SF2->F2_DOC) + _aTotal[098]
    //Fecha
    (PRE) cCadOrig += Alltrim(_aTotal[096]) + _aTotal[098]
    //FormaPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", IIf(SF2->F2_GLOBAL == '1',IIf(!Empty(_aTotal[112]),_aTotal[112],_aTotal[107]),IIf(Empty(_aTotal[107]).Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",_aTotal[107])) + _aTotal[098] )
    //NoCertificado
    (PRE) cCadOrig += Alltrim(SF2->F2_CERTFOL) + _aTotal[098]
    //CondicionesDePago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + _aTotal[098] ) 
    //Subtotal
    (PRE) cCadOrig += Alltrim(STR(IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, (SF2->(F2_VALMERC+F2_FRETE+F2_SEGURO+F2_DESPESA) + _aTotal[103] + SF2->F2_DESCONT) - _aTotal[036] - _aTotal[037]),14,_aTotal[106])) + _aTotal[098]
    //Descuento
    (PRE) cCadOrig += IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", "", IIf( SF2->F2_DESCONT == 0, "", Alltrim(STR(SF2->F2_DESCONT,14,2)) + _aTotal[098]) )
    //Moneda
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21","XXX",Alltrim(CTO->CTO_MOESAT)) + _aTotal[098]
    //TipoCambio
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21","",IIf(Alltrim(CTO->CTO_MOESAT) <> "MXN", Alltrim(STR(SF2->F2_TXMOEDA,14,2)), "1") + _aTotal[098])
    //Total
    (PRE) cCadOrig += Alltrim(Str(IIf(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, iif(GetSx3Cache("F2_VALBRUT","X3_DECIMAL")<= 2,SF2->F2_VALBRUT + _aTotal[103]- _aTotal[037] - IIf(Len(_aTotal[115]) > 0,_aTotal[115][1],0),Round(SF2->F2_VALBRUT,2) + _aTotal[103] - _aTotal[037] - IIf(Len(_aTotal[115]) > 0,_aTotal[115][1],0))),14,_aTotal[106])) + _aTotal[098]
    //TipoDeComprobante
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_ESPECIE) == "NF",IIf(ALLTRIM(SF2->F2_TIPODOC) == "21", "T", "I" ), "E") + _aTotal[098]
    //Exportacion
    (PRE) cCadOrig += IIf(!Empty(_aTotal[113]),_aTotal[113],"01") + _aTotal[098]
    //MetodoPago
    (PRE) cCadOrig += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", Alltrim(SE4->E4_MPAGSAT) + _aTotal[098] )
    //LugarExpedicion
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + _aTotal[098]
    //Periodicidad
    (PRE) cCadOrig += IIf(SF2->(ColumnPos("F2_IDCBAJA")) > 0 .And. SF2->F2_GLOBAL == "1", SF2->F2_IDCBAJA + _aTotal[098],"")
    //Meses
    (PRE) cCadOrig += IIf(SF2->(ColumnPos("F2_MODCONS")) > 0 .And. SF2->F2_GLOBAL == "1", SF2->F2_MODCONS + _aTotal[098],"")
    //Año
    (PRE) cCadOrig += IIf(SF2->(ColumnPos("F2_PTOEMIS")) > 0 .And. SF2->F2_GLOBAL == "1", SF2->F2_PTOEMIS + _aTotal[098],"")

    //////////////////////CFDI Relacionados//////////////////////////
    (PREREG)!Empty(SF2->F2_RELSAT).Or. !Empty(SF2->F2_SERMAN).Or. !Empty(SF2->F2_DOCMAN)
    (PRE) IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","",fGetFolRel("S",.T.))

    ///////////DATOS DEL EMISOR///////////////////////
    //Rfc
    (PRE) cCadOrig += CFDCarEsp(AllTrim(SM0->M0_CGC),.F.) + _aTotal[098]
    //Nombre
    (PRE) cCadOrig += CFDCarEsp(_aTotal[075],.F.) + _aTotal[098]
    //RegimenFiscal
    (PRE) cCadOrig += CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + _aTotal[098]

    //////////////////////DATOS DEL RECEPTOR//////////////////////////
    (PRE) AllTrim(SF2->F2_ESPECIE) <> "NDI"
    (PRE) SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA))
    (PRE) SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS))
    //Rfc
    (PRE) (cCadOrig += IIf(SF2->F2_GLOBAL == "1", "XAXX010101000", CFDCarEsp(_aTotal[108], .F.)) + _aTotal[098])
    //Nombre
    (PRE) (cCadOrig += IIF(SF2->F2_GLOBAL == "1", "PUBLICO EN GENERAL",CFDCarEsp(_aTotal[109],.F.)) + _aTotal[098], .T.)
    //DomicilioFiscalReceptor
    (PRE) (cCadOrig += CFDCarEsp(_aTotal[110],.F.) + _aTotal[098], .T.)
    //ResidenciaFiscal
    (PRE) IIf(lCCCE .And. !Empty(CFDCarEsp(Alltrim(SF2->F2_RESIDE))) .And. !_aTotal[076], cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SF2->F2_RESIDE,"YA_CCESAT")) + _aTotal[098], "")
    //NumRegIdTrib
    (PRE) IIf(lCCCE .And. !Empty(CFDCarEsp(Alltrim(SF2->F2_IDTRIB))) .And. !_aTotal[076], cCadOrig += CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + _aTotal[098], "")
    //RegimenFiscalReceptor
    (PRE) (cCadOrig += IIf(AI0->(ColumnPos("AI0_REGFIS")) > 0,CFDCarEsp(_aTotal[111],.F.) + _aTotal[098],""), .T.)
    //UsoCFDI
    (PRE) (cCadOrig += Alltrim(SF2->F2_USOCFDI) + _aTotal[098], .T.)

    (PRE) (cCadOrig += fXMLFUN("CO",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.)
    (PRE) (cCadOrig += fXMLFUN("TI",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)

    (POS) IIf(lCCCE, cCadOrig += "2.0" + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_TRASLA), cCadOrig += Alltrim(SF2->F2_TRASLA) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_CVEPED), cCadOrig += Alltrim(SF2->F2_CVEPED) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_CERORI), cCadOrig += Alltrim(SF2->F2_CERORI) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_NUMCER), cCadOrig += Alltrim(SF2->F2_NUMCER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_EXPCONF), cCadOrig += Alltrim(SF2->F2_EXPCONF) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SF2->F2_INCOTER), cCadOrig += Alltrim(SF2->F2_INCOTER) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. SF2->(ColumnPos("F2_OBSCE")) > 0 .And. !Empty(SF2->F2_OBSCE), cCadOrig += CFDCarEsp(AllTrim(SF2->F2_OBSCE), .F.) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF2->F2_TCUSD)), cCadOrig += Alltrim(Str(SF2->F2_TCUSD)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(Str(SF2->F2_TOTUSD)), cCadOrig += Alltrim(Str(SF2->F2_TOTUSD,14,2)) + _aTotal[098], "")

    //Emisor
    (POS) IIf(lCCCE , cCadOrig += CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CEPENT), cCadOrig += CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CODZOSE)+ALLTRIM(SM0->M0_CEPENT),1,9,1,4))) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(SM0->M0_CODMUN), cCadOrig += AllTrim(SM0->M0_CODMUN) + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += "MEX" + _aTotal[098], "")
    (POS) IIf(lCCCE , cCadOrig += AllTrim(SM0->M0_CEPENT) + _aTotal[098], "")

    //Receptor Domicilio
    (POS) IIf(lCCCE .And. _aTotal[108] == "XEXX010101000", cCadOrig += CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(AllTrim(SA1->A1_END)) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), cCadOrig += AllTrim(SA1->A1_NR_END) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), cCadOrig += AllTrim(SA1->A1_NROINT) + _aTotal[098], "")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), cCadOrig +=  CFDCarEsp(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))) + _aTotal[098],"")
    (POS) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_MUN))), cCadOrig +=  CFDCarEsp(AllTrim(SA1->A1_MUN),.F.) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + _aTotal[098],"")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + _aTotal[098], "")
    (POS) IIf(lCCCE, cCadOrig += AllTrim(SA1->A1_CEP) + _aTotal[098], "")

    //Destinatarios
    (POS) IIf(lCCCE .And. FindFunction("LxCEDest") .And. SF2->(ColumnPos("F2_ACOPLA")) > 0, cCadOrig += LxCEDest(SF2->F2_CLIENTE,SF2->F2_LOJA,SF2->F2_ACOPLA, .T.), "")

    (POS) cCadOrig += IIf(!Empty(cCadOriCCE), cCadOriCCE, "")

    //Carta Porte
    (POS) IIf(_aTotal[011],(cCadOrig += LxFunaCaPo(SF2->F2_FILIAL,SF2->F2_DOC,SF2->F2_SERIE,.T.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.),"")

    (POS) (cCadOrig += fXMLFUN("IL",.T., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)

    (POS) cCadOrig += _aTotal[098]
    (POS) _aTotal[033] := cCadOrig

    //SELLO
    (POS) _aTotal[100] := EVPDigest(cCadOrig,5)
    (POS) _aTotal[100] := PrivSignRSA(&(SuperGetMv("MV_CFDDIRS",,""))+SuperGetMv("MV_CFDARQS",,""),_aTotal[100],6,"assinatura")
    (POS) _aTotal[100] := ENCODE64(_aTotal[100])
    [XXX CABECERA]
    Linha1     C 041 0 Chr(239) + Chr(187) + Chr(191) + '<?xml version="1.0" encoding="UTF-8"?>'
    [XXX FACTURA]
    //Certificado del SAT incluido para pruebas 
    (PRE) cCert := "MIIFuTCCA6GgAwIBAgIUMzAwMDEwMDAwMDA1MDAwMDM0NDIwDQYJKoZIhvcNAQELBQAwggErMQ8wDQYDVQQDDA"
    (PRE) cCert +="ZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFETUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9yaXR5MSgwJgYJKoZIhvcNAQ"
    (PRE) cCert +="kBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0wGwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWxpejEOMAwGA1UEEQwFMDYzNzAxCzAJBgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYS"
    (PRE) cCert +="UNPMREwDwYDVQQHDAhDT1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3BvbnNhYmxlOiBBQ0RNQS1TQVQwHhcNMjMwNTE4MTI1OTI2WhcNMjcwNTE4MTI1OTI2WjCB4DEqM"
    (PRE) cCert +="CgGA1UEAxMhWEVOT04gSU5EVVNUUklBTCBBUlRJQ0xFUyBTIERFIENWMSowKAYDVQQpEyFYRU5PTiBJTkRVU1RSSUFMIEFSVElDTEVTIFMgREUgQ1YxKjAoBgNVBAoTIVhFTk9OIElORFVTVFJJQUwgQVJUSUNMRVMgUyBERSBDVjElMCMGA1UEL"
    (PRE) cCert +="RMcWElBMTkwMTI4SjYxIC8gVkFEQTgwMDkyN0RKMzEeMBwGA1UEBRMVIC8gVkFEQTgwMDkyN0hTUlNSTDA1MRMwEQYDVQQLEwpTdWN1cnNhbCAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAga5zxQ4mEBE4LobElO0+UyMDcAYbY0NJbg4x"
    (PRE) cCert +="Nbvwd66CUuTjyK2q11Y6nTzod1I1Nhv75cfZbJzdW/4EO/1bGLEt3zpTnP0yDVh9KL4/WJ0QW5kR4QVpxd84aBkJe7FltC5j+FUiDSCCLpSBlGvwZdFAwZhSZvHeFB1i1pDc3rA/PvqJwn35goEdIfhgfymg+31LuL1stU30pOSYtxltiEoM3QFePVurYhYq"
    (PRE) cCert +="sxNmZMGkRvVNrf/SnZsiaLUonM8CNLfhJIFxBraH3qeZ3iCaeFgL8zO5ux+8D1XAg2RpJLf7gFVC9fWOc9yaHKNsjkt1E2YauH9KpHxRAjt3zKniywIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQsFAAOCAgEAR73vD"
    (PRE) cCert +="0WGeWtnZyIFixfsNtvM3068JFvn4LJ0aF0ZZwTJhcff7OrUrpsrCjMzpIOB3Lfq5DLtaIPNeEkSa5W4yi1XJ930kcJ4kubi16jmTIMIZ7w9fy8p99gggTMbYiFf0Jzvfz+PQqqpsfnc3lMVV/GkHvs8QHEekZxpWHS22oE/S5wKq7b85oW649fC834EoZGIsb8"
    (PRE) cCert +="0Rna4ATuDxbt3dvzTR/b/eyricihMBqQ1MPCi9D81o1/3EPEOZNYFcC+yQK7M+/C7pivs0A972q8LYxG8DzmaKV8zLg+IR9ygdYdl/y/Snoeo0udV4yUlzug7i5IGZbfUh2jo3WEkEdIpty+lcVt2PtWOTdR70V0oCivE0MV0qw9GRzFAr6G71fra6r+sUKUwxQB"
    (PRE) cCert +="n07pi6hHmmZ7/DZ9QCaheqD9ttdhlQhpTTt0UPpWY9CDUJKpbWlkKYUzLPkdf/ppjiizbP1fqDcoIfZxl4RPKKtr0eIJWhEnuVirZ0kevHXEspI+igdMqk8MRndZSoohuIuLdjKjfXEGBALoqUzAB6avN2zzEy6ERRCGfR3cVhVUTcpd/iQffeGvw7tRZZOiWgwG3"
    (PRE) cCert +="Sjc/zgUppnFXfVFHCTmRz1nr0dOqKjOpMEMncRSfY2Mk+Xm8rmJ7toBu4iAyJUDCP6v24as1uxiE9DVDaFwlugdYL9c="
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.) .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114], .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) If(AllTrim(SF2->F2_ESPECIE)=="NDI",SYA->(MsSeek(xFilial("SYA")+SA2->A2_PAIS)) , .T.)
    (PRE) (SE4->(MSSeek(xFilial("SE4")+SF2->F2_COND)) , .T.)
    (PRE) (AI0->(MSSeek(xFilial("AI0")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PRE) _aTotal[001] := '<cfdi:Comprobante'
    (PRE) _aTotal[001] += ' xmlns:cfdi="http://www.sat.gob.mx/cfd/4"'
    (PRE) _aTotal[001] += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
    (PRE) _aTotal[001] += Iif(_aTotal[104],' xmlns:cartaporte31="http://www.sat.gob.mx/CartaPorte31"','')
    (PRE) _aTotal[001] += ' xmlns:implocal="http://www.sat.gob.mx/implocal"'
    (PRE) _aTotal[001] += IIf(lCCCE .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", ' xmlns:leyendasFisc="http://www.sat.gob.mx/leyendasFiscales"' , "")
    (PRE) _aTotal[001] += ' xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd '
    (PRE) _aTotal[001] += IIF(lCCCE,'http://www.sat.gob.mx/ComercioExterior20 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior20/ComercioExterior20.xsd ','http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd')
    (PRE) _aTotal[001] += IIf(_aTotal[104],' http://www.sat.gob.mx/CartaPorte31http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte31.xsd','')
    (PRE) _aTotal[001] += IIf(lCCCE .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", ' http://www.sat.gob.mx/leyendasFiscales http://www.sat.gob.mx/sitio_internet/cfd/leyendasFiscales/leyendasFisc.xsd"' , '"')
    (PRE) _aTotal[001] += IIf(lCCCE, ' xmlns:cce20="http://www.sat.gob.mx/ComercioExterior20" ' , "")
    (PRE) _aTotal[001] += ' Version="4.0"'
    (PRE) _aTotal[001] += ' Serie="' + Alltrim(SF2->F2_SERIE) + '"'
    (PRE) _aTotal[001] += ' Folio="' + Alltrim(SF2->F2_DOC) + '"'
    (PRE) _aTotal[001] += ' Fecha="' + Alltrim(_aTotal[096]) + '"'
    (PRE) _aTotal[001] += ' Sello="' + Alltrim(_aTotal[100]) + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' FormaPago="' +  IIf(SF2->F2_GLOBAL == '1',IIf(!Empty(_aTotal[112]),_aTotal[112],_aTotal[107]),IIf(Empty(_aTotal[107]) .Or. Alltrim(SE4->E4_MPAGSAT) == "PPD","99",_aTotal[107])) + '"' )
    (PRE) _aTotal[001] += ' NoCertificado="' + Alltrim(SF2->F2_CERTFOL) + '"'
    (PRE) _aTotal[001] += ' Certificado="' + cCert + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' CondicionesDePago="' +  CFDCarEsp(Alltrim(SE4->E4_DESCRI)) + '"' ) 
    (PRE) _aTotal[001] += ' SubTotal="' + Alltrim(STR(IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", 0, (SF2->(F2_VALMERC+F2_FRETE+F2_SEGURO+F2_DESPESA)  + _aTotal[103] + SF2->F2_DESCONT) - _aTotal[036] - _aTotal[037] ),14,_aTotal[106])) + '"'
    (PRE) _aTotal[001] += IIF(ALLTRIM(SF2->F2_TIPODOC) == "21", "", IIf( SF2->F2_DESCONT == 0, "", ' Descuento="' + Alltrim(STR(SF2->F2_DESCONT,14,2)) + '"' ))
    (PRE) _aTotal[001] += ' Moneda="' + IIf(Alltrim(SF2->F2_TIPODOC) == "21","XXX",Alltrim(CTO->CTO_MOESAT)) + '"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' TipoCambio="' + IIf(Alltrim(CTO->CTO_MOESAT) <> "MXN", Alltrim(STR(SF2->F2_TXMOEDA,14,2)), "1") + '"') 
    (PRE) _aTotal[001] += ' Total="' + Alltrim(Str(IIf(Alltrim(SF2->F2_TIPODOC) == "21", 0, IIf(GetSx3Cache("F2_VALBRUT","X3_DECIMAL") <= 2,SF2->F2_VALBRUT + _aTotal[103] - _aTotal[037] - _aTotal[038] - IIf(Len(_aTotal[115]) > 0,_aTotal[115][1],0),Round(SF2->F2_VALBRUT,2) + _aTotal[103] - _aTotal[037] - _aTotal[038] - IIf(Len(_aTotal[115]) > 0,_aTotal[115][1],0))),14,_aTotal[106])) +  '"'
    (PRE) _aTotal[001] += ' TipoDeComprobante="' + IIf(Alltrim(SF2->F2_ESPECIE) == "NF",IIf(Alltrim(SF2->F2_TIPODOC) == "21", "T", "I"), "E") + '"'
    (PRE) _aTotal[001] += ' Exportacion="'+IIf(!Empty(_aTotal[113]),_aTotal[113],"01")+'"'
    (PRE) _aTotal[001] += IIf(Alltrim(SF2->F2_TIPODOC) == "21", "", ' MetodoPago="' +  Alltrim(SE4->E4_MPAGSAT) + '"' )
    (PRE) _aTotal[001] += ' LugarExpedicion="' + CFDCarEsp(AllTrim(SM0->M0_CEPENT)) + '"'
    (PRE) _aTotal[001] += '>'
    (PREREG) _aTotal[001]

    (POS) cNodoCCE := IIf(lCCCE, '        <cce20:ComercioExterior' , "")
    (POS) cNodoCCE += IIf(lCCCE, ' Version="2.0"' , "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_TRASLA), ' MotivoTraslado="' + Alltrim(SF2->F2_TRASLA) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_CVEPED), ' ClaveDePedimento="' + Alltrim(SF2->F2_CVEPED) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_CERORI), ' CertificadoOrigen="' + Alltrim(SF2->F2_CERORI) +'"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_NUMCER), ' NumCertificadoOrigen="' + Alltrim(SF2->F2_NUMCER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_EXPCONF), ' NumeroExportadorConfiable="' + Alltrim(SF2->F2_EXPCONF) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(SF2->F2_INCOTER), ' Incoterm="' + Alltrim(SF2->F2_INCOTER) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. SF2->(ColumnPos("F2_OBSCE")) > 0 .And. !Empty(SF2->F2_OBSCE), ' Observaciones="' + CFDCarEsp(AllTrim(SF2->F2_OBSCE), .T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF2->F2_TCUSD)), ' TipoCambioUSD="' + Alltrim(Str(SF2->F2_TCUSD)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(Str(SF2->F2_TOTUSD)), ' TotalUSD="' + Alltrim(Str(SF2->F2_TOTUSD,14,2)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "")
    (POS) _aTotal[094] := cNodoCCE

    [XXX CFDIREL]
    (PREREG) !Empty(SF2->F2_RELSAT).Or. !Empty(SF2->F2_SERMAN).Or. !Empty(SF2->F2_DOCMAN)
    (PREREG) (_aTotal[001] := IIf(_aTotal[104] .And. Alltrim(SF2->F2_TIPODOC) == "21","",fGetFolRel("S")))
    (PREREG) _aTotal[001]

    [XXX FACTURA GLOBAL]
    (PRE) (_aTotal[001] := IIF(SF2->F2_GLOBAL == "1",'    <cfdi:InformacionGlobal ',""))
    (PRE) (_aTotal[001] += Iif(SF2->(ColumnPos("F2_IDCBAJA")) > 0 .and. SF2->F2_GLOBAL == "1" ,' Periodicidad="' + SF2->F2_IDCBAJA  + '"',""))
    (PRE) (_aTotal[001] += Iif(SF2->(ColumnPos("F2_MODCONS")) > 0 .and. SF2->F2_GLOBAL == "1" ,' Meses="' + SF2->F2_MODCONS  + '"',""))
    (PRE) (_aTotal[001] += Iif(SF2->(ColumnPos("F2_PTOEMIS")) > 0 .and. SF2->F2_GLOBAL == "1" ,' Año="' + SF2->F2_PTOEMIS  + '"',""))
    (PRE) (_aTotal[001] += IIF(SF2->F2_GLOBAL == "1",'/>' ,""))
    (PRE) (_aTotal[001] := IIF(SF2->F2_GLOBAL == "1",_aTotal[001] ,""))
    (PREREG) _aTotal[001]

    [XXX EMISOR]
    (PRE) (_aTotal[001] := '    <cfdi:Emisor'  , .T.)
    (PRE) (_aTotal[001] += ' Rfc="' + CFDCarEsp(AllTrim(SM0->M0_CGC))+ '"'  , .T.)
    (PRE) (_aTotal[001] += ' Nombre="' + CFDCarEsp(_aTotal[075],.T.) + '"'  , .T.)
    (PRE) (_aTotal[001] += ' RegimenFiscal="' + CFDCarEsp(Alltrim(SM0->M0_DSCCNA)) + '"'  , .T.)
    (PRE) (_aTotal[001] += '/>'  , .T.)
    (PRE) (_aTotal[001] := _aTotal[001]  , .T.)
    (PREREG) _aTotal[001]

    [XXX RECEPTOR_CLIENTE]
    (PRE) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114], .T., .F.)
    (PRE) cNodoCCE := ""

    (PREREG) AllTrim(SF2->F2_ESPECIE) <> "NDI"
    (PREREG) (SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA)) , .T.)
    (PREREG) (SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS)) , .T.)
    (PREREG) (_aTotal[001] := '    <cfdi:Receptor' , .T.)
    (PREREG) (_aTotal[001] += ' Rfc="' + CFDCarEsp(IIf(SF2->F2_GLOBAL == "1", "XAXX010101000", _aTotal[108])) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' Nombre="' + iif(SF2->F2_GLOBAL == "1","PUBLICO EN GENERAL",CFDCarEsp(_aTotal[109],.T.)) + '"' , .T.)
    (PREREG) (_aTotal[001] += ' DomicilioFiscalReceptor="' + _aTotal[110] + '"' , .T.)
    (PREREG) (_aTotal[001] += Iif(AI0->(ColumnPos("AI0_REGFIS")) > 0,' RegimenFiscalReceptor="' + _aTotal[111] + '"',""), .T.)
    (PREREG) (_aTotal[001] += ' UsoCFDI="' + Alltrim(SF2->F2_USOCFDI) + '"' , .T.)
    (PREREG) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB)))) .And. !_aTotal[076], (_aTotal[001] += ' NumRegIdTrib="' + CFDCarEsp(AllTrim(AllTrim(SF2->F2_IDTRIB))) + '"' , .T.), "") 
    (PREREG) IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(AllTrim(SF2->F2_RESIDE)))) .And. !_aTotal[076], (_aTotal[001] += ' ResidenciaFiscal="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SF2->F2_RESIDE,"YA_CCESAT")) + '"' , .T.), "")
    (PREREG) (_aTotal[001] += '/>' ,.T.)
    (PREREG) (_aTotal[001] := _aTotal[001] , .T.)
    (PREREG) _aTotal[001]

    (POS) cNodoCCE += IIf(lCCCE, '            <cce20:Emisor' , "")
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 
    (POS) cNodoCCE += IIf(lCCCE, '                <cce20:Domicilio' , "")        
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SM0->M0_ENDCOB)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(CFDCarEsp(AllTrim(SM0->M0_CEPENT)))), ' Colonia="' + CFDCarEsp(AllTrim(ObtColSAT("S015",AllTrim(SM0->M0_CODZOSE)+ALLTRIM(SM0->M0_CEPENT),1,9,1,4))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SM0->M0_CEPENT))), ' Municipio="' + CFDCarEsp(AllTrim(SM0->M0_CODMUN)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(ObtColSAT("S004",AllTrim(SM0->M0_CEPENT),1,5,6,3))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim("MEX") + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SM0->M0_CEPENT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            </cce20:Emisor>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            <cce20:Receptor ' + IIf(_aTotal[108]=="XEXX010101000", 'NumRegIdTrib="' + CFDCarEsp(AllTrim(SF2->F2_IDTRIB)) + '"',""), "")     
    (POS) cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ), "") 
    (POS) cNodoCCE += IIf(lCCCE, '                <cce20:Domicilio' , "")        
    (POS) cNodoCCE += IIf(lCCCE, ' Calle="' + CFDCarEsp(AllTrim(SA1->A1_END)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NR_END)), ' NumeroExterior="' + AllTrim(SA1->A1_NR_END) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_NROINT)), ' NumeroInterior="' + AllTrim(SA1->A1_NROINT) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(CFDCarEsp(AllTrim(SA1->A1_BAIRRO))), ' Colonia="' + CFDCarEsp(AllTrim(SA1->A1_BAIRRO)) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE .And. !Empty(AllTrim(SA1->A1_MUN)), ' Municipio="' + CFDCarEsp(AllTrim(SA1->A1_MUN),.T.) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Estado="' + CFDCarEsp(Alltrim(Posicione("SX5",1,xFilial("SX5")+"12"+SA1->A1_EST,"X5_DESCRI"))) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' Pais="' + AllTrim(Posicione("SYA",1,xFilial("SYA")+SA1->A1_PAIS,"YA_CCESAT")) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, ' CodigoPostal="' + AllTrim(SA1->A1_CEP) + '"', "")
    (POS) cNodoCCE += IIf(lCCCE, '/>' + ( chr(13)+chr(10) ), "")
    (POS) cNodoCCE += IIf(lCCCE, '            </cce20:Receptor>' + ( chr(13)+chr(10) ), "") 
    //Destintarios
    (POS) cNodoCCE += IIf(lCCCE .And. FindFunction("LxCEDest") .And. SF2->(ColumnPos("F2_ACOPLA")) > 0, LxCEDest(SF2->F2_CLIENTE,SF2->F2_LOJA,SF2->F2_ACOPLA,.F.),"")
    (POS) (cNodoCCE += IIf(lCCCE, '            <cce20:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    [SD2 CONCEPTO]
    (PRE) lCCCE    := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114] , .T., .F.)
    (PRE) cNodoCCE := ""

    (PRE) DbGoTop()

    (PREREG) (cNodoCCE += IIf(lCCCE, '                  <cce20:Mercancia' , ""),.T.)      
    (PREREG) (cNodoCCE += IIf(lCCCE , ' NoIdentificacion="' + Alltrim(SD2->D2_ITEM + SD2->D2_COD) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), ' FraccionArancelaria="' + Alltrim(SD2->D2_FRACCA) + Alltrim(SD2->D2_NICO) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD2->D2_CANADU)), ' CantidadAduana="' + Alltrim(Str(SD2->D2_CANADU)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(SD2->D2_FRACCA), ' UnidadAduana="' + AllTrim(ObtColSAT("S014",AllTrim(SD2->D2_FRACCA),1,8,9,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE .And. !Empty(Str(SD2->D2_VALADU)), ' ValorUnitarioAduana="' + Alltrim(Str(SD2->D2_VALADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, ' ValorDolares="' + Alltrim(Str(SD2->D2_USDADU,14,2)) + '"', ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '>' + ( chr(13)+chr(10) ) , ""),.T.)
    (PREREG) (cNodoCCE += IIf(lCCCE, '                  </cce20:Mercancia>' + ( chr(13)+chr(10) ), ""),.T.)

    (POS) (cNodoCCE += IIf(lCCCE, '            </cce20:Mercancias>' + ( chr(13)+chr(10) ), ""),.T.)
    (POS) (cNodoCCE += IIf(lCCCE, '        </cce20:ComercioExterior>' , ""),.T.)
    (POS) _aTotal[094] += cNodoCCE

    (POS) (_aTotal[034] := fXMLFUN("CO",.F., IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),.T.)
     
    [XXX CONCEPTOS]
    (POS) FsQuery(_aTotal[097],2)

    (PREREG) (_aTotal[001] := _aTotal[034] ,.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOS]
    (PREREG) (_aTotal[002] := fXMLFUN("TI",.F.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.)),.T.)
    (PREREG) _aTotal[002]

    //IMPUESTOS LOCALES//
    (PRE) (_aTotal[095] := fXMLFUN("IL",.F.),.T.)

    [XXX COMPLEMENT]
    (PREREG) IIf(_aTotal[011],_aTotal[105] := LxFunaCaPo(SF2->F2_FILIAL,SF2->F2_DOC,SF2->F2_SERIE,.F.,IIf(ALLTRIM(SF2->F2_TIPODOC) == "21",.T.,.F.),_aTotal[104]),"")
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095] ) .Or. !Empty(_aTotal[105]) .or. _aTotal[104] , '    <cfdi:Complemento', ""), .T.)
    (PREREG) (_aTotal[001] += IIF(!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095] ) .Or. !Empty(_aTotal[105]),'>',""),.T.)
    (PREREG) _aTotal[001]
    COMPLEMENT  C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.T.,.F.,4))


    [XXX COMERCIOEX]
    (PREREG) (_aTotal[001] := _aTotal[094],.T.)
    (PREREG) _aTotal[001]

    [XXX CARTAPORTE]
    (PREREG) (_aTotal[001] := _aTotal[105],.T.)
    (PREREG) _aTotal[001]

    [XXX IMPUESTOLOC]
    (PREREG) (_aTotal[001] := _aTotal[095],.T.)
    (PREREG) _aTotal[001]

    [XXX LEYENDASFIS]
    (PREREG) lCCCE := IIf(SuperGetMV("MV_CFDIEXP",.F.,.F.)  .And. !Empty(SF2->F2_TIPOPE) .And. _aTotal[114], .T., .F.) .And. SF2->(FieldPos("F2_CONUNI")) > 0
    (PREREG) lCCCE
    (PREREG) (_aTotal[001] := IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF" , '        <leyendasFisc:LeyendasFiscales version="1.0" >'+ ( chr(13)+chr(10) ), ""), .T.)
    (PREREG) (_aTotal[001] += IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF" , '            <leyendasFisc:Leyenda textoLeyenda=', ""), .T.)
    (PREREG) (_aTotal[001] += IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. SF2->F2_CONUNI=="1" .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF", '"IMMEX:'+ AllTrim(SA1->A1_PFISICA) +' ' + _aTotal[101] +'" />', IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. SF2->F2_CONUNI=="2" .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF",'"IMMEX:'+ AllTrim(SA1->A1_PFISICA) + ' ' + _aTotal[102] +'" />',"")), .T.)
    (PREREG) _aTotal[001]
    (PREREG) (_aTotal[001] := IIF((!EMPTY(_aTotal[094] ) .or. !EMPTY(_aTotal[095])) .And. !EMPTY(SF2->F2_CONUNI) .And. SA1->A1_CONTRBE == "1" .And. Alltrim(SF2->F2_ESPECIE) == "NF",'        </leyendasFisc:LeyendasFiscales>', ""), .T.)
    (PREREG) _aTotal[001]


    [XXX COMPLEMENT]
    (PREREG) (_aTotal[001] := IIF(!EMPTY(_aTotal[094]) .or. !EMPTY(_aTotal[095]) .or. !EMPTY(_aTotal[105]),'    </cfdi:Complemento>',""), .T.)
    (PREREG) _aTotal[001]
    COMPLEMENT  C 021 0 ENCODEUTF8(XMLConv("",,,"cfdi:Complemento",.F.,.T.,4))

    //[XXX CAD_ORIG]
    //(PREREG) _aTotal[033] 

    [XXX FACTURA]
    (PRE) _aTotal[095] := &(GetNewPar("MV_CFDNAF2","Lower(AllTrim(SF2->F2_ESPECIE)) + '_' + Lower(AllTrim(SF2->F2_SERIE)) + '_'  + Lower(AllTrim(SF2->F2_DOC)) + '.xml'"))
    (ARQ) _aTotal[095]
    FACTURA    C 019 0 ENCODEUTF8(XMLConv("",,,"cfdi:Comprobante",.F.,.T.,0))




    06. OTRAS DOCUMENTACIONES


    07. TABLAS UTILIZADAS

    • SA1 - Clientes.
    • AI0 - Complemento de Clientes.
    • SF1 - Encabezado de facturas de entrada.
    • SF2 - Encabezado de facturas de salida.
    • SF3 - Libros Fiscales.
    • SD1 - Ítems de facturas de entrada.
    • SD2 - Ítems de facturas de salida.
    • SB1 - Productos.
    • F3H - Estructuras de catálogos del SAT.
    • F3I - Catálogos del SAT. 


    08.LINK DE DESCARGA EJECUTABLES

    A continuación se encuentran las instrucciones para la actualización de los ejecutables homologados de los diferentes PAC's (Proveedores Autorizados de Certificados), con los que TOTVS mantiene los servicios de timbrado de CFDI's (Comprobantes Fiscales Digitales).

    1. Ingresar a la Central de Descargas y Actualizaciones:

      Portal de Descargas

    2. Seleccionar la opción, TOTVS Línea Protheus:

      Image Added

    3. Dar clic en la opción "Artefactos Generales del Producto":

      Image Added

    4. Dar clic en la opción "Rdmake Estándar":

      Image Added

    5. De las opciones desplegadas; buscar la opción "Localizaciones" y dar clic en ella:

      Image Added

    6. Dar clic en en el botón "Haga download del archivo":

      Image Added

    7. Tras completarse la descarga del archivo; descomprimir el contenido.
    8. Se mostrará la siguiente estructura de carpetas:

    Los ejecutables se encuentra dentro de la carpeta RDMAKES_LOCALIZACIONES, en la ruta México\CFDI. Dentro de esta ruta se encuentran las carpetas comprimidas(archivos .zip) con el nombre de cada PAC, como se muestra en la siguiente imagen:

    Image Added

    Actualización Consulta Estándar en el archivo SXB – Consulta Estándar:

    ...

    Alias

    ...

    Tipo

    ...

    MEX010

    ...

    1

    ...

    MEX010

    ...

    2

    ...

    MEX010

    ...

    5

    ...

    05. BITACORA DE CAMBIOS

    06. TABLAS UTILIZADAS

    ...