Árvore de páginas

Versões comparadas

Chave

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

...

Totvs custom tabs box
tabsParámetros, Archivos Necesarios ,Configuraciones Necesarias, Facturas, Notas Crédito, Notas Débito, Remitos, Documentos Electrónicos, Punto de Entrada Xml Salida, Punto de Entrada Xml Entrada,Personalizar PDF
idspaso01,paso02,paso03,paso04,paso05,paso06,paso07,paso08,paso09,paso10,paso11
Totvs custom tabs box items
defaultyes
referenciapaso01
Nombre de la VariableValor 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 CatalogosFact.zip. En este archivo se encuentran los catálogos en formato csv los cuales serán tomados por la rutina Carga de Catálogos para generar sus registros en Protheus.
  • Certificado digital.
    • El certificado digital informado en el parámetro MV_CFDI_PX, deberá ser colocado dentro de la ruta informada en el parámetro MV_CFDSMAR.
  • Archivo .exe (SIFENWS.EXE) para realizar consumo de los servicios web del SIFEN
    • El archivo SIFENWS.EXE se puede descargar del siguiente enlace https://suporte.totvs.com/portal/p/10098/download?e=1083727 una vez descargado el archivo:
      • Localizar el archivo descargado, y descomprimir.
      • Ubique la carpeta "Paraguay" dentro se encuentra el comprimido SIFENWS descomprima no 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.
  • 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 de Catálogos  "Actualizaciones | Archivos| Definición de Catálogos". La primera vez detonará la carga de los archivos csv al Protheus. Es importante realice este paso 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.

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

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

Pago de Contado

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


Pago a plazo

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

Pago en cuota

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

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

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

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

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

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

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


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

Transmisión

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

Ejemplo:

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

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

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

Cancelación

Seleccionar los parámetros para visualizar los documentos Autorizados.

Ejemplo:

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

Imprimir PDF

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 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 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 ejemplo 1 del Punto de Entrada (M486PESXML), siguiente ejemplo sirve para reemplazar todo el XML y será necesario utilizar una función similar a QueryItemsla función de usuario  QryItem() , que realiza una consulta SQL (Query) para obtener los datos correspondientes a los ítems ítems, se encuentra al final del ejemplo.

Ejemplos de uso:

Bloco de código
languagexmlactionscript3
themeRDark
titleEjemplo 1M486PESXML
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 := QueryItemsu_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
Bloco de código
languagexml
themeRDark
titleEjemplo 2
linenumberstrue
collapsetrue
User Function M486PESXML()
Local cFilial	:= PARAMIXB[1] //Sucursal
Local cSerie    := PARAMIXB[2] //Serie
Local cCliente  := PARAMIXB[3] //Cliente
Local cLoja     := PARAMIXB[4] //Loja
Local cDoc      := PARAMIXB[5] //Número de Documento
Local cEspecie  := PARAMIXB[6] //Especie del Documento
Local cXml      := PARAMIXB[7] //XML

//Modificación del XML

Return cXml 
Bloco de código
languagexml
themeRDark
titleQueryItems()
linenumberstrue
collapsetrue
/*/{Protheus.doc} QueryItems
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 

/*/{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.
/*/
StaticUser Function QueryItemsQryItem(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 ejemplo 1 del Punto de Entrada (M486PEEXML), siguiente ejemplo sirve para reemplazar todo el XML y será necesario utilizar una función similar a QueryItemsla función de usuario  QryItem() , que realiza una consulta SQL (Query) para obtener los datos correspondientes a los ítems ítems, se encuentra al final del ejemplo.

Ejemplos de uso:

Bloco de código
languagexmlactionscript3
themeRDark
titleEjemplo 1 M486PEEXML
linenumberstrue
collapsetrue
User Function M486PEEXMLUser Function M486PEEXML()
Local cFilial   Local cFilial   := PARAMIXB PARAMIXB[1]
Local cSerie    Local cSerie    := PARAMIXB PARAMIXB[2]
Local cCliente  Local cCliente  := PARAMIXB PARAMIXB[3]
Local cLoja     Local cLoja     := PARAMIXB PARAMIXB[4]
Local cDoc      Local cDoc      := PARAMIXB PARAMIXB[5]
Local cEspecie  Local cEspecie  := PARAMIXB PARAMIXB[6]
Local cXml      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 := QueryItemsu_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
Bloco de código
languagexml
themeRDark
titleEjemplo 2
linenumberstrue
collapsetrue
User Function M486PESXML()
Local cFilial	:= PARAMIXB[1] //Sucursal
Local cSerie    := PARAMIXB[2] //Serie
Local cCliente  := PARAMIXB[3] //Cliente
Local cLoja     := PARAMIXB[4] //Loja
Local cDoc      := PARAMIXB[5] //Número de Documento
Local cEspecie  := PARAMIXB[6] //Especie del Documento
Local cXml      := PARAMIXB[7] //XML

//Modificación del XML

Return cXml 
Bloco de código
languagexml
themeRDark
titleQueryItems()
linenumberstrue
collapsetrue
LOJA,"1") + cSalto
	cXml += '		</gCamDEAsoc>' + cSalto
	cXml += '	</DE>' + cSalto
	cXml += '</rDE>' + cSalto

	RestArea(aSF)
	RestArea(aArea)

Return cXml

/*/{Protheus.doc} QueryItems
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.
/*/
StaticUser Function QueryItemsQryItem(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



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.

...

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