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???



La franja horaria es GMT +2. Ahora son las 07:31:35.

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