Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice (https://www.clubdelphi.com/foros/showthread.php?t=91252)

keys 31-01-2017 09:56:39

Cuando el emisor de una factura es español hay que rellenar solo la parte de contraparte el nombre y el cif. La parte del idotro es para cuando no es nacional.

<sii:Contraparte>
<sii:NombreRazon>EMPRESAYYYYYYYY</sii:NombreRazon>
<sii:NIF>94234500B</sii:NIF>
</sii:Contraparte>

seccion_31 31-01-2017 10:35:41

Hola !

Para keys, necesitaría un ejemplo de los objetos que creáis para introducir una factura de exportación o intracomunitaria.


En mi ejemplo para facturas emitidas:
ARegistroLRFacturasEmitidas[ i ].FacturaExpedida.TipoDesglose.desglosefactura.sujeta.noexenta.desgloseIVA


¿para exportación ?


¿para intracomunitaria?



Virman: Si, van en unidades separadas, pero es lo mismo. El problema es que todavía no conecta con la AEAT. Yo sigo con el anterior hasta el 7 de febrero.
Virman: estoy empezando con las recibidas. tardare en llegar ahí, por dificultades con mi fichero de facturas recibidas.
Keys: ¿has probado a enviar mas de 15 facturas emitidas a la vez?

newtron 31-01-2017 11:11:09

Cita:

Empezado por keys (Mensaje 512779)
Hola a todos!

Yo en vez de utilizar la unit Soap.SOAPHTTPTrans.pas que va en el ejemplo utilizo la unit que viene con delphi. Esta unit no tiene la opción de añadir el certificado directamente, lo que hago es asignarlo a un objeto THTTPRIO, de esta forma no dependo de esta unit que no se si funcionará en futuras versiones de delphi.

No se por que en el ejemplo se utilizó una propia en vez de la de delphi.

Un Saludo.

¿Y cómo haces esa asignación?

Saludos

keys 31-01-2017 11:37:44

Hola para hacer la asignacion hago lo siguiente.

Tengo un objeto HttpPRIO que se le asigna el numero de serie del certificado.

Código Delphi [-]
  Objeto.HTTPWebNode.ClientCertificate.SerialNum := BuscarCertificado;


Código Delphi [-]
//Esta funcion devuelve el Numero de serie del certificado pasandole el nombre del certificado.
//Para ello tengo un combo donde cargo todos los certificados instalados.

function BUSCAR_CERTIFICADO(Nombre_Certificado: String): string;
var
  hStore: HCERTSTORE;
  PrevContext, CurContext: PCERT_CONTEXT;
  cbSize: DWORD;
  sNombre: String;
begin
  Result := '';
  hStore := CertOpenSystemStore(0, PChar('MY'));
  if hStore <> nil then begin
     PrevContext := nil;
     CurContext := CertEnumCertificatesInStore(hStore, PrevContext);
     while CurContext <> nil do begin
       sNombre := '';
       cbSize := CertGetNameString(CurContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, nil, 0);
       if cbSize > 0 then  begin
          SetLength(sNombre, cbSize-1);
          CertGetNameString(CurContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, PChar(sNombre), cbSize);
           if SameText(Nombre_certificado, sNombre) then
             begin
               REsult := GetCertSerialNumber(@CurContext^.pCertInfo^.SerialNumber);
               break;
            end;
       end;
       PrevContext := CurContext;
       CurContext  := CertEnumCertificatesInStore(hStore, PrevContext);
     end;
  end;
end;

A la hora de hacer el envio se hace de la siguiente manera

Código Delphi [-]
  resultado := GetsiiSOAP(True, '', OBJETO HTTPTRIO).SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);

newtron 31-01-2017 11:49:10

Ok.

Lo suyo sería subir un ejemplo como los anteriores ya pasado a la nueva versión 0.5 y si es posible sin modificar el Soap.SOAPHTTPTrans.pas que, como bien dices, es mejor usar el estándar. ¿Algo así disponible?

Saludos

CMB 31-01-2017 11:57:52

Cita:

Empezado por Virman (Mensaje 512780)
Tengo problemas para el envío de facturas recibidas, que me dice: Valor o tipo incorrecto del campo: NIF.
Revisando los campos para el emisor de la factura (el que nos la envía a nosotros por ser factura recibida), veo que no hay campo NIF, teniendo que usar obligatoriamente el campo IdOtro.
Yo lo hago así:
IDFacturaRecibidaType idFact = new IDFacturaRecibidaType(); //IDFACTURA
IDFacturaRecibidaTypeIDEmisorFactura emisorFactura = new IDFacturaRecibidaTypeIDEmisorFactura(); //emisorFactura
IDOtroType idOtro = new IDOtroType();
idOtro.CodigoPais = ((CountryType2)(202)); //España
idOtro.IDType = ((PersonaFisicaJuridicaIDTypeType)(00)); //00 -> 02(NIF - IVA)
idOtro.ID = "XXXXXXXXX"; //Aqui pongo X por no poner un NIF real
emisorFactura.Item = idOtro;
idFact.IDEmisorFactura = emisorFactura;

¿No os parece que sería más sencillo crear un fichero XML que incluya todas las facturas a enviar? Siguiendo el esquema y ejemplos del documento "SII_Descripcion_ServicioWeb_v0.5.pdf".

Luego se envía el XML por webservice y se recoge la respuesta. Menos código a escribir. ¿Alguien lo ha probado?

Saludos,

seccion_31 31-01-2017 12:17:10

CMB al final lo que envias es un XML igualito al que tu compones. Lo que te ahorra el interface es componer el XML a mano.

En posteos anteriores puse como enviar tu propio XML, y guardar el que genera el HTTPRIO1 es igual de fácil:

llamando asi:

Código:

result := GetsiiSOAP(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);
ejecutara los eventos:


Código:

procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string;
  SOAPResponse: TStream);
var
  ss:TFileStream;
begin
    ss:=TFileStream.Create('C:\recibido.xml', fmCreate);
    SOAPResponse.Position := 0;
    ss.CopyFrom(SOAPResponse, SOAPResponse.size);
    ss.Free;
    SOAPResponse.Position := 0;
end;

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
var
  ss:TFileStream;
begin
    SOAPRequest.Size:=0;
    ss:=TFileStream.Create('C:\enviado.xml', fmOpenRead);
    SOAPRequest.Position := 0;
    SOAPRequest.CopyFrom( ss, ss.Size);
    ss.Free;

    SOAPRequest.Position := 0;

end;


keys, a ver si me prestas un poco de atención, please... ;) ¿has podido enviar mas de 15 facturas en un bloque?

CMB 31-01-2017 12:21:38

Cita:

Empezado por seccion_31 (Mensaje 512797)
CMB al final lo que envias es un XML igualito al que tu compones. Lo que te ahorra el interface es componer el XML a mano.
En posteos anteriores puse como enviar tu propio XML, y guardar el que genera el HTTPRIO1 es igual de fácil:
llamando asi:
Código:

result := GetsiiSOAP(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);
ejecutara los eventos:

Parece que llevas razón, seccion_31. Muchas gracias.

Saludos,

keys 31-01-2017 12:23:18

Cita:

Empezado por newtron (Mensaje 512793)
Ok.

Lo suyo sería subir un ejemplo como los anteriores ya pasado a la nueva versión 0.5 y si es posible sin modificar el Soap.SOAPHTTPTrans.pas que, como bien dices, es mejor usar el estándar. ¿Algo así disponible?

Saludos

Subo un ejemplo para utilzar las units de delphi en vez de las que tiene el ejemplo anterior. En cuanto a la versión 0.5 parece que no funciona de momento.



Para CMB no te tengo olvidado estoy en ello. De momento me estaba pegando con una sola factura. En cuanto lo pruebe te digo.

keys 31-01-2017 13:41:36

Cita:

Empezado por seccion_31 (Mensaje 512797)
CMB a


keys, a ver si me prestas un poco de atención, please... ;) ¿has podido enviar mas de 15 facturas en un bloque?

He generado un bloque de más de 15 facturas y me ha pasado lo mismo que a ti, me ha dado errores de certificado. Ahora intento enviar una sola y me da un error "NO HA PODIDO GENERARSE LA FIRMA". No se si me han bloqueado el certificado o es que están haciendo cambios y por eso no funciona. He estado enviando facturas toda la mañana sin ningún problema.

Alguien puede hacer la prueba de enviar ahora una factura y ver si le funciona.

Gracias

newtron 31-01-2017 14:07:26

Cita:

Empezado por keys (Mensaje 512807)
He generado un bloque de más de 15 facturas y me ha pasado lo mismo que a ti, me ha dado errores de certificado. Ahora intento enviar una sola y me da un error "NO HA PODIDO GENERARSE LA FIRMA". No se si me han bloqueado el certificado o es que están haciendo cambios y por eso no funciona. He estado enviando facturas toda la mañana sin ningún problema.

Alguien puede hacer la prueba de enviar ahora una factura y ver si le funciona.

Gracias

Yo acabo de enviar una sin problemas.

seccion_31 31-01-2017 14:40:06

Acabo de enviar una sin problemas.

Saludos !

keys 31-01-2017 15:17:13

Hola a todos. Ya vuelvo a poder enviar, yo creo que la página de la aeat se ha quedado un rato frita.

Si intento enviar 13 facturas o más me sale el siguiente error.

"Se requiere un certificado para completar la autenticación de cliente - URL:https://www1.agenciatributaria.gob.e...SiiFactV1PSOAP - SOAPAction"

Mandaré la pregunta a hacienda para ver si algún día responde.

seccion_31 31-01-2017 16:52:57

Ese es el error que me sale a mi.

Envio ahora mismo la pregunta también.

newtron 31-01-2017 17:32:08

Esperaremos a ver qué pasa con la nueva versión, ahora yo tengo dos preguntas:

1-¿Por qué usar el componente HTTPRIO en vez de crearlo de forma dinámica? ¿alguna ventaja?
2-¿Usando el componente HTTPRIO en la nueva versión habrá que crear tantos como ficheros WSDL?

Saludos

Neftali [Germán.Estévez] 31-01-2017 17:43:01

Dado que es un tema interesante, de actualidad y que cada vez me da la impresión de que se lo van a encontrar más personas del grupo lo he "Chincheteado".

newtron 31-01-2017 18:14:06

Cita:

Empezado por Neftali (Mensaje 512830)
Dado que es un tema interesante, de actualidad y que cada vez me da la impresión de que se lo van a encontrar más personas del grupo lo he "Chincheteado".

Me parece muy correcto.

seccion_31 01-02-2017 08:18:27

Me han contestado de la aeat, diciéndome que "se esta tramitando..."

Pero el encabezado de respuesta era sospechosamente este:

"Re: [Posible SPAM] Error al enviar 13 o mas facturas"

uuummm....

lo han dividido para dividir por usos... igual piensan que es mejor por si alguien no usa recibidas, y si emitidas....

Si usas la llamada:

Código:

result := GetsiiSOAP(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);
necesitas indicar en el httipro el WSDLLOCATION

Si usas:

Código:

result := GetsiiSOAP.SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);
Te sirve sin ningún httipro, es mas: ! lo puedes quitar del form !

Pero cuidado, con el nuevo interface 0.5 el puerto que tienen puesto es el real, fijaros en la función GetsiiSOAP

Saludos !

RafaSerMed 01-02-2017 09:57:47

content-type
 
Hola a todos.

Lo primero agradecer enormemente a todos los que están colaborando con este hilo (y obviamente con el resto del foro), ya que poco a poco se clarifican todos los problemas.

Yo por mi parte había desarrollado el sistema de envío por mi cuenta, pero al encontrarme mil y un problemas he llegado hasta aquí.

En mi caso el problema que tengo es el siguiente error al lanzar la petición SOAP: "Received content of invalid Content-Type setting: text/html - SOAP expects text/XML". Me ocurre tanto con un desarrollo mio, como con el ultimo ejemplo completo que se ha posteado en este hile

Buscando información, creo haber llegado a la conclusión que es un error en el formato del XML enviado por el HTTPRIO, pero no lo tengo claro. En un principio estaba intentando lanzar "ConsultaLRFacturasEmitidas" que me parecía mas sencilla para probar si la comunicación era correcta y si estaba añadiendo bien el certificado a la petición. Pero tambien como digo me ocurre con "SuministroLRFacturasEmitidas". Y tanto con la version 0.4 como con la nueva 0.5

Alguna idea???

RafaSerMed 01-02-2017 10:04:00

Lo siento, soy idiota. Creo que es un problema con el certificado ademas alguien ya lo ha posteado anteriormente....

Cita:

Empezado por RafaSerMed (Mensaje 512867)
Hola a todos.

Lo primero agradecer enormemente a todos los que están colaborando con este hilo (y obviamente con el resto del foro), ya que poco a poco se clarifican todos los problemas.

Yo por mi parte había desarrollado el sistema de envío por mi cuenta, pero al encontrarme mil y un problemas he llegado hasta aquí.

En mi caso el problema que tengo es el siguiente error al lanzar la petición SOAP: "Received content of invalid Content-Type setting: text/html - SOAP expects text/XML". Me ocurre tanto con un desarrollo mio, como con el ultimo ejemplo completo que se ha posteado en este hile

Buscando información, creo haber llegado a la conclusión que es un error en el formato del XML enviado por el HTTPRIO, pero no lo tengo claro. En un principio estaba intentando lanzar "ConsultaLRFacturasEmitidas" que me parecía mas sencilla para probar si la comunicación era correcta y si estaba añadiendo bien el certificado a la petición. Pero tambien como digo me ocurre con "SuministroLRFacturasEmitidas". Y tanto con la version 0.4 como con la nueva 0.5

Alguna idea???


Virman 01-02-2017 13:20:12

Qué faena lo de esperar hasta el día 7 para poder seguir realizando pruebas. He cambiado los webservices a la nueva versión y ahora no puedo hacer envíos.

ex.Message = "Codigo[4100].Error en la cabecera. El contenido de IDVersionSii no es válido."

Buenos, seguiremos probando más adelante.

Saludos.

RafaSerMed 01-02-2017 17:21:32

En mi caso con la versión 0.4, ya lo tengo todo listo. Soy capaz de enviar facturas tanto emitidas como recibidas, con datos de importes exentos o no, y alguna que otra combinación.

Por otro lado, también puedo realizar consultas de facturas y me devuelve los datos de envíos anteriores sin problemas.

Pero todo esto no me funciona con la versión 0.5, porque me da un error 404 en la URL de envío: https://www7.aeat.es/wlpl/SSII-FACT/...iiFactFEV1SOAP, aunque dicha URL si que responde con una llamada normal desde el navegador por ejemplo.

En la web no dice que funcionará a partir del día 7, sino que a partir de ese día "SOLO" se podrá enviar con esta versión. He remitido una pregunta a la AEAT sobre el tema y aun estoy en espera de contestación.

keys 02-02-2017 12:53:03

Convocatoria de las EE.DD. para el proyecto "Suministro Inmediato de Información (SII)" - 15 de febrero de 2017

Se comunica que el próximo día 15 de febrero de 2017 a las 11 h. se celebrará una reunión informativa en el Salón de Actos del Departamento de Informática Tributaria (C/ Santa María Magdalena, 16, 28016 Madrid) sobre el proyecto "Suministro inmediato de información (SII)" y con el siguiente contenido previsto:

11:00 - 11:45 h.: Normativa tributaria sobre el proyecto SII

11:45 - 13:15 h.: Aspectos tecnológicos del proyecto SII

13:15 - 13:45 h.: Ruegos y Preguntas

Si están interesados en asistir, por favor comuniquen nombre, apellidos y NIF de la persona designada al correo electrónico mariablanca.rodriguez@correo.aeat.es incluyendo en el asunto del mensaje el texto "EE.DD. 15/02/2017 y nombre de la empresa asistente".

A efectos de no superar el aforo de la sala, se debe limitar la asistencia a un máximo de una persona por empresa o entidad.

La información ofrecida se difundirá posteriormente en la dirección:

http://www.agenciatributaria.es/AEAT...olladores.html

Muchas gracias por su colaboración.

newtron 02-02-2017 13:27:38

Gracias por la info. ^\||/

apicito 03-02-2017 09:56:41

Como estoy siguiendo y utilizando este hilo para consumir otro webservice de la administración española os aporto una solución para cuando los envios deben firmarse digitalmente, que es mi caso, por si este lo requiere ahora o en el futuro.
Puede utilizarse la aplicación autofirma (https://administracionelectronica.go...s#.WJQ7nH9EKuc) que está ahora en su versión 1.5 y que se puede llamar desde la línea de comandos.
Por ejemplo:
Código:

"C:\Program Files\AutoFirma\AutoFirma\AutoFirma.exe" sign -i c:\Users\juan\proba.xml -o c:\Users\juan\proba-signed.xml -algorithm SHA512withRSA -store windows  -alias le-56772dsd-fc29-b432-f56f-sdfs45sd5456 -format "XAdES Enveloped"
Aún me falta algún detalle que solucionar, pero funciona.
Un saludo.

seccion_31 06-02-2017 09:48:04

Yo sigo esperando al dia 7. A ver que pasa

Ya puedo enviar facturas emitidas, y casi recibidas.

Tengo la consulta de facturas emitidas. Para saber que información tiene la AEAT recogida.

He parado todo el trabajo a esperar el dia 7. Por si acaso.


Ahora bien, tengo la siguientes dudas:

1) ¿alguien ha conseguido enviar mas de 13 facturas en un envio?
2) ¿es mejor enviar en bloques de 1 y obtener un CSV individual para cada factura? (y mas fácil para depurar un re-envio)
3) ¿Qué objetos creáis para enviar facturas de exportación e intracomunitarias?

Saludos !

keys 06-02-2017 16:00:22

Cita:

Empezado por seccion_31 (Mensaje 512960)
Yo sigo esperando al dia 7. A ver que pasa

Ahora bien, tengo la siguientes dudas:

1) ¿alguien ha conseguido enviar mas de 13 facturas en un envio?
2) ¿es mejor enviar en bloques de 1 y obtener un CSV individual para cada factura? (y mas fácil para depurar un re-envio)
3) ¿Qué objetos creáis para enviar facturas de exportación e intracomunitarias?

Saludos !

1) Estoy en tu mismo caso no puedo enviar mas de 13. Pregunte a hacienda pero no me han contestado nada. Estoy esperando a el día 7 para ver que pasa.

2) En principio creo que da igual siempre que este bien gestionado. Me imagino que el enviar de factura en factura hará que el proceso sea más lento. Al final lo importante es el id de respuesta si esta aceptado y la causa por la cual no te aceptan una factura.

3) Te pongo un ejemplo para cada una. En cuanto a las de exportación estan para la version actual, cuando cambie a la 5 en el campo ClaveRegimenEspecialOTrascendencia hay que poner un 2 y no un 15.
la intracomunitaria es de entrega de bienes y esta no va a cambiar para la siguiente version. En cuanto a las intracomunitarias de prestación hay que meterlas como inversión sujeto pasivo. No pongo ejemplo por que eso si cambia en la siguente version.

Un Saludo

seccion_31 06-02-2017 16:55:15

gracias keys

mañana lo miro.

en la aeat están empezando a responder... a ver que nos dicen.

cuidado con guardar el CSV

y tengo ya completos el tema de interrogar a la aeat de las facturas que ya hemos pasado. si quereis puedo colgar un trozo de ejemplo, pero hasta que no funcione todo con el cambio del dia 7, como que...

en fin...

seccion_31 07-02-2017 07:59:34

buenos días a todos !

Nos estamos superando:

Usando la 0.1 (que hasta ayer iba bien)
Codigo[3501].Error técnico de BBDD: java.sql.SQLException: TABLA MAESTRA ORA-00904: "LFE_IMP_NOSUJETA_PRES": identificador no válido

Usando la 0.5 (que hoy debería funcionar)
Not Found (404) - 'https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP'


¿Qué tal os va?

(ya les he escrito de nuevo)

Virman 07-02-2017 08:17:45

Error IDVersionSII
 
A mi al tratar de enviar una factura emitida, recibida o bien de inversión, me aparece el error:

ex.Message = "Codigo[4100].Error en la cabecera. El contenido de IDVersionSii no es válido."

Aún cuando la IDVersión es: VersionSiiType.Item05

Sin embargo la intracomunitaria si me ha dejado, alguna sugerencia?

Un saludo.

RafaSerMed 07-02-2017 09:27:28

Cita:

Empezado por Virman (Mensaje 512989)
A mi al tratar de enviar una factura emitida, recibida o bien de inversión, me aparece el error:

ex.Message = "Codigo[4100].Error en la cabecera. El contenido de IDVersionSii no es válido."

Aún cuando la IDVersión es: VersionSiiType.Item05

Sin embargo la intracomunitaria si me ha dejado, alguna sugerencia?

Un saludo.

En mi caso me ha dejado perfectamente. Eso sí, volviendo a generar la unidad a partir del WSDL, ya que ha cambiado con respecto al que estaba disponible previamente (no se para que le ponen disponible si luego cambia cuando realmente se puede usar).

El valor de IDVersionSii es VersionSiiType._0_5 con este nuevo WSDL.

seccion_31 07-02-2017 10:06:29

a esta hora y reimportando los wdsl y tal... ya puedo enviar facturas emitidas, recibidas, y consultar.

sigue dando el error:

Se requiere un certificado para completar la autenticación de cliente - URL:https://www7.aeat.es/wlpl/SSII-FACT/...iiFactFEV1SOAP - SOAPAction:""

si pasas un monton. No pasa ni una del paquete. (confirmado porque luego consulto).


una pregunta tonta... en el numero de factura pone "numeroserie" si tienes serie en tus facturas entiendo que debería ser 9999999X ¿no?

newtron 07-02-2017 10:13:27

Cita:

Empezado por seccion_31 (Mensaje 512991)
a esta hora y reimportando los wdsl y tal... ya puedo enviar facturas emitidas, recibidas, y consultar.

¿Sería posible un ejemplo operativo? No tengo yo muy claro lo de la consulta.

Cita:

Empezado por seccion_31 (Mensaje 512991)
una pregunta tonta... en el numero de factura pone "numeroserie" si tienes serie en tus facturas entiendo que debería ser 9999999X ¿no?

Yo entiendo también que hay que poner el número de factura completo con su serie.

Saludos

keys 07-02-2017 10:38:19

Cita:

Empezado por seccion_31 (Mensaje 512991)


una pregunta tonta... en el numero de factura pone "numeroserie" si tienes serie en tus facturas entiendo que debería ser 9999999X ¿no?

Yo creo que se refiere al numero identificador unico que tiene esa factura. Es decir si tienes serie la tienes que poner 99999999X o X999999, etc es decir como se identifique esa factura en la empresa.


Una Pregunta. A la hora de añadir los wsdl al proyecto los habeis añadido todos desde la misma carpeta? o habéis añadido cada uno desde una carpeta distinta? es decir las de emitidas por un lado, las recibidas por otro, etc...

A mi tambien me da error si envío muchas facturas.
Un Saludo.

Virman 07-02-2017 11:41:29

He reimportado los wsdl y ahora me dice:

ex.Message = "Debe establecer la propiedad Path para llamar al método Send."

He importado los servicios web de los 7 suministros que hay (SuministroBienesInversion, SuministroCobrosEmitidas, SuministroCobrosMetalico, SuministroFactEmitidas, SuministroFactRecibidas, SuministroOpIntracomunitarias, SuministroPagosRecibidas). Pero esta propiedad Path es la primera vez que la veo, a alguno le ha salido este mensaje de error al intentar enviar?

Un saludo.

Me autorespondo, me faltaba reeditar las referencias de los SiiService de cada suministro.

Virman 07-02-2017 12:43:11

Facturas emitidas consigo enviarlas correctamente, para el resto me devuelve SIEMPRE este error:

Error en comunicación: Codigo[4124].Error La direccion no se corresponde con el fichero de entrada.

Antes de la versión 0.5 conseguía enviar todos los tipos salvo Facturas Recibidas, pero ahora sólo puedo enviar facturas emitidas.

Ese error se lo da a alguien más? No he encontrado mucha información sobre ese error en la red, por lo que no puedo deciros muchos más.

Virman 07-02-2017 13:19:06

Cita:

Empezado por Virman (Mensaje 512995)
Facturas emitidas consigo enviarlas correctamente, para el resto me devuelve SIEMPRE este error:

Error en comunicación: Codigo[4124].Error La direccion no se corresponde con el fichero de entrada.

Antes de la versión 0.5 conseguía enviar todos los tipos salvo Facturas Recibidas, pero ahora sólo puedo enviar facturas emitidas.

Ese error se lo da a alguien más? No he encontrado mucha información sobre ese error en la red, por lo que no puedo deciros muchos más.

Vale, después de buscar he visto que era porque sigue apareciendo en los wsdl la dirección xxxxxxxxxxxx, y aunque la cambié en ellos, en app.config de mi proyecto, no se habían actualizado. Qué ganitas tengo de que pongan una versión estable y sin xxxxxxxxxxxx.

seccion_31 08-02-2017 08:29:43

Este es mi código para consultar facturas emitidas, colocando sus resultados en una base de datos.


Código:

//    memoErrores.lines.Clear;
    if dbRespuesta.active then dbRespuesta.Active:=false;

    dbRespuesta.FieldDefs.Clear;
    dbRespuesta.FieldDefs.Add('numero',ftstring,30,false);
    dbRespuesta.FieldDefs.Add('fecha',ftDate,0,false);
    dbRespuesta.FieldDefs.Add('cliente',ftstring,100,false);
    dbRespuesta.FieldDefs.Add('nif',ftstring,50,false);
    dbRespuesta.FieldDefs.Add('tipo',ftstring,5,false);
    dbRespuesta.FieldDefs.Add('exenta',ftstring,5,false);
    dbRespuesta.FieldDefs.Add('tipostr',ftstring,50,false);
    dbRespuesta.FieldDefs.Add('regimen',ftstring,5,false);
    dbRespuesta.FieldDefs.Add('operacion',ftstring,200,false);
    dbRespuesta.FieldDefs.Add('terceros',ftstring,5,false);
    dbRespuesta.FieldDefs.Add('total',ftfloat,0,false);
    dbRespuesta.FieldDefs.Add('cobros',ftstring,5,false);
    dbRespuesta.FieldDefs.Add('noexenta',ftstring,5,false);
    dbRespuesta.FieldDefs.Add('estado',ftstring,100,false);
    dbRespuesta.FieldDefs.Add('descripcio',ftstring,300,false);
    for h := 0 to 6 do
    begin
        dbRespuesta.FieldDefs.Add('iva'+inttostr(h),ftFloat,0,false);
        dbRespuesta.FieldDefs.Add('impiva'+inttostr(h),ftFloat,0,false);
        dbRespuesta.FieldDefs.Add('baseimp'+inttostr(h),ftFloat,0,false);
    end;
    dbRespuesta.CreateTable;
    dbRespuesta.Active:=true;

    //***CSY
    CERTIFICADO := BUSCAR_CERTIFICADO(comboBox1.text); //<----- SELECCIONAR CERTIFICADO
    if(CERTIFICADO = nil) then begin
      ShowMessage('No encuento el certificado');
      Exit();
    end;

    emitidas.HTTPWebNode.ClientCertificate.SerialNum := Buscar_Certificado_SERIAL(comboBox1.text);
    //****

  try
    /////////////////////////////////////////////////////////////////////////////
    ////  PRESENTADOR OSEA  -> NOSOTROS    //////////////////////////////////////
    //    se crea el objeto que se va a enviar:
    /////////////////////////////////////////////////////////////////////////////
    aConsultaLRFacturasEmitidas := ConsultaLRFacturasEmitidas.Create;
    aConsultaLRFacturasEmitidas.Cabecera:=CabeceraConsultaSii.Create;
    // DATOS:
    aConsultaLRFacturasEmitidas.Cabecera.IDVersionSii:=VersionSiiType(0);      // 0.1
    aConsultaLRFacturasEmitidas.Cabecera.titular := PersonaFisicaJuridicaUnicaESType.Create;
    aConsultaLRFacturasEmitidas.Cabecera.Titular.NombreRazon:=_PRESENTADOR;          // NOMBRE DEL PRESENTADOR (CUALQUIERA VALE)
    aConsultaLRFacturasEmitidas.Cabecera.Titular.NIF:=_NIF_EMISOR;              // CIF del PRESENTADOR (DEBE COINCIDIR CON EL CERTIFICADO SELECCIONADO)

    aConsultaLRFacturasEmitidas.FiltroConsulta:=LRFiltroEmitidasType.Create;
    aConsultaLRFacturasEmitidas.FiltroConsulta.PeriodoImpositivo:=PeriodoImpositivo.Create;
    aConsultaLRFacturasEmitidas.FiltroConsulta.PeriodoImpositivo.Ejercicio:=edit2.text;
    aConsultaLRFacturasEmitidas.FiltroConsulta.PeriodoImpositivo.Periodo:=TipoPeriodoType( comboBox2.itemIndex  );

    try
      // se hace la llamada a la funcion suministrada por el WS
      result := GetsiiSOAP(true,'',emitidas).ConsultaLRFacturasEmitidas(aConsultaLRFacturasEmitidas);
      memoComs.Lines.Add( getEnumName(typeInfo(ResultadoConsultaType), ord(result.resultadoConsulta) ) );

      //mostrar los resultados devueltos por la llamada
      for i := low(result.RegistroRespuestaConsultaLRFacturasEmitidas) to High(result.RegistroRespuestaConsultaLRFacturasEmitidas) do
      begin
          _noexenta:='';
          _numero:='';
          _fechaStr:='';
          _tipo:='';
          _tipoStr:='';
          _regimen:='';
          _operacion:='';
          _exenta:='';
          _terceros:='';
          _cliente:='';
          _nif:='';
          _tipodesglose:='';
          _cobros:='';
          _estado:='';
          _estadoFactura:='';
          _ImporteTotal:=0;
          _descripcion:='';

        with result.RegistroRespuestaConsultaLRFacturasEmitidas[i] do
        begin
            try
                if result.RegistroRespuestaConsultaLRFacturasEmitidas[i].datosfacturaemitida.tipodesglose.desglosetipooperacion<>nil then
                  _exenta:=GetEnumName( TypeInfo(CausaExencionType),ord(DatosFacturaEmitida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.exenta.CausaExencion));
            except
            end;

            _tipo:=GetEnumName(TypeInfo(clavetipoFacturaType), Ord(DatosFacturaEmitida.TipoFactura));
            _tipoSTR:=tipoSTR( DatosFacturaEmitida.TipoFactura );
            _regimen:=GetEnumName( TypeInfo(IdOperacionesTrascendenciaTributariaType),  Ord(DatosFacturaEmitida.ClaveRegimenEspecialOTrascendencia) );

            _ImporteTotal:=strToFloat( SII_Numero( DatosFacturaEmitida.ImporteTotal ) );

            _operacion:=DatosFacturaEmitida.DescripcionOperacion;
            _terceros:=GetEnumName(typeInfo( EmitidaPorTercerosType ), ord( DatosFacturaEmitida.EmitidaPorTerceros ) );
            _numero:=IDFactura.NumSerieFacturaEmisor;

            try
              if DatosFacturaEmitida.contraparte<>nil then    // POR SI NO LLEVA CONTRAPARTE:
              begin
                _cliente:=DatosFacturaEmitida.contraparte.NombreRazon;
                _NIF:=DatosFacturaEmitida.contraparte.NIF;

                if DatosFacturaEmitida.TipoDesglose.DesgloseFactura<>nil then
                begin
                  _tipodesglose:=GetEnumName( typeInfo(TipoOperacionSujetaNoExentaType), ord(DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.TipoNoExenta) );
                  _noexenta:=getEnumName(typeInfo( TipoOperacionSujetaNoExentaType ) ,  ord(DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.TipoNoExenta ) );
                end;
                if DatosFacturaEmitida.contraparte.IDOtro<>nil then
                begin
                    if _NIF='' then
                        _NIF:=DatosFacturaEmitida.contraparte.IDOtro.ID;
                end;
              end
              else                                        // POSIBLE ERROR:
              BEGIN
                  _cliente:='SIN CLIENTE';
                  MemoComs.lines.add('factura: ' + IDFactura.NumSerieFacturaEmisor + ' SIN CLIENTE');
              end;

              if DatosFacturaEmitida.TipoDesglose.DesgloseFactura<>NIL then
              begin
                for h := low(DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA) to high( DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA) do
                begin
                    with DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA[h] do
                    begin
                          base[h]:= strTofloat( SII_numero( baseImponible ) );
                          tipo[h]:=strTofloat(SII_numero( tipoImpositivo ) );
                          cuota[h]:=strTofloat(SII_numero( cuotarepercutida ) );
                    end;
                end;
              end;
              _cobros:=getEnumName( typeInfo(FacturaARType),  ord(DatosFacturaEmitida.Cobros) );

              _fechaStr:=copy(IDFactura.FechaExpedicionFacturaEmisor,1,10);
              _fechaStr:=stringReplace(_fechaStr,'-','/',[rfReplaceAll]);
              _fecha:=strTodate( _fechaStr );
              _estado:=estadoFactura.EstadoRegistro;
              _descripcion:=DatosFacturaEmitida.DescripcionOperacion;

            MemoComs.lines.add('factura: ' + IDFactura.NumSerieFacturaEmisor + ' ' + IDFactura.NumSerieFacturaEmisorResumenFin + ' ' + IDFactura.FechaExpedicionFacturaEmisor);


            // guardar en la base de datos:
            dbRespuesta.Insert;
            dbRespuesta.fieldbyName('numero').Text:=_numero;
            dbRespuesta.fieldbyName('fecha').asdatetime:=_fecha;
            dbRespuesta.fieldbyName('cliente').Text:=_cliente;
            dbRespuesta.fieldbyName('nif').Text:=_nif;
            dbRespuesta.fieldbyName('tipo').Text:=_tipo;
            dbRespuesta.fieldbyName('tipostr').Text:=_tipostr;
            dbRespuesta.fieldbyName('exenta').Text:=_exenta;
            dbRespuesta.fieldbyName('regimen').Text:=_regimen;
            dbRespuesta.fieldbyName('operacion').Text:=_operacion;
            dbRespuesta.fieldbyName('terceros').Text:=_terceros;
            dbRespuesta.fieldbyName('total').asfloat:=_ImporteTotal;
            dbRespuesta.fieldbyName('cobros').text:=_cobros;
            dbRespuesta.fieldbyName('fecha').asdatetime:=_fecha;
            dbRespuesta.fieldbyName('estado').text:=_estado;
            dbRespuesta.fieldbyName('descripcio').text:=_descripcion;
            dbRespuesta.fieldbyName('Noexenta').text:=_noexenta;

            if DatosFacturaEmitida.TipoDesglose.DesgloseFactura<>NIL then
            begin
              for h := low(DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA) to high( DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA) do
              begin
                  dbRespuesta.fieldbyName('iva'+inttostr(h)).asfloat:=tipo[h];
                  dbRespuesta.fieldbyName('impiva'+inttostr(h)).asfloat:=cuota[h];
                  dbRespuesta.fieldbyName('baseimp'+inttostr(h)).asfloat:=base[h];
              end;
            end;

            dbRespuesta.Post;
        except
            On E:Exception do
            begin
              MemoErrores.lines.Add(_numero);
              MemoErrores.lines.Add(E.Message);
              MemoErrores.lines.Add('--------------------');
            end;

        end;


        end;
      end;
    except
      On E:Exception do
        //El proceso de envio dio error
        MemoErrores.lines.Add(E.Message);
    end;
  finally
    // se eliminan los objetos creados
    aConsultaLRFacturasEmitidas.Free;
    result.Free;

    dbRespuesta.Active:=true;
  end;
end;

Y Ahora me faltaria:

* Facturas recibidas intracomunitarias y autofactura....
* Factura a Canarias?

Aunque lo estoy mirando ahora, ¿Por favor, podeis postear algún ejemplo? ...

Saludos !

seccion_31 08-02-2017 08:50:22

Esta claro que hay facturas rectificativas por diferencias. Aunque no lo veo muy claro.


Pero ... ¿y los abonos? ¿Cómo se gestionan?

Saludos !

newtron 08-02-2017 09:35:04

Cita:

Empezado por seccion_31 (Mensaje 513031)
Esta claro que hay facturas rectificativas por diferencias. Aunque no lo veo muy claro.


Pero ... ¿y los abonos? ¿Cómo se gestionan?

Saludos !

Yo entiendo que los abonos son facturas emitidas pero en negativo. Yo he probado y se las "traga" sin problemas.

Saludos


La franja horaria es GMT +2. Ahora son las 12:44:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi