Estimados
Alguien que tiene alguna experiencia con Factura Electrónica en Chile.
De ante mano muchas gracias
Saludos desde Santiago
function Chile()
Local cValue := ""
Local oSoapClient
Local lOk, orespuesta, i
Local cDominio_WebServices := "https://palena.sii.cl/DTEWS/CrSeed.jws?WSDL"
Local oEnvioDte, cXml
lOk := .T.
// Ejemplo para obtener una semilla --------------------------------------------------
oSoapClient := CreateObject( "MSSOAP.SoapClient30" ) // Conecta a SOAP 3.0
oSoapClient:msSoapInit( cDominio_WebServices )
try
cXml := oSoapClient:getSeed()
alert( cXml )
catch
cValue := oSOAPClient:faultString + Hb_OsNewLine() + oSOAPClient:detail
alert( "error:"+cValue )
end
oSoapClient := NIL
// Ejemplo para obtener una semilla --------------------------------------------------
// Ejemplo de como formar XML electronico.
oEnvioDte := EnvioDTE():New()
oEnvioDte:oSetDTE:ID := "1"
oEnvioDte:oSetDTE:oCaratula:RutEmisor := "1"
oEnvioDte:oSetDTE:oCaratula:RutEnvia := "2"
oEnvioDte:oSetDTE:oCaratula:RutReceptor := "3"
oEnvioDte:oSetDTE:oCaratula:FchResol := "2015-01-01"
oEnvioDte:oSetDTE:oCaratula:TmstFirmaEnv := hb_TSToStr( hb_DateTime() )
oEnvioDte:oSetDTE:oCaratula:oSubTotDTE:TpoDTE := "33"
// Creamos un documentro tributario Electronico
oDte := DTE():New()
oDte:version = "2"
oEnvioDte:AddDTE( oDte )
oDte := DTE():New()
oDte:version = "23"
oEnvioDte:AddDTE( oDte )
Alert( oEnvioDte:WriteXML() )
quit
return nil
#include "hbclass.ch"
/****************************************************************************/
/****************************************************************************/
CLASS EnvioDTE FROM TResponse
DATA version INIT "1.0"
DATA oSetDTE
DATA oSignature // TODO:objeto signature
METHOD New() CONSTRUCTOR
METHOD WriteXML()
METHOD AddDTE( oDTE ) INLINE ::oSetDTE:AddDTE( oDTE )
END CLASS
METHOD New() CLASS EnvioDTE
::Operacion := "EnvioDTE"
::oSetDTE := SetDTE():New()
RETURN Self
METHOD WriteXML() CLASS EnvioDTE
Local pNode, pMsgs, pTree
Local oSuplement
pNode := ::CreateXML( )
mxmlElementSetAttr( pNode, "version", ::version )
::oSetDTE:WriteXML( pNode )
::GetXML()
RETURN ::cXML
/*
SetDTE , sección del documento que contiene toda la data del envío, esto es la
Carátula y 1 o más DTE, y su respectiva firma electrónica
*/
CLASS SetDTE
DATA ID INIT "ID_1"
DATA oCaratula
DATA aoDTEs
METHOD New() CONSTRUCTOR
METHOD WriteXML()
METHOD AddDTE( oDTE ) INLINE aadd( ::aoDTEs, oDTE )
END CLASS
METHOD new() CLASS SetDTE
::aoDTEs := {} // Arrays de objetos DTE
::oCaratula := Caratula():New()
RETURN Self
METHOD WriteXML( pNode ) CLASS SetDTE
Local pSetDte, oDte
pSetDte := mxmlNewElement( pNode, "SetDTE" )
mxmlElementSetAttr( pSetDte, "ID", ::ID )
::oCaratula:WriteXML( pSetDte )
for each oDte in ::aoDTEs
oDte:WriteXML( pSetDte )
next
RETURN pSetDte
/*****************************************************************/
/* Resumen de información enviada */
/*****************************************************************/
CLASS Caratula
DATA version INIT "1"
DATA RutEmisor INIT "0"
DATA RutEnvia INIT "0"
DATA RutReceptor INIT "0"
DATA FchResol INIT "2000-01-01"
DATA NroResol INIT "123456"
DATA TmstFirmaEnv INIT "2000-01-01T00:00:00"
DATA oSubTotDTE
METHOD New() CONSTRUCTOR
METHOD WriteXML()
END CLASS
METHOD new() CLASS Caratula
::oSubTotDTE := SubTotDTE():New()
RETURN Self
METHOD WriteXML( pNode ) CLASS Caratula
Local pCaratula, node
pCaratula := mxmlNewElement( pNode, "Caratula" )
mxmlElementSetAttr( pCaratula, "version", ::version )
node := mxmlNewElement( pCaratula, "RutEmisor")
mxmlNewText(node, 0, ::RutEmisor)
node := mxmlNewElement( pCaratula, "RutEnvia")
mxmlNewText(node, 0, ::RutEnvia)
node := mxmlNewElement( pCaratula, "RutReceptor")
mxmlNewText(node, 0, ::RutReceptor )
node := mxmlNewElement( pCaratula, "FchResol")
mxmlNewText(node, 0, ::FchResol)
node := mxmlNewElement( pCaratula, "NroResol")
mxmlNewText(node, 0, ::NroResol )
node := mxmlNewElement( pCaratula, "TmstFirmaEnv")
mxmlNewText(node, 0, ::TmstFirmaEnv )
::oSubTotDTE:WriteXML( pCaratula )
RETURN pCaratula
/****************************************************************************/
/* Subtotales de DTE enviados */
/****************************************************************************/
CLASS SubTotDTE
DATA TpoDTE INIT "0"
DATA NroDTE INIT "0"
METHOD New() CONSTRUCTOR
METHOD WriteXML( pNode)
END CLASS
METHOD new() CLASS SubTotDTE
RETURN Self
METHOD WriteXML( pNode ) CLASS SubTotDTE
Local pSubTotDTE, node
pSubTotDTE := mxmlNewElement( pNode, "SubTotDTE" )
node := mxmlNewElement( pSubTotDTE, "TpoDTE")
mxmlNewText(node, 0, Cstr( ::TpoDTE ) )
node := mxmlNewElement( pSubTotDTE, "NroDTE")
mxmlNewText(node, 0, Cstr( ::NroDTE ) )
RETURN pSubTotDTE
/****************************************************************************/
/* Documento Tributario Electronico */
/****************************************************************************/
CLASS DTE
DATA version INIT "1"
DATA oDocumento
METHOD New() CONSTRUCTOR
METHOD WriteXML( pNode )
END CLASS
METHOD new() CLASS DTE
::oDocumento := Documento():New()
RETURN Self
METHOD WriteXML( pNode ) CLASS DTE
Local pDTE, node
pDte := mxmlNewElement( pNode, "DTE" )
mxmlElementSetAttr( pDte, "version", ::version )
::oDocumento:WriteXML( pDte )
RETURN pDTE
/****************************************************************************/
/* Información Tributaria del DTE */
/****************************************************************************/
CLASS Documento
DATA ID INIT "1"
DATA oEncabezado
DATA oDetalle
DATA oSubTotInfo
METHOD New() CONSTRUCTOR
METHOD WriteXML( pNode )
END CLASS
METHOD new() CLASS Documento
RETURN Self
METHOD WriteXML( pNode ) CLASS Documento
Local pDTE, node
pDte := mxmlNewElement( pNode, "Documento" )
mxmlElementSetAttr( pDte, "ID", ::ID )
RETURN pDTE
/****************************************************************************/
/****************************************************************************/
CLASS TResponse
DATA Error INIT .F.
DATA oDoc
DATA lUTF8 INIT .F.
DATA cXML INIT ""
DATA Operacion INIT ""
METHOD New() INLINE Self
METHOD CreateXML()
METHOD WriteXMLFile( cFile ) VIRTUAL
METHOD WriteXML()
METHOD GetXML()
METHOD Destroy()
ENDCLASS
METHOD CreateXML( ) CLASS TResponse
Local oNode, oNodeP
::oDoc := mxmlNewXML("1.0")
oNodeP := mxmlNewElement( ::oDoc, ::Operacion )
mxmlElementSetAttr( oNodeP, "xmlns", "http://www.sii.cl/SiiDte" )
mxmlElementSetAttr( oNodeP, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
mxmlElementSetAttr( oNodeP, "xsi:schemaLocation", "http://www.sii.cl/SiiDte EnvioDTE_v10.xsd")
RETURN oNodeP
METHOD WriteXML() CLASS TResponse
::CreateXML( )
::GetXML()
::Destroy()
RETURN ::cXML
METHOD GetXML( ) CLASS TResponse
::cXML := MXMLSAVEALLOCSTRING( ::oDoc )
// TODO: Hay que hacer una conversion de UTf-8 a iso-8859-1, y cambiar encoding="utf-8" a iso-8859-1
if !::lUTF8
endif
RETURN ::cXML
METHOD Destroy() CLASS TResponse
if !empty( ::oDoc )
mxmlDelete( ::oDoc )
endif
RETURN NIL
#include "fivewin.ch"
#include "hbcurl.ch"
/*
Funcion para bajar lista de facturadores electronicos del SII
usa la lib hbcurl
esta pensada para ser llamada desde msgmeter por eso los parametros ometer,otext,odlg,lend si no lo llaman asi, comentar todo lo relacionado a ello.
notar que el tamaño de la descarga no se puede saber con anticipacion
Basado en codigo publicado en edreams.cl
Programado por Lautaro Moreira - Audisoft SPA
Si va a usar esta funcion no borrar esta informacion
Funcion bajalistafacturadores
curl = url del archivo a bajar [opcional]
cfile = Archivo a bajar [opcional]
cdestino = Nombre del destino para el archivo bajado [opcional]
ometer = objeto tmeter
otext = objeto tsay
odlg = objeto tdialog
lend = si es .t. indica que el usuario aborto [funcion no la usa]
retorna texto con ruta de archivo bajado.
*/
FUNCTION bajalistafacturadores(curl,cfile,cdestino,ometer,otext,odlg,lend)
LOCAL aHeader
LOCAL curlHandle
LOCAL ncontador
LOCAL ddate := date()
DO WHILE DoW(ddate) == 7 .OR. DoW(ddate) == 1 // solo dias habiles
--ddate
ENDDO
DEFAULT cfile := "ce_empresas_dwnld_"+DToS(ddate)+".csv"
DEFAULT cdestino := GetEnv("TEMP")+"\"+cfile
DEFAULT curl := "https://palena.sii.cl/cvc_cgi/dte/ee_consulta_empresas_dwnld?NOMBRE_ARCHIVO="+cfile
ncontador := 0
ometer:settotal( 10000 )
ometer:SET(0)
curlHandle:= curl_easy_init()
aHeader:={}
AAdd(aHeader,"Referer: https://palena.sii.cl/cvc_cgi/dte/ee_empresas_dte.html")
AAdd(aHeader,"Accept-Encoding: gzip, deflate, sdch")
AAdd(aHeader,"User-Agent: Mozilla/5.0") // (compatible; PROG 1.0; Windows NT 5.0; YComp 5.0.2.4)")
otext:settext("Descargando Archivo desde el SII")
IF .NOT. Empty(curlhandle)
curl_easy_setopt( curlhandle, HB_CURLOPT_HTTPHEADER,aHeader)
curl_easy_setopt( curlHandle, HB_CURLOPT_URL, cUrl )
curl_easy_setopt( curlHandle, HB_CURLOPT_SSLVERSION,3)
curl_easy_setopt( curlHandle, HB_CURLOPT_SSL_VERIFYPEER, .F. )
curl_easy_setopt( curlHandle, HB_CURLOPT_CONNECTTIMEOUT , 60 )
curl_easy_setopt( curlHandle, HB_CURLOPT_DL_FILE_SETUP, cdestino )
curl_easy_setopt( curlHandle, HB_CURLOPT_NOPROGRESS, 0 )
curl_easy_setopt( curlHandle, HB_CURLOPT_VERBOSE, .F. ) //lVerbose )
curl_easy_setopt( curlHandle, HB_CURLOPT_PROGRESSBLOCK, {| nPos, nLen |IF(ncontador>=10000,(ncontador:=0,sysrefresh()),ncontador++), ometer:SET( ncontador ) } )
/* Do everything */
curlErr := curl_easy_perform(curlHandle)
/* Report any errors */
if .NOT. empty(curlErr)
msgalert(curl_easy_strerror(curlErr),"Error")
ENDIF
curl_easy_reset( curlHandle )
ELSE
msgalert("No handle")
ENDIF
if !empty(curlHandle)
curl_easy_cleanup( curlHandle )
else
msgalert( "Error")
endif
RETURN cdestino
cFile := "C:\Acepta\DTEService\input\" + cTipo + "F" + LTRIM(TRANSFORM(nNumero,"@ZZZZZZZZ"))+ ".XML"
oPrn := TTxtFile():New( cFile )
IF oPrn:Open()
oPrn:Add( "<Documento>")
oPrn:Add( "<Encabezado>")
oPrn:Add("<IdDoc>")
oPrn:Add("<TipoDTE>" + (cTIDOCV)->Tipo + "</TipoDTE>")
oPrn:Add("<Folio>" + LTRIM(TRANSFORM(nNumero,"@ZZZZZZZZ")) + "</Folio>")
oPrn:Add("<FchEmis>" + cFecha + "</FchEmis>")
// oPrn:Add("<IndNoRebaja>" + "" + "</IndNoRebaja>")
IF (cTIDOCV)->Tipo = "52"
oPrn:Add("<TipoDespacho>" + "2" + "</TipoDespacho>") // Despacho por cuenta del emisor
// a intalaciones del cliente
IF SUBSTR((cTIDOCV)->Estado,1,1) = "T"
oPrn:Add("<IndTraslado>" + "6" + "</IndTraslado>") // 6=Otros traslados no venta
oPrn:Add("<FmaPago>" + "3" + "</FmaPago>") // 3=Sin Costo(entrega gratuita)
ELSE
oPrn:Add("<IndTraslado>" + "1" + "</IndTraslado>") // 1=Operacion constituye venta
oPrn:Add("<FmaPago>" + IF((cTIDOCV)->Dias_CR = 0,"1","2" ) + "</FmaPago>") // 1=Contado; 2=Credito; 3
ENDIF
ELSE
oPrn:Add("<FmaPago>" + IF((cTIDOCV)->Dias_CR = 0,"1","2" ) + "</FmaPago>") // 1=Contado; 2=Credito; 3
ENDIF
oPrn:Add("<FchVenc>" + cFVencim + "</FchVenc>")
oPrn:Add("</IdDoc>")
oPrn:Add("<Emisor>")
oPrn:Add("<RUTEmisor>" + LTRIM(cRutEmis) + "</RUTEmisor>")
oPrn:Add("<RznSoc>" + RTRIM((cPARAM)->Nombre) + "</RznSoc>")
oPrn:Add("<GiroEmis>" + RTRIM((cPARAM)->Giro) + "</GiroEmis>")
oPrn:Add("<Acteco>" + RTRIM((cPARAM)->Activid) + "</Acteco>")
oPrn:Add("<Sucursal>" + RTRIM((cPARAM)->Ciudad) + "</Sucursal>")
// oPrn:Add("<CdgSIISucur>" + "" + "</CdgSIISucur>")
oPrn:Add("<DirOrigen>" + RTRIM(LimpiaString((cPARAM)->Direcc)) + "</DirOrigen>")
oPrn:Add("<CmnaOrigen>" + RTRIM((cPARAM)->Ciudad) + "</CmnaOrigen>")
oPrn:Add("<CiudadOrigen>" + RTRIM((cPARAM)->Ciudad) + "</CiudadOrigen>")
oPrn:Add("<CdgVendedor>" + (cTIDOCV)->CodVen + "</CdgVendedor>")
oPrn:Add("</Emisor>")
oPrn:Close()
Return to FiveWin para Harbour/xHarbour
Users browsing this forum: Google [Bot] and 58 guests