FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Problema al enviar más de 20 facturas a la vez
Buenas tardes,
Estoy con un problema que no consigo encontrar la solución, a ver si alguien pudiese echarme una mano. Cuando envío más de 20 facturas emitidas (me pasa lo mismo con las recibidas) recibo el siguiente error: Se requiere un certificado para completar la autenticación de cliente - URL:https://www7.aeat.es/wlpl/SSII-FACT/...iiFactFEV1SOAP - SOAPAction:"" Si esas mismas facturas las envío en dos veces, me las envía sin problema. Para realizar el envío, genero el xml con delphi 7 y realizo el envío mediante una dll que he creado con Delphi XE7. El código mediante el cual hago el envío es el siguiente: Código:
type TComunicacionSW = class(TObject) private FArchivoEnvio: String; FArchivoRespuesta: String; FHTTPRIO: THTTPRIO; procedure HTTPRIOBeforeExecute(const MethodName: string; SOAPRequest: TStream); procedure HTTPRIOAfterExecute(const MethodName: string; SOAPResponse: TStream); public Constructor Create; Destructor Destroy; end; procedure TComunicacionSW.HTTPRIOBeforeExecute(const MethodName: string; SOAPRequest: TStream); var v_fileStream: TFileStream; begin SOAPRequest.Size := 0; v_fileStream := TFileStream.Create(FArchivoEnvio, fmOpenRead); SOAPRequest.Position := 0; SOAPRequest.CopyFrom(v_fileStream, v_fileStream.Size); v_fileStream.Free; SOAPRequest.Position := 0; end; procedure TComunicacionSW.HTTPRIOAfterExecute(const MethodName: string; SOAPResponse: TStream); var v_fileStream: TFileStream; begin if FileExists(FArchivoRespuesta) then DeleteFile(FArchivoRespuesta); v_fileStream := TFileStream.Create(FArchivoRespuesta, fmCreate); SOAPResponse.Position := 0; v_fileStream.CopyFrom(SOAPResponse, SOAPResponse.size); v_fileStream.Free; SOAPResponse.Position := 0; end; function ObtenerNumeroSerieCertificado(p_nombreCertificado: String): string; var hStore: HCERTSTORE; PrevContext, CurContext: PCERT_CONTEXT; cbSize: DWORD; v_nombre: String; begin Result := ''; hStore := CertOpenSystemStore(0, PChar('MY')); if hStore <> nil then begin PrevContext := nil; CurContext := CertEnumCertificatesInStore(hStore, PrevContext); while CurContext <> nil do begin v_nombre := ''; cbSize := CertGetNameString(CurContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, nil, 0); if cbSize > 0 then begin SetLength(v_nombre, cbSize-1); CertGetNameString(CurContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, PChar(v_nombre), cbSize); if SameText(p_nombreCertificado, v_nombre) then begin result := GetCertSerialNumber(@CurContext^.pCertInfo^.SerialNumber); break; end; end; PrevContext := CurContext; CurContext := CertEnumCertificatesInStore(hStore, PrevContext); end; end; end; function EnviarFacturasEmitidas(p_nombreCertificado, p_archivoEnvio, p_archivoRespuesta: ShortString): PChar;stdcall;export; var v_suministroLRFacturasEmitidas: SuministroFactEmitidas.SuministroLRFacturasEmitidas; v_respuestaLRFacturasEmitidas: SuministroFactEmitidas.RespuestaLRFacturasEmitidas; v_siiSOAP: SuministroFactEmitidas.siiSOAP; v_serialNum: String; v_error: string; v_comunicacionSW: TComunicacionSW; begin v_error := ''; v_serialNum := ObtenerNumeroSerieCertificado(p_nombreCertificado); v_comunicacionSW := TComunicacionSW.Create; v_suministroLRFacturasEmitidas := SuministroFactEmitidas.SuministroLRFacturasEmitidas.Create; v_respuestaLRFacturasEmitidas := SuministroFactEmitidas.RespuestaLRFacturasEmitidas.Create; try try v_comunicacionSW.FArchivoEnvio := p_archivoEnvio; v_comunicacionSW.FArchivoRespuesta := p_archivoRespuesta; v_comunicacionSW.FHTTPRIO.HTTPWebNode.ClientCertificate.SerialNum := v_serialNum; //Se realiza la llamada sin datos y en el evento HTTPRIOBeforeExecute se establece el xml con los datos generados anteriormente v_siiSOAP := SuministroFactEmitidas.GetsiiSOAP(true,'',v_comunicacionSW.FHTTPRIO); v_respuestaLRFacturasEmitidas := v_siiSOAP.SuministroLRFacturasEmitidas(v_suministroLRFacturasEmitidas); except on e:Exception do v_error := 'Error DLL: Error en la comunicación con el servicio web.' + e.Message; end; finally v_suministroLRFacturasEmitidas.Free; v_respuestaLRFacturasEmitidas.Free; end; result := StringToPChar(v_error); end; El archivo SuministroFactEmitidas lo he generado automáticamente con WSDL Importer de delphi y le he modificado lo siguiente (defURL realmente no lo utilizo): const defWSDL = 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroFactEmitidas.wsdl'; defURL = 'https://www7.aeat.es/wlpl/SSII-FACT/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP'; defSvc = 'siiService'; defPrt = 'SuministroFactEmitidasPruebas'; ¿Se le ocurre a alguien que es lo que estoy haciendo mal? Un saludo |
#2
|
|||
|
|||
Por cierto si envío el archivo xml mediante la web https://www7.aeat.es/static_files/co...teWSAEAT2.html se envía correctamente.
|
#3
|
||||
|
||||
Cita:
Te pongo el codigo pero revisa los post anteriores. En el evento OnbeforePost del objeto HttpTrio tienes que poner lo siguiente
|
#4
|
|||
|
|||
Muchas gracias keys, probaré con las capicom a ver que tal. Aunque me resulta curioso que si funcione el certificado cuando envío 15 facturas y no funcione cuando envío 25.
|
#5
|
||||
|
||||
Eso nos pasaba a todos, creo recordar que el problema era a partir de 13 facturas.
|
#6
|
|||
|
|||
Cita:
slds. |
#7
|
|||
|
|||
Facturas Simplificadas
Alguién tiene un ejemplo de una factura simplificada. En el documento aparece como no obligatorio el campo nif, pero si no se lo indico , al serializar el xml,
se queda así esa factura: Cita:
|
#8
|
|||
|
|||
Cita:
|
#9
|
||||
|
||||
8.1.1.3.Ejemplo mensaje XML de alta de factura simplificada
XML de entrada Código:
<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:siiLR="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroLR.xsd" xmlns:sii="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInformacion.xsd"> <soapenv:Header/> <soapenv:Body> <siiLR:SuministroLRFacturasEmitidas> <sii:Cabecera> <sii:IDVersionSii>0.7</sii:IDVersionSii> <sii:Titular> <sii:NombreRazon>EMPRESAXXXX</sii:NombreRazon> <sii:NIF>A84532501</sii:NIF> </sii:Titular> <sii:TipoComunicacion>A0</sii:TipoComunicacion> </sii:Cabecera> <siiLR:RegistroLRFacturasEmitidas> <sii:PeriodoImpositivo> <sii:Ejercicio>2017</sii:Ejercicio> <sii:Periodo>03</sii:Periodo> </sii:PeriodoImpositivo> <siiLR:IDFactura> <sii:IDEmisorFactura> <sii:NIF>A84532501</sii:NIF> </sii:IDEmisorFactura> <sii:NumSerieFacturaEmisor>00000002</sii:NumSerieFacturaEmisor> <sii:FechaExpedicionFacturaEmisor>10-03-2017</sii:FechaExpedicionFacturaEmisor> </siiLR:IDFactura> <siiLR:FacturaExpedida> <sii:TipoFactura>F2</sii:TipoFactura> <sii:ClaveRegimenEspecialOTrascendencia>01</sii:ClaveRegimenEspecialOTrascendencia> <sii:ImporteTotal>26.70</sii:ImporteTotal> <sii:DescripcionOperacion>VentaYYYYYYYYY</sii:DescripcionOperacion> <sii:TipoDesglose> <sii:DesgloseFactura> <sii:Sujeta> <sii:NoExenta> <sii:TipoNoExenta>S1</sii:TipoNoExenta> <sii:DesgloseIVA> <sii:DetalleIVA> <sii:TipoImpositivo>21</sii:TipoImpositivo> <sii:BaseImponible>22.07</sii:BaseImponible> <sii:CuotaRepercutida>4.63</sii:CuotaRepercutida> </sii:DetalleIVA> </sii:DesgloseIVA> </sii:NoExenta> </sii:Sujeta> </sii:DesgloseFactura> </sii:TipoDesglose> </siiLR:FacturaExpedida> </siiLR:RegistroLRFacturasEmitidas> </siiLR:SuministroLRFacturasEmitidas> </soapenv:Body> </soapenv:Envelope> |
#10
|
|||
|
|||
Cita:
Al principio me estaba dando el error Codigo[17413].File too large pero después he visto que era un error que estaba dándonos a todos. Que ya parece que también está ya corregido. Muchas gracias por vuestra ayuda. |
#11
|
||||
|
||||
Cita:
Yo ando en PHP y logro mandar bloques de 100 sin problema alguno |
#12
|
|||
|
|||
Cita:
|
#13
|
|||
|
|||
buff! tengo un lío tremendo... si he conseguido generar el suministro de facturas emitidas, siguiendo lo que he visto en el hilo,
¿como puedo ver el contenido del xml ANTES de llamar a GetsiiSOAP(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASumLRFacturasEmitidas); ? seguro que es muy sencillo |
#14
|
||||
|
||||
Cita:
Saludos
__________________
Be water my friend. |
#15
|
|||
|
|||
Cita:
Cita:
|
#16
|
|||
|
|||
Cita:
¿Dónde está la implementación de montar_fichero_sii( date,time,'nombredefichero.xml')? Gracias. |
#17
|
|||
|
|||
Cita:
procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream); var ss:TFileStream; begin SOAPRequest.Size:=0; ss:=TFileStream.Create('C:\1.xml', fmOpenRead); SOAPRequest.Position := 0; SOAPRequest.CopyFrom( ss, ss.Size); ss.Free; SOAPRequest.Position := 0; end; No lo he probado aún, pero tiene sentido. |
#18
|
|||
|
|||
Más de 86.000 vistas
Y ya van más de 86.000 vistas!!! Y 1.363 respuestas.
|
#19
|
|||
|
|||
Hola.
Un pequeño aporte. Me he liado bastante para pasar de texto al indice de las enumeraciones de los XMLNS que genera Delphi. Por ejemplo para saber el índice del país a partir del código del país en texto. He visto algunas soluciones en otras respuestas pero hacía falta declarar listas o arrays auxiliares. Una pequeña función puede ayudar en estos casos: Código:
function IndiceEnum(Info: PTypeInfo; const Name: string): Integer; var InternalName: string; begin InternalName := RemClassRegistry.GetInternalPropName(Info, Name); Result := GetEnumValue(Info, InternalName); if Result < 0 then raise Exception.CreateFmt('Valor %s no encontrado en enumeracion %s', [Name, Info^.Name]); end; Código:
FacturaExpedida.Contraparte.IDOtro.CodigoPais := CountryType2(IndiceEnum(TypeInfo(CountryType2), Pais)); La misma función se puede utilizar con otras enumeraciones que estén declaradas en los XLMNS. Rubén. |
#20
|
|||
|
|||
Cita:
procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream); var ss:TFileStream; begin ss:=TFileStream.Create('C:\1.xml', fmOpenWrite); SOAPRequest.Position := 0; ss.CopyFrom(SOAPRequest,SOAPRequest.Size); ss.Free; SOAPRequest.Position := 0; end; Pero esto aún da un problema: no genera el fichero. Hay que crearlo previamente (copy con 1.xml y terminarlo con Ctrl Z si lo quieres vacío). Los TFileStream son un poco tozudos a veces con los share y demás permisos (Read, Write, etc). Con paciencia y un poco de tiempo acabar de perfilar para corregir este problema. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
TICKET BAI (TicketBAI); Nuevo sistema de la Agencia Tributaria del Pais Vasco | keys | Internet | 4186 | Hace 6 Horas 13:01:53 |
AEAT envio de datos vía Webservice problemas con WSDL | CelsoO | Internet | 11 | 09-10-2019 20:03:41 |
webService Soap de la Administración Digital Española notific@ | apicito | Internet | 3 | 31-01-2017 11:25:28 |
Error en Webservice funcion envio de sms | webmasterplc | Delphi para la web | 5 | 25-07-2013 20:10:29 |
Problemas con envío de XML a un WebService | davidvamo | Internet | 1 | 13-02-2007 15:49:20 |
|