Buenas
Os dejo aqui un trabajo inicial, que espero podais continuar , es un boceto de como debería hacerse.
Tiene 2 partes,
1) Parte. Conexion por SOAPClient
El ejemplo tiene una ejemplo de como obtener una semilla a través de Soap, esto os debe de abrir la mente de como
podéis hacer la comunicacion.
2) Boceto de construccion del XML EnvioDTE. Teneis la base sobre la que trabajar, por si os corre prisa.
Ojo, no está ni mucho menos acabada, pero es para que os hagais una idea de como hacer clases independientes por cada
seccion del XSD, de esta manera, el mantenimiento es super sencillo.
Podeis ver como los objetos se llaman unos a otros para escribir cada uno su parte del XML, en cascada.
3) Tema de Cifrado, hay que buscar ayuda de como usar openssl. MI CONSEJO es usarlo EXTERNO a la aplicacion,
de lo contrario, os aseguro que como en el sistema exista algún OpenSSL con una version distintas, el sufrimiento no merece
la pena
Por lo que poco que he visto , creo que funciona muy similar al de Portugal, pero no me hacerme mucho caso, porque no
he podido apenas mirar nada.
Espero que os ayude un poco.
Nota:
#SOPORTE PARA MXML
MXML_LIB=$(HARBOUR_LIB_DIR)\mxml.lib
HB_MXML_LIB=$(HARBOUR_LIB_DIR)\hbmxml.lib
- Code: Select all Expand view
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