Gracias por vuestras respuestas.
Saludos,
El Sistema SII afectará a unas 62.000 empresas que representan el 80% de la facturación total y que están obligadas a autoliquidar el IVA mensualmente.
Hola:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:vnif="http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV1Ent.xsd"> <soapenv:Header/> <soapenv:Body> <vnif:VNifV1Ent> <vnif:Nif>???????</vnif:Nif> <vnif:Nombre>???????</vnif:Nombre> </vnif:VNifV1Ent> </soapenv:Body></soapenv:Envelope>CertRuta
= FILETOSTR("Ruta del Certificado")
CERT
= STRCONV(CertRuta,13)
rror de identificación. No se detecta certificado digital o no se ha seleccionado correctamente
#DEFINE HTTPSTATUS_OK 200#DEFINE HTTPSTATUS_CREATED 201#DEFINE HTTPSTATUS_ACCEPTED 202#DEFINE HTTPSTATUS_MULTISTATUS 207#DEFINE HTTPSTATUS_BADREQUEST 400#DEFINE HTTPSTATUS_UNAUTHORIZED 401#DEFINE HTTPSTATUS_FORBIDDEN 403#DEFINE HTTPSTATUS_NOTFOUND 404#DEFINE HTTPSTATUS_INTERNALSERVERERROR 500
sError = ""iStatus = 0 pXMLResponse = "d:\respuesta.xml"
TEXT TO sXMLRequest TEXTMERGE NOSHOW <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:vnif="http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV1Ent.xsd"> <soapenv:Header/> <soapenv:Body> <vnif:VNifV1Ent> <vnif:Nif>22005188J</vnif:Nif> <vnif:Nombre>Paco Paco Paco</vnif:Nombre> </vnif:VNifV1Ent> </soapenv:Body> </soapenv:Envelope> ENDTEXT
TRY oHTTP = CREATEOBJECT('Msxml2.ServerXMLHTTP.6.0') *oHTTP = CREATEOBJECT('Msxml2.ServerXMLHTTP.3.0') oHTTP.OPEN("POST",cWS_Url,.F.) OHTTP.SetOption(2) = 13056 *oHTTP.SetOption(3) = "D:\Copia Certificado\Certificado_2017.pfx" oHTTP.setRequestHeader("SOAPAction", "EjecutandoWS desde VFP") oHTTP.setRequestHeader("Content-Type", "text/xml;charset=utf-8") oHTTP.SEND(sXMLRequest) && MANDO EL REQUEST QUE HAGO
CATCH TO loErr sError = "Error: " + TRANSFORM(loErr.ErrorNo) + " Mensaje: " + loErr.Message iStatus = -1 ENDTRY
IF iStatus != 0 RETURN -1ENDIF
IF oHTTP.STATUS = HTTPSTATUS_OK RespuestaWS = oHTTP.responseText STRTOFILE(STRCONV(RespuestaWS,9),pXMLResponse) iStatus = 0 sError = "" RETURN 0ELSE sError = "Error: No se logró la conexión con el Web Service." iStatus = -1 RETURN -1ENDIFLOCAL loHttpLOCAL lnSuccessLOCAL loCertLOCAL lcHtml
TEXT TO sXMLRequest TEXTMERGE NOSHOW <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:vnif="http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV1Ent.xsd"> <soapenv:Header/> <soapenv:Body> <vnif:VNifV1Ent> <vnif:Nif>????????X</vnif:Nif> <vnif:Nombre>XXXXXXXXXXXXXXXXXXXXXXXXXX</vnif:Nombre> </vnif:VNifV1Ent> </soapenv:Body> </soapenv:Envelope> ENDTEXT
loHttp = CreateObject('Chilkat_9_5_0.Http')
* Any string unlocks the component for the 1st 30-days.lnSuccess = loHttp.UnlockComponent("Anything for 30-day trial")IF (lnSuccess <> 1) THEN ? loHttp.LastErrorText RELEASE loHttp RETURN .F.ENDIF
loCert = CreateObject('Chilkat_9_5_0.Cert')
lcCert_Ruta="ruta completa al certificado.pfx"lcCert_Clave="Clavedelcertificado"
lnSuccess = loCert.LoadPfxFile(lcCert_Ruta,lcCert_Clave)IF (lnSuccess <> 1) THEN
=MESSAGEBOX("Problemas al leer el certificado")
*? loCert.LastErrorText release loHttp RELEASE loCert RETURN .F.ENDIF
loHttp.SetSslClientCert(loCert)
loHttp.setRequestHeader("SOAPAction", "EjecutandoWS desde VFP")loHttp.SetRequestHeader("Content-Type","text/xml; charset=utf-8")
loResp = loHttp.PostXml(cWS_Url,sXMLRequest,"utf-8")
IF (ISNULL(loResp)) THEN ? loHttp.LastErrorText ? "LastHeader:" ? loHttp.LastHeaderELSE lnResponseStatusCode = loResp.StatusCode * You may wish to verify that the responseStatusCode equals 200... ? "Response Status Code: " + STR(lnResponseStatusCode) * You may examine the exact HTTP header sent with the POST like this: ? "LastHeader:" ? loHttp.LastHeader * Examine the XML returned by the web service: ? "XML Response:" *? loResp.BodyStr loXmlResp = CreateObject('Chilkat_9_5_0.Xml') lnSuccess = loXmlResp.LoadXml(loResp.BodyStr) lcUnwrappedXml = loXmlResp.TagContent("VNifV1Sal:Nif") IF !EMPTY(lcUnwrappedXml) ? lcUnwrappedXml lcUnwrappedXml = loXmlResp.TagContent("VNifV1Sal:Nombre") ELSE lcUnwrappedXml = loXmlResp.TagContent("faultstring") IF !EMPTY(lcUnwrappedXml) ? lcUnwrappedXml ELSE ? "ERROR NO DETERNIMADO" ENDIF ENDIF RELEASE loXmlResp release loHttp RELEASE loCert *loXmlResp = CreateObject('Chilkat_9_5_0.Xml') *lnSuccess = loXmlResp.LoadXml(loResp.BodyStr) ENDIF#DEFINE HTTPSTATUS_OK 200#DEFINE HTTPSTATUS_CREATED 201#DEFINE HTTPSTATUS_ACCEPTED 202#DEFINE HTTPSTATUS_MULTISTATUS 207#DEFINE HTTPSTATUS_BADREQUEST 400#DEFINE HTTPSTATUS_UNAUTHORIZED 401#DEFINE HTTPSTATUS_FORBIDDEN 403#DEFINE HTTPSTATUS_NOTFOUND 404#DEFINE HTTPSTATUS_INTERNALSERVERERROR 500
sError = ""iStatus = 0 pXMLResponse = "d:\respuesta.xml"
TEXT TO sXMLRequest TEXTMERGE NOSHOW <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:vnif="http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV1Ent.xsd"> <soapenv:Header/> <soapenv:Body> <vnif:VNifV1Ent> <vnif:Nif>?????????</vnif:Nif> <vnif:Nombre>??????????????</vnif:Nombre> </vnif:VNifV1Ent> </soapenv:Body> </soapenv:Envelope> ENDTEXT
TRY oHTTP = CREATEOBJECT('Msxml2.ServerXMLHTTP.6.0') *oHTTP = CREATEOBJECT('Msxml2.ServerXMLHTTP.3.0') oHTTP.setOption(2) = 13056 oHTTP.setOption(3) = "CURRENT_USER\My\???????????????????????" && donde ????????????=nombre de tu certificado oHTTP.OPEN("POST",cWS_Url,.F.)
oHTTP.setRequestHeader("SOAPAction", "EjecutandoWS desde VFP") oHTTP.setRequestHeader("Content-Type", "text/xml;charset=utf-8") oHTTP.SEND(sXMLRequest) && MANDO EL REQUEST QUE HAGO
CATCH TO loErr sError = "Error: " + TRANSFORM(loErr.ErrorNo) + " Mensaje: " + loErr.Message iStatus = -1 ENDTRY
IF iStatus != 0 RETURN -1ENDIF
IF oHTTP.STATUS = HTTPSTATUS_OK RespuestaWS = oHTTP.responseText lcUnwrappedXml = STREXTRACT(RespuestaWS,'<VNifV1Sal:Nif>','</VNifV1Sal:Nif>') IF !EMPTY(lcUnwrappedXml) ? "Verificado OK "+lcUnwrappedXml lcUnwrappedXml = STREXTRACT(RespuestaWS,'<VNifV1Sal:Nombre>','</VNifV1Sal:Nombre>') ? lcUnwrappedXml ELSE lcUnwrappedXml = STREXTRACT(RespuestaWS,'<faultstring>','</faultstring>') IF !EMPTY(lcUnwrappedXml) ? lcUnwrappedXml ELSE ? "ERROR NO DETERNIMADO" ENDIF ENDIF * STRTOFILE(STRCONV(RespuestaWS,9),pXMLResponse)oWS = CREATEOBJECT( "VFP_WebService","https://www1.agenciatributaria.gob.es/wlpl/BURT-JDIT/ws/VNifV1SOAP?wsdl")
lcRespuesta = oWS.GetWeather("B66666666","NOMBRE EMPRESA")
IF oWS.iStatus != 0
MESSAGEBOX(oWS.sError,16,"Error al ejecutar WS")
ELSE
MESSAGEBOX(lcRespuesta,64,"EjecutandoWS desde VFP - PortalFOX")
ENDIF
DEFINE CLASS VFP_WebService AS CUSTOM
* --- Definimos las propiedades ---
sError = ""
iStatus = 0
sURL_WS = ""
* --- Definimos la función del WebService ---
FUNCTION GetWeather (TcNif, TcNom)
* --- Paso 1. Creo el XML Request ---
sXMLRequest = this.CreaRequest(TcNif, TcNom)
pXMLResponse = ADDBS(SYS(2023)) + SYS(2015) + [.xml]
* --- Paso 2. Ejecuto el WS | Paso 3. Obtengo el Response ---
this.iStatus = this.EjecutaWS( this.sURL_WS, sXMLRequest , pXMLResponse )
IF this.iStatus != 0 && Ocurrió un error el cual está especificado en sError.
RETURN ""
ENDIF
sXMLResponse = FILETOSTR(pXMLResponse)
* --- Parseamos el XML Response ---
* --- Para el ejemplo está así, manejando texto, ustedes deben manejar XML (falta de tiempo, perdón) ---
sRespuestaWS = "N.I.F.:"+CHR(9)+ STREXTRACT(sXMLResponse,'VNifV1Sal:Nif>','</VNifV1Sal:Nif')+CHR(13)+CHR(10)
sRespuestaWS = sRespuestaWS +"Nombre:"+CHR(9)+ ALLTRIM(STREXTRACT(sXMLResponse,':Nombre>','</VNifV1Sal:Nombre'))+CHR(13)+CHR(10)
sRespuestaWS = sRespuestaWS +"Enviado:"+CHR(9)+"NOMBRE EMPRESA"
this.borraArchivo(pXMLResponse)
RETURN sRespuestaWS
ENDFUNC
*---------------------------------------------------
FUNCTION EjecutaWS(pURL_WSDL, pFileRequest , pFileResponse )
*---------------------------------------------------
TRY
oHTTP = CREATEOBJECT('Msxml2.ServerXMLHTTP.6.0')
oHTTP.OPEN("POST", pURL_WSDL, .F.)
oHTTP.setRequestHeader("User-Agent", "EjecutandoWS desde VFP - PortalFOX")
oHTTP.setRequestHeader("Content-Type", "text/xml;charset=utf-8")
oHTTP.SEND(pFileRequest)
CATCH TO loErr
this.sError = "Error: " + TRANSFORM(loErr.ErrorNo) + " Mensaje: " + loErr.Message
this.iStatus = -1
ENDTRY
IF this.iStatus != 0
RETURN -1
ENDIF
* --- Si el status es diferente a 200, ocurrió algún error de conectividad con el WS ---
IF oHTTP.STATUS = 200
RespuestaWS = oHTTP.responseText
* --- Se genera el XML del response | Este es el paso 3!! ---
STRTOFILE(STRCONV(RespuestaWS,9),pXMLResponse)
this.iStatus = 0
this.sError = ""
RETURN 0
ELSE
this.sError = "Error: No se logró la conexión con el Web Service."
this.iStatus = -1
RETURN -1
ENDIF
ENDFUNC
*---------------------------------------------------
*---------------------------------------------------
FUNCTION CreaRequest(TcNif, TcNom)
*---------------------------------------------------
TEXT TO sXMLRequest TEXTMERGE NOSHOW
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:vnif="http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV1Ent.xsd">
<soapenv:Header/>
<soapenv:Body>
<vnif:VNifV1Ent>
<vnif:Nif>B66666666</vnif:Nif>
<vnif:Nombre>NOMBRE EMPRESA</vnif:Nombre>
</vnif:VNifV1Ent>
</soapenv:Body>
</soapenv:Envelope>
ENDTEXT
RETURN sXMLRequest
ENDFUNC
*---------------------------------------------------
*---------------------------------------------------
FUNCTION BorraArchivo(pFile)
*---------------------------------------------------
IF FILE(pFile)
DELETE FILE (pFile)
ENDIF
ENDFUNC
*---------------------------------------------------
*---------------------------------------------------
* Evento constructor
PROCEDURE Init
*---------------------------------------------------
LPARAMETERS tcURLWS
this.sURL_WS = tcURLWS
this.iStatus = 0
this.sError = ""
ENDPROC
*---------------------------------------------------
ENDDEFINE
oHTTP.setOption(3) = "CURRENT_USER\My\???????????????????????" && donde ????????????=nombre de tu certificado
<font color="#0000ff" face="Cour
La presentación podrá ser efectuada por el obligado tributario, un apoderado suyo a este trámite ó un colaborador social, que deberá disponer de un certificado electrónico reconocido. Las aplicaciones que envían información a los servicios web deberán autenticarse con el certificado electrónico de cliente. Por tanto, el uso de los servicios requiere tener instalado un certificado electrónico reconocido admitido por la Agencia Tributaria, en el ordenador desde el que se produzca el envío de la información. Dicho certificado podrá ser de Persona Física ó de Persona Jurídica. Todos los NIFs se tienen que validar contra la Base de Datos Centralizada de la AEAT. "
y al final
4.3. Medio de envío.
Entorno: Internet.
Protocolo: HTTPS.
Mensajes: Web Service con SOAP 1.1 modo Document.
Certificado: Las aplicaciones que envían información a los servicios web deberán autenticarse con certificado electrónico de cliente. El uso de los servicios requiere tener instalado un certificado electrónico reconocido admitido por la Agencia Tributaria, en el ordenador desde el que se produzca el envío de la información.
Firma: Los XML intercambiados no irán firmados "
saludos
thisform.memoxml.edit1.value="" && esto es un edit que va a contener la consulta que se puede enviar al WS
loXML = CREATEOBJECT("aeat_sii")loXML.str_version="0.6"loXML.str_nombrefis= XXXXXXXXXXXXXXX && nombre de la empresa que realiza la declaraciónloXML.str_nif=XXXXXXXXXX && cif de la empresaloXML.str_tipocom="A0" && A0=Alta /A1=Modficación / A4=Modif. factura regimen viajeros
SELECT C_SII && cursor que contiene registros repercutidos a declararSCAN ALL && poner datos
loXML.str_fecha_factura=C_SII.fecha_fac && campo fecha loXML.str_serie=C_SII.documento && campo documento IF C_SII.importe_total>0 && campo importe total loXML.str_tipo_factura_emitida="F1" && segun tabla L2_EMI F1=Factura,F2=Simplificada,R1=Rectificativa etc... ELSE loXML.str_tipo_factura_emitida="R1" ENDIF && ojo falta ver tema de exportación etc aqui solo contemplo caso nacional loXML.str_clave_regimen_especial_emitida="01" && 01=Operación de regimen común, 02=Exportación etc...
loXML.n_importe_total_emitida = C_SII.importe_total && campo importe total factura loXML.str_descripcion_operacion_emitida="VENTA DE MERCADERIAS O SERVICIOS" && esto no creo que la gente lo ponga loXML.str_nombre_contraparte_emitida = C_SII.nombrefiscal && nombre fiscal del cliente loXML.str_pais_emitida = C_SII.pais && contiene el codigo del pais && codigo pais del cliente loXML.str_nif_contraparte_emitida = C_SII.cif && cif del cliente loXML.str_idtype="02" && por si no es nacinal tipo de identificador es NIF-IVA loXML.e_fiscal() && monto parte de <sum1:Contraparte> por la clase
select ........(saco las bases los % y los recargos del registro)..... INTO CURSOR C_IVAS NOCONSOLE NOWAIT IF _tally>0 && SI HAY LINEAS SELECT C_IVAS loXML.str_tipo_No_Exenta="S1" SCAN ALL loXML.n_tipo_impositivo=C_IVAS.por_iva && porcentaje de iva loXML.n_base_imponible=C_IVAS.baseimp && base imponible loXML.n_cuota_repercutida=C_IVAS.imp_iva && importe iva loXML.n_tipo_recargo_equivalencia=C_IVAS.por_req && porcentaje recargo equ. loXML.n_cuota_recargo_equivalencia=C_IVAS.imp_req && importe recargo loXML.f_desglose_factura() && va generando esta seccion ENDSCAN ENDIF SELECT C_SII loXML.d_Registrofactura() && añade registros para cada facturaENDSCANloXML.a_Raiz() && añade todo al globalthisform.memoxml.edit1.value=loXML.str_raiz && lo asigno al edit box para ver resultadothisform.refresh#DEFINE HTTPSTATUS_OK 200
sError = ""
iStatus = 0
TRY oHTTP = CREATEOBJECT('Msxml2.ServerXMLHTTP.6.0') oHTTP.setOption(2) = 13056
oHTTP.setOption(3) = "CURRENT_USER\My\XXXXXXXXXXXXXXXXXXXXX" && donde XXXXXXX es el nombre del certificado oHTTP.OPEN("POST",cWS_Url,.F.)
oHTTP.setRequestHeader("SOAPAction", "EjecutandoWS desde VFP") oHTTP.setRequestHeader("Content-Type", "text/xml;charset=utf-8") oHTTP.SEND(thisform.memoxml.edit1.value) && MANDO EL REQUEST QUE HAGO
CATCH TO loErr sError = "Error: " + TRANSFORM(loErr.ErrorNo) + " Mensaje: " + loErr.Message iStatus = -1 ENDTRY
IF iStatus != 0 RETURN -1ENDIF
IF oHTTP.STATUS = HTTPSTATUS_OK RespuestaWS = oHTTP.responseText IF MESSAGEBOX("Mostrar Resultado",4+32,"Atención")=6 thisform.memoxml.edit2.value=RespuestaWS && muestro el resultado ENDIF iStatus = 0
sError = "" RETURN 0ELSE sError = "Error: No se logró la conexión con el Web Service." iStatus = -1 RETURN -1ENDIFSTREXTRACT(loCertificate.Subject, "CN=", "," , 1)
do wwDotNetBridgeLOCAL loBridge as wwDotNetBridgeloBridge = CreateObject("wwDotNetBridge","V4")
*** Create an instance of 509StoreloStore = loBridge.CreateInstance("System.Security.Cryptography.X509Certificates.X509Store")
*** Grab a static Enum valueleReadOnly = loBridge.GetEnumvalue("System.Security.Cryptography.X509Certificates.OpenFlags","ReadOnly")
*** Open the certificate store - results into loStore.CertificatesloStore.Open(leReadOnly)
*** Collection of CertificateslaCertificates = loStore.Certificates
*** Collections don't work over regular COM Interop*** so use indirect accesslnCount = loBridge.GetProperty(laCertificates,"Count")
*** Loop through CertificatesFOR lnX = 1 TO lnCount -1 *** Access collection item indirectly LOCAL loCertificate as System.Security.Cryptography.X509Certificates.X509Certificate2 loCertificate = loBridge.GetPropertyEx(loStore,"Certificates[" + TRANSFORM(lnX) + "]") IF !ISNULL(loCertificate) a=loCertificate.Subject ? SUBSTR(A,4,AT(",",A,1)-4) ENDIFENDFOR
RETURN
FUNCTION LeerXML LPARAMETERS cXMLFile LOCAL oXML, oRootNode, cParentName, cValue, cName, nType, nNumNodes, ; cRootTagName, oNodeList, oNode, bHasChild, cTagName, ; oChildNodeList, nChildLen, nPass, oChildNode, oAttributeList, ; cTextData, nTextDataLen, cAttrName, cAttrValue, nNumAttr
oXML = CREATEOBJECT('MSXML2.DomDocument.3.0') oXML.ASYNC = .F. oXML.LOADXml(cXMLFile) oRootNode = oXML.documentElement cRootTagName = oRootNode.tagName oNodeList = oRootNode.getElementsByTagName("*") nNumNodes = oNodeList.LENGTH
FOR nPos = 0 TO (nNumNodes-1) STEP 1 * Get the next node in the list oNode = oNodeList.ITEM(nPos) cParentName = oNode.nodeName bHasChild = oNode.hasChildNodes() nType = oNode.nodeType IF bHasChild IF oNode.firstChild.nodeType != 1
cParentName = oNode.nodeName
cValor=oNode.text ? cParentName+" -> "+cValor ENDIF ENDIF ENDFOR RETURNENDFUNC
Gracias Francisco por la clase que has colgado, es fantástica. La he estado probando y funciona muy bien. Lo que le he encontrado es una tontería. Es la propiedad de la clase loXML.str_desglose_facturas que debería dejarse en blanco al inicio de cada factura, ya que si no va arrastrando los ivas de las facturas anteriores.
Otra cosa que he visto, es que en el ejemplo no contemplas las bases exentas ni la codificación específica de las rectificativas, que hay que poner el nº de la factura rectificada y su fecha, (normal para ser una primera aproximación). He modificado la clase para incluir estas dos opciones, si queréis os pongo en otro post como lo he solucionado.
str_ini_no_exenta =""
str_ini_exenta=""
str_desglose_facturas=""
str_fin_exenta=""
str_rectificada=""
str_factura_rectificada=""
str_fecha_factura_rectificada=""
Definir los métodos :
f_desglose_exenta
LOCAL lcCadena,lcCadena1,pcAvanlin
TEXT TO lcCadena NOSHOW TEXTMERGE
<sum1:BaseImponible><<this.dame_numero(this.n_base_imponible)>></sum1:BaseImponible>
ENDTEXT
pcAvanlin=this.salto_de_linea
this.str_fin_exenta = IIF(this.str_fin_exenta == "", lcCadena, this.str_fin_exenta + &pcAvanlin + lcCadena)
f_pon_exenta
LOCAL lcCadena,pcAvanlin
TEXT TO lcCadena NOSHOW TEXTMERGE
<sum1:Exenta>
<sum1:CausaExencion><<this.str_tipo_Exenta>></sum1:CausaExencion>
<<this.str_fin_exenta>>
</sum1:Exenta>
ENDTEXT
this.str_ini_exenta=lcCadena
f_pon_no_exenta
LOCAL lcCadena,pcAvanlin
TEXT TO lcCadena NOSHOW TEXTMERGE
<sum1:NoExenta>
<sum1:TipoNoExenta><<this.str_tipo_No_Exenta>></sum1:TipoNoExenta>
<sum1:DesgloseIVA>
<<this.str_desglose_facturas>>
</sum1:DesgloseIVA>
</sum1:NoExenta>
ENDTEXT
this.str_ini_no_exenta=lcCadena
f_pon_rectificada
LOCAL lcCadena,pcAvanlin
TEXT TO lcCadena NOSHOW TEXTMERGE
<sum1:TipoRectificativa>I</sum1:TipoRectificativa>
<sum1:FacturasRectificadas>
<sum1:IDFacturaRectificada>
<sum1:NumSerieFacturaEmisor><<this.str_factura_rectificada>></sum1:NumSerieFacturaEmisor>
<sum1:FechaExpedicionFacturaEmisor><<this.str_fecha_factura_rectificada>></sum1:FechaExpedicionFacturaEmisor>
</sum1:IDFacturaRectificada>
</sum1:FacturasRectificadas>
ENDTEXT
this.str_rectificada=lcCadena
En el método d_registrofactura he modificado
Antes
****<sum:FacturaExpedida>
****<sum1:TipoFactura><<this.str_tipo_factura_emitida>></sum1:TipoFactura>
Ahora
<sum:FacturaExpedida>
<sum1:TipoFactura><<this.str_tipo_factura_emitida>></sum1:TipoFactura> <<this.str_rectificada>>
Antes
****<sum1:Sujeta>
****<sum1:NoExenta>
****<sum1:TipoNoExenta><<this.str_tipo_No_Exenta>></sum1:TipoNoExenta>
****<sum1:DesgloseIVA>
****<<this.str_desglose_facturas>>
****</sum1:DesgloseIVA>
****</sum1:NoExenta>
****</sum1:Sujeta>
Ahora
<sum1:Sujeta>
<<this.str_ini_no_exenta>><<this.str_ini_exenta>>
</sum1:Sujeta>
En el programa que llama a la clase...
Al leer cada factura
loXML.str_ini_no_exenta =""
loXML.str_ini_exenta=""
loXML.str_desglose_facturas=""
loXML.str_fin_exenta=""
m.Haynoexen = .F.
m.Hayexentas=.F.
IF la factura es rectificativa
loXML.str_fecha_factura_rectificada= && campo fecha factura rectificada
loXML.str_factura_rectificada= && campo nº factura rectificada
loXML.f_pon_rectificada()
loXML.str_rectificada=CHR(13)+CHR(10) +loXML.str_rectificada
else
loXML.str_fecha_factura_rectificada= ""
loXML.str_factura_rectificada= ""
loXML.str_rectificada=""
endif
** Para el tema de exentas y no exentas
En la lectura de bases y cuotas si las bases son # 0:
IF loXML.n_cuota_repercutida#0 && importe iva
lo que hace +
m.HAYNOEXEN=.T.
ELSE
loXML.n_base_imponible = loXML.n_base_imponible&& base imponible
loXML.f_desglose_exenta() && va generando esta sección
m.HAYEXENTAS=.T.
ENDIF
una vez leído todas las bases y cuotas
IF m.HAYNOEXEN
loXML.f_pon_no_exenta() && va generando esta sección
loXML.str_tipo_No_Exenta="S1"
ENDIF
IF m.HAYEXENTAS
loXML.str_tipo_Exenta="E4" && Lo que corresponda al tipo de exención, canarias comunitario, exportación
loXML.f_pon_exenta() && va generando esta seccion
IF m.Haynoexen
loXML.str_ini_exenta = CHR(13)+CHR(10) + loXML.str_ini_exenta
ENDIF
ENDIF
Y me parece que ya está
Saludos
ENDIF
* CREO EL CURSOR
CREATE CURSOR Cur_RESULTADO (Estado C(30),CIF C(20),NOMBREFIS C(80),Documento c(80),Fecha_DOC D,IMPORTE_TOTAL N(16,6), FECHA_PRE C(40),FECHA_MOD C(40))
* Start out by creating the actual xml parser objectoXML = CREATEOBJECT('MSXML2.DomDocument.3.0')oXML.ASYNC = .F.oXML.LOADXml(thisform.xml_devuelto)oRootNode = oXML.documentElementcRootTagName = oRootNode.tagNameoNodeList = oRootNode.getElementsByTagName("*")nNumNodes = oNodeList.LENGTH
FOR nPos = 0 TO (nNumNodes-1) STEP 1 * Get the next node in the list oNode = oNodeList.ITEM(nPos) cParentName = oNode.nodeName cNodo_Padre = ALLTRIM(oNode.ParentNode.nodeName) bHasChild = oNode.hasChildNodes() nType = oNode.nodeType IF bHasChild IF oNode.firstChild.nodeType != 1 cParentName = ALLTRIM(oNode.nodeName) cValor=oNode.text DO CASE CASE cParentName=="sii:NumSerieFacturaEmisor" INSERT INTO Cur_RESULTADO (Documento) VALUES (cVALOR) CASE cParentName=="sii:FechaExpedicionFacturaEmisor" REPLACE Fecha_DOC WITH CTOD(cVALOR) IN Cur_RESULTADO CASE cParentName=="siiLRRC:EstadoRegistro" REPLACE Estado WITH cVALOR IN Cur_RESULTADO CASE cParentName=="sii:NIF" AND cNodo_Padre=="siiLRRC:Contraparte" REPLACE CIF WITH cVALOR IN Cur_RESULTADO CASE cParentName=="sii:NombreRazon" AND cNodo_Padre=="siiLRRC:Contraparte" REPLACE NOMBREFIS WITH cVALOR IN Cur_RESULTADO CASE cParentName=="siiLRRC:ImporteTotal" AND cNodo_Padre=="siiLRRC:DatosFacturaEmitida" REPLACE IMPORTE_TOTAL WITH VAL(cVALOR) IN Cur_RESULTADO CASE cParentName=="sii:TimestampPresentacion" REPLACE FECHA_PRE WITH cVALOR IN Cur_RESULTADO CASE cParentName=="siiLRRC:TimestampUltimaModificacion" REPLACE FECHA_MOD WITH cVALOR IN Cur_RESULTADO ENDCASE *? cParentName+" -> "+cValor ENDIF ENDIFENDFORGO TOP IN CUR_RESULTADOHola Francisco, pedias XML de emitidas exportación. Hoy al fin !!!! he conseguido que aeat me acepte un XML de pruebas de exportación. Vaya por delante que según los errores que me ha ido dando aeat, las fras de exportación, tanto comunitarias como extranjero, se han de hacer en "TipoDesglose" como "DesgloseTipoOperacion" y no como "DesgloseFactura" que si acepta para las facturas nacionales. Otra cosa que he encontrado en las fras de exportación, es que aunque no se tenga un 'Nif' identificativo por lo se pone un 06 en idtype, hay que poner algo en el ID, yo pongo el código cliente. Mañana os pondré una comunitaria con servicios y entregas. Saludos
Hola:
Hola Marian
Hola Marian
<sum:FacturaExpedida> <sum1:TipoFactura>F1</sum1:TipoFactura><sum1:ClaveRegimenEspecialOTrascendencia>02</sum1:ClaveRegimenEspecialOTrascendencia><sum1:ImporteTotal>125.00</sum1:ImporteTotal><sum1:DescripcionOperacion>VENTAS O SERVICIOS DE EMPRESA</sum1:DescripcionOperacion><sum1:Contraparte> <sum1:NombreRazon>CLIENTE EXTRANGERO PRUEBA</sum1:NombreRazon> <sum1:IDOtro> <sum1:CodigoPais>SA</sum1:CodigoPais><sum1:IDType>06</sum1:IDType><sum1:ID>AR45455666667</sum1:ID> </sum1:IDOtro></sum1:Contraparte><sum1:TipoDesglose><sum1:DesgloseTipoOperacion><sum1:Entrega><sum1:Sujeta><sum1:Exenta><sum1:CausaExencion>E2</sum1:CausaExencion><sum1:BaseImponible>125.00</sum1:BaseImponible></sum1:Exenta></sum1:Sujeta>
</sum1:Entrega>
</sum1:DesgloseTipoOperacion></sum1:TipoDesglose></sum:FacturaExpedida>Hola:
Hola:
Hola a todos y gracias otra vez por las soluciones i aclaraciones
Hola a todos
Hola:
Y la otra es en facturas recibidas intracomunitarias, si las que son de servicios hay que ponerlas en "Inversión del sujeto pasivo" como en el 340?
Hola:
Hola: