Totvs custom tabs box items |
---|
default | yes |
---|
referencia | paso01 |
---|
| Nombre de la Variable | Valor Ejemplo |
---|
MV_PATH814 | C:\Catalogos_csv\ | MV_F3HNUM |
| MV_CFDI_AM | T | 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_PA | SIFENWS | MV_CFDDOCS | GetSrvProfString('startpath','')+'\cfd\facturas\' | MV_CFDI_PX | certificado.pfx | MV_CFDICVE | 12345678a | MV_IDCONEN | 1 | MV_IDCSC | 0001 | MV_CSC | ABCD0000000000000000000000000000 | MV_CFDUSO | 1 | MV_RELACNT | [email protected] | MV_TIPTRAN | S | MV_ASYNLOT | 50 | MV_TIPCON | 1=Persona Física ,2=Persona Jurídica | MV_IMPKUDE | 1= Imprime facturas autorizadas 2= Imprime facturas transmitidas y autorizadas |
|
Totvs custom tabs box items |
---|
default | no |
---|
referencia | paso02 |
---|
| - 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 |
---|
default | no |
---|
referencia | paso03 |
---|
| | Totvs custom tabs box items |
---|
default | no |
---|
referencia | paso03 |
---|
| - 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 |
---|
name | Catalogos.zip |
---|
height | 250 |
---|
|
Código | Descripción |
---|
S001 | Tipo de Régimen | S002 | Unidad de Medida | S003 | Departamento | S004 | Monedas | S005 | Países | S006 | Catálogo de actividad económica | S007 | Catálogo de afectación | S008 | Catálogo de categoría ISC | S009 | Catálogo de tasas ISC | S010 | Condiciones | S011 | Catálogo de Regímenes Aduaneros | S012 | Referencia Geográfica | S013 | Tipos de Pago | S014 | Denominación Tarjeta | S015 | Documento Electrónico | S016 | Tipo de transacción | S017 | Catálogo de Impuesto Afectado | S018 | Tipo Documento de Identidad | S019 | Indicador de Presencia | S020 | Doc Identidad VEN/TRA | S021 | Motivo de Emisión NC | S022 | Motivo de Emisión RE | S023 | Catálogo de Respon. Emisión | S024 | Catálogo de Vehículos | S025 | Catálogo de Tipo de Combustible | S026 | Catálogo de Mod. de Transporte | S027 | Catálogo Respon. del Flete | S028 | Catálogo de Doc. Impreso | S029 | Tipos de Operación | S030 | Dirección del Emisor | S031 | Distrito | S032 | Procesamiento 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.
|
Totvs custom tabs box items |
---|
default | no |
---|
referencia | paso04 |
---|
| Pago de Contado - En el módulo de Facturación, ingresar a la rutina Facturación "Actualizaciones | Facturación | FacturaciónFacturación".
- Registrar una factura, informar los campos necesarios en la factura para generar correctamente el archivo xml.
- Tipo NF (F2_TIPONF).
- Tipo Transacción (F2_TPTRANS).
- Seleccionar una condición de pago que realice baja automática. (E4_BXTITAV = 1)
- Confirmar el documento.
- 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)
- Para la correcta generación deberán ser informados los campos de acuerdo al tipo de pago.
- Tipo de pago
- Pago con Tarjetas.
- Tipo Tarjeta
- Código de autorización de operación.
- Número de Tarjeta (Últimos 4 dígitos).
- Pago con cheque.
- Banco emisor.
- Número de cheque.
- Monto de pago
- Forma de procesamiento de pago
- 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."
- Una vez registradas las formas de pago confirmar.
Pago a plazo - En el módulo de Facturación, ingresar a la rutina Facturación "Actualizaciones | Facturación | FacturaciónFacturación".
- Registrar una factura, informar los campos necesarios en la factura para generar correctamente el archivo xml.
- Tipo NF (F2_TIPONF).
- Tipo Transacción (F2_TPTRANS).
- 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)
- Confirmar el documento.
Pago en cuota - En el módulo de Facturación, ingresar a la rutina Facturación "Actualizaciones | Facturación | FacturaciónFacturación".
- Registrar una factura, informar los campos necesarios en la factura para generar correctamente el archivo xml.
- Tipo NF (F2_TIPONF).
- Tipo Transacción (F2_TPTRANS).
- 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)
- Confirmar el documento.
|
Totvs custom tabs box items |
---|
default | no |
---|
referencia | paso05 |
---|
| - 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".
- Registrar una nota de crédito, informar los campos necesarios en la factura para generar correctamente el archivo xml.
- Tipo Nota C (F1_TIPREF) - Motivo de la emisión de la nota de crédito.
- Dentro de "Otras acciones | Doc Orig" seleccionar el documento al que corresponde la nota de crédito.
- 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 |
---|
default | no |
---|
referencia | paso06 |
---|
| - 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".
- Registrar una nota de débito, informar los campos necesarios en la factura para generar correctamente el archivo xml.
- Tipo Nota D (F2_TIPREF).
- Al registrar la nota de débito deberán ser informados los campos del documento al cual se encuentra asociada.
- 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 |
---|
default | no |
---|
referencia | paso07 |
---|
| En el módulo de Facturación, ingresar a la rutina Pedidos de venta "Actualizaciones | Pedidos | Pedidos de venta". - Registrar un pedido que genere un remito e informar los datos necesarios en el pedido para generar correctamente el archivo xml.
- Transp. (C5_TRANSP)
- Doc Gener. (C5_DOCGER) = 2 - Remisión
- Vehic. Trans. (C5_VEICULO)
- Motivo (C5_MODTRAD)
- Tipo NF (C5_TIPONF)
- Tipo Transac. (C5_TPTRANS)
- Incoterms (C5_INCOTER)
- Fec. Ini. Tras. (C5_FECDSE)
- Fch. Fin Tras. (C5_FECHDE)
- Resp. Flete (C5_TPRESFL)
- Confirmar el documento.
En el módulo de Facturación, ingresar a la rutina Generac de remito "Actualizaciones | Form. De Remisión | Generac de remito". Realizar la generación del remito usando el pedido antes generado.
|
Totvs custom tabs box items |
---|
default | no |
---|
referencia | paso08 |
---|
| - En el módulo de Facturación, ingresar a la rutina Documentos Electrónicos "Actualizaciones | Facturación | Documentos Electrónicos".
- Seleccionar los parámetros de acuerdo a los documentos que serán visualizados/procesados.
- ¿Tipo documento? - Seleccionar el tipo de documento.
- Factura
- Nota Débito
- Nota Crédito
- Remisión
- ¿Serie? - Seleccionar la serie de los documentos.
- ¿Estatus? - Estatus de los documentos.
- 1 - No transmitida.
- 2 - Recibido.
- 3 - Esperando procesamiento.
- 4 - Documento Rechazado.
- 5 - Documento Autorizado.
- ¿Fecha Inicial? - Fecha inicial del rango para los documentos.
- ¿Fecha Final? - Fecha final del rango para los documentos.
Transmisión Seleccionar los parámetros para visualizar los documentos no transmitidos o rechazados. Ejemplo: - ¿Tipo documento? - "Factura"
- ¿Serie? - "A"
- ¿Estatus? - "1" o "4"
- ¿Fecha Inicial? - 01/03/2021
- ¿Fecha Final? - 31/03/2021
Se visualizarán los documentos que no han sido transmitidos o procesados, dependiendo del parámetro "Estatus". - Seleccionar "Transmitir".
- 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.
- ¿Serie de la Factura? - "A01"
- ¿Factura Inicial? - "0010010000001"
- ¿Factura Final? - "0010010000001"
- Una vez finalizado el proceso se mostrará un mensaje.
- En caso de haber tenido errores durante la transmisión se mostrará un mensaje indicándolo.
- Indicar "Si" en la pregunta "¿Desea visualizar el log del proceso?".
- Se mostrará un informe con los errores que ocurrieron durante el proceso.
- En caso de haber realizado de manera correcta la transmisión se mostrará un mensaje indicándolo.
- Indicar "Si" en la pregunta "¿Desea visualizar log de Transmisión?".
- Se mostrará un informe con los documentos autorizados.
- 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: - ¿Tipo documento? - "Factura"
- ¿Serie? - "A"
- ¿Estatus? - "5"
- ¿Fecha Inicial? - 01/03/2021
- ¿Fecha Final? - 31/03/2021
- Seleccionar "Otras acciones | Anulación Fac. Electrónica".
- Se mostrará una barra de progreso.
- Una vez finalizado el proceso se mostrará un mensaje.
- En caso de haber tenido errores durante la transmisión se mostrará un mensaje indicándolo.
- Indicar "Si" en la pregunta "¿Desea visualizar el log del proceso?".
- Se mostrará un informe con los errores que ocurrieron durante el proceso.
- En caso de haber realizado de manera correcta la transmisión se mostrará un mensaje indicándolo.
- Indicar "Si" en la pregunta "¿Desea visualizar log de Transmisión?".
- 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. - Seleccionar "Imprimir PDF".
- 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.
- ¿Serie de documento? - "A01"
- ¿Documento Inicial? - "0010010000001"
- ¿Documento Final? - "0010010000001"
- ¿Formato? - PDF
- Ruta copia PDF - C:\prueba\
- Se mostrará una barra de progreso.
- 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 |
---|
default | no |
---|
referencia | paso09 |
---|
| 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 |
---|
default | no |
---|
referencia | paso10 |
---|
| 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. - Seleccionar "Imprimir PDF".
- 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.
- ¿Serie de documento? - "A01"
- ¿Documento Inicial? - "0010010000002"
- ¿Documento Final? - "0010010000002"
- ¿Formato? - PDF
- Ruta copia PDF - C:\prueba\
- No se mostrara ningún mensaje, solo no se realizara el proceso.
- 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. - Seleccionar "Imprimir PDF".
- 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.
- ¿Serie de documento? - "A01"
- ¿Documento Inicial? - "0010010000001"
- ¿Documento Final? - "0010010000001"
- ¿Formato? - PDF
- Ruta copia PDF - C:\prueba\
- Se mostrará una barra de progreso.
- 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. - Seleccionar "Imprimir PDF".
- 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.
- ¿Serie de documento? - "A01"
- ¿Documento Inicial? - "0010010000002"
- ¿Documento Final? - "0010010000002"
- ¿Formato? - PDF
- Ruta copia PDF - C:\prueba\
- No se mostrara ningún mensaje, solo no se realizara el proceso.
- 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. - Seleccionar "Imprimir PDF".
- 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.
- ¿Serie de documento? - "A01"
- ¿Documento Inicial? - "0010010000001"
- ¿Documento Final? - "0010010000001"
- ¿Formato? - PDF
- Ruta copia PDF - C:\prueba\
- Se mostrará una barra de progreso.
- 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. - Seleccionar "Imprimir PDF".
- 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.
- ¿Serie de documento? - "A01"
- ¿Documento Inicial? - "0010010000002"
- ¿Documento Final? - "0010010000002"
- ¿Formato? - PDF
- Ruta copia PDF - C:\prueba\
- Se mostrará una barra de progreso.
- 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 |
---|
default | no |
---|
referencia | paso09 |
---|
| 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 |
---|
| 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 |
---|
language | actionscript3 |
---|
theme | RDark |
---|
title | M486PESXML |
---|
linenumbers | true |
---|
collapse | true |
---|
| 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 |
---|
default | no |
---|
referencia | paso10 |
---|
| 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 |
---|
| 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 |
---|
language | actionscript3 |
---|
theme | RDark |
---|
title | M486PEEXML |
---|
linenumbers | true |
---|
collapse | true |
---|
| 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 |
---|
default | no |
---|
referencia | paso11 |
---|
| 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/A | N/A | N/A |
| Retorno: | N/A |
|
Totvs custom tabs box items |
---|
default | no |
---|
referencia | paso12 |
---|
| IMPRESION DEL KUDE - PARÁMETRO MV_IMPKUDE (EJEMPLO) Parámetro | Descripción | Tipo | Valores | Default |
---|
MV_IMPKUDE | Configuració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 |
---|
default | no |
---|
referencia | paso11 |
---|
| PE - M486PDFGEN | Descripción: | M486PDFGEN.- Generación personalizada de Impresión Gráfica de Documentos | Ubicación: | Actualizaciones / Facturación / Transmisión Electrónica. | Eventos: | Imprimir PDF. | Programa Fuente: | MATA486.PRW | Función: | MenuDef | Retorno: | N/A | Ejemplo: #Include 'Protheus.ch' User Function M486PDFGEN() MsgAlert("Aquí debe colocar lógica para imprimir pdf ") Return NIL Bloco de código |
---|
language | xml |
---|
title | M486PDFGEN |
---|
linenumbers | true |
---|
collapse | true |
---|
| #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
|