Árvore de páginas

Versões comparadas

Chave

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

...

  1. Visión general
  2. Ejemplo de utilización
  3. Menús
  4. Diccionario de datos.
  5. Tablas.
  6. .Temas relacionados.


01. VISIÓN GENERAL

Se implementa la generación de XML  y procedimiento de timbrado de los documentos Factura "NF", Nota de Crédito "NCC" , Nota de Débito "NDC" y Guía de Remisión "RFN" electrónicos según lo establecido por la SET en la  versión N° 150-24/06/2019/SIFEN (Especificado en el siguiente documento).

...

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 Ejemplo
MV_PATH814C:\Catalogos_csv\
MV_F3HNUM
MV_CFDI_AMT
MV_CFDSMAR

GetClientDir()

Cuando se usa en versión web se debe crear un carpeta en alguna ubicación con permisos de lectura y escritura;  y se debe informar la ruta ejemplo "C:\temp\". Adicional en dicha ruta debe esta el certificado y la carpeta SIFENWS.

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
MV_TIPCON1=Persona Física ,2=Persona Jurídica
MV_IMPKUDE

1= Imprime facturas autorizadas

2= Imprime facturas transmitidas y autorizadas


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 archivo CatalogosFact.zip. En  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 MVparámetro MV_CFDI_PX, deberá ser colocado dentro de la ruta informada en el parámetro MVpará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 1083727 una vez descargado el archivo:
      • Localizar el archivo descargado descomprima, y descomprimir.
      • Ubique la carpeta "Paraguay" dentro se encuentra el comprimido SIFENWS descomprima y use de acuerdo al presente documentono mover ninguno de los elementos.
    • El nombre del archivo(ejecutable) 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.
  • Dentro de la ruta '\Protheus_data\system\', deberá crear los siguientes directorios:
    • "\facturas\" 
    • Dentro de la ruta '\Protheus_data\system\facturas\', deberá crear los siguientes directorios:
      • "\autorizados\" - Almacena las facturas autorizadas por el SIFEN.
      • "\canceladas\" - Almacena los documentos cancelados. Los documentos cancelados son documentos que fueron enviados y autorizados por el SIFEN, pero que después fueron cancelados.
      • "\inutilizadas\" - Almacena los documentos inutilizados. Los documentos inutilizados son documentos que no fueron transmitidos al SIFEN, pero que fueron reportados como "cancelados" sin ser aprobados previamente.
  • Para el uso en versión web se debe tener actualizado WEBAGENT y configurar correctamente de acuerdo  a la documentación.
Totvs custom tabs box items
defaultno
referenciapaso03
  • Catálogos.
    • En el módulo de Facturación, ingresar a la rutina Definición

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  Definición de Catálogos". La primera vez detonará la carga de los archivos csv al Protheus. Es importante realice este paso después de configurar todos los parámetros , pues las configuraciones siguientes dependen de la correcta carga de la información de catálogos al sistema Protheus.

    • CatalogosCatálogos.

      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 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  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 Países)
    • YA_CODERP - Cod. ERP. Clave de país de acuerdo al catálogo de países.
  • Monedas - (SIGACTB | Actualizaciones | Archivos| Monedas  Monedas Contables)
    • CTO_MOESAT - Moneda SAT. Clave de moneda de acuerdo al catálogo monedas.
  • Unidades de medida - (SIGAFIS | Actualizaciones | Archivos| Unidades  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  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  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ónFacturació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ónFacturació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 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ónFacturació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 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

Sin la existencia del parámetro MV_IMPKUDE.

  Ejemplo 1 -  Documento Autorizado.

NOTA: Al no existir el parámetro se toma el valor default de 1. Por lo que solo se pueden imprimir documentos autorizados.

  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.autorizados de los que se generara el PDF. 
    1. ¿Serie de documento? - "A01"
    2. ¿Documento Inicial? - "0010010000001"
    3. ¿Documento Final? - "0010010000001"
    4. ¿Formato? - PDF
    5. Ruta copia PDF - C:\prueba\
  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 MVparámetro MV_CFDDOCS en la carpeta llamada "Autorizados" o en la ruta informada en el parámetro "Ruta copia PDF".
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.

  Ejemplo 2 - Documento No Autorizado.

NOTA: Al no existir el parámetro se toma el valor default de 1. Por lo que solo se pueden imprimir documentos autorizados.

  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 autorizados de los que se generara el PDF. 
    1. ¿Serie de documento? - "A01"
    2. ¿Documento Inicial? - "0010010000002"
    3. ¿Documento Final? - "0010010000002"
    4. ¿Formato? - PDF
    5. Ruta copia PDF - C:\prueba\
  3. No se mostrara ningún mensaje, solo no se realizara el proceso.
  4. Al consultar la ruta informada en el parámetro MV_CFDDOCS en la carpeta llamada "Autorizados" o en la ruta informada en el parámetro "Ruta copia PDF", no existira ningún documento generado.

Configuración del parámetro MV_IMPKUDE = 1

  Ejemplo 1 -  Documento Autorizado.

NOTA: Al estar configurado el valor del parámetro en 1, solo se pueden imprimir documentos autorizados.

  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 autorizados de los que se generara el PDF. 
    1. ¿Serie de documento? - "A01"
    2. ¿Documento Inicial? - "0010010000001"
    3. ¿Documento Final? - "0010010000001"
    4. ¿Formato? - PDF
    5. Ruta copia PDF - C:\prueba\
  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" o en la ruta informada en el parámetro "Ruta copia PDF".

  Ejemplo 2 - Documento No Autorizado.

NOTA: Al estar configurado el valor del parámetro en 1, solo se pueden imprimir documentos autorizados.

  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 autorizados de los que se generara el PDF. 
    1. ¿Serie de documento? - "A01"
    2. ¿Documento Inicial? - "0010010000002"
    3. ¿Documento Final? - "0010010000002"
    4. ¿Formato? - PDF
    5. Ruta copia PDF - C:\prueba\
  3. No se mostrara ningún mensaje, solo no se realizara el proceso.
  4. Al consultar la ruta informada en el parámetro MV_CFDDOCS en la carpeta llamada "Autorizados" o en la ruta informada en el parámetro "Ruta copia PDF", no existira ningún documento generado.

Configuración del parámetro MV_IMPKUDE = 2

  Ejemplo 1 -  Documento Autorizado.

NOTA: Al estar configurado el valor del parámetro en 2, se pueden imprimir documentos que ya han sido transmitidos y están en espera de ser autorizados.

  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 autorizados de los que se generara el PDF. 
    1. ¿Serie de documento? - "A01"
    2. ¿Documento Inicial? - "0010010000001"
    3. ¿Documento Final? - "0010010000001"
    4. ¿Formato? - PDF
    5. Ruta copia PDF - C:\prueba\
  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" o en la ruta informada en el parámetro "Ruta copia PDF".

  Ejemplo 2 - Documento Transmitido aun No Autorizado.

NOTA: Al estar configurado el valor del parámetro en 2, se pueden imprimir documentos que ya han sido transmitidos y están en espera de ser autorizados.

  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 autorizados de los que se generara el PDF. 
    1. ¿Serie de documento? - "A01"
    2. ¿Documento Inicial? - "0010010000002"
    3. ¿Documento Final? - "0010010000002"
    4. ¿Formato? - PDF
    5. Ruta copia PDF - C:\prueba\
  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 o en la ruta informada en el parámetro "Ruta copia PDF"..
Totvs custom tabs box items
defaultno
referenciapaso09

En caso de que se necesite modificar el XML para documentos de salida (NF, NDC, RFN) existe el punto de entrada M486PESXML habilitado para realizar esta operación.

Aviso
titleNota

El siguiente ejemplo sirve para reemplazar todo el XML y será necesario utilizar la función de usuario  QryItem() , que realiza una consulta SQL (Query) para obtener los datos correspondientes a los ítems, se encuentra al final del ejemplo.

Ejemplos de uso:

Bloco de código
languageactionscript3
themeRDark
titleM486PESXML
linenumberstrue
collapsetrue
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 := u_QryItem("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

/*/{Protheus.doc} QryItem Genera un query para obetener los datos correspondientes a los items.
@param cAlias, caracter, Alias de la tabla.
@param cCpos, caracter, Campos a ser usados en el query.
@param cWhere, caracter, Condición a ser usada en el query.
@param cOrder, caracter, Campo a ser usado en el orden,
@return cAliasTmp, Alias de la tabla temporal.
/*/
User Function QryItem(cAlias, cCpos, cWhere, cOrder)
Local cQuery 	:= ""
Local cAliasTmp	:= getNextAlias()

	cQuery := "Select "
	cQuery += cCpos
	cQuery += " ,B1_COD, B1_DESC, B1_UM, AH_COD_CO" 
	cQuery += " from "+RetSqlName(cAlias)+ " " + cAlias + " "
	cQuery += " Left Join " +RetSqlName("SB1")+ " SB1 ON " + IIf(cAlias == "SD2","D2_COD","D1_COD") + " = B1_COD AND B1_FILIAL = '" + xFilial("SB1") + "'"
	cQuery += " Left Join " +RetSqlName("SAH")+ " SAH ON B1_UM = AH_UNIMED AND AH_FILIAL = '" + xFilial("SAH") + "'"
	cQuery += " Where "
	cQuery += cWhere
	cQuery += " AND " + cAlias + ".D_E_L_E_T_ = ''"
	cQuery += " AND SB1.D_E_L_E_T_ = ''"
	cQuery += " AND SAH.D_E_L_E_T_ = ''"
	If !Empty(cOrder)
		cQuery += " ORDER BY "+ SqlOrder(cOrder)
	EndIf
	cQuery := ChangeQuery(cQuery)
	dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cAliasTmp,.T.,.T.)

	(cAliasTmp)->(dbGoTop())

Return cAliasTmp

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 que se necesite modificar el xml para documentos de entrada (NCC) existe el punto de entrada M486PEEXML habilitado para realizar esta operación.

Aviso
titleNota

El siguiente ejemplo sirve para reemplazar todo el XML y será necesario utilizar la función de usuario  QryItem() , que realiza una consulta SQL (Query) para obtener los datos correspondientes a los ítems, se encuentra al final del ejemplo.

Ejemplos de uso:

Bloco de código
languageactionscript3
themeRDark
title M486PEEXML
linenumberstrue
collapsetrue
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 := u_QryItem("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

/*/{Protheus.doc} QryItem Genera un query para obetener los datos correspondientes a los items.
@param cAlias, caracter, Alias de la tabla.
@param cCpos, caracter, Campos a ser usados en el query.
@param cWhere, caracter, Condición a ser usada en el query.
@param cOrder, caracter, Campo a ser usado en el orden,
@return cAliasTmp, Alias de la tabla temporal.
/*/
User Function QryItem(cAlias, cCpos, cWhere, cOrder)
Local cQuery 	:= ""
Local cAliasTmp	:= getNextAlias()

	cQuery := "Select "
	cQuery += cCpos
	cQuery += " ,B1_COD, B1_DESC, B1_UM, AH_COD_CO" 
	cQuery += " from "+RetSqlName(cAlias)+ " " + cAlias + " "
	cQuery += " Left Join " +RetSqlName("SB1")+ " SB1 ON " + IIf(cAlias == "SD2","D2_COD","D1_COD") + " = B1_COD AND B1_FILIAL = '" + xFilial("SB1") + "'"
	cQuery += " Left Join " +RetSqlName("SAH")+ " SAH ON B1_UM = AH_UNIMED AND AH_FILIAL = '" + xFilial("SAH") + "'"
	cQuery += " Where "
	cQuery += cWhere
	cQuery += " AND " + cAlias + ".D_E_L_E_T_ = ''"
	cQuery += " AND SB1.D_E_L_E_T_ = ''"
	cQuery += " AND SAH.D_E_L_E_T_ = ''"
	If !Empty(cOrder)
		cQuery += " ORDER BY "+ SqlOrder(cOrder)
	EndIf
	cQuery := ChangeQuery(cQuery)
	dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cAliasTmp,.T.,.T.)

	(cAliasTmp)->(dbGoTop())

Return cAliasTmp

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

Parámetros: 

Posición

Tipo

Descripción

N/AN/AN/A
Retorno:N/A



Ejemplo:

#Include 'Protheus.ch'

User Function M486PDFGEN()

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

Return NIL

#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
Totvs custom tabs box items
defaultno
referenciapaso12

IMPRESION DEL KUDE - PARÁMETRO MV_IMPKUDE (EJEMPLO)

Parámetro

Descripción

Tipo

Valores

Default

MV_IMPKUDEConfiguración de la impresión del KUDE antes de obtener la autorización.Numérico

1 = Imprime solo facturas validadas.

2 = Imprime facturas validadas y facturas transmitidas.

1 =  Imprime solo facturas validadas.

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
Bloco de código
languagexml
titleM486PDFGEN
linenumberstrue
collapsetrue


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:

...

Totvs custom tabs box
tabsTablas,Campos,Consultas Estándar,Parámetros, Índices, Preguntas, Tablas genéricas,Leyenda/Estatus de los documentos
idspaso1,paso2,paso3,paso4,paso5,paso6,paso7,paso8
Totvs custom tabs box items
defaultyes
referenciapaso1

Clave

Nombre

Modo

PYME

F3HConfiguración de CatálogosCS
F3IInformación de CatálogosCS
F7LPagos contado Factura ElectrónicaES
Totvs custom tabs box items
defaultno
referenciapaso2
CampoTipoTamañoDecimalFormatoTítuloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
F3H
F3H_FILIALC20
SucursalSucursal1NoNoNo




Digite el código de la sucursal.
F3H_CODIGOC40@!CódigoCódigo del parámetro1SiSiSi


NaoVazio() .and. ExistChav("F3H", M->F3H_CODIGO,1) .and. FreeForUse("F3H",M->F3H_CODIGO)
Código del parámetro.
F3H_DESCC300@!DescripciónDescripción del parámetro1SiSiSi


NAOVAZIO()
Descripción del parámetro.
F3H_ORDEMC2099OrdenOrden del parámetro1SiSiNo




Orden del parámetro.
F3H_CAMPOSC100AXXXXXXXXXCamposNombre del Campo1SiSiNo


NaoVazio() .and.  f812VerChav("F3H",M->F3H_CAMPOS)
Incluir el nombre del campo.
F3H_DESCPOC25
@!Desc. CampoDescripción del Campo1SiSiNo




Incluir la descripción del campo.
F3H_TIPOC1
@!TipoTipo1SiSiNoN=Numérico;C=Caracter;D=FechaF812Valid()
NaoVazio() .and. Pertence("NCD")  .and. f812ChkTipo(M->F3H_TIPO)

Incluya el tipo de campo. C = Carácter, D = Fecha, N = Numérico.

F3H_TAMANN3
999TamañoTamaño del Campo.1SiSiNo
F812Valid()
NaoVazio() .and. F812ChkTaman(M->F3H_TAMAN)

Incluir el tamaño del campo.

Obs: si el campo fuera tipo D=Fecha,  el tamaño debe ser igual a 8.

F3H_DECIMAN2
99DecimalDecimal1SiNoNo
F812Valid()
f812ChkDec(M->F3H_DECIMA
Incluir el número de decimales que tendrá el campo. Campos tipo: Fecha y Carácter No tiene decimales
F3H_PICTURC450@!FormatoFormato1SiNoNo




Digite la máscara para la exhibición del campo. Ej.: "@E 999,99

F3H_VALIDc1200@!ValidaciónValidación del Usuario1SiNoNo




Agregar una validación del campo si es necesario.

Ej,: Entre("01","10",M-> F3H_TAMAN,.T.)

En el caso que la función utilizada sea "PERTENECE", deberá informarse el campo como segundo parámetro.

Ej.: Pertence("12",cCampo)

F3H_PADRAOC6
@!Cons. Estand.Consulta Estándar1NoNoNo


f812ConsPad()
Digite una consulta estándar para la tabla.
F3H_VERSAOC3
@!VersiónVersión1SiNoNo




Versión del catálogo.
F3H_PESQC1
@!¿Usado Busq?¿USado en la Busqueda?1NoNoNo1=Si;2=No



¿Usado en la Búsqueda de la Consulta Estándar (SXB)? Informar Si para utilizar este campo como clave simples de búsqueda.
F3I
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
F3I_FILIALC20
SucursalSucursal1SiSiNo




Informe el código de la sucursal.
F3I_CODIGOC40@!CódigoCódigo del parámetro1SiNoNo


EXISTCPO("F31")

Informe el contenido de identificación del ítem de la lista.

Por ejemplo, si la lista de modificación es la lista de países,

este campo corresponde al código de identificación del país.

F3I_SEQUENC5
99999SecuenciaSecuencia1SiNoNo




Secuencia.
F3I_CONTEUC250
@!ContenidoContenido de la tabla1SiNoNo




Informe el contenido.
F7L
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
F7L_FILIALC20
SucursalSucursal1NoNoNo




Digite el código de la sucursal.
F7L_DOCC130@!No. DocNúmero de Documento0SiSiSi




Indique el número de documento
F7L_SERIEC30@!SerieSerie del Documento0SiSiNo




Indique el número de Serie
F7L_CLIENTC60@!Cod. ClienteCod. Cliente0SiSiNo




Código del Cliente.
F7L_LOJAC20@!TiendaTienda0SiSiNo




Código de Tienda
F7L_CONDC40
Cond. PagoCond. Pago0SiSiNo




Condiciones de Pago
F7L_SEQC30@999Num PagoNúmero de PagoSiSiNo




Número de Pago
F7L_TPPAGOC20@!Tipo de PagoTipo de Pago0SiSiSi

PAR013NaoVazio() .or. ValidF3I("S013", M->F7L_TPPAGO,1,2)
Tipo de Pago.
F7L_MONTON182@E 999,999,999,999,999.99Monto PagoMonto Pago0SiSiSi




Tipo de Pago
F7L_TPTARC10@!Tipo TarjetaTipo Tarjeta0SiNoSi

PAR014NaoVazio() .or. ValidF3I("S014", M->F7LU_TPTAR,1,1)
Tipo Tarjeta
F7L_FRMPROC10@!Frm. Proc. PForma Procesamiento Pago0SiSiNo

PAR032NaoVazio() .or. ValidF3I("S032", M->F7L_FRMPRO,1,1)
Forma de Procesamiento Pago
F7L_CODOPEC10@!Cod. Aut. OPCódigo Autorización. Op.0SiNoSi




Código Autorización Op.
F7L_NUMTRJC40@!Num. TarjetaNum. Tarjeta0SiNoNo




Número de Tarjeta
F7L_CODBCOC60@!Banco EmisorBanco Emisor0SiNoNo




Banco Emisor.
F7L_C80@!Num ChequeNumero de Cheque0SiNoSi




Número de cheque.
SFP
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
FP_SERIE2C2
@!Serie 2Serie 21SiNoNo
!(funname() $ 'MATA467N/MATA462N/MATA465N')



FP_FINITIMC8

Fch. In. TimFecha de inicio Timbrado1Si
Si




Fecha de inicio de timbrado.
SA1
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
A1_TIPDOCC2
@!Tipo Dic.Tipo Documento de Identid.1SiNoNo

PAR018Vazio() .OR. ValidF3I("S018", M->A1_TIPDOC,1,1)
Tipo de documento de identidad.
A1_NUMC5
@!No. CasaNúmero de casa1SiNoNo



1Número de casa.
A1_DEPTOC2
@!Cod. DeptoCódigo de Departamento SET1SiNoNo

PAR003NaoVazio() .and. ValidF3I("S003", M->A1_DEPTO,1,2)1Código de departamento de acuerdo al SET.
A1_DISTRC3
@!Cod. DistritoCódigo de Distrito1SiNoNo

PAR031NaoVazio() .OR. ValidF3I("S031", M->A1_DISTR,3,3)1Código de distrito de acuerdo al SET.
A1_CIUDADC4
@!Cod. CiudadCódigo de Ciudad1SiNoNo

PAR012NaoVazio() .OR. ValidF3I("S012", M->A1_CIUDAD,6,4)1Código de ciudad de acuerdo al SET.
A1_PFISCAC18
@!DNIDNI1SiNoNo



1Documento de Identidad
SF2
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
F2_SERIE2C2
@!Serie 2Serie 21SiNoSi


!(funname() $ 'MATA467N/MATA462N/MATA465N')
Serie usada en la factura electrónica.
F2_DOCC13
@!Num de DocNumero de Documento1SiNoSi


CtrFolios(xFilial("SF2"),M->F2_SERIE,M->F2_ESPECIE,M->F2_DOC) .AND. LXEXSER2()

F2_SERIEC3
@!Serie Doc.Serie del Documento1SiNoSi


LxExSer2()

F2_HORAC8
99:99HoraHora1SiNoSi





F2_NUMTIMC13
@!TimbradoNúmero Timbrado1SiNoSi
.F.



F2_TIPONFC4
@!Tipo NFTipo de Factura.1SiNoSi

PAR019Vazio() .or. ValidF3I("S019", M->F2_TIPONF,1,4)
Tipo de Factura conforme a catálogo No. 19
F2_UUIDC44
@!CDCCDC1SiNoNo




Número del CDC.
F2_TIPREFC2
@!Tipo Nota de DTipo de Nota de Debito1SiNoSi

PAR021Vazio() .OR. ValidF3I("S021", M->F2_TIPREF,1,1)
Motivo de Emisión
F2_VEICULOC8
@!Vehic. TranspVehículo del Transporte1SiNoNo

DA3NAOVAZIO() .AND. ExistCpo("DA3",M->F2_VEICULO,1)
Código del Vehículo.
F2_RASTRC20
@!VueloNo. de Vuelo1SiNoNo




Número de vuelo cuando es transporte aéreo.
F2_INCOTERC3
@!IncotermsClave de Incoterms1SiNoNo

PAR010Vazio() .or. ValidF3I("S010", M->F2_INCOTER,1,3)
Condiciones de negociación.
F2_FECDSED8

Fch Ini TrasFecha Inicio de Traslado1SiNoNo




Fecha inicio de traslado.
F2_FECHSED8

Fch fin TrasFecha Fin de Traslado1SiNoNo




Fecha fin de traslado.
F2_KMN70@E 9,999,999Dist. EntregaDistancia de Entrega1SiNoNo




Distancia de entrega
F2_TPTRANSC2
@!Tipo TransacTipo de Transacción1SiNoNo

PAR016Vazio() .or. ValidF3I("S016", M->F2_TPTRANS,1,2)
Tipo Transacción
F2_MOTEMIRC2
@!Motivo EmisMotivo Emisión1SiNoNo

PAR022Vazio() .or. ValidF3I("S022", M->F2_MOTEMIR,1,2)
Motivo Emisión del Remito
F2_FECTIMBD8

Fecha Trans.Fecha de transmisión1SiNoSi




Fecha de transmisión del documento.
F2_FECANTFD8

Fch Canc envFecha cancelación envio1SiNoSi




Fecha de cancelación del documento enviado.
F2_FLFTEXC1

Status TransEstatus transmisión Elec1SiNoNo0=No Enviado;1=Enviado;5=Rechazado;6=Autorizado



Estatus de los documento electrónicos.
F2_TPRESFLC1
@!Resp. FleteResponsable Flete1SiNoNo

PAR027Vazio() .OR. ValidF3I("S027", M->F2_TPRESFL,1,1)
Responsable del flete
SF1
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
F1_DOCC13
@!Num de Doc.Número de Documento1SiNoSi


CtrFolios(xFilial("SF1"),M->F1_SERIE,M->F1_ESPECIE,M->F1_DOC) .AND. LXEXSER2()

F1_SERIEC3
@!Serie Doc.Serie del Documento1SiNoSi





F1_SERIE2C2
@!Serie 2Serie 21SiNoSi


!(funname() $ 'MATA462N/MATA465N')

F1_NUMTIMC13
@!TimbradoNumero de Timbrado1SiNoSi
.F.



F1_UUIDC44
@!CDCCDC1SiNoNo




Número del CDC
F1_TIPREFC2
@!Tipo Nota de CTipo de nota de Crédito1SiNoSi

PAR021Vazio() .OR. ValidF3I("S021", M->F1_TIPREF,1,1)
Motivo de Emisión
F1_FECTIMBD8

Fecha Trans.Fecha de transmisión1SiNoSi




Fecha de transmisión del documento.
F1_FECANTFD8

Fch Canc envFecha cancelación envio1SiNoSi




Fecha de cancelación del documento enviado.
F1_FLFTEXC1

Status TransEstatus transmisión Elec1SiNoNo0=No Enviado;1=Enviado;5=Rechazado;6=Autorizado



Estatus de los documento electrónicos.
SYA
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
YA_CODERPC3
@!Cod. ERPCod. ERP1SiNoSi

PAR005

Clave de País de acuerdo al catálogo No. 05
CTO
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
CTO_MOESATC3
@!Moneda SATMoneda SAT1SiNoSi

PAR004

Clave de moneda de acuerdo al catálogo No. 04
SAH
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
AH_COD_COC3@!
Ori Cert Cod.FIESP Ori Certif Cod1SiNoSi

PAR002Vazio() .or. ValidF3I("S002", M->AH_COD_CO,1,3)

Clave de Unidad de Medida de acuerdo al catálogo No. 02

SA4
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
A4_TIPCONC1
@!Tipo ContribTipo de Contribuyente1SiNoNo1=Contribuyente;2=No Contribuyente

Pertence("12")

A4_TIPIDC1
@!Tipo de IdenTipo de identificación1SiNoNo

PAR018Vazio() .OR. ValidF3I("S018", M->A4_TIPID,1,1)

SC5
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
C5_TIPONFC4
@!Tipo NFTipo de Factura1SiNoSi

PAR019Vazio() .or. ValidF3I("S019", M->C5_TIPONF,1,1)
Tipo de Factura conforme al catálogo 19
C5_TPTRANSC2
@!Tipo TransacTipo de Transacción1SiNoNo

PAR016

Vazio() .or. ValidF3I("S016", M->C5_TPTRANS,1,2)


Tipo Transacción
C5_RASTRC20
@!VuevloNo. de Vuelo1SiNoNo




Número de vuelo cuando es transporte aéreo
C5_INCOTERC3
@!IncontermsInconterms1SiNoNo

PAR010Vazio() .or. ValidF3I("S010", M->C5_INCOTER,1,3)
Condiciones de Negociación
C5_FECDSED8

Fecha Ini TrasFecha Inicio de Traslado1SiNoNo




Fecha Inicio de Traslado
C5_FECHSED8

Fecha Fin TrasFecha Fin de Traslado1SiNoNo




Fecha Fin de Traslado
C5_MODTRADC2
@!MotivoMotivo1SiNoNo


Vazio() .or. ValidF3I("S022", M->C5_MODTRAD,1,2)
Motivo de Emisión
C5_TPRESFLC1
@!Resp. FleteResponsable Flete1SiNoNo

PAR027Vazio() .OR. ValidF3I("S027", M->C5_TPRESFL,1,1)
Responsable del flete
DA3
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. SistemaFolderHelp
DA3_MARVEIC2
@!MarcaMarca1SiNoSi

M6ExistCpo("SX5","M6"+M->DA3_MARVEI,1)

DA3_TIPTR2C1
@!Tipo Transp.Tipo de Transporte1SiNoNo

PAR026Vazio() .OR. ValidF3I("S026", M->DA3_TIPTRA,1,1)

DA3_FROVEIC1
@!FlotaFlota1SiNoNo1=Propia;2=Tercero

Pertence("12")

DA3_TIPIDC1
@!Tipo VechiculoTipo de Vehiculo1SiNoNo1= Numero de identificación del vehículo;2=Numero de matricula del vehículo

Pertence('12')

SFB
CampoTipoTamañoDecimalFormatoTituloDescripciónNivelUtilizadoObligatorioBrowseOpcionesWhenConsulta(F3)Val. Sistema
Help
FB_CODIMPC1@!Cod. ImpuestCódigo de ImpuestoNaoVazio() .OR. ValidF3I("S017", M->FB_CODIMP,1,1)1SiNoNo


PAR017
Código de Impuesto
FB_CLASSEC1@!
Clase Imp.Clase de impuesto1SiSiNoI=Impuesto; P=Percepción; R=Retención



Indica clase del impuesto.
Totvs custom tabs box items
defaultno
referenciapaso3

Alias

Tipo

SecuenciaColumnaDescripciónContenido
Consulta PAR001
PAR001101RERegímenesF3I
PAR00120101RegímenesF812SXB("S001","Codigo")
PAR001501

VAR_IXB
Consulta PAR002
PAR002101REUnidades MedidaF3I
PAR00220101Unidades MedidaF812SXB("S002","Codigo")
PAR002501

VAR_IXB
Consulta PAR003
PAR003101REDepartamentosF3I
PAR00320101DepartamentosF812SXB("S003","Codigo")
PAR003501

VAR_IXB
Consulta PAR004
PAR004101REMonedasF3I
PAR00420101MonedasF812SXB("S004","Codigo")
PAR004501

VAR_IXB
Consulta PAR005

PAR005

101REPaísesF3I
PAR00520101PaísesF812SXB("S005","Codigo")
PAR005501

VAR_IXB
Consulta PAR006

PAR006

101REActividad EconómicaF3I
PAR00620101Actividad EconómicaF812SXB("S006","Codigo")
PAR006501

VAR_IXB
Consulta PAR007

PAR007

101REAfectacionesF3I
PAR00720101AfectacionesF812SXB("S007","Codigo")
PAR007501

VAR_IXB
Consulta PAR008

PAR008

101RECategoría ISCF3I
PAR00820101Categoría ISCF812SXB("S008","Codigo")
PAR008501

VAR_IXB
Consulta PAR009

PAR009

101RETasa ISCF3I
PAR00920101Tasa ISCF812SXB("S009","Codigo")
PAR009501

VAR_IXB
Consulta PAR010

PAR010

101RECondiciones F3I
PAR01020101Condiciones F812SXB("S010","Codigo")
PAR010501

VAR_IXB
Consulta PAR011

PAR011

101RERegímenes AduanerosF3I
PAR01120101Regímenes AduanerosF812SXB("S011","Codigo")
PAR011501

VAR_IXB
Consulta PAR012

PAR012

101REReferencia GeográficaF3I
PAR01220101Referencia GeográficaF812SXB("S012","Codigo")
PAR012501

VAR_IXB
Consulta PAR013

PAR013

101RETipos de PagoF3I
PAR01320101Tipos de PagoF812SXB("S013","Codigo")
PAR013501

VAR_IXB
Consulta PAR014

PAR014

101REDenominación de TarjetaF3I
PAR01420101Denominación de TarjetaF812SXB("S014","Codigo")
PAR014501

VAR_IXB
Consulta PAR015

PAR015

101REDocumento ElectrónicoF3I
PAR01520101Documento ElectrónicoF812SXB("S015","Codigo")
PAR015501

VAR_IXB
Consulta PAR016

PAR016

101RETipo de TransacciónF3I
PAR01620101Tipo de TransacciónF812SXB("S016","Codigo")
PAR016501

VAR_IXB
Consulta PAR017

PAR017

101RETipo OperaciónF3I
PAR01720101Tipo OperaciónF812SXB("S017","Codigo")
PAR017501

VAR_IXB
Consulta PAR018

PAR018

101REDocumento IdentidadF3I
PAR01820101Documento IdentidadF812SXB("S018","Codigo")
PAR018501

VAR_IXB
Consulta PAR019

PAR019

101REIndicador de PresenciaF3I
PAR01920101Indicador de PresenciaF812SXB("S019","Codigo")
PAR019501

VAR_IXB
Consulta PAR020

PAR020

101REDoc Identidad Ven/TrF3I
PAR02020101Doc Identidad Ven/TrF812SXB("S020","Codigo")
PAR020501

VAR_IXB
Consulta PAR021

PAR021

101REMotivo de Emisión NCF3I
PAR02120101Motivo de Emisión NCF812SXB("S021","Codigo")
PAR021501

VAR_IXB
Consulta PAR022

PAR022

101REMotivo de Emisión ReF3I
PAR02220101Motivo de Emisión ReF812SXB("S022","Codigo")
PAR022501

VAR_IXB
Consulta PAR023

PAR023

101REResponsable de EmisiónF3I
PAR02320101Responsable de EmisiónF812SXB("S023","Codigo")
PAR023501

VAR_IXB
Consulta PAR024

PAR024

101REVenta de VehículosF3I
PAR02420101Venta de VehículosF812SXB("S024","Codigo")
PAR024501

VAR_IXB
Consulta PAR025

PAR025

101RETipo de CombustibleF3I
PAR02520101Tipo de CombustibleF812SXB("S025","Codigo")
PAR025501

VAR_IXB
Consulta PAR026

PAR026

101REModalidad de TranspF3I
PAR02620101Modalidad de TranspF812SXB("S026","Codigo")
PAR026501

VAR_IXB
Consulta PAR027

PAR027

101REResponsable del FleteF3I
PAR02720101Responsable del FleteF812SXB("S027","Codigo")
PAR027501

VAR_IXB
Consulta PAR028

PAR028

101REDocumento ImpresoF3I
PAR02820101Documento ImpresoF812SXB("S028","Codigo")
PAR028501

VAR_IXB
Consulta PAR029

PAR029

101RETipo de OperaciónF3I
PAR02920101Tipo de OperaciónF812SXB("S029","Codigo")
PAR029501

VAR_IXB
Consulta PAR031

PAR031

101REDistritosF3I
PAR03120101DistritosF812SXB("S031","Codigo")
PAR031501

VAR_IXB
Consulta PAR032

PAR032

101REProc. de PagoF3I
PAR03220101Proc. de PagoF812SXB("S032","Codigo")
PAR032501

VAR_IXB
Totvs custom tabs box items
defaultno
referenciapaso4
Nombre de la VariableTipoDescripción
MV_PATH814CarácterRuta de donde serán cargados los catálogos
MV_F3HNUMCarácterAlmacena el ultimo numero del código del parámetro
MV_CFDI_AMCarácterConfiguración de ambiente para la comunicación con  los servicios web del SIFEN: T=(Teste) Pruebas;  P= Producción
MV_CFDSMARCarácterCarpeta local en donde se procesarán las facturas para firmar y enviar al SIFEN.
MV_CFDI_PACarácterNombre del archivo .exe encargado de firmar XML y consumir los servicios web del SIFEN.
MV_CFDDOCSCarácterDirectorio donde se grabaran las facturas electrónicas.
MV_CFDI_PXCarácterNombre del archivo en formato .pfx del certificado digital.
MV_CFDICVECarácterContraseña del certificado digital para firmado de los XML y comunicación con el SIFEN.
MV_IDCONENCarácterIdentificador control de envío Factura electrónica.
MV_IDCSCCarácterIdentificador del código secreto del contribuyente
MV_CSCCarácterCódigo secreto del contribuyente
MV_CFDUSOCarácterIndica si las facturas electrónicas se utilizaran o no, configurándose con: 0 - No utiliza Fact-E, 1-Utiliza Fact-e, 2-Indica uso de Fact-E
MV_CFDANULCarácterIndica el directorio donde se grabaran los CFD de facturas anuladas.  
MV_RELACNTCarácterCuenta a ser utilizada en el envío de E-Mail para los informes.  
MV_TIPTRANCarácterConfiguración del tipo transmisión usada con SIFEN, A= Asíncrona; S:Síncrona
MV_ASYNLOTNúmericoMáximo de documentos en lote transmisión asíncrona
Totvs custom tabs box items
defaultno
referenciapaso5
Índice OrdenClaveDescripciónPropietario
F3H1F3H_FILIAL+F3H_CODIGOCódigoS
F3H2F3H_FILIAL+F3H_DESCDescripciónS
F3H3F3H_FILIAL+F3H_CAMPOS+F3H_CODIGOCampos + CódigoS
F3I1F3I_FILIAL+F3I_CODIGO+F3I_SEQUENCódigo + SecuenciaS
F7L1F7L_FILIAL+F7L_DOC+F7L_SERIE+F7L_CLIENT+F7L_LOJADocumento + Serie + Cliente + TiendaS
Totvs custom tabs box items
defaultno
referenciapaso6

MATA486

X1_ORDEM

X1_PERGUNTX1_TIPOX1_TAMANHOX1_VAR01X1_VALIDX1_F3X1_DEF01X1_DEF02X1_DEF03X1_DEF04X1_HELP
01¿Tipo de Documento?Numérico1MV_PAR01

FacturaNota de DébitoNota de CréditoRemisión

Informe el tipo de documento con el que

se estará trabajando durante la transmisión electrónica:

  1. Factura
  2. Nota de Débito
  3. Nota de Crédito
  4. Remisión 
02¿Serie?Carácter3MV_PAR02
SERNF



Informe la serie del documento.

03¿Estatus?Carácter1MV_PAR03
SD



Indica el estatus del documento electrónico.

1-No transmitido

2-Recibido

3-Esperando Procesamiento

4-Documento Rechazado

5-Documento Autorizado

04¿Fecha Inicial?Fecha8MV_PAR04





Indique la fecha de digitación inicial.

05¿Fecha Final?Fecha8MV_PAR05





Indique la fecha de digitación final.


MATA486A

X1_ORDEM

X1_PERGUNTX1_TIPOX1_TAMANHOX1_VAR01X1_VALIDX1_F3X1_DEF01X1_DEF02X1_DEF03X1_DEF04X1_HELP
01¿Serie de la Factura?Carácter3MV_PAR01
SERNF



Informe el número de Serie de la Factura

02¿Factura Inicial?Carácter13MV_PAR02





Informe el número Factura Inicial

03¿Factura Final?Carácter13MV_PAR03!Empty(MV_PAR03) .And. MV_PAR02<=MV_PAR03




Informe el número Factura Final


MATA486B

X1_ORDEM

X1_PERGUNTX1_TIPOX1_TAMANHOX1_VAR01X1_VALIDX1_F3X1_DEF01X1_DEF02X1_DEF03X1_DEF04X1_HELP
01¿Serie de Nota de Debito?Carácter3MV_PAR01
SERNF



Informe el número de Serie de la Nota de Débito

02¿Nota de Débito Inicial?Carácter13MV_PAR02





Informe el número de la Nota de Débito Débito Inicial

03¿Nota de Débito Final?Carácter13MV_PAR03!Empty(MV_PAR03) .And. MV_PAR02<=MV_PAR03




Informe el número de la Nota de Débito Final


MATA486C

X1_ORDEM

X1_PERGUNTX1_TIPOX1_TAMANHOX1_VAR01X1_VALIDX1_F3X1_DEF01X1_DEF02X1_DEF03X1_DEF04X1_HELP
01¿Serie de Nota de Crédito?Carácter3MV_PAR01
SERNF



Informe el número de Serie de la Nota de Crédito

02¿Nota de Crédito Inicial?Carácter13MV_PAR02





Informe el número de la Nota de Crédito Inicial

03¿Nota de Débito Crédito Final?Carácter13MV_PAR03!Empty(MV_PAR03) .And. MV_PAR02<=MV_PAR03




Informe el número de la Nota de Débito Crédito Final


MATA486CMATA486E

X1_ORDEM

X1_PERGUNTX1_TIPOX1_TAMANHOX1_VAR01X1_VALIDX1_F3X1_DEF01X1_DEF02X1_DEF03X1_DEF04X1_HELP
01¿Serie de Nota de Créditola Remisión?Carácter3MV_PAR01
SERNF



Informe el número de Serie de la Nota Serie de Créditola Remisión

02¿Nota de Crédito ¿Remisión Inicial?Carácter13MV_PAR02





Informe el número de la Nota de Crédito Remisión Inicial

03¿Nota de Crédito ¿Remisión Final?Carácter13MV_PAR03!Empty(MV_PAR03) .And. MV_PAR02<=MV_PAR03




Informe el número de la Nota de Crédito Remisión Final


MATA486EMATA486F

el número de Serie de la Remisión

X1_ORDEM

X1_PERGUNTX1_TIPOX1_TAMANHOX1_VAR01X1_VALIDX1_F3X1_DEF01X1_DEF02X1_DEF03X1_DEF04X1_HELP
01¿Serie de la Remisióndocumento?Carácter3MV_PAR01NaoVazio()SERNF



Informe

02¿Remisión Inicial?Carácter13MV_PAR02

Informe el número de la Remisión Inicial

03¿Remisión Final?Carácter13MV_PAR03!Empty(MV_PAR03) .And. MV_PAR02<=MV_PAR03

Informe el número de la Remisión Final

MATA486F

X1_ORDEM

X1_PERGUNTX1_TIPOX1_TAMANHOX1_VAR01X1_VALIDX1_F3X1_DEF01X1_DEF02X1_DEF03X1_DEF04X1_HELP
01¿Serie de documento?Carácter3MV_PAR01NaoVazio()SERNF

Informe serie del documento.

02¿Documento inicial?Carácter13MV_PAR02

Informe el número de documento inicial.

03¿Documento final?Carácter13MV_PAR03NaoVazio() .And. MV_PAR03>=MV_PAR02

Informe el número de documento final.

04¿Formato?Numérico1MV_PAR04NaoVazio()PDF

Informe formato de generación de representación impresa.

Totvs custom tabs box items
defaultno
referenciapaso7

serie del documento.

02¿Documento inicial?Carácter13MV_PAR02





Informe el número de documento inicial.

03¿Documento final?Carácter13MV_PAR03NaoVazio() .And. MV_PAR03>=MV_PAR02




Informe el número de documento final.

04¿Formato?Numérico1MV_PAR04NaoVazio()
PDF


Informe formato de generación de representación impresa.

Totvs custom tabs box items
defaultno
referenciapaso7

SD - Estatus Documentos

ClaveDescripción
1NO TRANSMITIDA
2RECIBIDO
3ESPERANDO PROCESAMIENTO
4DOCUMENTO RECHAZADO
5DOCUMENTO AUTORIZADO
8DOCUMENTO CANCELADO/INUTILIZADO
Totvs custom tabs box items
defaultno
referenciapaso8

Leyenda/Estatus

ColorEstatusCondición
GrisNo Transmitida(F1_FLFTEX/F2_FLFTEX = '' o F1_FLFTEX/F2_FLFTEX = '0')
AzulRecibido (F1_FLFTEX/F2_FLFTEX = '1')
AmarilloEsperando procesamiento(F1_FLFTEX/F2_FLFTEX = '4' o F1_FLFTEX/F2_FLFTEX = '2')
RojoDocumento rechazado(F1_FLFTEX/F2_FLFTEX == '5' o F1_FLFTEX/F2_FLFTEX == '3')
VerdeDocumento autorizado(F1_FLFTEX/F2_FLFTEX = '6')
BlancoDocumento inutilizado(F1_FLFTEX/F2_FLFTEX = '8' y  F1_FECANF/ F2_FECANTF vacío).
CaféDocumento cancelado (F1_FLFTEX/F2_FLFTEX = '8' y  F1_FECANF/ F2_FECANTF diferente de vacío (con fecha de cancelación)).



Aviso
titleIMPORTANTE

Los documentos cancelados e inutilizados son identificados con el valor 8 en el campo Estatus Transmisión (F1_FLFTEX/F2_FLFTEX). Para diferenciar estos documentos, se verifica si fue informada la fecha de cancelación (F1_FECANTF/F2_FECANTF). Los documentos cancelados sí tienen informada una fecha de cancelación; y los documentos inutilizados no tienen informada fecha de cancelación. 


Leyenda/Estatus de los documentos

Image Added

SD - Estatus Documentos

ClaveDescripción
1NO TRANSMITIDA
2RECIBIDO
3ESPERANDO PROCESAMIENTO
4DOCUMENTO RECHAZADO
5DOCUMENTO AUTORIZADO
Totvs custom tabs box items
defaultno
referenciapasoERROR







...

HTML
<!-- esconder o menu --> 


<style>
div.theme-default .ia-splitter #main {
    margin-left: 0px;
}
.ia-fixed-sidebar, .ia-splitter-left {
    display: none;
}
#main {
    padding-left: 10px;
    padding-right: 10px;
    overflow-x: hidden;
}

.aui-header-primary .aui-nav,  .aui-page-panel {
    margin-left: 0px !important;
}
.aui-header-primary .aui-nav {
    margin-left: 0px !important;
}
</style>

 overflow-x: hidden;
}

.aui-header-primary .aui-nav,  .aui-page-panel {
    margin-left: 0px !important;
}
.aui-header-primary .aui-nav {
    margin-left: 0px !important;
}
</style>


06. TEMAS RELACIONADOS

DMICNS-14750 DT Transmisión asíncrona PAR

16602764 DMICNS-16650 DT Tipo de operación PAR

16237597 DMICNS-16301 DT Generación del XML del evento de cancelación PAR

16158151 DMICNS-16302 DT Evento inutilización PAR

16776831 DMICNS-16884 DT Fact Electrónica datos sucursal PAR

DMICNS-14924 DT Retransmisión de documentos rechazados PAR

DMICNS-15935 DT Condición de pago tipo 7 y cancelación PAR

DMICNS-13164 DT Error log al transmitir Factura en Oracle PAR

DMICNS-13287 DT problema con SUBSTR Oracle PAR

16918885 DMICNS-17017 DT PDF Factura Electrónica RDMAKE PAR. 

DMICNS-14068 DT Documentos electrónicos sin RUC para minoristas PAR

16254964 DMICNS-16340 DT Generación de factura electrónica con bonificación PAR

DMICNS-16024 DT Error al transmitir una NCC con factura no electrónica PAR

18866781 DMICNS-19157 DT Leyenda en documentos cancelados/inutilizados PAR

DT Ejecutable SIFENWS.EXE parámetros PAR

20422822 DMICNS-20599 DT Tag iTipCont incorrecto PAR

20421378 DMICNS-20636 DT Impresión de documentos de FCE aún no autorizadas parámetro MV_IMPKUDE PAR