Árvore de páginas

Versões comparadas

Chave

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

...

Totvs custom tabs box
tabsParámetros, Archivos Necesarios ,Configuraciones Necesarias, Facturas, Notas Crédito, Notas Débito, Remitos, Documentos Electrónicos, Punto de Entrada Xml Salida, Punto de Entrada Xml Entrada,Personalizar PDF
idspaso01,paso02,paso03,paso04,paso05,paso06,paso07,paso08,paso09,paso10,paso11
Totvs custom tabs box items
defaultyes
referenciapaso01
Nombre de la VariableValor
MV_PATH814C:\Catalogos_csv\
MV_F3HNUM
MV_CFDI_AMT
MV_CFDSMARGetClientDir()
MV_CFDI_PASIFENWS
MV_CFDDOCSGetSrvProfString('startpath','')+'\cfd\facturas\'
MV_CFDI_PXcertificado.pfx
MV_CFDICVE12345678a
MV_IDCONEN1
MV_IDCSC0001
MV_CSCABCD0000000000000000000000000000
MV_CFDUSO1
MV_RELACNT[email protected]
MV_TIPTRANS
MV_ASYNLOT50


Totvs custom tabs box items
defaultno
referenciapaso02
  • Archivos de Catálogos.
    • Una vez configurado el parámetro MV_PATH814 con una ruta local, deberá colocar los archivos .csv anexos a esta solución en el archivo CatalogosFact.zip. En este archivo se encuentran los catálogos en formato csv los cuales serán tomados por la rutina Carga de Catálogos para generar sus registros en Protheus.
  • Certificado digital.
    • El certificado digital informado en el parámetro MV_CFDI_PX, deberá ser colocado dentro de la ruta informada en el parámetro MV_CFDSMAR.
  • Archivo .exe (SIFENWS.EXE) para realizar consumo de los servicios web del SIFEN
    • El archivo SIFENWS.EXE se puede descargar del siguiente enlace https://suporte.totvs.com/portal/p/10098/download?e=1031442 una vez descargado el archivo:
      • Localizar el archivo descargado descomprima.
      • Ubique la carpeta "Paraguay" dentro se encuentra el comprimido SIFENWS descomprima y use de acuerdo al presente documento.
    • El nombre del archivo deberá ser colocado en el parámetro MV_CFDI_PA (SIFENWS), el archivo deberá ser colocado en la ruta informada en el parámetro MV_CFDSMAR.
      • En caso de que el archivo se encuentre en una carpeta, la carpeta deberá tener el mismo nombre del archivo .exe.
Totvs custom tabs box items
defaultno
referenciapaso03
  • Catálogos.
    • En el módulo de Facturación, ingresar a la rutina Definición de Catálogos  "Actualizaciones | Archivos| Definición de Catálogos". La primera vez detonará la carga de los archivos csv al Protheus. Es importante realice este paso, pues las configuraciones siguientes dependen de la correcta carga de la información de catálogos al sistema Protheus.

    • Catalogos.

      View file
      nameCatalogos.zip
      height250

      CódigoDescripción
      S001Tipo de Régimen
      S002Unidad de Medida
      S003Departamento
      S004Monedas
      S005Países
      S006Catálogo de actividad económica
      S007Catálogo de afectación
      S008Catálogo de categoría ISC
      S009Catálogo de tasas ISC
      S010Condiciones
      S011Catálogo de Regímenes Aduaneros
      S012Referencia Geográfica
      S013Tipos de Pago
      S014Denominación Tarjeta
      S015Documento Electrónico
      S016Tipo de transacción
      S017Catálogo de Impuesto Afectado
      S018Tipo Documento de Identidad
      S019Indicador de Presencia
      S020Doc Identidad VEN/TRA
      S021Motivo de Emisión NC
      S022Motivo de Emisión RE
      S023Catálogo de Respon. Emisión
      S024Catálogo de Vehículos
      S025Catálogo de Tipo de Combustible
      S026Catálogo de Mod. de Transporte
      S027Catálogo Respon. del Flete
      S028Catálogo de Doc. Impreso
      S029Tipos de Operación
      S030Dirección del Emisor
      S031Distrito
      S032Procesamiento Pago
    • En el módulo de Facturación, ingresar a la rutina Mantenimiento de Catálogos "Actualizaciones | Archivos | Mantenimiento de Catálogos". Ingresar al catálogo S030 - DIRECCIÓN DEL EMISOR, informar los datos correspondientes a la dirección del emisor.
      • Ejemplo:
        • RUC correspondiente al emisor.
        • Número  - Correspondiente al informado antes el SIFEN.
        • Tipo Régimen - Régimen del emisor de acuerdo al catálogo S001.
        • Departamento - Correspondiente al RUC informado y de acuerdo al catálogo S003.
        • Distrito - Correspondiente al RUC informado y de acuerdo al catálogo S031.
        • Ciudad - Correspondiente al RUC informado y de acuerdo al catálogo S012.

Dentro del módulo configurador en la configuración de la empresa verificar la siguiente configuración se encuentre registrada:

  • Datos generales
    • Nombre comercial.
    • Teléfono
    • RUC (CNPJ o CPF).
  • Dirección Fiscal/Entrega
    • Dirección Fiscal/Entrega
    • Barrio
    • Ciudad Fiscal Entrega
    • CP Fiscal/Entrega
  • Adicionales
    • Actividad económica - Correspondiente al RUC informado y de acuerdo al catálogo S006.


Para los siguientes registros será necesario informar los siguientes campos para el correcto llenado de los archivos xml.

  • Clientes - (SIGAFIS | Actualizaciones | Archivos| Clientes)
    • A1_TIPDOC - Tipo de documento.
    • A1_NUM - Número de casa.
    • A1_DEPTO - Código departamento de acuerdo a la SET.
    • A1_DISTR - Código de distrito de acuerdo a la SET.
    • A1_CIUDAD - Código de ciudad de acuerdo a la SET.
    • A1_PESSOA - Persona Física/Jurídica
    • A1_CGC - RUC.
    • A1_NIF - Número de identificación Fiscal
    • A1_NOME - Nombre del cliente.
    • A1_NREDUZ - Nombre de fantasía.
    • A1_END - Dirección del cliente.
    • A1_TEL - Teléfono del cliente.
    • A1_EMAIL - Correo del cliente.
    • A1_COD - Código interno del cliente.
  • Países - (SIGACOM | Actualizaciones | Archivo Importaciones| Países)
    • YA_CODERP - Cod. ERP. Clave de país de acuerdo al catálogo de países.
  • Monedas - (SIGACTB | Actualizaciones | Archivos| Monedas Contables)
    • CTO_MOESAT - Moneda SAT. Clave de moneda de acuerdo al catálogo monedas.
  • Unidades de medida - (SIGAFIS | Actualizaciones | Archivos| Unidades de Medida).
    • AH_COD_CO - Ori Cert Cód. Clave de unidad de medida de acuerdo al catálogo de unidades de medida.
  • Impuestos variables - (SIGAFIS | Actualizaciones | Archivos| Impuestos Variab.).
    • FB_CODIMP - Cod. Impuest. Código de impuesto de acuerdo al catálogo de impuesto afectado.
    • FB_CLASSE - Clase Imp. Indicar la clase de impuesto.
  • Control de Formularios - (SIGAFIS | Actualizaciones | Archivos| Control de formularios).
    • FP_SERIE2 - Serie 2. De acuerdo a la numeración definida por el SIFEN empezando con una serie en blanco hasta acabar la numeración 0000001 - 9999999.
    • FP_CAI - No. Aprob. Informar el número de timbrado para la serie usada de acuerdo al tipo de documento.
    • FP_FINITIM - Fch. In. Tim. Informar la fecha de inicio del timbrado.
  • Productos - (SIGAFIS | Actualizaciones | Archivos | Productos).
    • B1_COD - Código del producto.
    • B1_DESC - Descripción del producto.
    • B1_UM - Unidad de Medida.
  • Condiciones de pago - (SIGAFAT | Actualizaciones | Archivos | Condiciones de pago).
    • Pago de contado  
      • E4_BXTITAV = 1-Si. Baja título automática.
    • Pago en cuota o plazo.
      • E4_BXTITAV = 2-No. Baja título automática.
      • E4_COND - Informar el plazo o cuotas.
        • Ejemplo plazo
          • "30" - Genera un plazo de 30 días.
        • Ejemplo cuota
          • "30,60,90" - Genera 3 cuotas, una cada 30 días.
  • Transportadoras (SIGACOM | Actualizaciones | Archivo importaciones | Transportadoras)
    • A4_NOME - Nombre
    • A4_CGC - RUC
    • A4_TIPCON - Tipo Contrib
    • A4_TIPID - Tipo de Iden (De acuerdo al catálogo S018).
  • Vehículos (SIGAOMS | Actualizaciones | Logística | Vehículos)

    • DA3_DESC - Modelo
    • DA3_PLACA - Matrícula
    • DA3_CHASSI - Chasís
    • DA3_TIPTR2 - Tipo Transporte
    • DA3_TIPID - Tipo Vehículo (Tipo de identificación).
Totvs custom tabs box items
defaultno
referenciapaso04

Pago de Contado

  1. En el módulo de Facturación, ingresar a la rutina Facturación "Actualizaciones | Facturación | Facturación".
  2. Registrar una factura, informar los campos necesarios en la factura para generar correctamente el archivo xml.
    1. Tipo NF (F2_TIPONF).
    2. Tipo Transacción (F2_TPTRANS).
    3. Seleccionar una condición de pago que realice baja automática. (E4_BXTITAV = 1)
  3. Confirmar el documento.
  4. Una vez finalizado se mostrará una ventana para informar las formas de pago del documento, estas son obligatorias para la correcta generación del documento xml. (Deberán contemplar el valor completo del documento para que sea válido)
    1. Para la correcta generación deberán ser informados los campos de acuerdo al tipo de pago.
      1. Tipo de pago 
        1. Pago con Tarjetas.
          1. Tipo Tarjeta
          2. Código de autorización de operación.
          3. Número de Tarjeta (Últimos 4 dígitos).
        2. Pago con cheque. 
          1. Banco emisor.
          2. Número de cheque.
      2. Monto de pago
      3. Forma de procesamiento de pago
    2. En caso no haber registrado la formas de pago al confirmar el documento será posible registrarlas seleccionando el documento y en "Otras acciones" seleccionar la opción "Registro pagos."
  5. Una vez registradas las formas de pago confirmar.


Pago a plazo

  1. En el módulo de Facturación, ingresar a la rutina Facturación "Actualizaciones | Facturación | Facturación".
  2. Registrar una factura, informar los campos necesarios en la factura para generar correctamente el archivo xml.
    1. Tipo NF (F2_TIPONF).
    2. Tipo Transacción (F2_TPTRANS).
    3. Seleccionar una condición de pago que NO realice baja automática y genere pago con plazo. (Ejemplo: E4_BXTITAV = 2 y E4_COND = 30)
  3. Confirmar el documento.

Pago en cuota

  1. En el módulo de Facturación, ingresar a la rutina Facturación "Actualizaciones | Facturación | Facturación".
  2. Registrar una factura, informar los campos necesarios en la factura para generar correctamente el archivo xml.
    1. Tipo NF (F2_TIPONF).
    2. Tipo Transacción (F2_TPTRANS).
    3. Seleccionar una condición de pago que NO realice baja automática y genere cuotas. (Ejemplo: E4_BXTITAV = 2 y E4_COND = 30,60,90)
  3. Confirmar el documento.
Totvs custom tabs box items
defaultno
referenciapaso05
  1. En el módulo de Facturación, ingresar a la rutina Generac. de Notas  de Crédito y Débito "Actualizaciones | Facturación | Generac. de Notas  de Crédito y Débito".
  2. Registrar una nota de crédito, informar los campos necesarios en la factura para generar correctamente el archivo xml.
    1. Tipo Nota C (F1_TIPREF) - Motivo de la emisión de la nota de crédito.
  3. Dentro de "Otras acciones | Doc Orig" seleccionar el documento al que corresponde la nota de crédito.
  4. Confirmar el documento.

Nota 

Las notas de crédito deben tener un documento asociado. Campos D1_NFORI, D1_SERIORI informados.

Totvs custom tabs box items
defaultno
referenciapaso06
  1. En el módulo de Facturación, ingresar a la rutina Generac. de Notas  de Crédito y Débito "Actualizaciones | Facturación | Generac. de Notas  de Crédito y Débito".
  2. Registrar una nota de débito, informar los campos necesarios en la factura para generar correctamente el archivo xml.
    1. Tipo Nota D (F2_TIPREF).
  3. Al registrar la nota de débito deberán ser informados los campos del documento al cual se encuentra asociada.
  4. Confirmar el documento.

Nota

Las notas de crédito deben tener un documento asociado. Campos D2_NFORI, D2_SERIORI informados.

Totvs custom tabs box items
defaultno
referenciapaso07
  1. En el módulo de Facturación, ingresar a la rutina Pedidos de venta "Actualizaciones | Pedidos | Pedidos de venta". 

    1. Registrar un pedido que genere un remito e informar los datos necesarios en el pedido para generar correctamente el archivo xml.
      1. Transp. (C5_TRANSP)
      2. Doc Gener. (C5_DOCGER) = 2 - Remisión
      3. Vehic. Trans. (C5_VEICULO)
      4. Motivo (C5_MODTRAD)
      5. Tipo NF (C5_TIPONF)
      6. Tipo Transac. (C5_TPTRANS)
      7. Incoterms (C5_INCOTER)
      8. Fec. Ini. Tras. (C5_FECDSE)
      9. Fch. Fin Tras. (C5_FECHDE)
      10. Resp. Flete (C5_TPRESFL)
  2. Confirmar el documento.
  3. En el módulo de Facturación, ingresar a la rutina Generac de remito "Actualizaciones | Form. De Remisión | Generac de remito".

  4. Realizar la generación del remito usando el pedido antes generado.


Totvs custom tabs box items
defaultno
referenciapaso08
  1. En el módulo de Facturación, ingresar a la rutina Documentos Electrónicos "Actualizaciones | Facturación | Documentos Electrónicos".
  2. Seleccionar los parámetros de acuerdo a los documentos que serán visualizados/procesados.
    1. ¿Tipo documento? - Seleccionar el tipo de documento.
      1. Factura
      2. Nota Débito
      3. Nota Crédito
      4. Remisión
    2. ¿Serie? - Seleccionar la serie de los documentos.
    3. ¿Estatus? - Estatus de los documentos.
      1. 1 - No transmitida.
      2. 2 - Recibido.
      3. 3 - Esperando procesamiento.
      4. 4 - Documento Rechazado.
      5. 5 - Documento Autorizado.
    4. ¿Fecha Inicial? - Fecha inicial del rango para los documentos.
    5. ¿Fecha Final? - Fecha final del rango para los documentos.

Transmisión

Seleccionar los parámetros para visualizar los documentos no transmitidos o rechazados.

Ejemplo:

  1. ¿Tipo documento? - "Factura"
  2. ¿Serie? - "A"
  3. ¿Estatus? - "1" o "4"
  4. ¿Fecha Inicial? - 01/03/2021
  5. ¿Fecha Final? - 31/03/2021

Se visualizarán los documentos que no han sido transmitidos o procesados, dependiendo del parámetro "Estatus".

  1. Seleccionar "Transmitir".
  2. Se mostrará una venta de parámetros, informar los datos de acuerdo a los documentos que serán transmitidos. Informar la serie del documento y el rango de los documentos a transmitir.
    1. ¿Serie de la Factura? - "A01"
    2. ¿Factura Inicial? - "0010010000001"
    3. ¿Factura Final? - "0010010000001"
  3. Una vez finalizado el proceso se mostrará un mensaje.
    1. En caso de haber tenido errores durante la transmisión se mostrará un mensaje indicándolo.
      1. Indicar "Si" en la pregunta "¿Desea visualizar el log del proceso?".
      2. Se mostrará un informe con los errores que ocurrieron durante el proceso.
    2. En caso de haber realizado de manera correcta la transmisión se mostrará un mensaje indicándolo.
      1. Indicar "Si" en la pregunta "¿Desea visualizar log de Transmisión?".
      2. Se mostrará un informe con los documentos autorizados.
  4. El documento será actualizado y ahora será visible al seleccionar el estatus "5 - Documento Autorizado"


Cancelación

Seleccionar los parámetros para visualizar los documentos Autorizados.

Ejemplo:

  1. ¿Tipo documento? - "Factura"
  2. ¿Serie? - "A"
  3. ¿Estatus? - "5"
  4. ¿Fecha Inicial? - 01/03/2021
  5. ¿Fecha Final? - 31/03/2021
  1. Seleccionar "Otras acciones | Anulación Fac. Electrónica".
  2. Se mostrará una barra de progreso.
  3. Una vez finalizado el proceso se mostrará un mensaje.
    1. En caso de haber tenido errores durante la transmisión se mostrará un mensaje indicándolo.
      1. Indicar "Si" en la pregunta "¿Desea visualizar el log del proceso?".
      2. Se mostrará un informe con los errores que ocurrieron durante el proceso.
    2. En caso de haber realizado de manera correcta la transmisión se mostrará un mensaje indicándolo.
      1. Indicar "Si" en la pregunta "¿Desea visualizar log de Transmisión?".
      2. Se mostrará un informe con los documentos autorizados.

Imprimir PDF

  1. Seleccionar "Imprimir PDF".
  2. Se mostrará una venta de parámetros, informar los datos de acuerdo a los documentos que serán generados los PDF. Informar la serie del documento y el rango de los documentos a transmitir.
    1. ¿Serie de documento? - "A01"
    2. ¿Documento Inicial? - "0010010000001"
    3. ¿Documento Final? - "0010010000001"
    4. ¿Formato? - PDF
  3. Se mostrará una barra de progreso.
  4. Una vez finalizado el proceso se podrán consultar los documento en la ruta informada en el parámetro MV_CFDDOCS en la carpeta llamada "Autorizados".
Totvs custom tabs box items
defaultno
referenciapaso09

En caso de ser necesario modificar el xml para documentos de salida (NF, NDC, RFN) existe el punto de entrada M486PESXML habilitado para realizar esta operación.

Ejemplos de uso:

Bloco de código
User Function M486PESXML()
Local cFilial   := PARAMIXB[1]
Local cSerie    := PARAMIXB[2]
Local cCliente  := PARAMIXB[3]
Local cLoja     := PARAMIXB[4]
Local cDoc      := PARAMIXB[5]
Local cEspecie  := PARAMIXB[6]
Local cXml      := ""
Local cSalto	:= chr(13) + chr(10)
Local cPicture	:= "999999999999999.9999"
Local cID		:= ""
Local cSecCod	:= ""
Local cdDVId	:= ""
Local cFeEmiDE	:= ""
Local cNumCasa	:= ""
Local cDepEmi	:= ""
Local cDisEmi	:= ""
Local cCiuEmi	:= ""
Local cIniTras	:= ""
Local cFinTras	:= ""
Local aTotales	:= {0,0,0,0,0,0,0,0,0,0,0,0,0}
Local aDesc		:= {0,0}
Local lProd		:= SuperGetMV("MV_CFDI_AM",,"") == "P"
Local cEmail	:= SuperGetMV("MV_RELACNT",,"")
Local cAliasTmp	:= ""
Local aArea		:= GetArea()
Local aSF		:= {}

	DbSelectArea("SF2")
	aSF := GetArea()
	DbSetOrder(1)//F2_FILIAL+F2_DOC+F2_SERIE+F2_CLIENTE+F2_LOJA+F2_FORMUL+F2_TIPO
	lOK := DbSeek(xFilial("SF2")+cDoc+cSerie+cCliente+cLoja) 

	
	cSecCod  := M486SecCod(Time(),SF2->F2_EMISSAO)
	cID 	 := IIF(AllTrim(SF2->F2_ESPECIE)=="NF",M486GENCDC("01",SUBSTR(SM0->M0_CGC,1,RAT("-",SM0->M0_CGC)-1),Substr(SM0->M0_CGC,RAT("-",SM0->M0_CGC)+ 1,1),SUBSTR(SF2->F2_DOC,1,3),SUBSTR(SF2->F2_DOC,4,3),RIGHT(SF2->F2_DOC,7),"1",SF2->F2_EMISSAO,"1",cSecCod,SF2->F2_ESPECIE),"")
	cID 	 := IIF(AllTrim(SF2->F2_ESPECIE)=="NDC",M486GENCDC("06",SUBSTR(SM0->M0_CGC,1,RAT("-",SM0->M0_CGC)-1),Substr(SM0->M0_CGC,RAT("-",SM0->M0_CGC)+ 1,1),SUBSTR(SF2->F2_DOC,1,3),SUBSTR(SF2->F2_DOC,4,3),RIGHT(SF2->F2_DOC,7),"1",SF2->F2_EMISSAO,"1",cSecCod,SF2->F2_ESPECIE),cID)
	cID 	 := IIF(AllTrim(SF2->F2_ESPECIE)=="RFN",M486GENCDC("07",SUBSTR(SM0->M0_CGC,1,RAT("-",SM0->M0_CGC)-1),Substr(SM0->M0_CGC,RAT("-",SM0->M0_CGC)+ 1,1),SUBSTR(SF2->F2_DOC,1,3),SUBSTR(SF2->F2_DOC,4,3),RIGHT(SF2->F2_DOC,7),"1",SF2->F2_EMISSAO,"1",cSecCod,SF2->F2_ESPECIE),cID)
	cdDVId	 := AllTrim(STR(CalcMod11(SUBSTR(cID,1,43))))
	cFeEmiDE := SUBSTR(DTOS(SF2->F2_EMISSAO),0,4) + "-" + SUBSTR(DTOS(SF2->F2_EMISSAO),5,2) + "-" + SUBSTR(DTOS(SF2->F2_EMISSAO),7,2) + "T" + SF2->F2_HORA
	cNumCasa := ObtColSAT("S030",SUBSTR(SM0->M0_CGC,1,10) , 1, 10, 11,6)
	cNumCasa := Iif(Empty(cNumCasa), "0", cNumCasa )
	cDepEmi  := ObtColSAT("S030",SUBSTR(SM0->M0_CGC,1,10) , 1, 10, 18,2) 
	cDisEmi  := ObtColSAT("S030",SUBSTR(SM0->M0_CGC,1,10) , 1, 10, 20,3)
	cCiuEmi  := ObtColSAT("S030",SUBSTR(SM0->M0_CGC,1,10) , 1, 10, 23,4)

	cXml := '<rDE' + cSalto
	cXml += ' xmlns="http://ekuatia.set.gov.py/sifen/xsd" ' + cSalto
	cXml += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' + cSalto
	cXml += ' xsi:schemaLocation="http://ekuatia.set.gov.py/sifen/xsd/ siRecepDE_v150.xsd">' + cSalto
	cXml += ' <dVerFor>150</dVerFor>' + cSalto
	cXml += '	<DE Id="' + cID + '">' + cSalto
	cXml += '		<dDVId>' + cdDVId + '</dDVId>' + cSalto
	cXml += '		<dFecFirma></dFecFirma> ' + cSalto
	cXml += '		<dSisFact>1</dSisFact>' + cSalto
	cXml += '		<gOpeDE>' + cSalto
	cXml += '        	<iTipEmi>1</iTipEmi>' + cSalto
	cXml += '        	<dDesTipEmi>Normal</dDesTipEmi>' +cSalto
	cXml += '			<dCodSeg>' + SUBSTR(cID,35,9) + '</dCodSeg>' + cSalto
	cXml += '		</gOpeDE>' + cSalto
	cXml += '		<gTimb>' + cSalto
	If AllTrim(SF2->F2_ESPECIE) == "NF"
		cXml += '        	<iTiDE>1</iTiDE>' + cSalto
		cXml += '        	<dDesTiDE>Factura electrónica</dDesTiDE>' + cSalto
	ElseIf AllTrim(SF2->F2_ESPECIE) == "NDC"
		cXml += '        	<iTiDE>6</iTiDE>' + cSalto
		cXml += '        	<dDesTiDE>Nota de débito electrónica</dDesTiDE>' + cSalto
	Else
		cXml += '        	<iTiDE>7</iTiDE>' + cSalto
		cXml += '        	<dDesTiDE>Nota de remisión electrónica</dDesTiDE>'	+ cSalto
	EndIf
	cXml += '        	<dNumTim>'+ AllTrim(SF2->F2_NUMTIM) +'</dNumTim>' + cSalto
	cXml += '        	<dEst>' + SUBSTR(SF2->F2_DOC,1,3) + '</dEst>' + cSalto
	cXml += '        	<dPunExp>' + SUBSTR(SF2->F2_DOC,4,3) + '</dPunExp>' + cSalto
	cXml += '        	<dNumDoc>' + RIGHT(SF2->F2_DOC,7) + '</dNumDoc>' + cSalto
	cXml += '        	<dSerieNum>' + AllTrim(SF2->F2_SERIE2) + '</dSerieNum>' + cSalto
	cXml += '			<dFeIniT>' +FecIniTimb(SF2->F2_SERIE, SF2->F2_ESPECIE) + '</dFeIniT>' + cSalto
	cXml += '		</gTimb>' + cSalto
	cXml += '		<gDatGralOpe>' + cSalto
	cXml += '			<dFeEmiDE>' + cFeEmiDE + '</dFeEmiDE>' + cSalto
	
	// Campos inherentes a la operación comercial (D010-D099)
	If AllTrim(SF2->F2_ESPECIE) <> "RFN"
		CTO->(DbSetOrder(1)) //CTO_FILIAL+CTO_MOEDA
		CTO->(MsSeek(xFilial("CTO")+Strzero(SF2->F2_MOEDA,2)))
		cXml += M486IMPPAR(AllTrim(SF2->F2_ESPECIE),SF2->F2_DOC,SF2->F2_SERIE, SF2->F2_CLIENTE,SF2->F2_LOJA, CTO->CTO_MOESAT, AllTrim(SF2->F2_TPTRANS),SF2->F2_TXMOEDA) + cSalto
	EndIf
	//EMISOR
	cXml += '			<gEmis>' + cSalto
	cXml += '				<dRucEm>' + SUBSTR(SM0->M0_CGC,1,RAT("-",SM0->M0_CGC)-1)+'</dRucEm>' + cSalto
	cXml += '				<dDVEmi>' + Substr(SM0->M0_CGC,RAT("-",SM0->M0_CGC)+ 1,1) + '</dDVEmi>' + cSalto
	cXml += '				<iTipCont>1</iTipCont>' + cSalto
	cXml += '				<cTipReg>'+ ObtColSAT("S030",SUBSTR(SM0->M0_CGC,1,10) , 1, 10, 17,1) +'</cTipReg>' + cSalto
	If lProd
		cXml += '				<dNomEmi>'+ AllTrim(SM0->M0_NOME) + '</dNomEmi>' + cSalto
	Else
		cXml += '				<dNomEmi>'+  "DE generado en ambiente de prueba - sin valor comercial ni fiscal" + '</dNomEmi>' + cSalto
	EndIf
	cXml += '				<dNomFanEmi>'+ AllTrim(SM0->M0_NOMECOM) + '</dNomFanEmi>' + cSalto
	cXml += '				<dDirEmi>'+ AllTrim(SM0->M0_ENDENT) + '</dDirEmi>' + cSalto
	cXml += '				<dNumCas>' + cNumCasa + '</dNumCas>' + cSalto
	cXml += '				<cDepEmi>' + cDepEmi+ '</cDepEmi>' + cSalto
	cXml += '				<dDesDepEmi>' + AllTrim(ObtColSAT("S003",cDepEmi, 1, 2, 3,28)) + '</dDesDepEmi>' + cSalto
	cXml += '				<cDisEmi>' + AllTrim(cDisEmi) + '</cDisEmi>' + cSalto
	cXml += '				<dDesDisEmi>' + AllTrim(ObtColSAT("S031",cDisEmi, 1, 3, 4,30))+ '</dDesDisEmi>' + cSalto
	cXml += '				<cCiuEmi>' +  AllTrim(cCiuEmi)  + '</cCiuEmi>' + cSalto
	cXml += '				<dDesCiuEmi>' +  AllTrim(ObtColSAT("S012",cCiuEmi, 48, 4, 52,30))+ '</dDesCiuEmi>' + cSalto
	If !Empty(SM0->M0_TEL)
		cXml += '				<dTelEmi>' + AllTrim(SM0->M0_TEL) + '</dTelEmi>' + cSalto
	EndIf
	cXml += '				<dEmailE>' +  cEmail  + '</dEmailE>' + cSalto //Quitar
	cXml += '				<gActEco>' + cSalto
	cXml += '					<cActEco>' + AllTrim(SM0->M0_DSCCNA) + '</cActEco>' + cSalto
	cXml += '					<dDesActEco>'+ ObtColSAT("S006",SUBSTR(SM0->M0_DSCCNA,1,6) , 2, 5, 7,166)+'</dDesActEco>' + cSalto
	cXml += '				</gActEco>' +  cSalto
	cXml += '			</gEmis>' + cSalto
	//RECEPTOR
	SA1->(DbSetOrder(1))
	SA1->(MSSeek(xFilial("SA1")+SF2->F2_CLIENTE+SF2->F2_LOJA))
	SYA->(DbSetOrder(1))
	SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS))

	cXml += '			<gDatRec>' + cSalto
	cXml += '				<iNatRec>1</iNatRec>' + cSalto
	cXml += '				<iTiOpe>1</iTiOpe>' + cSalto
	cXml += '				<cPaisRec>' + SYA->YA_CODERP + '</cPaisRec>' + cSalto
	cXml += '				<dDesPaisRe>'+ ObtColSAT("S005",SYA->YA_CODERP, 1, 3, 4,52)+'</dDesPaisRe>' +cSalto
	If !Empty(SA1->A1_CGC)
		cXml += '				<iTiContRec>' + IIF(SA1->A1_PESSOA $ "F","1","2") + '</iTiContRec>' + cSalto
		cXml += '				<dRucRec>' +  SUBSTR(SA1->A1_CGC,1,RAT("-",SA1->A1_CGC)-1) + '</dRucRec>' + cSalto
		cXml += '				<dDVRec>' + Substr(SA1->A1_CGC,RAT("-",SA1->A1_CGC)+ 1,1) + '</dDVRec>' + cSalto
	Else
		cXml += '				<iTipIDRec>' + AllTrim(SA1->A1_TIPDOC) + '</iTipIDRec>' + cSalto
		cXml += '				<dDTipIDRec>' +  ObtColSAT("S018", SA1->A1_TIPDOC, 1, 1, 2,41) + '</dDTipIDRec>' + cSalto
		cXml += '				<dNumIDRec>' +  IIF(AllTrim(SA1->A1_TIPDOC)=="5","0",ALLTRIM(SA1->A1_NIF)) + '</dNumIDRec>' +cSalto
	EndIf
	cXml += '				<dNomRec>' + AllTrim(SA1->A1_NOME)+ '</dNomRec>' + cSalto
	cXml += '				<dNomFanRec>' + AllTrim(SA1->A1_NREDUZ)+ '</dNomFanRec>' + cSalto
	cXml += '				<dDirRec>' + AllTrim(SA1->A1_END) + '</dDirRec>' + cSalto
	cXml += '				<dNumCasRec>' + AllTrim(SA1->A1_NUM) + '</dNumCasRec>' + cSalto
	cXml += '				<cDepRec>' + SA1->A1_DEPTO + '</cDepRec>' + cSalto
	cXml += '				<dDesDepRec>' + AllTrim(ObtColSAT("S003",SA1->A1_DEPTO, 1, 2, 3,28)) +'</dDesDepRec>' + cSalto
	cXml += '				<cDisRec>' + SA1->A1_DISTR+ '</cDisRec>' + cSalto
	cXml += '				<dDesDisRec>'+ AllTrim(ObtColSAT("S031",SA1->A1_DISTR, 1, 3, 4,30)) + '</dDesDisRec>' + cSalto
	cXml += '				<cCiuRec>' + AllTrim(SA1->A1_CIUDAD) + '</cCiuRec>' + cSalto
	cXml += '				<dDesCiuRec>' + AllTrim(ObtColSAT("S012",SA1->A1_CIUDAD, 48, 4, 52,30)) + '</dDesCiuRec>' + cSalto
	If !Empty(SA1->A1_TEL)
		cXml += '				<dTelRec>' + AllTrim(SA1->A1_TEL) + '</dTelRec>' + cSalto
	EndIf
	If !Empty(SA1->A1_EMAIL)
		cXml += '				<dEmailRec>' + SA1->A1_EMAIL + '</dEmailRec>' + cSalto
	EndIf
	cXml += '				<dCodCliente>' + AllTrim(SA1->A1_COD) + '</dCodCliente>' + cSalto
	cXml += '			</gDatRec>' + cSalto
	cXml += '		</gDatGralOpe>' + cSalto

	//TIPO DE PRESENCIA
	cXml += '		<gDtipDE>' + cSalto
	If AllTrim(SF2->F2_ESPECIE)=="NF"
		cXml += '        	<gCamFE>' + cSalto
		cXml += '    			<iIndPres>' + AllTrim(SF2->F2_TIPONF) + '</iIndPres>' + cSalto
		cXml += '        		<dDesIndPres>'+ ObtColSAT("S019",SF2->F2_TIPONF, 1, 1, 2,30)+'</dDesIndPres>' + cSalto
		cXml += '        	</gCamFE>' + cSalto
		// CONDICIONES DE PAGO
		cXml += M486CONDPAG(SF2->F2_FILIAL, SF2->F2_DOC,SF2->F2_SERIE, SF2->F2_CLIENTE,SF2->F2_LOJA,SF2->F2_ESPECIE,SF2->F2_COND,SF2->F2_MOEDA,SF2->F2_TXMOEDA) + cSalto
	ElseIf AllTrim(SF2->F2_ESPECIE)=="NDC"
		cXml += '        	<gCamNCDE>' + cSalto
		cXml += '    			<iMotEmi>' + AllTrim(SF2->F2_TIPREF) + '</iMotEmi>' + cSalto
		cXml += '        		<dDesMotEmi>'+ ObtColSAT("S021",SF2->F2_TIPREF, 1, 1, 2,30)+'</dDesMotEmi>' + cSalto
		cXml += '        	</gCamNCDE>' + cSalto
	ElseIf AllTrim(SF2->F2_ESPECIE)=="RFN"
		cXml += '        	<gCamNRE>' + cSalto
		cXml += '    			<iMotEmiNR>' + AllTrim(SF2->F2_MOTEMIR) + '</iMotEmiNR>' + cSalto
		cXml += '        		<dDesMotEmiNR>'+ ObtColSAT("S022",SF2->F2_MOTEMIR, 1, 2, 3,60)+'</dDesMotEmiNR>' + cSalto
		cXml += '    			<iRespEmiNR>1</iRespEmiNR>'+ cSalto
		cXml += '    			<dDesRespEmiNR>Emisor de la factura</dDesRespEmiNR>' + cSalto
		If AllTrim(SF2->F2_MOTEMIR) == "1"
			cXml += '    			<dFecEm>' + SUBSTR(DTOS(SF2->F2_FECHSE),0,4) + "-" + SUBSTR(DTOS(SF2->F2_FECHSE),5,2) + "-" + SUBSTR(DTOS(SF2->F2_FECHSE),7,2) + '</dFecEm>' + cSalto
		EndIf
		cXml += '        	</gCamNRE>' + cSalto
	EndIf

	cAliasTmp := QueryItems("SD2", "D2_COD, D2_QUANT, D2_TES, D2_ITEM, SD2.R_E_C_N_O_", "D2_DOC='" + SF2->F2_DOC + "' AND D2_SERIE='" + SF2->F2_SERIE + "' AND D2_CLIENTE='" + SF2->F2_CLIENTE + "' AND D2_LOJA='" + SF2->F2_LOJA + "'",  "D2_ITEM") 
	
	While (cAliasTmp)->(!EOF())
		cXml += '        	<gCamItem>' + cSalto
		cXml += '    			<dCodInt>' + Alltrim((cAliasTmp)->B1_COD) + '</dCodInt>' + cSalto
		cXml += '    			<dDesProSer>' + AllTrim((cAliasTmp)->B1_DESC) + '</dDesProSer>' + cSalto
		cXml += '    			<cUniMed>' + AllTrim((cAliasTmp)->AH_COD_CO) + '</cUniMed>' + cSalto
		cXml += '    			<dDesUniMed>' + ObtColSAT("S002",(cAliasTmp)->AH_COD_CO, 1, 3, 29,6) + '</dDesUniMed>' + cSalto
		cXml += '    			<dCantProSer>' + AllTrim(TRANSFORM((cAliasTmp)->D2_QUANT,"9999999999.9999") )+ '</dCantProSer>' + cSalto
		If AllTrim(SF2->F2_ESPECIE) <> "RFN"
			If (cAliasTmp)->R_E_C_N_O_ > 0
				SD2->(dbgoto((cAliasTmp)->R_E_C_N_O_))
			EndIf
			cXml += M486IMPDPAR(AllTrim(SF2->F2_ESPECIE),SF2->F2_DOC,SF2->F2_SERIE, SF2->F2_CLIENTE,SF2->F2_LOJA, (cAliasTmp)->D2_TES,(cAliasTmp)->D2_ITEM,(cAliasTmp)->D2_COD,@aDesc,@aTotales) + cSalto
		EndIf
		cXml += '        	</gCamItem>' + cSalto
		(cAliasTmp)->(dbSkip())
	End
	(cAliasTmp)->(dbcloseArea())
	
	//Nodos de Guia de Remisión
	If AllTrim(SF2->F2_ESPECIE) == "RFN"
		DbSelectArea("DA3")
		DA3->(DbSetOrder(1)) //DA3_FILIAL+DA3_COD
		If DA3->(DbSeek(xFilial("DA3") + SF2->F2_VEICULO))
			cXml += '        	<gTransp>' + cSalto
			cXml += '    			<iTipTrans>' + AllTrim(DA3->DA3_TIPTR2) + '</iTipTrans>' + cSalto
			If AllTrim(AllTrim(DA3->DA3_FROVEI)) == "1"
				cXml += '    			<dDesTipTrans>Propio</dDesTipTrans>' + cSalto
			Else
				cXml += '    			<dDesTipTrans>Tercero</dDesTipTrans>' + cSalto
			EndIf
			cXml += '    			<iModTrans>' + AllTrim(DA3->DA3_TIPTR2) + '</iModTrans>' + cSalto
			cXml += '    			<dDesModTrans>' + AllTrim(ObtColSAT("S026", AllTrim(DA3->DA3_TIPTR2), 1, 1, 2,10)) + '</dDesModTrans>' + cSalto
			cXml += '    			<iRespFlete>' + AllTrim(SF2->F2_TPRESFL) + '</iRespFlete>' + cSalto
			cXml += '    			<cCondNeg>' + AllTrim(SF2->F2_INCOTER) + '</cCondNeg>' +  cSalto
			cIniTras := SUBSTR(DTOS(SF2->F2_FECDSE),0,4) + "-" + SUBSTR(DTOS(SF2->F2_FECDSE),5,2) + "-" + SUBSTR(DTOS(SF2->F2_FECDSE),7,2)
			cXml += '    			<dIniTras>' + cIniTras + '</dIniTras>' + cSalto
			cFinTras := SUBSTR(DTOS(SF2->F2_FECHSE),0,4) + "-" + SUBSTR(DTOS(SF2->F2_FECHSE),5,2) + "-" + SUBSTR(DTOS(SF2->F2_FECHSE),7,2)
			cXml += '    			<dFinTras>' + cFinTras  + '</dFinTras>' + cSalto
			cXml += '    			<gCamSal>' + cSalto
			cXml += '    				<dDirLocSal>' + AllTrim(SM0->M0_ENDENT) + '</dDirLocSal>' + cSalto
			cXml += '    				<dNumCasSal>' + cNumCasa + '</dNumCasSal>' + cSalto 
			If !Empty(SM0->M0_COMPENT)
				cXml += '    				<dComp1Sal>' + AllTrim(SM0->M0_COMPENT) + '</dComp1Sal>' + cSalto
			EndIf
			cXml += '    				<cDepSal>' + cDepEmi + '</cDepSal>' + cSalto
			cXml += '    				<dDesDepSal>' + AllTrim(ObtColSAT("S003",cDepEmi, 1, 2, 3,28)) + '</dDesDepSal>' + cSalto
			cXml += '    				<cDisSal>' + AllTrim(cDisEmi) + '</cDisSal>' + cSalto
			cXml += '    				<dDesDisSal>' + AllTrim(ObtColSAT("S031",cDisEmi, 1, 3, 4,30)) + '</dDesDisSal>' +cSalto
			cXml += '    				<cCiuSal>' + AllTrim(cCiuEmi) + '</cCiuSal>' + cSalto
			cXml += '    				<dDesCiuSal>' + AllTrim(ObtColSAT("S012",cCiuEmi, 48, 4, 52,30)) + '</dDesCiuSal>' + cSalto
			cXml += '    			</gCamSal>' + cSalto
			cXml += '    			<gCamEnt>' + cSalto
			cXml += '    				<dDirLocEnt>' + AllTrim(SA1->A1_END) + '</dDirLocEnt>' + cSalto
			cXml += '    				<dNumCasEnt>' + AllTrim(SA1->A1_NUM) + '</dNumCasEnt>' + cSalto
			cXml += '    				<cDepEnt>' + AllTrim(SA1->A1_DEPTO) + '</cDepEnt>' + cSalto
			cXml += '    				<dDesDepEnt>' + Alltrim(ObtColSAT("S003",SA1->A1_DEPTO, 1, 2, 3,28)) + '</dDesDepEnt>' + cSalto
			cXml += '    				<cDisEnt>' + AllTrim(SA1->A1_DISTR) + '</cDisEnt>' +cSalto
			cXml += '    				<dDesDisEnt>' + AllTrim(ObtColSAT("S031",SA1->A1_DISTR, 1, 3, 4,30)) + '</dDesDisEnt>' + cSalto
			cXml += '    				<cCiuEnt>' + AllTrim(SA1->A1_CIUDAD) + '</cCiuEnt>' + cSalto
			cXml += '    				<dDesCiuEnt>' +  AllTrim(ObtColSAT("S012",SA1->A1_CIUDAD, 48, 4, 52,30)) + '</dDesCiuEnt>' + cSalto
			If !Empty(SA1->A1_TEL)
				cXml += '    				<dTelEnt>' + AllTrim(SA1->A1_TEL) + '</dTelEnt>' + cSalto
			EndIf
			cXml += '    			</gCamEnt>' + cSalto
			cXml += '    			<gVehTras>' + cSalto
			cXml += '    				<dTiVehTras>' + Alltrim(ObtColSAT("S026", AllTrim(DA3->DA3_TIPTR2), 1, 1, 2,10)) + '</dTiVehTras>' + cSalto
			cXml += '    				<dMarVeh>' + AllTrim(DA3->DA3_DESC) + '</dMarVeh>' +cSalto
			cXml += '    				<dTipIdenVeh>' + AllTrim(DA3->DA3_TIPID) + '</dTipIdenVeh>' + cSalto
			If AllTrim(DA3->DA3_TIPID) == "1"
				cXml += '    				<dNroIDVeh>' + AllTrim(DA3->DA3_CHASSI) + '</dNroIDVeh>' + cSalto
			Else
				cXml += '    				<dNroMatVeh>' + AllTrim(DA3->DA3_PLACA) + '</dNroMatVeh>' + cSalto
			EndIf
			If AllTrim(DA3->DA3_TIPTR2) == "3"
				cXml += '    				<dNroVuelo>' + AllTrim(SF2->F2_RASTR) + '</dNroVuelo>' + cSalto
			EndIf
			cXml += '    			</gVehTras>' + cSalto
			DbSelectArea("SA4")
			SA4->(DbSetOrder(1)) //A4_FILIAL+A4_COD
			If SA4->(MsSeek(xFilial("SA4") + SF2->F2_TRANSP))
				cXml += '    			<gCamTrans>' + cSalto
				cXml += '    				<iNatTrans>' + AllTrim(SA4->A4_TIPCON) + '</iNatTrans>' + cSalto
				cXml += '    				<dNomTrans>' + AllTrim(SA4->A4_NOME) + '</dNomTrans>' + cSalto
				If AllTrim(SA4->A4_TIPCON) == "1"
					cXml += '    				<dRucTrans>' + SUBSTR(SA4->A4_CGC,1,RAT("-",SA4->A4_CGC)-1) + '</dRucTrans>' + cSalto
					cXml += '    				<dDVTrans>' + SUBSTR(SA4->A4_CGC,RAT("-",SA4->A4_CGC)+ 1,1) + '</dDVTrans>' + cSalto
				Else
					cXml += '    				<iTipIDTrans>' + Alltrim(SA4->A4_TIPID) + '</iTipIDTrans>' + cSalto
					cXml += '    				<dDTipIDTrans>' +  Alltrim(ObtColSAT("S018", ALLTRIM(SA4->A4_TIPID), 1, 1, 2,41))  + '</dDTipIDTrans>' + cSalto
					cXml += '    				<dNumIDTrans>' + AllTrim(SA4->A4_CGC) + '</dNumIDTrans>' + cSalto
				EndIf
				cXml += '    				<dNumIDChof>' + AllTrim(SA4->A4_CGC) + '</dNumIDChof>' + cSalto
				cXml += '    				<dNomChof>' + AllTrim(SA4->A4_NOME) + '</dNomChof>' + cSalto
				cXml += '    			</gCamTrans>' + cSalto
			EndIf
			cXml += '        	</gTransp>' + cSalto
		EndIf
	EndIf

	cXml += '		</gDtipDE>' + cSalto
	If AllTrim(SF2->F2_ESPECIE) <> "RFN"
		aTotales := M486SUBTOT(AllTrim(SF2->F2_ESPECIE),SF2->F2_DOC,SF2->F2_SERIE, SF2->F2_CLIENTE,SF2->F2_LOJA)
		cXml += '		<gTotSub>' + cSalto
		cXml += '        	<dSubExe>'+ AllTrim(TRANSFORM(aTotales[1],cPicture))+'</dSubExe>' + cSalto
		cXml += '        	<dSubExo>'+ AllTrim(TRANSFORM(aTotales[2],cPicture))+'</dSubExo>' + cSalto
		cXml += '        	<dSub5>'+ AllTrim(TRANSFORM(aTotales[3],cPicture))+'</dSub5>' + cSalto
		cXml += '        	<dSub10>'+ AllTrim(TRANSFORM(aTotales[4],cPicture))+'</dSub10>' + cSalto
		cXml += '        	<dTotOpe>'+ AllTrim(TRANSFORM(aTotales[5],cPicture))+'</dTotOpe>' + cSalto
		cXml += '        	<dTotDesc>'+ AllTrim(TRANSFORM(aDesc[1],cPicture))+'</dTotDesc>' + cSalto
		cXml += '        	<dTotDescGlotem>'+ AllTrim(TRANSFORM(aTotales[6],cPicture))+'</dTotDescGlotem>' + cSalto
		cXml += '        	<dTotAntItem>0</dTotAntItem>' + cSalto
		cXml += '        	<dTotAnt>0</dTotAnt>' + cSalto
		cXml += '        	<dPorcDescTotal>0</dPorcDescTotal>' + cSalto
		cXml += '        	<dDescTotal>'+ AllTrim(TRANSFORM(aDesc[1],cPicture))+'</dDescTotal>' + cSalto
		cXml += '        	<dAnticipo>0</dAnticipo>' + cSalto
		cXml += '        	<dRedon>0.0</dRedon>' + cSalto
		cXml += '        	<dTotGralOpe>'+ AllTrim(TRANSFORM(SF2->F2_VALBRUT,cPicture))+'</dTotGralOpe>' + cSalto
		cXml += '        	<dIVA5>'+ AllTrim(TRANSFORM(aTotales[7],cPicture))+'</dIVA5>' + cSalto
		cXml += '        	<dIVA10>'+ AllTrim(TRANSFORM(aTotales[8],cPicture))+'</dIVA10>' + cSalto
		cXml += '        	<dTotIVA>'+ AllTrim(TRANSFORM(aTotales[9],cPicture))+'</dTotIVA>' + cSalto
		cXml += '        	<dBaseGrav5>'+ AllTrim(TRANSFORM(aTotales[10],cPicture))+'</dBaseGrav5>' + cSalto
		cXml += '			<dBaseGrav10>'+ AllTrim(TRANSFORM(aTotales[11],cPicture))+'</dBaseGrav10>' + cSalto
		cXml += '			<dTBasGraIVA>'+ AllTrim(TRANSFORM(aTotales[12],cPicture))+'</dTBasGraIVA>' + cSalto
		If AllTrim(STR(SF2->F2_MOEDA)) <> "1"
			cXml += '			<dTotalGs>'+ AllTrim(TRANSFORM(SF2->F2_VALBRUT*SF2->F2_TXMOEDA,cPicture))+'</dTotalGs>' + cSalto
		EndIf
		cXml += '		</gTotSub>' +cSalto
	EndIf
	
	//DOCUMENTO ASOCIADO
	If AllTrim(SF2->F2_ESPECIE)=="NDC"
		cXml += '		<gCamDEAsoc>' + cSalto
		cXml += M486ASOC(SF2->F2_ESPECIE,SF2->F2_DOC,SF2->F2_SERIE,SF2->F2_CLIENTE,SF2->F2_LOJA,"1") 
		cXml += '		</gCamDEAsoc>' + cSalto
	EndIf
	cXml += '	</DE>' + cSalto
	cXml += '</rDE>' + cSalto

	RestArea(aSF)
	RestArea(aArea)

Return cXml

La información retornada en la variable cXml deberá contener el xml que será guardado para ser transmitido.

Totvs custom tabs box items
defaultno
referenciapaso10

En caso de ser necesario modificar el xml para documentos de entrada (NCC) existe el punto de entrada M486PEEXML habilitado para realizar esta operación.

Ejemplos de uso:

Bloco de código
User Function M486PEEXML()
Local cFilial   := PARAMIXB[1]
Local cSerie    := PARAMIXB[2]
Local cCliente  := PARAMIXB[3]
Local cLoja     := PARAMIXB[4]
Local cDoc      := PARAMIXB[5]
Local cEspecie  := PARAMIXB[6]
Local cXml      := ""
Local cSalto	:= chr(13) + chr(10)
Local cPicture	:= "999999999999999.9999"
Local cID		:= ""
Local cSecCod	:= ""
Local cdDVId	:= ""
Local cFeEmiDE	:= ""
Local cNumCasa	:= ""
Local cDepEmi	:= ""
Local cDisEmi	:= ""
Local cCiuEmi	:= ""
Local aTotales	:= {0,0,0,0,0,0,0,0,0,0,0,0,0}
Local aDesc		:= {0,0}
Local lProd		:= SuperGetMV("MV_CFDI_AM",,"") == "P"
Local cEmail	:= SuperGetMV("MV_RELACNT",,"")
Local cAliasTmp	:= ""
Local aArea		:= GetArea()
Local aSF		:= {}

	DbSelectArea("SF1")
	aSF := GetArea()
	DbSetOrder(1)//F1_FILIAL+F1_DOC+F1_SERIE+F1_FORNECE+F1_LOJA+F1_TIPO 
	DbSeek(xFilial("SF1")+cDoc+cSerie+cCliente+cLoja)

	
	cSecCod  := M486SecCod(Time(),SF1->F1_EMISSAO)
	cID		 := M486GENCDC("05",SUBSTR(SM0->M0_CGC,1,RAT("-",SM0->M0_CGC)-1),Substr(SM0->M0_CGC,RAT("-",SM0->M0_CGC)+ 1,1),SUBSTR(SF1->F1_DOC,1,3),SUBSTR(SF1->F1_DOC,4,3),SUBSTR(SF1->F1_DOC,7),"1",SF1->F1_EMISSAO,"1",cSecCod,SF1->F1_ESPECIE)
	cdDVId	 := AllTrim(STR(CalcMod11(SUBSTR(cID,1,43))))
	cFeEmiDE := SUBSTR(DTOS(SF1->F1_EMISSAO),0,4) + "-" + SUBSTR(DTOS(SF1->F1_EMISSAO),5,2) + "-" + SUBSTR(DTOS(SF1->F1_EMISSAO),7,2) + "T" + SF1->F1_HORA
	cNumCasa := ObtColSAT("S030",SUBSTR(SM0->M0_CGC,1,10) , 1, 10, 11,6)
	cNumCasa := Iif(Empty(cNumCasa), "0", cNumCasa )
	cDepEmi  := ObtColSAT("S030",SUBSTR(SM0->M0_CGC,1,10) , 1, 10, 18,2) 
	cDisEmi  := ObtColSAT("S030",SUBSTR(SM0->M0_CGC,1,10) , 1, 10, 20,3)
	cCiuEmi  := ObtColSAT("S030",SUBSTR(SM0->M0_CGC,1,10) , 1, 10, 23,4)

	cXml := '<rDE' + cSalto
	cXml += ' xmlns="http://ekuatia.set.gov.py/sifen/xsd" ' + cSalto
	cXml += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' + cSalto
	cXml += ' xsi:schemaLocation="http://ekuatia.set.gov.py/sifen/xsd/ siRecepDE_v150.xsd">' + cSalto
	cXml += ' <dVerFor>150</dVerFor>' + cSalto
	cXml += '	<DE Id="' + cID + '">' + cSalto
	cXml += '		<dDVId>' + cdDVId + '</dDVId>' + cSalto
	cXml += '		<dFecFirma></dFecFirma> ' + cSalto
	cXml += '		<dSisFact>1</dSisFact>' + cSalto
	cXml += '		<gOpeDE>' + cSalto
	cXml += '        	<iTipEmi>1</iTipEmi>' + cSalto
	cXml += '        	<dDesTipEmi>Normal</dDesTipEmi>' +cSalto
	cXml += '			<dCodSeg>' + SUBSTR(cID,35,9) + '</dCodSeg>' + cSalto
	cXml += '		</gOpeDE>' + cSalto
	cXml += '		<gTimb>' + cSalto
	cXml += '        	<iTiDE>5</iTiDE>' + cSalto
	cXml += '        	<dDesTiDE>Nota de crédito electrónica</dDesTiDE>' + cSalto
	cXml += '        	<dNumTim>'+ AllTrim(SF1->F1_NUMTIM) +'</dNumTim>' + cSalto
	cXml += '        	<dEst>' + SUBSTR(SF1->F1_DOC,1,3) + '</dEst>' + cSalto
	cXml += '        	<dPunExp>' + SUBSTR(SF1->F1_DOC,4,3) + '</dPunExp>' + cSalto
	cXml += '        	<dNumDoc>' + RIGHT(SF1->F1_DOC,7) + '</dNumDoc>' + cSalto
	cXml += '        	<dSerieNum>' + AllTrim(SF1->F1_SERIE2) + '</dSerieNum>' + cSalto
	cXml += '			<dFeIniT>' + FecIniTimb(SF1->F1_SERIE, SF1->F1_ESPECIE) + '</dFeIniT>' + cSalto
	cXml += '		</gTimb>' + cSalto
	cXml += '		<gDatGralOpe>' + cSalto
	cXml += '			<dFeEmiDE>' + cFeEmiDE + '</dFeEmiDE>' + cSalto

	// Campos inherentes a la operación comercial (D010-D099)
	CTO->(DbSetOrder(1)) //CTO_FILIAL+CTO_MOEDA
	CTO->(MsSeek(xFilial("CTO")+Strzero(SF1->F1_MOEDA,2)))
	cXml += M486IMPPAR(ALLTRIM(SF1->F1_ESPECIE),SF1->F1_DOC,SF1->F1_SERIE, SF1->F1_FORNECE,SF1->F1_LOJA, CTO->CTO_MOESAT,"","") + cSalto

	//EMISOR
	cXml += '			<gEmis>' + cSalto
	cXml += '				<dRucEm>' + SUBSTR(SM0->M0_CGC,1,RAT("-",SM0->M0_CGC)-1)+'</dRucEm>' + cSalto
	cXml += '				<dDVEmi>' + Substr(SM0->M0_CGC,RAT("-",SM0->M0_CGC)+ 1,1) + '</dDVEmi>' + cSalto
	cXml += '				<iTipCont>1</iTipCont>' + cSalto
	cXml += '				<cTipReg>'+ ObtColSAT("S030",SUBSTR(SM0->M0_CGC,1,10) , 1, 10, 17,1) +'</cTipReg>' + cSalto
	If lProd
		cXml += '				<dNomEmi>'+ AllTrim(SM0->M0_NOME) + '</dNomEmi>' + cSalto
	Else
		cXml += '				<dNomEmi>'+  "DE generado en ambiente de prueba - sin valor comercial ni fiscal" + '</dNomEmi>' + cSalto
	EndIf
	cXml += '				<dNomFanEmi>'+ AllTrim(SM0->M0_NOMECOM) + '</dNomFanEmi>' + cSalto
	cXml += '				<dDirEmi>'+ AllTrim(SM0->M0_ENDENT) + '</dDirEmi>' + cSalto
	cXml += '				<dNumCas>' + cNumCasa + '</dNumCas>' + cSalto
	cXml += '				<cDepEmi>' + cDepEmi+ '</cDepEmi>' + cSalto
	cXml += '				<dDesDepEmi>' + AllTrim(ObtColSAT("S003",cDepEmi, 1, 2, 3,28)) + '</dDesDepEmi>' + cSalto
	cXml += '				<cDisEmi>' + AllTrim(cDisEmi) + '</cDisEmi>' + cSalto
	cXml += '				<dDesDisEmi>' + AllTrim(ObtColSAT("S031",cDisEmi, 1, 3, 4,30))+ '</dDesDisEmi>' + cSalto
	cXml += '				<cCiuEmi>' +  AllTrim(cCiuEmi)  + '</cCiuEmi>' + cSalto
	cXml += '				<dDesCiuEmi>' +  AllTrim(ObtColSAT("S012",cCiuEmi, 48, 4, 52,30))+ '</dDesCiuEmi>' + cSalto
	If !Empty(SM0->M0_TEL)
		cXml += '				<dTelEmi>' + AllTrim(SM0->M0_TEL) + '</dTelEmi>' + cSalto
	EndIf
	cXml += '				<dEmailE>' +  cEmail  + '</dEmailE>' + cSalto //Quitar
	cXml += '				<gActEco>' + cSalto
	cXml += '					<cActEco>' + AllTrim(SM0->M0_DSCCNA) + '</cActEco>' + cSalto
	cXml += '					<dDesActEco>'+ ObtColSAT("S006",SUBSTR(SM0->M0_DSCCNA,1,6) , 2, 5, 7,166)+'</dDesActEco>' + cSalto
	cXml += '				</gActEco>' +  cSalto
	cXml += '			</gEmis>' + cSalto
	//RECEPTOR
	SA1->(DbSetOrder(1))
	SA1->(MSSeek(xFilial("SA1")+SF1->F1_FORNECE+SF1->F1_LOJA))
	SYA->(DbSetOrder(1))
	SYA->(MsSeek(xFilial("SYA")+SA1->A1_PAIS))

	cXml += '			<gDatRec>' + cSalto
	cXml += '				<iNatRec>1</iNatRec>' + cSalto
	cXml += '				<iTiOpe>1</iTiOpe>' + cSalto
	cXml += '				<cPaisRec>' + SYA->YA_CODERP + '</cPaisRec>' + cSalto
	cXml += '				<dDesPaisRe>'+ ObtColSAT("S005",SYA->YA_CODERP, 1, 3, 4,52)+'</dDesPaisRe>' +cSalto
	If !Empty(SA1->A1_CGC)
		cXml += '				<iTiContRec>' + IIF(SA1->A1_PESSOA $ "F","1","2") + '</iTiContRec>' + cSalto
		cXml += '				<dRucRec>' +  SUBSTR(SA1->A1_CGC,1,RAT("-",SA1->A1_CGC)-1) + '</dRucRec>' + cSalto
		cXml += '				<dDVRec>' + Substr(SA1->A1_CGC,RAT("-",SA1->A1_CGC)+ 1,1) + '</dDVRec>' + cSalto
	Else
		cXml += '				<iTipIDRec>' + AllTrim(SA1->A1_TIPDOC) + '</iTipIDRec>' + cSalto
		cXml += '				<dDTipIDRec>' +  ObtColSAT("S018", SA1->A1_TIPDOC, 1, 1, 2,41) + '</dDTipIDRec>' + cSalto
		cXml += '				<dNumIDRec>' +  IIF(AllTrim(SA1->A1_TIPDOC)=="5","0",ALLTRIM(SA1->A1_NIF)) + '</dNumIDRec>' +cSalto
	EndIf
	cXml += '				<dNomRec>' + AllTrim(SA1->A1_NOME)+ '</dNomRec>' + cSalto
	cXml += '				<dNomFanRec>' + AllTrim(SA1->A1_NREDUZ)+ '</dNomFanRec>' + cSalto
	cXml += '				<dDirRec>' + AllTrim(SA1->A1_END) + '</dDirRec>' + cSalto
	cXml += '				<dNumCasRec>' + AllTrim(SA1->A1_NUM) + '</dNumCasRec>' + cSalto
	cXml += '				<cDepRec>' + SA1->A1_DEPTO + '</cDepRec>' + cSalto
	cXml += '				<dDesDepRec>' + AllTrim(ObtColSAT("S003",SA1->A1_DEPTO, 1, 2, 3,28)) +'</dDesDepRec>' + cSalto
	cXml += '				<cDisRec>' + SA1->A1_DISTR+ '</cDisRec>' + cSalto
	cXml += '				<dDesDisRec>'+ AllTrim(ObtColSAT("S031",SA1->A1_DISTR, 1, 3, 4,30)) + '</dDesDisRec>' + cSalto
	cXml += '				<cCiuRec>' + AllTrim(SA1->A1_CIUDAD) + '</cCiuRec>' + cSalto
	cXml += '				<dDesCiuRec>' + AllTrim(ObtColSAT("S012",SA1->A1_CIUDAD, 48, 4, 52,30)) + '</dDesCiuRec>' + cSalto
	If !Empty(SA1->A1_TEL)
		cXml += '				<dTelRec>' + AllTrim(SA1->A1_TEL) + '</dTelRec>' + cSalto
	EndIf
	If !Empty(SA1->A1_EMAIL)
		cXml += '				<dEmailRec>' + SA1->A1_EMAIL + '</dEmailRec>' + cSalto
	EndIf
	cXml += '				<dCodCliente>' + AllTrim(SA1->A1_COD) + '</dCodCliente>' + cSalto
	cXml += '			</gDatRec>' + cSalto
	cXml += '		</gDatGralOpe>' + cSalto

	//TIPO DE PRESENCIA
	cXml += '		<gDtipDE>' + cSalto
	cXml += '        	<gCamNCDE>' + cSalto
	cXml += '    			<iMotEmi>' + AllTrim(SF1->F1_TIPREF) + '</iMotEmi>' + cSalto
	cXml += '        		<dDesMotEmi>'+ ObtColSAT("S021",SF1->F1_TIPREF, 1, 1, 2,30)+'</dDesMotEmi>' + cSalto
	cXml += '        	</gCamNCDE>' + cSalto

	cAliasTmp := QueryItems("SD1", "D1_COD, D1_QUANT, D1_TES, D1_ITEM, SD1.R_E_C_N_O_", "D1_DOC='" + SF1->F1_DOC + "' AND D1_SERIE='" + SF1->F1_SERIE + "' AND D1_FORNECE='" + SF1->F1_FORNECE + "' AND D1_LOJA='" + SF1->F1_LOJA + "'",  "D1_ITEM") 
	
	While (cAliasTmp)->(!EOF())
		cXml += '        	<gCamItem>' + cSalto
		cXml += '    			<dCodInt>' + Alltrim((cAliasTmp)->B1_COD) + '</dCodInt>' + cSalto
		cXml += '    			<dDesProSer>' + AllTrim((cAliasTmp)->B1_DESC) + '</dDesProSer>' + cSalto
		cXml += '    			<cUniMed>' + AllTrim((cAliasTmp)->AH_COD_CO) + '</cUniMed>' + cSalto
		cXml += '    			<dDesUniMed>' + ObtColSAT("S002",(cAliasTmp)->AH_COD_CO, 1, 3, 29,6) + '</dDesUniMed>' + cSalto
		cXml += '    			<dCantProSer>' + AllTrim(TRANSFORM((cAliasTmp)->D1_QUANT,"9999999999.9999") )+ '</dCantProSer>' + cSalto
		If (cAliasTmp)->R_E_C_N_O_ > 0
			SD2->(dbgoto((cAliasTmp)->R_E_C_N_O_))
		EndIf
		cXml += M486IMPDPAR(ALLTRIM(SF1->F1_ESPECIE),SF1->F1_DOC,SF1->F1_SERIE, SF1->F1_FORNECE,SF1->F1_LOJA, (cAliasTmp)->D1_TES,(cAliasTmp)->D1_ITEM,(cAliasTmp)->D1_COD,@aDesc) + cSalto
		cXml += '        	</gCamItem>' + cSalto
		(cAliasTmp)->(dbSkip())
	End
	(cAliasTmp)->(dbcloseArea())
	cXml += '		</gDtipDE>' + cSalto

	aTotales := M486SUBTOT(ALLTRIM(SF1->F1_ESPECIE),SF1->F1_DOC,SF1->F1_SERIE, SF1->F1_FORNECE,SF1->F1_LOJA)
	cXml += '		<gTotSub>' + cSalto
	cXml += '        	<dSubExe>'+ AllTrim(TRANSFORM(aTotales[1],cPicture))+'</dSubExe>' + cSalto
	cXml += '        	<dSubExo>'+ AllTrim(TRANSFORM(aTotales[2],cPicture))+'</dSubExo>' + cSalto
	cXml += '        	<dSub5>'+ AllTrim(TRANSFORM(aTotales[3],cPicture))+'</dSub5>' + cSalto
	cXml += '        	<dSub10>'+ AllTrim(TRANSFORM(aTotales[4],cPicture))+'</dSub10>' + cSalto
	cXml += '        	<dTotOpe>'+ AllTrim(TRANSFORM(aTotales[5],cPicture))+'</dTotOpe>' + cSalto
	cXml += '        	<dTotDesc>'+ AllTrim(TRANSFORM(aDesc[1],cPicture))+'</dTotDesc>' + cSalto
	cXml += '        	<dTotDescGlotem>'+ AllTrim(TRANSFORM(aTotales[6],cPicture))+'</dTotDescGlotem>' + cSalto
	cXml += '        	<dTotAntItem>0</dTotAntItem>' + cSalto
	cXml += '        	<dTotAnt>0</dTotAnt>' + cSalto
	cXml += '        	<dPorcDescTotal>0</dPorcDescTotal>' + cSalto
	cXml += '        	<dDescTotal>'+ AllTrim(TRANSFORM(aDesc[1],cPicture))+'</dDescTotal>' + cSalto
	cXml += '        	<dAnticipo>0</dAnticipo>' + cSalto
	cXml += '        	<dRedon>0.0</dRedon>' + cSalto
	cXml += '        	<dTotGralOpe>'+ AllTrim(TRANSFORM(SF1->F1_VALBRUT,cPicture))+'</dTotGralOpe>' + cSalto
	cXml += '        	<dIVA5>'+ AllTrim(TRANSFORM(aTotales[7],cPicture))+'</dIVA5>' + cSalto
	cXml += '        	<dIVA10>'+ AllTrim(TRANSFORM(aTotales[8],cPicture))+'</dIVA10>' + cSalto
	cXml += '        	<dTotIVA>'+ AllTrim(TRANSFORM(aTotales[9],cPicture))+'</dTotIVA>' + cSalto
	cXml += '        	<dBaseGrav5>'+ AllTrim(TRANSFORM(aTotales[10],cPicture))+'</dBaseGrav5>' + cSalto
	cXml += '			<dBaseGrav10>'+ AllTrim(TRANSFORM(aTotales[11],cPicture))+'</dBaseGrav10>' + cSalto
	cXml += '			<dTBasGraIVA>'+ AllTrim(TRANSFORM(aTotales[12],cPicture))+'</dTBasGraIVA>' + cSalto
	If AllTrim(STR(SF1->F1_MOEDA)) <> "1"
		cXml += '			<dTotalGs>'+ AllTrim(TRANSFORM(SF1->F1_VALBRUT*SF1->F1_TXMOEDA,cPicture))+'</dTotalGs>' + cSalto
	EndIf
	cXml += '		</gTotSub>' +cSalto
	
	//DOCUMENTO ASOCIADO
	cXml += '		<gCamDEAsoc>' + cSalto
	cXml += M486ASOC(SF1->F1_ESPECIE,SF1->F1_DOC,SF1->F1_SERIE,SF1->F1_FORNECE,SF1->F1_LOJA,"1") + cSalto
	cXml += '		</gCamDEAsoc>' + cSalto
	cXml += '	</DE>' + cSalto
	cXml += '</rDE>' + cSalto

	RestArea(aSF)
	RestArea(aArea)

Return cXml

La información retornada en la variable cXml deberá contener el xml que será guardado para ser transmitido.

Totvs custom tabs box items
defaultno
referenciapaso11

PE - M486PDFGEN

Descripción:

M486PDFGEN.- Generación personalizada de Impresión Gráfica de Documentos

Ubicación:

Actualizaciones / Facturación / Transmisión Electrónica.

Eventos:

Imprimir PDF.

Programa Fuente:

MATA486.PRW

Función:

MenuDef

Retorno:N/A


Ejemplo:

#Include 'Protheus.ch'

User Function M486PDFGEN()

   MsgAlert("Aquí debe colocar lógica para imprimir pdf ")

Return NIL

Bloco de código
languagexml
titleM486PDFGEN
linenumberstrue
collapsetrue
#include 'protheus.ch'
#INCLUDE "RPTDEF.CH"
#INCLUDE "FWPrintSetup.ch"
#INCLUDE "XMLXFUN.CH"
#INCLUDE "TBICONN.CH"
#INCLUDE "RPTDEF.CH"
#INCLUDE "FONT.CH"
#INCLUDE "M486PDFPAR.CH"

/*/{Protheus.doc} M486PDFPAR
Rutina para creación y/o envio de reporte en formato PDF generado
a partir de XML timbrado por el SIFEN (PAR).
@author TOTVS
@version 1.0
@param cEspecie, caracter, Especie del Documento
/*/
User Function M486PDFGEN(cEspecie)
 	Local cPerg := "M486PDF"
	Private cSerie := ""
	Private cDocIni := ""
	Private cDocFin := ""
	Private nFormato := 0
	Private cPath := &(SuperGetmv( "MV_CFDDOCS" , .F. , "'cfd\facturas\'" )) + "\autorizados\"
	Private oXML   := Nil
	Private nTotPag := 0
	Private oFont1 := TFont():New( "ARIAL", , 7, .F., .F.)
	Private oFont2 := TFont():New( "ARIAL", , 8, .F., .F.)
	Private oFont3 := TFont():New( "ARIAL", , 10, .T., .T.)
	Private oFont4 := TFont():New( "ARIAL", , 8, .F., .T.) //Negrita - 8
	Private oFont5 := TFont():New( "ARIAL", , 11, .F., .T.) //Negrita - 12
	Private oFont6 := TFont():New( "ARIAL", , 14, .F., .T.) //Negrita - 16
	Private oFont7 := TFont():New( "ARIAL", , 11, .T., .T.) //Negrita - 16
	Private oFont8 := TFont():New( "ARIAL", , 10, .F., .F.)
	Private oFont9 := TFont():New( "ARIAL", ,  9, .F., .F.)
	Private nLinea	:= 0
	Private cPicture := "@E 99,999,999,999.99"
	Private cPicture2 := "@E 99999999999.99"
	Private cXmlMoe:=''
	Private cDirAux:=""
	Private nFinBox:=0
	oFont1:nWidth:=oFont2:nWidth:=oFont3:nWidth:=oFont4:nWidth:=oFont5:nWidth:=oFont6:nWidth:=oFont7:nWidth:=oFont8:nWidth:=oFont9:nWidth:= 3
	cPath := Replace( cPath, "\\", "\" )
	IF Empty(cEspecie)
	cEspecie:=U_TComboBox()
	ENDIF
	
	If Pergunte(cPerg,.T.)
		cSerie := MV_PAR01
		cDocIni := MV_PAR02
		cDocFin := MV_PAR03
		nFormato := MV_PAR04
		cDirAux:= ALLTRIM(MV_PAR05)
		Processa({|| U_XMLPDF(cEspecie)},STR0052, STR0053)// "Espere.." "Generando impresión de documento autorizado"
	EndIf
Return Nil

/*/{Protheus.doc} U_XMLPDF
Llamado de funciones para impresión de reporte PDF
@version 1.0
@param cEspecie, character,  Especie del documento.
/*/
User Function XMLPDF(cEspecie)
Local cCampos 	:= ""
Local cTablas 	:= ""
Local cCond   	:= ""
Local cOrder  	:= ""
Local cAliasPDF := getNextAlias()
Local cAviso	:= ""
Local cErro		:= ""
Local oPrinter
Local cFile 	:= ""
Local cFileGen 	:= ""
Local cFileAux 	:= ""
Local nRegProc 	:= 0
Local cPDFPro  	:= "1"
Local bOk:= .T.

Private nML			:= 20
Private cTipFact	:= ""
Private cLetFac		:= ""
Private cLetPie 	:= ""
Private nTamCant:=0
Private nPag:=0
	If alltrim(cEspecie) $ "NF|NDC|RFN|RTS"
		
		cCampos  := "% SF2.F2_FILIAL, SF2.F2_SERIE SERIE, SF2.F2_DOC DOCUMENTO, SF2.F2_ESPECIE ESPECIE, SF2.F2_CLIENTE CLIENTE, SF2.F2_LOJA LOJA, SF2.F2_MOEDA AS MONEDA, F2_SERIE2 SERIE2 %"
		cTablas  := "% " + RetSqlName("SF2") + " SF2 %"
		cCond    := "% SF2.F2_SERIE = '"  + cSerie + "'"
		cCond    += " AND SF2.F2_DOC >= '"  + cDocIni + "'"
		cCond    += " AND SF2.F2_DOC <= '"  + cDocFin + "'"
		cCond    += " AND SF2.F2_ESPECIE IN ('"  + cEspecie + "')"
		cCond	 += " AND SF2.F2_FILIAL = '" + xFilial("SF2") + "'"
		cCond	 += " AND SF2.D_E_L_E_T_  = ' ' %"
		cOrder := "% SF2.F2_FILIAL, SF2.F2_SERIE, SF2.F2_DOC %"
		cLetFac := STR0001 + IIf(Alltrim(cEspecie) == "NF", STR0002, STR0004) //"FACTURA ELECTRÓNICA" //"NOTA DE DÉBITO ELECTRÓNICA"
		cLetPie := IIf(Alltrim(cEspecie) == "NF", STR0029, STR0030) //"Representación impresa de FACTURA ELECTRÓNICA" //"Representación impresa de NOTA DE DÉBITO ELECTRÓNICA"
		nTamCant :=TamSX3("D2_QUANT")[2]
	ElseIf alltrim(cEspecie) $ "NCC"
		// NOTA DE CRÉDITO
		cCampos  := "% SF1.F1_FILIAL, SF1.F1_SERIE SERIE, SF1.F1_DOC DOCUMENTO, SF1.F1_ESPECIE ESPECIE, SF1.F1_FORNECE CLIENTE, SF1.F1_LOJA LOJA, SF1.F1_MOEDA AS MONEDA, F1_SERIE2 SERIE2  %"
		cTablas  := "% " + RetSqlName("SF1") + " SF1 %"
		cCond    := "% SF1.F1_SERIE = '"  + cSerie + "'"
		cCond    += " AND SF1.F1_DOC >= '"  + cDocIni + "'"
		cCond    += " AND SF1.F1_DOC <= '"  + cDocFin + "'"
		cCond    += " AND SF1.F1_ESPECIE = '"  + cEspecie + "'"
		cCond	 += " AND SF1.F1_FILIAL = '" + xFilial("SF1") + "'"
		cCond	 += " AND SF1.D_E_L_E_T_  = ' ' %"
		cOrder := "% SF1.F1_FILIAL, SF1.F1_SERIE, SF1.F1_DOC %"
		cLetFac := STR0001 + STR0003 //"NOTA DE CRÉDITO ELECTRÓNICA"
		cLetPie	:= STR0031  //"Representación impresa de NOTA DE CRÉDITO ELECTRÓNICA"
		nTamCant :=TamSX3("D1_QUANT")[2]
	EndIf

	BeginSql alias cAliasPDF
		SELECT %exp:cCampos%
		FROM  %exp:cTablas%
		WHERE %exp:cCond%
		ORDER BY %exp:cOrder%
	EndSql

	Count to nRegProc

	dbSelectArea(cAliasPDF)

	(cAliasPDF)->(DbGoTop())

	While (cAliasPDF)->(!Eof())
		If cPDFPro == "1"
			cFileGen := AllTrim((cAliasPDF)->SERIE) + AllTrim((cAliasPDF)->DOCUMENTO) + AllTrim((cAliasPDF)->ESPECIE)
			cFile := cFileGen + ".xml"
			oXML := XmlParserFile(cPath + cFile, "_", @cAviso,@cErro)

			If oXML <> Nil
				If File(GetClientDir() + cFileGen + ".pdf")
					// En caso de que exista el PDF en la carpeta del Smartclient, lo borra para que no pregunte si se sobre-escribe
					Delete File &(GetClientDir() + cFileGen + ".pdf")
				Endif

				oPrinter := FWMSPrinter():New(cFileGen,6,.F.,GetClientDir(),.T.,,,,,.F.,,.F. )

				If AllTrim((cAliasPDF)->ESPECIE) $ "NF|NDC|RFN|RTS"
					If alltrim((cAliasPDF)->ESPECIE) == "NF"
						cTipFact:= STR0002
						cLetFac := STR0001 + STR0002 // "KuDE de " "Factura Electrónica"
						cLetPie := STR0043 + STR0002 + STR0044 //"Consulte la validez de esta " "Factura Electrónica" " con el número de CDC impreso abajo en:"
					ElseIf AllTrim((cAliasPDF)->ESPECIE) == "NDC"
						cTipFact:= STR0004
						cLetFac := STR0001 + STR0004 // "KuDE de " "Nota de Débito Electrónica"
						cLetPie := STR0043 + STR0004 + STR0044 //"Consulte la validez de esta " "Nota de Débito Electrónica" " con el número de CDC impreso abajo en:"
					ElseIf AllTrim((cAliasPDF)->ESPECIE) $ "RFN|RTS"
						cTipFact:= STR0005
						cLetFac := STR0001 + STR0005 // "KuDE de " "Nota de Débito Electrónica"
						cLetPie := STR0043 + STR0005 + STR0044 //"Consulte la validez de esta " "Nota de Débito Electrónica" " con el número de CDC impreso abajo en:"
					EndIf
				ElseIf AllTrim((cAliasPDF)->ESPECIE) $ "NCC"
					cTipFact:= STR0003
					cLetFac	:= STR0001 + STR0003 //"KuDE de " "Nota de Crédito Electrónica"
					cLetPie	:= STR0043 + STR0003 + STR004  //"Consulte la validez de esta " "Nota de Crédito Electrónica" " con el número de CDC impreso abajo en:"
				EndIf

				oPrinter:setDevice(IMP_PDF)
				oPrinter:cPathPDF := GetClientDir()
				oPrinter:StartPage()

				cXmlMoe:=(cAliasPDF)->MONEDA
				//Encabezado
				U_uImpEnc(oPrinter,oXml, ( !AllTrim((cAliasPDF)->ESPECIE) $ "RFN|RTS"))
				
				If !AllTrim((cAliasPDF)->ESPECIE) $ "RFN|RTS"
					//Detalle
					U_uDetFact(oPrinter,oXML,0,1)
				Else
					U_uDetRem(oPrinter,oXML)
				EndIf
					
				//Pie de página
				oPrinter:EndPage()
				oPrinter:Print()

			

				cFileAux := GetClientDir() + cFileGen +".pdf"
				CpyT2S(cFileAux, cPath)
				If !Empty(cDirAux)
					bOk:=CpyS2T(cPath+ cFileGen +".pdf",cDirAux,.T. )
					IF !bOk
						Help(" ",1,STR0089,,STR0090,4,5)
					ENDIF
				ENDIF

				FreeObj(oPrinter)
				oPrinter := Nil

				FErase(cFileAux)
			EndIf
		EndIf
		(cAliasPDF)->(dbskip())
	EndDo

Return Nil

/*/{Protheus.doc} uImpEnc
Imprime encabezado de factura a partir de XML Paraguay
@version 1.0
@param oPrinter, objeto, Objeto creado por FWMSPrinter.
@param oXml, objeto, Objeto con estructura de archivo XML.
/*/
User Function uImpEnc(oPrinter,oXml,lNoRem)

Local cFileLogo	:= ""
//Emisor
Local cNomEm	:= ""
Local cRUC 		:= ""
Local cTimbrado := ""
Local cFecTim	:= ""
Local cDir		:= ""
Local cCiudad	:= ""
Local cTel		:= ""
Local cCorreo	:= ""
Local cActEc	:= ""
Local cNumDoc	:= ""
//Receptor
Local cFecEmis	:= ""
Local cCondVnt	:= ""
Local cCoutas	:= ""
Local cMoneda	:= ""
Local cTipoCam	:= ""
Local cRUCRec	:= ""
Local cNomRec	:= ""
Local cDirRec	:= ""
Local cTelRec	:= ""
Local cCorreoR	:= ""
Local cTipoTr	:= ""
Local cMotTr	:= ""
Local nMRText	:= 340
Local nMLText	:= 25
Local nIniBox:= 0
Local cResto:=0
Default lNoRem	:= .T.

	
	If XmlChildEx(oXml:_RDE, '_DE') <> Nil
		If XmlChildEx(oXml:_RDE:_DE, '_GDATGRALOPE') <> Nil
			If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE, '_GEMIS') <> Nil
				If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS, '_DNOMEMI') <> Nil
					cNomEm		:= oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS:_DNOMEMI:TEXT
				EndIf
				If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS, '_DDESCIUEMI') <> Nil
					cCiudad		:= oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS:_DDESCIUEMI:TEXT
				EndIf
				If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS, '_DTELEMI') <> Nil
					cTel		:= oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS:_DTELEMI:TEXT
				EndIf
				If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS, '_DEMAILE') <> Nil
					cCorreo		:= oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS:_DEMAILE:TEXT
				EndIf
				If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS, '_DRUCEM') <> Nil
					cRUC		:= oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS:_DRUCEM:TEXT
				EndIf
				If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS, '_DDVEMI') <> Nil 
					cRUC		+= "-" + oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS:_DDVEMI:TEXT
				EndIf
				If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS, '_DDIREMI') <> Nil
					cDir		:= oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS:_DDIREMI:TEXT
				EndIf
				If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS, '_DNUMCAS') <> Nil 
					cDir		+= " " + STR0054 + " " + oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS:_DNUMCAS:TEXT
				EndIf
				If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS, '_GACTECO') <> Nil
					If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS:_GACTECO, '_DDESACTECO') <> Nil
						cActEc		:= oXml:_RDE:_DE:_GDATGRALOPE:_GEMIS:_GACTECO:_DDESACTECO:TEXT
					EndIf
				EndIf
				 
			EndIf
			If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE, '_DFEEMIDE') <> Nil
				//Emisión
				cFecEmis	:= SUBSTR(oXml:_RDE:_DE:_GDATGRALOPE:_DFEEMIDE:TEXT,9,2) + "-"
				cFecEmis	+= SUBSTR(oXml:_RDE:_DE:_GDATGRALOPE:_DFEEMIDE:TEXT,6,2) + "-"
				cFecEmis	+= SUBSTR(oXml:_RDE:_DE:_GDATGRALOPE:_DFEEMIDE:TEXT,1,4) + " "
				cFecEmis	+= SUBSTR(oXml:_RDE:_DE:_GDATGRALOPE:_DFEEMIDE:TEXT,12)
			EndIf
			
			If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE, '_GOPECOM') <> Nil
				If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GOPECOM, '_DDESTIPTRA') <> Nil
					cTipoTr		:= oXml:_RDE:_DE:_GDATGRALOPE:_GOPECOM:_DDESTIPTRA:TEXT
				EndIf
				If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GOPECOM, '_CMONEOPE') <> Nil
					cMoneda		:= oXml:_RDE:_DE:_GDATGRALOPE:_GOPECOM:_CMONEOPE:TEXT
				EndIf
				If cMoneda <> "PYG"
					If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE:_GOPECOM, '_DTICAM') <> Nil
						cTipoCam	:= oXml:_RDE:_DE:_GDATGRALOPE:_GOPECOM:_DTICAM:TEXT
					EndIf
				EndIf
			EndIf
			
			If XmlChildEx(oXml:_RDE:_DE:_GDATGRALOPE, '_GDATREC') <> Nil
				If XmlChildEx( oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC, '_DRUCREC') <> Nil
					cRUCRec		:= oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC:_DRUCREC:TEXT 
				EndIf
				IF Empty(cRUCRec)
					If XmlChildEx( oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC, '_DNUMIDREC') <> Nil
					cRUCRec		:= oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC:_DNUMIDREC:TEXT 
					EndIf
				ENDIF
				If XmlChildEx( oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC, '_DDVREC') <> Nil
					cRUCRec		+= "-" + oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC:_DDVREC:TEXT
				EndIf
				If XmlChildEx( oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC, '_DNOMREC') <> Nil
					cNomRec		:= oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC:_DNOMREC:TEXT
				EndIf
				If XmlChildEx( oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC, '_DDIRREC') <> Nil
					cDirRec		:= oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC:_DDIRREC:TEXT 
				EndIf
				If XmlChildEx( oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC, '_DNUMCASREC') <> Nil
					cDirRec		+= " " + STR0054 + " " + oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC:_DNUMCASREC:TEXT
				EndIf
				If XmlChildEx( oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC, '_DTELREC') <> Nil
					cTelRec		:= oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC:_DTELREC:TEXT//dTelRec
				EndIf
				If XmlChildEx( oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC, '_DEMAILREC') <> Nil
					cCorreoR	:= oXml:_RDE:_DE:_GDATGRALOPE:_GDATREC:_DEMAILREC:TEXT //dEmailRec
				EndIf
			EndIf
		EndIf
		If XmlChildEx( oXml:_RDE:_DE, '_GTIMB') <> Nil
			If XmlChildEx( oXml:_RDE:_DE:_GTIMB, '_DNUMTIM') <> Nil
				cTimbrado	:= oXml:_RDE:_DE:_GTIMB:_DNUMTIM:TEXT
			EndIf
			If XmlChildEx( oXml:_RDE:_DE:_GTIMB, '_DFEINIT') <> Nil
				cFecTim		:= oXml:_RDE:_DE:_GTIMB:_DFEINIT:TEXT
			EndIf
			If XmlChildEx( oXml:_RDE:_DE:_GTIMB, '_DEST') <> Nil
				cNumDoc		:= oXml:_RDE:_DE:_GTIMB:_DEST:TEXT
			EndIf
			If XmlChildEx( oXml:_RDE:_DE:_GTIMB, '_DPUNEXP') <> Nil  
				cNumDoc		+= "-" + oXml:_RDE:_DE:_GTIMB:_DPUNEXP:TEXT
			EndIf  
			If XmlChildEx( oXml:_RDE:_DE:_GTIMB, '_DNUMDOC') <> Nil
				cNumDoc		+= "-" + oXml:_RDE:_DE:_GTIMB:_DNUMDOC:TEXT
			EndIf
		EndIf
		If XmlChildEx( oXml:_RDE:_DE, '_GDTIPDE') <> Nil
			If XmlChildEx( oXml:_RDE:_DE:_GDTIPDE, '_GCAMCOND') <> Nil
				If XmlChildEx( oXml:_RDE:_DE:_GDTIPDE:_GCAMCOND, '_DDCONDOPE') <> Nil
					cCondVnt	:= oXml:_RDE:_DE:_GDTIPDE:_GCAMCOND:_DDCONDOPE:TEXT
				EndIf
				If XmlChildEx( oXml:_RDE:_DE:_GDTIPDE:_GCAMCOND, '_GPAGCRED') <> Nil
					If XmlChildEx( oXml:_RDE:_DE:_GDTIPDE:_GCAMCOND:_GPAGCRED, '_DCUOTAS') <> Nil
						cCoutas		:= oXml:_RDE:_DE:_GDTIPDE:_GCAMCOND:_GPAGCRED:_DCUOTAS:TEXT
					EndIf
				EndIf
			EndIf
			
			If XmlChildEx( oXml:_RDE:_DE:_GDTIPDE, '_GCAMNCDE') <> Nil
				If XmlChildEx( oXml:_RDE:_DE:_GDTIPDE:_GCAMNCDE, '_DDESMOTEMI') <> Nil
					cMotTr := oXml:_RDE:_DE:_GDTIPDE:_GCAMNCDE:_DDESMOTEMI:TEXT
				EndIf
			EndIf
		EndIf
	EndIf


	cFileLogo := U_uCargaLog()

	nLinea := 15
	
	oPrinter:Box( nLinea, nML, nLinea+15, 575, "-4")
	
	oPrinter:SayAlign(nLinea + 1,190,cLetFac,oFont5,160,5,CLR_BLACK, 2, 2 )
	
	
	nLinea += 15
	nIniBox:= U_ucalLi(cDir,51)
	nIniBox+= U_ucalLi(cCorreo,40)
	nInibox+=U_ucalLi(cActEc,66)
	IF nIniBox >3 //no se cuentan esas 3 lineas por que no dal un salto
		nIniBox:=nIniBox-3
	ENDIF
	oPrinter:Box( nLinea, nML, nLinea+130+(nIniBox*10), 575, "-4")
	
	nLinea += 10
	If File(cFilelogo)
		oPrinter:SayBitmap(nLinea,nMLText,cFileLogo,100,50) // Impresion de logotipo
	EndIf
	
	nLinea += 10
	oPrinter:Say(nLinea,nMRText,STR0006  + cRUC,oFont3) //"RUC: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMRText,STR0007 +  cTimbrado,oFont3) //"Timbrado No: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMRText,STR0008 + cFecTim,oFont3) //"Fecha de Inicio de Vigencia: "
	
	nLinea += 30
	oPrinter:Say(nLinea,nMLText,cNomEm,oFont5) //Nombre  generado en ambiente de prueba - sin valor comercial ni fiscal
	
	nLinea += 3
	U_uLeyendas(cDir,51,@nLinea,nMLText,oPrinter,10,oFont8) 

	//nLinea += 1
	U_uLeyendas(STR0010+cCiudad,51,@nLinea,nMLText,oPrinter,10,oFont8) 
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0011 + cTel,oFont8) //"Teléfono: "
	
	oPrinter:Say(nLinea,nMRText,cTipFact,oFont6) //Tipo de documento
	
	nLinea += 10
	
	cResto:=SubStr(cCorreo,1,40)
	oPrinter:Say(nLinea,nMLText,cResto,oFont8)
	cResto:=SubStr(cCorreo,41,len(cCorreo))
	U_uLeyendas(cResto,40,@nLinea,nMLText,oPrinter,12,oFont8) 
	
	oPrinter:Say(nLinea,nMRText,cNumDoc,oFont7) //Número de documento
	
	nLinea += 10
	
	cResto:=SubStr(STR0012 + cActEc,1,50)
	oPrinter:Say(nLinea,nMLText,cResto,oFont8)
	cResto:=SubStr(STR0012 + cActEc,51,len(STR0012 + cActEc))
	U_uLeyendas(cResto,50,@nLinea,nMLText,oPrinter,10,oFont8) 
	
	If lNoRem
		nLinea += 10
		nFinBox:=nIniBox+1 // para que no se encime el cuadro previo
		nIniBox:= U_ucalLi(cNomRec,50)// verificando lineas que van a consumir razon social
		nIniBox+=U_ucalLi(cDirRec,50)
		nIniBox+=U_ucalLi(cTipoTr,40)
		nIniBox+=U_ucalLi(cCorreoR,40)
		nIniBox+=U_ucalLi(cTelRec,50)
		
		
		oPrinter:Box( nLinea+nFinBox, nML, nLinea+80+(nIniBox*10), 575, "-4")
		
		
		nLinea += 10+nFinBox
		oPrinter:Say(nLinea,nMLText,STR0013 + cFecEmis,oFont8) //"Fecha y hora de emisión: "
		
		oPrinter:Say(nLinea,nMRText,STR0024,oFont8) //"RUC/Documento de Identidad No: "
		cResto:=SubStr(cRUCRec,1,25)
		oPrinter:Say(nLinea,nMRText+131,cResto,oFont3)
		cResto:=SubStr(cRUCRec,26,len(cRUCRec))
		U_uLeyendas(cResto,50,@nLinea,nMRText,oPrinter,12,oFont3) 
		
		nLinea += 10
		oPrinter:Say(nLinea,nMLText,STR0014 + cCondVnt,oFont8) //"Condición de venta: "
		
			
		oPrinter:Say(nLinea,nMRText,STR0025,oFont8) //"Nombre o Razón Social: "
		cResto:=SubStr(cNomRec,1,30)
		oPrinter:Say(nLinea,nMRText+86,cResto,oFont3)
		cResto:=SubStr(cNomRec,31,len(cNomRec))
		U_uLeyendas(cResto,50,@nLinea,nMRText,oPrinter,12,oFont3) 
		
		nLinea += 10
		oPrinter:Say(nLinea,nMLText,STR0017 + cCoutas,oFont8) //"Coutas: "
		
		oPrinter:Say(nLinea,nMRText,STR0026,oFont8) //"Dirección: "
		cResto:=SubStr(cDirRec,1,40)
		oPrinter:Say(nLinea,nMRText +40,cResto,oFont3)
		cResto:=SubStr(cDirRec,41,len(cDirRec))
		U_uLeyendas(cResto,50,@nLinea,nMRText,oPrinter,10,oFont3) 
		
		nLinea += 10
		oPrinter:Say(nLinea,nMLText,STR0018 + cMoneda,oFont8) //"Moneda: "
		oPrinter:Say(nLinea,nMLText+75,STR0019 + cTipoCam,oFont8) //"Tipo de Cambio: "
		
		oPrinter:Say(nLinea,nMRText,STR0011,oFont8) //"Teléfono: "
	
		cResto:=SubStr(cTelRec,1,45)
		oPrinter:Say(nLinea,nMRText +40,cResto,oFont3)
		cResto:=SubStr(cTelRec,46,len(cTelRec))
		U_uLeyendas(cResto,50,@nLinea,nMRText,oPrinter,10,oFont3)
		
		nLinea += 10
		oPrinter:Say(nLinea,nMLText,STR0020,oFont8) //"Tipo de cambio global o por item"
		
		oPrinter:Say(nLinea,nMRText,STR0027,oFont8) //"Correo Eléctronico: "
		cResto:=SubStr(cCorreoR,1,34)
		oPrinter:Say(nLinea,nMRText +69,cResto,oFont3)
		cResto:=SubStr(cCorreoR,35,len(cCorreoR))
		U_uLeyendas(cResto,40,@nLinea,nMRText,oPrinter,10,oFont3)

		nLinea += 10
		oPrinter:Say(nLinea,nMLText,STR0021,oFont8) //"Documento asociado CDC o preimpreso"
		
		oPrinter:Say(nLinea,nMRText,STR0028,oFont8) //"Tipo de transacción: "
		cResto:=SubStr(cTipoTr,1,35)
		oPrinter:Say(nLinea,nMRText +72,cResto,oFont3)
		cResto:=SubStr(cTipoTr,36,len(cTipoTr))
		U_uLeyendas(cResto,40,@nLinea,nMRText,oPrinter,10,oFont3)

		nLinea += 10
		oPrinter:Say(nLinea,nMLText,STR0022 + STR0023,oFont8) //"Tipo de documento asociado: " "FE o preimpreso"
		
		If !Empty(cMotTr)
			oPrinter:Say(nLinea,nMRText,STR0057,oFont8) //"Motivo de la emisión: "
			oPrinter:Say(nLinea,nMRText+75,cMotTr,oFont3) //
		EndIf
	Else
		nLinea += 15
		
		nIniBox:= U_ucalLi(cNomRec,60)
		nIniBox+= U_ucalLi(cRUCRec,50)


		oPrinter:Box( nLinea, nML, nLinea+50+nIniBox, 575, "-4")
		
		nLinea += 10
		oPrinter:Say(nLinea,nMLText,STR0013 + cFecEmis,oFont8) //"Fecha y hora de emisión: "
		
		nLinea += 10
		oPrinter:Say(nLinea,200,STR0058,oFont6) //"DESTINATARIO DE LA MERCADERÍA"
		
		nLinea += 10
		oPrinter:Say(nLinea,nMLText,STR0025,oFont8) //"Nombre o Razón Social: "
	
		cResto:=SubStr(cNomRec,1,20)
		oPrinter:Say(nLinea,nMLText +86,cResto,oFont3)
		cResto:=SubStr(cNomRec,21,len(cNomRec))
		U_uLeyendas(cResto,60,@nLinea,nMLText,oPrinter,10,oFont3)
		
		oPrinter:Say(nLinea,nMRText,STR0024,oFont8) //"RUC/Documento de Identidad No: "
		
		cResto:=SubStr(cRUCRec,1,25)
		oPrinter:Say(nLinea,nMRText+131,cResto,oFont3)
		cResto:=SubStr(cRUCRec,26,len(cRUCRec))
		U_uLeyendas(cResto,50,@nLinea,nMRText,oPrinter,12,oFont3) 
		
	
	EndIf
	
Return Nil

/*/{Protheus.doc} uDetFact
Imprimir detalle de reporte de factura a partir de XML
@author TOTVS
@version 1.0
@param oPrinter, objeto, objeto creado por FWMSPrinter.
@param oXml, Objeto con estructura de archivo XML.
@return N/A
/*/
User Function uDetFact(oPrinter,oXML,nIndice,nHoj)
Local nMLText	:= 25
Local nLinea1 	:= 73
Local nLinea2	:= 198
Local nLinea3	:= 243
Local nLinea4	:= 283
Local nLinea5	:= 343
Local nLinea6	:= 393
Local nLinea7	:= 454 
Local nLinea8	:= 515
Local nInicio	:= 0
Local nInicio2	:= 0

Local oXmlItem	:= Nil
Local nI		:= 0
Local nIniFact:=0
Local nLimite:= 0

Local nUltima:=0
Local nAux:=0
Local nHojas:=nHoj
cPicture := IIF(MsDecimais(cXmlMoe)==0,"@E 99,999,999,999","@E 99,999,999,999.99")
	If XmlChildEx(oXml:_RDE, '_DE') <> Nil
		
		If XmlChildEx(oXml:_RDE:_DE, '_GDTIPDE') <> Nil
			oXmlItem := oXml:_RDE:_DE:_GDTIPDE:_GCAMITEM
		EndIf
	EndIf
	
	nLinea += 30
	nInicio	:= nLinea
	
	oPrinter:Line( nLinea, nML, nLinea, 575, CLR_BLACK, "-4") //Linea superior
	
	//Encabezados
	nLinea += 20
	oPrinter:Say( nLinea,nMLText	  ,STR0029,oFont3) //"Cod"
	oPrinter:Say( nLinea,nMLText + 50 ,STR0030,oFont3) //"Descripción"
	oPrinter:Say( nLinea,nMLText + 166,STR0031,oFont3) //"Unidad de"
	oPrinter:Say( nLinea,nMLText + 211,STR0032,oFont3) //"Cantidad"
	oPrinter:Say( nLinea,nMLText + 260,STR0033,oFont3) //"Precio Unitario"
	oPrinter:Say( nLinea,nMLText + 320,STR0034,oFont3) //"Descuento"
	oPrinter:Say( nLinea,nMLText + 425,STR0035,oFont3) //"Valor de Venta"
	nLinea += 10
	oPrinter:Say( nLinea,nMLText + 169,STR0055,oFont3) //"medida"
	oPrinter:Say( nLinea,nMLText + 383,STR0036,oFont3) //"Exentas"
	oPrinter:Say( nLinea,nMLText + 454,STR0037,oFont3) //"5%"
	oPrinter:Say( nLinea,nMLText + 512,STR0038,oFont3) //"10%"

	nLinea += 5
	nInicio2 := nLinea
	oPrinter:Line( nLinea, nML, nLinea, 575, CLR_BLACK, "-4") //Linea inferior
	
	nLinea += 5
	If ValType(oXmlItem) == "O"
		U_uImpItem(oPrinter, oXmlItem)
		nUltima:=1
		nLimite:=618
	ElseIf ValType(oXmlItem) == "A"
		IF nIndice==0
			nHojas:=U_utotHojas(oXmlItem,nLinea,79,682,618,25,10,6)
		ENDIF
		For nI := IIF(nIndice<>0,nIndice,1) To Len(oXmlItem)
			
			IF nI== Len(oXmlItem)
				nUltima:=1
				nLimite:=618
			ELSE
				nLimite:=682
			ENDIF

			nAux:=3+nLinea  // el 7 es la separación de linea ente peoductos
			nAux+=U_ucalLi(oXmlItem[nI]:_DDESPROSER:TEXT,25)*10// +(IIF(nI==1,))
	
			IF (nAux)< nLimite// verifico primero si el item no pasa el limite le sumo 200 porel pie de pagina
				U_uImpItem(oPrinter, oXmlItem[nI])
			ELSE
				nLinea:=nLimite
				nIniFact:=nI
				EXIT
			
			ENDIF
			
		Next nI
	EndIf
	
	//Lineas de división
	
	oPrinter:Line( nInicio, nML, nLinea, nML, CLR_BLACK, "-4")
	oPrinter:Line( nInicio, 575, nLinea, 575, CLR_BLACK, "-4")
	oPrinter:Line( nInicio, nLinea1-10, nLinea, nLinea1-10, CLR_BLACK, "-4")
	oPrinter:Line( nInicio, nLinea2-10, nLinea, nLinea2-10, CLR_BLACK, "-4")
	oPrinter:Line( nInicio, nLinea3-10, nLinea, nLinea3-10, CLR_BLACK, "-4")
	oPrinter:Line( nInicio, nLinea4, nLinea, nLinea4, CLR_BLACK, "-4")
	oPrinter:Line( nInicio, nLinea5, nLinea, nLinea5, CLR_BLACK, "-4")
	oPrinter:Line( nInicio, nLinea6, nLinea, nLinea6, CLR_BLACK, "-4")
	
	oPrinter:Line( nInicio2, nLinea7, nLinea, nLinea7, CLR_BLACK, "-4")
	oPrinter:Line( nInicio2, nLinea8, nLinea, nLinea8, CLR_BLACK, "-4") 
	
	IF (nUltima ==  1)
		IF (nAux)< nLimite
			nLinea+=2
			oPrinter:Line( nLinea+1, nML, nLinea, 575, CLR_BLACK, "-4") 
			U_utotales(oPrinter,oXml)
		ENDIF
	ENDIF
	U_uImpPie(oPrinter,oXML)
	oPrinter:Say( 820,275,CVALTOCHAR((nPag+=1))+"/"+CVALTOCHAR(nHojas),oFont3) //
	IF nIniFact<>0

		U_usigPag(oPrinter,oXML)
		U_uDetFact(oPrinter,oXML,nIniFact,nHojas)

	ENDIF

Return Nil

/*/{Protheus.doc} uImpItem
Impresión de datos de items
@author TOTVS
@version 1.0
@param oPrinter, objeto, objeto creado por FWMSPrinter.
@param oItem, objeto, objeto con información del item
/*/
User Function uImpItem(oPrinter, oItem)
	Local cCodPro	:= ""
	Local cDescr	:= ""
	Local cUniMed	:= ""
	Local cCant		:= ""
	Local cPreUni	:= ""
	Local cDesc		:= ""
	Local cValVent	:= ""
	Local cTasaIVA	:= ""

	Local nCod 		:= 25
	Local nDescr 	:= 65
	Local nUniMed	:= 203
	Local nLinPro:=0
	Local aNum:={}
	Local nLinAux1:=0

	Local nLinCod:=0
	Local nLinCant:=0
	Local nLinFinCod:=0
	Local nLinFinPre:=0
	Local nLinFinDes:=0
	Local nLinFinIVA:=0
	


	cCodPro 	:= oItem:_DCODINT:TEXT
	cDescr		:= oItem:_DDESPROSER:TEXT
	cUniMed		:= oItem:_DDESUNIMED:TEXT
	cCant		:= U_uMoneda(  oItem:_DCANTPROSER:TEXT,cXmlMoe,.F.,nTamCant)

	cCant		:=	ALLTRIM(Transform(VAL(cCant),"@E 99,999,999,999.99"))//es el unico elemento que se deja en decimales cuando es guaranies

	cPreUni		:= U_uMoneda( oItem:_GVALORITEM:_DPUNIPROSER:TEXT,cXmlMoe,.T.)

	cPreUni		:=	ALLTRIM(Transform(VAL(cPreUni),cPicture))
	cDesc		:= U_uMoneda( oItem:_GVALORITEM:_GVALORRESTAITEM:_DDESCITEM:TEXT,cXmlMoe,.T.)
	
	cDesc		:=	ALLTRIM(Transform(VAL(cDesc),cPicture))

	cValVent	:= U_uMoneda(oItem:_GVALORITEM:_GVALORRESTAITEM:_DTOTOPEITEM:TEXT,cXmlMoe,.T.)
	
	cValVent	:=	ALLTRIM(Transform(VAL(cValVent),cPicture))
	cTasaIVA	:= oItem:_GCAMIVA:_DTASAIVA:TEXT

	nLinAux1:=nLinea+10
	nLinFinCod:=nLinAux1

	nLinCod:=U_uLeyendas(cCodPro,10,@nLinFinCod-10,nCod,oPrinter,10,oFont9,.T.)
	nLinFinCod+=(nLinCod*10)// la división del código es la más pequeña necesita sumarle 10 a cada línea en caso de tener más líneas
	U_uLeyendas(cDescr,29,@nLinea,nDescr,oPrinter,10,oFont9)

	oPrinter:Say( nLinAux1,nUniMed,cUniMed,oFont9) //Unidad de medida
	nLinCant:= nLinAux1+2
	nLinPro:=U_uLeyendas( cCant,16,@nLinCant-10,(252-(U_ulonVisu(cCant))),oPrinter,8,oFont9,.T.,.T.)
	nLinCant+=(nLinPro*5)
	
	nLinFinPre:= nLinAux1+2
	nLinPro:=U_uLeyendas( cPreUni,25,@nLinFinPre-10,(310-(U_ulonVisu(cPreUni))),oPrinter,8,oFont9,.T.,.T.)
	nLinFinPre+=(nLinPro*5)


	nLinFinDes:= nLinAux1+2
	nLinPro:=U_uLeyendas( cDesc,12,@nLinFinDes-10,(368-(U_ulonVisu(cDesc))),oPrinter,8,oFont9,.T.,.T.)
	nLinFinDes+=(nLinPro*5)


	If Val(cTasaIVA) == 0
		nLinFinIVA:= nLinAux1+2
		nLinPro:=U_uLeyendas( cValVent,25,@nLinFinIVA-10,(418-(U_ulonVisu(cValVent))),oPrinter,8,oFont9,.T.,.T.)
		nLinFinIVA+=(nLinPro*5)
	ElseIf Val(cTasaIVA) == 5
		nLinFinIVA:= nLinAux1+2
		nLinPro:=U_uLeyendas( cValVent,25,@nLinFinIVA-10,(478-(U_ulonVisu(cValVent))),oPrinter,8,oFont9,.T.,.T.)
		nLinFinIVA+=(nLinPro*5)

	ElseIf Val(cTasaIVA) == 10
		
		nLinFinIVA:= nLinAux1+2
		nLinPro:=U_uLeyendas( cValVent,25,@nLinFinIVA-10,(538-(U_ulonVisu(cValVent))),oPrinter,8,oFont9,.T.,.T.)
		nLinFinIVA+=(nLinPro*5)

	EndIf
	
	
	aNum:={nLinFinCod,nLinea,nLinCant,nLinFinPre,nLinFinIVA}
	aNum:=ASORT(aNum,,, { |x, y| x > y } )  //saltos(aNum) // se verifica la cantidad mayor en base a esto se hace el salto para el inicio del sig, item
	nLinea:=aNum[1]+4 

Return Nil

/*/{Protheus.doc} uDetRem
Imprimir detalle de reporte de remitos
@author TOTVS
@version 1.0
@param oPrinter, objeto, objeto creado por FWMSPrinter.
@param oXml, Objeto con estructura de archivo XML.
@return N/A
/*/
User Function uDetRem(oPrinter,oXML)
Local nMLText	:= 25
Local nMRText	:= 340

Local oXmlItem	:= Nil
//Datos del traslado
Local cRespEm	:= ""
Local cFecInT	:= ""
Local cFecFnT	:= ""
Local cDirPtoP	:= ""
Local cCiuPtoP	:= ""
Local cDepPtoP	:= ""
Local cKmEst	:= ""
Local cNoCasS	:= ""
Local cNoCasE	:= ""
//Datos del vehiculo del transporte
Local cTipTrans	:= ""
Local cModTrans	:= ""
Local cRespCosF	:= ""
Local cCondNeg	:= ""
Local cMarcaV	:= ""
Local cNoIdVe	:= ""
Local cNoMatVe	:= ""
Local cTipoVe	:= ""
//Datos del conductor del vehiculo
Local cNatTran	:= ""
Local cNomTran	:= ""
Local cNumDocCh	:= ""
Local cNomCh	:= ""
Local cNomAgen	:= ""
Local cDocId	:= ""
Local cDir		:= ""
Local cKM		:= ""
	If XmlChildEx(oXml:_RDE, '_DE') <> Nil
		If XmlChildEx(oXml:_RDE:_DE, '_GDTIPDE') <> Nil
		
			If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE, '_GTRANSP') <> Nil
				If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP, '_DINITRAS') <> Nil
					cFecInT := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_DINITRAS:TEXT
				EndIf
				
				If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP, '_DFINTRAS') <> Nil
					cFecFnT := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_DFINTRAS:TEXT
				EndIf
				
				If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP, '_DKMR') <> Nil
					cKmEst := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_DKMR:TEXT
				EndIf
				
				If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP, '_GCAMSAL') <> Nil
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMSAL, '_DDIRLOCSAL') <> Nil
						cDirPtoP := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMSAL:_DDIRLOCSAL:TEXT
					EndIf
					
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMSAL, '_DDESCIUSAL') <> Nil
						cCiuPtoP := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMSAL:_DDESCIUSAL:TEXT
					EndIf
					
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMSAL, '_DDESDEPSAL') <> Nil
						cDepPtoP := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMSAL:_DDESDEPSAL:TEXT
					EndIf
					
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMSAL, '_DNUMCASSAL') <> Nil
						cNoCasS := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMSAL:_DNUMCASSAL:TEXT
					EndIf
				EndIf
				
				If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP, '_GCAMENT') <> Nil
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMENT, '_DNUMCASENT') <> Nil
						cNoCasE := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMENT:_DNUMCASENT:TEXT
					EndIf
				EndIf
				
				If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP, '_ITIPTRANS') <> Nil
					cTipTrans := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_ITIPTRANS:TEXT
				EndIf
				
				If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP, '_DDESMODTRANS') <> Nil
					cModTrans := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_DDESMODTRANS:TEXT
				EndIf
				
				If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP, '_IRESPFLETE') <> Nil
					cRespCosF := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_IRESPFLETE:TEXT
					cRespCosF := AllTrim(ObtColSAT("S027", cRespCosF, 1, 1, 2, 55))
				EndIf
				
				If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP, '_CCONDNEG') <> Nil
					cCondNeg := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_CCONDNEG:TEXT
					cCondNeg := AllTrim(ObtColSAT("S010", cCondNeg, 1, 3, 4, 33))
				EndIf
				
				If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP, '_GVEHTRAS') <> Nil
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GVEHTRAS, '_DMARVEH') <> Nil
						cMarcaV := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GVEHTRAS:_DMARVEH:TEXT
					EndIf
					
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GVEHTRAS, '_DNROIDVEH') <> Nil
						cNoIdVe := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GVEHTRAS:_DNROIDVEH:TEXT
					EndIf
					
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GVEHTRAS, '_DNROMATVEH') <> Nil
						cNoMatVe := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GVEHTRAS:_DNROMATVEH:TEXT
					EndIf
					
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GVEHTRAS, '_DTIVEHTRAS') <> Nil
						cTipoVe := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GVEHTRAS:_DTIVEHTRAS:TEXT
					EndIf
				EndIf
				
				If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP, '_GCAMTRANS') <> Nil
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS, '_INATTRANS') <> Nil
						cNatTran := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS:_INATTRANS:TEXT
						
						If cNatTran == "1"
							cNatTran := STR0087
						ElseIf cNatTran == "2"
							cNatTran := STR0088
						Else
							cNatTran := ""
						EndIf                                                                                             
					EndIf
					
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS, '_DNOMTRANS') <> Nil
						cNomTran := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS:_DNOMTRANS:TEXT
					EndIf
					
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS, '_DNUMIDCHOF') <> Nil
						cNumDocCh := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS:_DNUMIDCHOF:TEXT
					EndIf
					
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS, '_DNOMCHOF') <> Nil
						cNomCh := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS:_DNOMCHOF:TEXT
					EndIf
					
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS, '_DNOMBAG') <> Nil
						cNomAgen := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS:_DNOMBAG:TEXT
					EndIf
					
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS, '_DRUCAG') <> Nil
						cDocId := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS:_DRUCAG:TEXT
					EndIf
					
					If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS, '_DDOMFISC') <> Nil
						cDir := oXml:_RDE:_DE:_GDTIPDE:_GTRANSP:_GCAMTRANS:_DDOMFISC:TEXT
					EndIf
					
				EndIf
				
			EndIf
			
			If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE, '_GCAMNRE') <> Nil
				If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE:_GCAMNRE, '_DDESRESPEMINR') <> Nil
					cRespEm := oXml:_RDE:_DE:_GDTIPDE:_GCAMNRE:_DDESRESPEMINR:TEXT
					cKM := oXml:_RDE:_DE:_GDTIPDE:_GCAMNRE:_DKMR:TEXT
				EndIf
			EndIf
			
			If XmlChildEx(oXml:_RDE:_DE:_GDTIPDE, '_GCAMITEM') <> Nil
				oXmlItem := oXml:_RDE:_DE:_GDTIPDE:_GCAMITEM
			EndIf
		EndIf
	EndIf

	nLinea += 10
	oPrinter:Box( nLinea, nML, nLinea+105, 575, "-4")
	
	nLinea += 15
	oPrinter:Say(nLinea,230,STR0059,oFont6) //"DATOS DEL TRASLADO"
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0060 + cRespEm,oFont8) //"Responsable de la emisión: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0061 + cFecInT,oFont8) //"Fecha estimada de inicio del traslado: "
	oPrinter:Say(nLinea,nMRText,STR0062 + cFecFnT,oFont8) //"Fecha estimada de fin de traslado: "
	
	nLinea += 10
	//oPrinter:Say(nLinea,nMLText,STR0063 + cDirPtoP,oFont8) //"Dirección del Punto de Partida: "
	cResto:=SubStr(STR0063 + cDirPtoP,1,100)
	oPrinter:Say(nLinea,nMLText,cResto,oFont8)
	cResto:=SubStr(cDirPtoP,101,len(cDirPtoP))
	U_uLeyendas(cResto,100,@nLinea,nMLText,oPrinter,10,oFont8)
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0064 + cCiuPtoP,oFont8) //"Ciudad del punto de partida: "
	oPrinter:Say(nLinea,nMRText,STR0065 + cDepPtoP,oFont8) //"Departamento del punto de partida: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0066 + cKmEst,oFont8) //"Kilómetros estimados de recorrido: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0067 + cNoCasS,oFont8) //"N° de casa de salida: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0068 + cNoCasE,oFont8) //"N° de casa de la entrega: "
	
	nLinea += 13
	oPrinter:Box( nLinea, nML, nLinea+138, 575, "-4")
	
	nLinea += 13
	oPrinter:Say(nLinea,200,STR0069,oFont6) //"DATOS DEL VEHICULO DEL TRANSPORTE"
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0070 + cTipTrans,oFont8) //"Tipo de transporte: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0071 + cModTrans,oFont8) //"Modalidad del transporte: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0072 + cRespCosF,oFont8) //"Responsable del costo del flete: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0073 + cCondNeg,oFont8) //"Condición de la negociación: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0061 + cFecInT,oFont8) //"Fecha estimada de inicio del traslado: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0062 + cFecFnT,oFont8) //"Fecha estimada de fin de traslado: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0074 + cMarcaV,oFont8) //"Marca del vehículo: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0075 + cNoIdVe,oFont8) //"N° de identificación del vehículo: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0076 + cNoMatVe,oFont8) //"N° de matrícula (chapa) del vehículo: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0077 + cTipoVe,oFont8) //"Tipo de vehículo: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,"Distancia Recorrida" + cKM,oFont8) //"Dist.
	
	nLinea += 10
	oPrinter:Box( nLinea, nML, nLinea+103, 575, "-4")
	nLinea += 15
	oPrinter:Say(nLinea,200,STR0078,oFont6) //"DATOS DEL VEHICULO DEL TRANSPORTE"
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0079 + cNatTran,oFont8) //"Naturaleza del transportista: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0080 + cNomTran,oFont8) //"Nombre o razón social del transportista: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0081 + cNumDocCh,oFont8) //"Número de documento de indentidad del chofer: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0082 + cNomCh,oFont8) //"Nombre y apellido del chofer: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0083 + cNomAgen,oFont8) //"Nombre o razón social del agente: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0024 + cDocId,oFont8) //"RUC/Documento de Identidad No: "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText,STR0026 + cDir,oFont8) //"Dirección: "
	
	nLinea += 5
	U_uProdRem(oPrinter,oXmlItem,0,oXml,cDir,1)

	
Return Nil

/*/{Protheus.doc} U_uImItemR
Impresión de datos de items
@author TOTVS
@version 1.0
@param oPrinter, objeto, objeto creado por FWMSPrinter.
@param oItem, objeto, objeto con información del item
/*/

User Function uImItemR(oPrinter, oItem)
Local cDescr	:= ""
Local cUniMed	:= ""
Local cCant		:= ""

Local nCant		:= 35
Local nUniMed	:= 95
Local nDescr 	:= 215
Local nLinPro	:=0
Local nLinAux	:=0

	cCant		:= oItem:_DCANTPROSER:TEXT
	cUniMed		:= oItem:_DDESUNIMED:TEXT
	cDescr		:= oItem:_DDESPROSER:TEXT
	
	nLinea += 5
	
	

	nLinPro:=U_uLeyendas(cDescr,80,@nLinea,nDescr,oPrinter,9,oFont9)
	nLinAux:=nLinea //respaldando valor del eje "y" afectado por la leyenda de producto

	IF nLinPro >1 // se modifica el valor del eje "y" para que lo tomen los items de forma centrada
		nLinea:= nLinea-(10*(nLinPro/2))
	ENDIF

	oPrinter:Say( nLinea,nCant	,PADL(cCant,4)	,oFont9) //Cantidad
	oPrinter:Say( nLinea,nUniMed,cUniMed,oFont9) //Unidad de medida
	
	nLinea:= nLinAux;


Return Nil

/*/{Protheus.doc} uImpPie
Imprimir pie de reporte de factura a partir de XML
@author TOTVS
@version 1.0
@param oPrinter, objeto, objeto creado por FWMSPrinter.
@param oXml, Objeto con estructura de archivo XML.
@return N/A
/*/
User Function uImpPie(oPrinter,oXml)
	Local nMLText	:= 25
	Local nMRText	:= 85
	Local cTextQR	:= ""

	If XmlChildEx( oXml:_RDE, '_GCAMFUFD') <> Nil
		cTextQR	:= oXml:_RDE:_GCAMFUFD:_DCARQR:TEXT //dEmailRec
	EndIf
	
	//nLinea += 5
	oPrinter:Box( nLinea, nML, nLinea+130, 575, "-4")
	
	nLinea += 15
	oPrinter:QRCode(nLinea+115,nMLText-4,cTextQR, 130)
	
	nLinea += 5
	oPrinter:Say(nLinea,nMRText+65,cLetPie,oFont7) //
	
	nLinea += 15
	oPrinter:Say(nLinea,nMRText+65,STR0045,oFont7) //"https://ekuatia.set.gov.py/consultas/"

	If XmlChildEx(oXml:_RDE, '_DE') <> Nil
		oPrinter:Say(nLinea+30,nMRText+65,"CDC:"+Upper(oXml:_RDE:_DE:_ID:TEXT),oFont7)
	ENDIF
	
	nLinea += 50
	oPrinter:Say(nLinea,nMLText+125,STR0047,oFont7) //"ESTE DOCUMENTO ES UNA REPRESENTACIÓN GRAFICA DE UN DOCUMENTO ELECTRÓNICO (XML)"
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText+125,STR0048,oFont3) //"Información de interés del facurador electrónico emisor."
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText+125,STR0049,oFont3) //"Si su documento electrónico presenta algún error, podrá solicitar la modificación dentro de las "
	
	nLinea += 10
	oPrinter:Say(nLinea,nMLText+125,STR0050,oFont3) //"72 horas siguientes de la emisión de este comprobante."
	
Return Nil

/*/{Protheus.doc} U_uSaltoPag
Genera salto de página en reporte
@author TOTVS
@version 1.0
@param oPrinter, objeto, objeto creado por FWMSPrinter.
/*/
User Function uSaltoPag(oPrinter)

	oPrinter:Line(nLinea,nML,nLinea,575,,"-4")

	oPrinter:EndPage()
	oPrinter:StartPage()

Return Nil

/*/{Protheus.doc} U_uCargaLog
Carga logo de la empresa
@author TOTVS
@version 1.0
@return cLogo .- Retorna url de ubicación de logo de empresa.
/*/
User Function uCargaLog()
	Local  cStartPath:= GetSrvProfString("Startpath","")
	//-- Logotipo da Empresa
	cLogo := cStartPath + "lgrl"+ALLTRIM(SM0->M0_CODIGO)+ALLTRIM(SM0->M0_CODFIL)+".BMP" // Empresa+Filial

	If !File( cLogo )
		cLogo := cStartPath + "lgrl"+ALLTRIM(SM0->M0_CODIGO)+".BMP" 
	ENDIF
	If !File( cLogo )
		cLogo := cStartPath + "lgrl"+".BMP" 
	EndIf
Return cLogo

/*/{Protheus.doc uMoneda
    con esta funcion se formatea los decimales en la visualizacion 
    @author TOTVS
    @version 1.01
    @param cValor, carácter, valor al cual se le modifican los decimales
    @param cMoneda, carácter, indica el numero de moneda
    @param lMVCENT, booleano, si es “.T.” se agregan los decimales al valor informado dependiendo de la moneda 
							  y el valor regresado por MsDecimais
							 si es “.F.” solo se quitan los decimales o se agregan
							 los informados en nDecDef
	@param nDecDef, numerico, se pueden definir los decimales siempre y cuando este en .F. lMVCENT
    @return cValor, carácter, valor al cual se le formateo los decimales	
/*/
User Function uMoneda(cValor,cMoneda,lMVCENT,nDecDef)

Local nCentavos:=MsDecimais(cMoneda)
	
	If lMVCENT
		cValor:= CVALTOCHAR(NOROUND( VAL(cValor), nCentavos ))
	ELSE
		IF nDecDef<> nil .or. nDecDef>0
			cValor:= CVALTOCHAR(NOROUND( VAL(cValor), nDecDef ))
		ENDIF
	ENDIF
		
Return cValor

 /*/{Protheus.doc} U_uLeyendas
	Esta función se utiliza para dividir una texto en varias líneas de acuerdo a los parámetros
	y posteriormente imprimir el  texto dentro del pdf
	@author TOTVS
    @param cDescr,caracter, leyenda a tratar
    @param nMaxLin,numerico, tamaño máximo de la línea(tomando en cuenta que es horizontal eje x cuadrante I)
    @param nLinea, numerico, en donde empieza la línea (tomando en cuenta al eje y en el cuadrante IV)
	@param nDescr, numerico, punto de inicio en "x")
	@param oPrinter, objeto, objeto para acceder a las propiedades del pdf
	@param nNumSalto, numerico, tamaño del interlineado
	@param oFont, objeto, fuente
	@param lPrint, booleano, indica si imprime el texto
	@param lAltXSal, booleano, indica si se altera el eje Y en caso de que la cadena necesite quebrarse, se usa principalmente en cantidades numericas
	@return total de lines ocupadas por la leyenda
	/*/
User Function uLeyendas(cDescr,nMaxLin,nLinea,nDescr,oPrinter,nNumSalto,oFont,lPrint,lAltXSal)
	Local nTotLiDes:=0
	Local nResiduo:=0
	Local nLin:=0

	Local nTotCad:=0
	Local nTotAux:=0
	Local nMaxAux:=0
	Local nInicio:=1
	Local cAux:=""
	Local cDescAux:=""
	
	Default cDescr=""
	Default nMaxlin=0
	DEFAULT nLinea:=0
	DEFAULT nDescr:=0
	DEFAULT oPrinter:= NIL
	DEFAULT nNumsalto:=0
	DEFAULT oFont:= NIL
	DEFAULT lPrint:=.T.
	DEFAULT lAltXSal:=.F.


	IF !Empty(cDescr)
		nMaxLin-=1 //evito tocar margen cuando so puras mayusculas
		nTotCad:= U_ulonVisu(cDescr)
		//Descripción del producto: tratamiento para evitar que se salgan del tamñaño del campo descripcion
		nTotLiDes:= ROUND(( nTotCad/nMaxLin),0)//numero de lineas(linea completa tamaño nMaxLin) que caben en la descripcion
		nResiduo:=( nTotCad/nMaxLin)-nTotLiDes // por redondeos se necesita saber si hay una linea incompleta(linea completa de tamaño nMaxLin)

		For nLin := 1 To nTotLiDes
			cDescAux		:= SubStr(cDescr, nInicio, nMaxlin)

			nTotAux:= ROUND(U_ulonVisu(cDescAux),0)

			if nTotAux> 	nMaxLin
				nMaxAux:=nMaxLin-(nTotAux-nMaxlin)
				cDescAux		:= SubStr(cDescr,nInicio,nMaxAux)
				cAux+=cDescAux
				nInicio:=nInicio+nMaxAux

			else
				cDescAux		:= SubStr(cDescr,nInicio, nMaxLin)
				cAux+=cDescAux
				nInicio:=nInicio+nMaxLin
			ENDIF
				
			nLinea += nNumSalto
			
			IF lPrint
			oPrinter:Say( nLinea,nDescr +(iif(lAltXSal .and. nLin>1,nMaxLin-U_ulonVisu(cDescAux),0) )	,cDescAux,oFont)
			ENDIF

		NEXT nLin 

		If nResiduo>0 // linea que no cubre el tamaño de 25

			cDescAux		:= SubStr(cDescr, len(cAux)+1, len(cDescr))				
			nLinea += nNumSalto
			
			IF lPrint
				oPrinter:Say( nLinea,nDescr +(iif(lAltXSal .and. nLin>1,nMaxLin-U_ulonVisu(cDescAux),0) )	,cDescAux,oFont)
			ENDIF
			
		ENDIF
	ENDIF
Return (nTotLiDes+nResiduo)


/*/{Protheus.doc} 
	U_ucalLi función para indicar el numero de líneas  en las que se puede dividir
	@author TOTTVS
	@param cDescr, descripcion, leyenda a dividir en lineas
	@param nMaxLin,numerico, tamaño máximo de la línea(tomando en cuenta que es horizontal eje x cuadrante I)
	@return nTotLiDes, numerico, lineas que se crean al dividir las U_uLeyendas
	/*/
User Function ucalLi(cDescr,nMaxLin)
Local nTotLiDes:=0
Default cDescr=""
Default nMaxlin=""

	nTotLiDes:= Len(cDescr)/nMaxLin//numero de lineas(linea completa tamaño 25) que caben en la descripcion 
	
Return nTotLiDes

/*/{Protheus.doc} U_usigPag
	@crea una pagina siguiente
	@author TOTVS
	@parama oPrinter, objeto, objeto para acceder a las propiedades del pdf
	@parama oXML, objeto, objeto para acceder a las propiedades del xml
	@return nil
/*/
User Function usigPag(oPrinter,oXML)
nLinea:=9
oPrinter:EndPage()
oPrinter:StartPage()

Return nil

/*/{Protheus.doc} U_utotales
    @pinta la información referente a los totales y pie de pagina(QR)
	@author TOTVS
	@version version
	@parama oPrinter, objeto, objeto para acceder a las propiedades del pdf
	@parama oXML, objeto, objeto para acceder a las propiedades del xml
	@return nil
/*/
User Function utotales(oPrinter,oXml)
Local nMLText	:= 25
Local nFin		:= 0
Local cSubTotal	:= ""
Local cTotal	:= ""
Local cTotGua	:= ""
Local cIVA5		:= ""
Local cIVA10	:= ""
Local cTotIVA	:= ""
Local cAuxSubTot:=""
Local cAuxTot:=""
Local cAuToIva:=""
Local cAuxTGua	:= ""

cPicture := IIF(MsDecimais(cXmlMoe)==0,"@E 99,999,999,999","@E 99,999,999,999.99")
	If XmlChildEx(oXml:_RDE, '_DE') <> Nil
		If XmlChildEx(oXml:_RDE:_DE, '_GTOTSUB') <> Nil
			If XmlChildEx(oXml:_RDE:_DE:_GTOTSUB, '_DTOTGRALOPE') <> Nil
				cSubTotal	:= U_uMoneda(oXml:_RDE:_DE:_GTOTSUB:_DTOTGRALOPE:TEXT,cXmlMoe,.T.)
				cAuxSubTot:=cSubTotal
				cSubTotal:=ALLTRIM(Transform(VAL(cSubTotal),cPicture))
			EndIf
			If XmlChildEx(oXml:_RDE:_DE:_GTOTSUB, '_DTOTGRALOPE') <> Nil
				cTotal		:=U_uMoneda(oXml:_RDE:_DE:_GTOTSUB:_DTOTGRALOPE:TEXT,cXmlMoe,.T.) 
				cAuxTot:=cTotal
				cTotal:=ALLTRIM(Transform(VAL(cTotal),cPicture))
			EndIf
			If XmlChildEx(oXml:_RDE:_DE:_GTOTSUB, '_DTOTGRALOPE') <> Nil
				cTotGua		:= U_uMoneda(oXml:_RDE:_DE:_GTOTSUB:_DTOTGRALOPE:TEXT,cXmlMoe,.T.) 
				cAuxTGua:=cTotGua
				cTotGua:=ALLTRIM(Transform(VAL(cTotGua),cPicture))
			EndIf
			If XmlChildEx(oXml:_RDE:_DE:_GTOTSUB, '_DIVA5') <> Nil
				cIVA5		:= U_uMoneda(oXml:_RDE:_DE:_GTOTSUB:_DIVA5:TEXT,cXmlMoe,.T.) 
				cIVA5:=ALLTRIM(Transform(VAL(cIVA5),cPicture))
			EndIf
			If XmlChildEx(oXml:_RDE:_DE:_GTOTSUB, '_DIVA10') <> Nil
				cIVA10		:= U_uMoneda(oXml:_RDE:_DE:_GTOTSUB:_DIVA10:TEXT,cXmlMoe,.T.) 
				cIVA10:=ALLTRIM(Transform(VAL(cIVA10),cPicture))
			EndIf
			If XmlChildEx(oXml:_RDE:_DE:_GTOTSUB, '_DTOTIVA') <> Nil
				cTotIVA		:= U_uMoneda(oXml:_RDE:_DE:_GTOTSUB:_DTOTIVA:TEXT,cXmlMoe,.T.) 
				cAuToIva:=	cTotIVA
				cTotIVA:=ALLTRIM(Transform(VAL(cTotIVA),cPicture))
			EndIf
		EndIf
		/*If XmlChildEx(oXml:_RDE:_DE, '_GDTIPDE') <> Nil
			oXmlItem := oXml:_RDE:_DE:_GDTIPDE:_GCAMITEM
		EndIf */
	EndIf
		//Lineas de división

	
	//SUBTOTAL
	oPrinter:Box( nLinea	, nML, nLinea+20, 575, "-4")
	oPrinter:Say( nLinea +10,nMLText,STR0039,oFont3)
	U_uinvetCad(cSubTotal,nLinea +10,570	,.T.,oFont3,oPrinter)
	//TOTAL DE LA OPERACION
	nLinea += 15
	oPrinter:Box( nLinea	, nML, nLinea+20, 575, "-4")
	oPrinter:Say( nLinea +10,nMLText,STR0040,oFont3) 
	
	U_uinvetCad(cTotal,nLinea +10,570	,.T.,oFont3,oPrinter)
	//TOTAL EN GUARANIES
	nLinea += 15
	oPrinter:Box( nLinea	, nML, nLinea+20, 575, "-4")
	oPrinter:Say( nLinea +10,nMLText,STR0041,oFont3)
	If cXmlMoe==1
		U_uinvetCad(cTotGua,nLinea +10,570	,.T.,oFont3,oPrinter)
	ELSE
		U_uinvetCad(ALLTRIM(Transform(ROUND((VAL(cAuxTGua)*VAL(oXml:_RDE:_DE:_GDATGRALOPE:_GOPECOM:_DTICAM:TEXT)),MsDecimais(1) ),cPicture)),nLinea +10,570	,.T.,oFont3,oPrinter)
	ENDIF
	
	//LIQUIDACION IVA
	nLinea += 15
	oPrinter:Box( nLinea	, nML, nLinea+20, 575, "-4")
	oPrinter:Say( nLinea +10,nMLText,STR0042,oFont3)
	
	oPrinter:Say( nLinea +10,165,"(" + STR0037 + ")",oFont3) //(5%)
	oPrinter:Say( nLinea +10,200,PADL(cIVA5,16),oFont3)
	
	oPrinter:Say( nLinea +10,260,"(" + STR0038 + ")",oFont3) //(10%)
	oPrinter:Say( nLinea +10,305,PADL(cIVA10,16),oFont3)
	
	oPrinter:Say( nLinea +10,455,STR0056,oFont3)
	
	U_uinvetCad(cTotIVA,nLinea +10,570	,.T.,oFont3,oPrinter)
	//	cTotIVA
	nLinea += 15
	nFin	:= nLinea
	
	
Return nil

/*/{Protheus.doc} U_uProdRem
	Funcion usada para la paginación
	@author TOTVS
	@parama oPrinter, objeto, objeto para acceder a las propiedades del pdf
	@parama oXmlItem, objeto, objeto para acceder a los items 
	@parama nIndice, numerico, numero de item donde se quedo el ciclo cuando existe mas de un item 
	@parama oXML, objeto, objeto para acceder a las propiedades del xml
	@parama cDir, carácter, dirección transportista
	@return nil
/*/
User Function uProdRem(oPrinter,oXmlItem,nIndice,oXml,cDir,nHoj)
Local nMLText:=25
Local nI:=0
Local nInicio	:= 0
Local nLinea1 	:= 80
Local nLinea2	:= 200
Local nIniRem	:=0
Local nHojas	:=nHoj
Local nLimite	:= 672
Local nAux		:=0
nInicio	:= nLinea

nLinea += 10
	nInicio	:= nLinea
	oPrinter:Line( nLinea, nML, nLinea, 575, CLR_BLACK, "-4") //Linea superior
	
	nLinea += 12
	oPrinter:Say(nLinea,nMLText + 10,STR0032,oFont8) //"Cantidad"
	
	oPrinter:Say(nLinea,nMLText + 70,STR0031 +  " " + STR0055,oFont8) //"Unidad de" "medida"
	
	oPrinter:Say(nLinea,nMLText + 190,STR0085 ,oFont8) //"Descripción detallada (incluir cantidad o porcentaje de la tolerancia de quiebra)"
	
	nLinea += 12
	oPrinter:Say(nLinea,nMLText + 190,STR0086,oFont8) //"o merma/datos de relevancia de la mercadería)"
	
	nLinea += 5
	oPrinter:Line( nLinea, nML, nLinea, 575, CLR_BLACK, "-4") //Linea media

	
	If ValType(oXmlItem) == "O"
		U_uImItemR(oPrinter, oXmlItem)
	ElseIf ValType(oXmlItem) == "A"
		IF nIndice==0
			nHojas:=U_utotHojas(oXmlItem,nLinea,48,nLimite,nLimite,80,10,0)
		ENDIF
		For nI := IIF(nIndice<>0,nIndice,1) To Len(oXmlItem)

			nAux:=nLinea  
			nAux+=U_ucalLi(oXmlItem[nI]:_DDESPROSER:TEXT,80)*10
			
			IF nAux < nLimite
				U_uImItemR(oPrinter, oXmlItem[nI])
			ELSE
				nIniRem:=nI
				EXIT
			ENDIF
			
		Next nI
	EndIf
	
	nLinea += 5
	oPrinter:Line( nLinea, nML, nLinea, 575, CLR_BLACK, "-4") //Linea media
	
	//Lineas de división
	oPrinter:Line( nInicio, nML, nLinea, nML, CLR_BLACK, "-4")
	oPrinter:Line( nInicio, 575, nLinea, 575, CLR_BLACK, "-4")
	oPrinter:Line( nInicio, nLinea1, nLinea, nLinea1, CLR_BLACK, "-4")
	oPrinter:Line( nInicio, nLinea2, nLinea, nLinea2, CLR_BLACK, "-4")
	U_uImpPie(oPrinter,oXml)
	oPrinter:Say( 820,275,CVALTOCHAR((nPag+=1))+"/"+CVALTOCHAR(nHojas),oFont3) //

	nLinea += 10
	IF nIniRem<>0
		U_usigPag(oPrinter,oXML)
		U_uProdRem(oPrinter,oXmlItem,nIniRem,oXml,cDir,nHojas)
	ENDIF
	
Return nil

/*/{Protheus.doc} U_utotHojas
	@author TOTVS
	@param oXmlItem, objeto xml, items del xml
	@param nPos1, numerico, posicion de inicio de pintado de items de la primer hoja(lleva más datos)
	@param nPos2, numerico, posicion de inicio de pintado de items de segunda hoja en adelante
	@param nLimIni, numerico, limite de pintado para items en las hojas salvo la ultima
	@param nLimFin, numerico, limite de pintado para items en la ultima hoja
	@param nLinLim, numerico, limite de ancho para las descripción del item
	@param nSalto, numerico, salto entre lineas de las descripcon de los items
	@param nSep, numerico, separación entre items(interlineado)
	@return 
/*/
User Function utotHojas(oXmlItem,nPos1,nPos2,nLimIni,nLimFin,nLinLim,nSalto,nSep)
Local nLinCon:=0
Local nTotal:=0
Local nI:=0
Local nLimite
Local nLinea:=nPos1
Local nHojas:=1

For nI := 1 To Len(oXmlItem)
	IF nI== Len(oXmlItem)

		nLimite:=nLimFin//618
	ELSE
		nLimite:=nLimIni//682
	ENDIF
	nLinCon:=nSep+nLinea 
	nTotal:=((U_ucalLi(oXmlItem[nI]:_DDESPROSER:TEXT,nLinLim)))*nSalto
	nLinCon+=nTotal

	IF (nLinCon)< nLimite// verifico primero si el item no pasa el limite le sumo 200 porel pie de pagina
		nLinea+=nTotal+nSep
	ELSE
		nHojas+=1
		nLinea:=nPos2+nTotal+nSep
	ENDIF
	
Next nI


Return nHojas

			
/*/{Protheus.doc} U_ulonVisu
	cuenta la longitud de una cadena pero al reconocer a algunas letras asigna un valor diferente de 1
	por ejemplo si es "," o "." o "," asignando un valor de 4 ya que al imprimir es el espacio que usa y al usar la función
	LEN solo lo toma como un valor de 1
	@author TOTVS
	@cCadena, caracter, cadena a extraer
	@return nTot, númerico, aproximación de la longitud visual de una cadena
	/*/
User Function ulonVisu(cCadena)

	Local cAux:=""
	Local nLin:=0
	Local nTot:=0
	DEFAULT cCadena:=""

	If	!Empty(cCadena)

		For nLin := 1 To Len(cCadena)
			
			cAux:=	SubStr(cCadena,nLin,1)
			If ASC(cAux  )==87 .or. ASC(cAux  )==81 .or. ASC(cAux  )==85	.or. ASC(cAux )==119 .or. ASC(cAux )==90 .or. ASC(cAux )==112 .or. ASC(cAux )==77
				nTot+=1.4
			Elseif IsUpper(cAux )
				nTot+=1.1
			Elseif  ASC(cAux )==44 .or. ASC(cAux )==46 .or. ASC(cAux)==59
				nTot+=2
			Else
				nTot+=1
			EndIF

		NEXT nLin
	ENDIF	
Return nTot



/*/{Protheus.doc} U_uinvetCad
    PADR y PADL no toman el punto x asignado solo formatea la cadena,
    Por eso a partir del x eje asignado comienza a imprimir la cadena hacia la izquierda, 
    tomando el ultimo carácter para comenzar a imprimir para ello se invierte la cadena
    @author TOTVS
    @param cTextInv, carácter, cadena original a ser invertida
	@param nY, numerico, posición en el eje Y
	@param nX, numerico, posición en el eje X
	@param lImp, booleano, indica si imprime el texto
	@parama oPrinter, objeto, objeto para acceder a las propiedades del pdf
	@parama oFont, objeto, fuente
    @return cTextoInvertido, carácter, la cadena original es invertida
    /*/

User Function uinvetCad(cTextInv, nY,nX,lImp,oFont,oPrinter)

	Local nI:=0
	Local cAux:=0

	DEFAULT cTextInv:=""
	DEFAULT nY=0
	DEFAULT nX:=0
	DEFAULT lImp:=.F.
	DEFAULT oFont:= NIL
	DEFAULT oPrinter:=NIl

	For nI := 1 to LEN(cTextInv) 
		cAux:=	SubStr(cTextInv,(LEN(cTextInv)-nI)+1,1)
		IF lImp
			oPrinter:Say( nY,nX-=4	,cAux,oFont)
		ENDIF
	Next

Return cTextInv
	

User Function TComboBox()
Local cEspecie:=""
Local cCombo	:= ""
Local aCombo	:= {}
Local oDlg		:= Nil
Local oFld		:= Nil
 
aAdd( aCombo, "1.-Factura" ) //"1- Factura"
aAdd( aCombo, "2.-Nota de Débito" ) //"2- debito"
aAdd( aCombo, "3.-Nota de Crédito" ) //"3- credito  "
aAdd( aCombo, "4.-Remisión" ) //"4- Remision  "
aAdd( aCombo, "5.-RTS" ) //"5- RTS  "

 	DEFINE DIALOG oDlg TITLE "Seleccione documento" FROM 180,180 TO 350,450 PIXEL


	@ 020,010 COMBOBOX oCombo VAR cCombo ITEMS aCombo SIZE 65,8 PIXEL OF oFld 
	@ 040,040 BUTTON "Siguiente" SIZE 046,10 PIXEL ACTION oDlg:End() //"&Sair"
 	ACTIVATE MSDIALOG oDlg CENTER
	
	cCombo:= Subs(cCombo,1,1)   

	if cCombo=="1"
		cEspecie:="NF"
	elseif cCombo=="2"
		cEspecie:="NDC"
	elseif cCombo=="3"
		cEspecie:="NCC"
	elseif cCombo=="4"
		cEspecie:="RFN"
	else 
		cEspecie:="RTS"
	endif



 Return cEspecie



03. Menús

En el Configurador (SIGACFG), acceda a Entornos/Archivo/Menú (CFGX013). Informe las nuevas opciones de menú conforme las instrucciones a continuación:

...