Árvore de páginas

01. DATOS GENERALES


Producto

TOTVS Backoffice

Línea de producto: 

Línea Protheus

Segmento:

Backoffice

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

M486PDFGEN 

PDF para factura electrónica de Paraguay
País:PARAGUAY
Ticket:16918885
Requisito/Story/Issue (informe el requisito vinculado):DMICNS-17017


02. SITUACIÓN/REQUISITO

Se solicito sea liberado para el cliente el RDMAKE de impresión de Factura electrónica (PDF) para país Paraguay, ya que actualmente no existe forma de personalizar el PDF del padrón estándar, a través del punto de entrada "M486PDFGEN".


03. SOLUCIÓN

Se libera RDMAKE "M486PDFGEN" para personalizar el PDF del padrón estándar.


Tener el ambiente configurado para la facturación electrónica de acuerdo al apartado "05. ASUNTOS RELACIONADOS"

  • A través del módulo de facturación (SIGAFAT>Actualizaciones | Facturación| Facturaciones).

    • Agregar una Factura de salida.
    • Agregar una Nota de Crédito Cliente (NCC). La NCC debe estar vinculada a documento origen ya timbrado.
    • Agregar una Nota de Débito Cliente (NDC). La NDC debe estar vinculada a documento origen ya timbrado.
    • Agregar una Remisión. 
    • Agregar una RTS. 


ediante el módulo de facturación (SIGAFAT>Actualizaciones | Facturación | Documentos Electrónicos).

  • Realizar la transmisión de los documentos creados previamente
  • Una vez transmitido los documentos realizar la impresión de cada uno:
    • Botón "IMPRIMIR PDF"
      • En el cuadro de dialogo de parámetros informar:
        • Serie de documento.
        • Documento inicial.
        • Documento final.
        • Formato.
        • Ruta Copia PDF (esta ruta corresponde al entorno donde se ejecuta el Smartclient). Ejemplo "C:\temp\"
        • En caso de no tener la pregunta agregar conforme el apartado "05. ASUNTOS RELACIONADOS" , opción "DMICNS-13709 DT tratamiento PDF factura electrónica PAR".
    • Verificar PDF para documento.

Descripción:

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

Ubicación:

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

Eventos:

Imprimir PDF.

Programa Fuente:

MATA486.PRW

Función:

MenuDef

Parámetros: 

Posición

Tipo

Descripción

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



#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



04. INFORMACIÓN ADICIONAL

  • No aplica




05. ASUNTOS RELACIONADOS

  • DMICNS-7499 DT Factura Electrónica Paraguay prueba piloto PAR
  • DMICNS-13709 DT tratamiento PDF factura electrónica PAR