Cita:
Empezado por seccion_31
ramherfer
sustituye esta funcion: uVerifactuFuncs y recompila el servidor B10
Código:
function consultar(sesion:integer; var resultado:TConsultaResultado):boolean;
var
consulta : ConsultaFactuSistemaFacturacion; // Objeto a enviar
res : RespuestaConsultaFactuSistemaFacturacionType; // Respuesta tras el envio
HTTPRIO1 : THTTPRIO;
j : integer;
direccion_envio, estado : string;
eventos : TEventosHttpPrio;
eventosWebNode: TEventosWebNode;
begin
consulta:=ConsultaFactuSistemaFacturacion.Create;
consulta.Cabecera:=CabeceraConsultaSf.Create;
consulta.Cabecera.ObligadoEmision:=ObligadoEmisionConsultaType.Create;
consulta.Cabecera.ObligadoEmision.NombreRazon:=sesiones[sesion].inicio.emisor.NombreRazonEmisor;
consulta.Cabecera.ObligadoEmision.NIF:=sesiones[sesion].inicio.emisor.nifEmisor;
consulta.FiltroConsulta:=LRFiltroRegFacturacionType.Create;
consulta.FiltroConsulta.PeriodoImputacion:=PeriodoImputacionType.Create;
consulta.FiltroConsulta.PeriodoImputacion.Ejercicio:=resultado.Cabecera.ejercicio;
consulta.FiltroConsulta.PeriodoImputacion.Periodo:=veriFactuPeriodo( resultado.Cabecera.periodo );
if resultado.Cabecera.NumSerieFactura='' then
begin
consulta.FiltroConsulta.FechaExpedicionFactura.RangoFechaExpedicion.Desde:=verifactuFecha(datetoStr(resultado.Cabecera.dfecha));
consulta.FiltroConsulta.FechaExpedicionFactura.RangoFechaExpedicion.Hasta:=verifactuFecha(datetoStr(resultado.Cabecera.hfecha));
end
else
begin
consulta.FiltroConsulta.NumSerieFactura:=resultado.Cabecera.NumSerieFactura;
end;
eventos:=TEventosHttpPrio.Create;
eventos.fileNameBefore :=sesiones[sesion].saveXMLenvio;
eventos.fileNameAfter :=sesiones[sesion].saveXMLResult;
eventosWebNode:=TEventosWebNode.Create;
eventosWebNode.sesion:=sesion;
HTTPRIO1:=THTTPRIO.create(nil);
HTTPRIO1.onBeforeExecute:=eventos.BeforeExecute;
HTTPRIO1.onAfterExecute :=eventos.AfterExecute;
// Cargar certificado del disco
if ( pos('.PFX',uppercase(sesiones[sesion].inicio.nombreCertificado))<>0) or
( pos('.P12',uppercase(sesiones[sesion].inicio.nombreCertificado))<>0) then
HTTPRIO1.HTTPWebNode.onBeforePost:=eventosWebNode.WebNodeBeforePost;
// --> envío pre-produccion: 'https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP';
try
// Cargar certificado del almacen
if ( pos('.PFX',uppercase(sesiones[sesion].inicio.nombreCertificado))=0) and
( pos('.P12',uppercase(sesiones[sesion].inicio.nombreCertificado))=0) then
HTTPRIO1.HTTPWebNode.ClientCertificate.SerialNum := Buscar_Certificado_SERIAL( sesiones[sesion].inicio.nombreCertificado ); // coloca el certificado
direccion_envio :=sesiones[sesion].inicio.direccion_envio;
res:= RespuestaConsultaFactuSistemaFacturacionType.Create;
res:= GetsfPortTypeVerifactu( false, direccion_envio , HTTPRIO1 ).ConsultaFactuSistemaFacturacion( consulta ); // Enviarlo !
// resultado del envio:
resultado.ConDatos:=(res.ResultadoConsulta=ResultadoConsultaType.ConDatos);
resultado.error :=false;
resultado.errorDes:='';
procesarConsulta(res,resultado );
except
on E:Exception do
begin
resultado.ConDatos:=false;
resultado.error:=true;
resultado.errorDes:=Format('(%s)-%s',[E.ClassName, E.Message]);
result:=false;
exit;
end;
// Finalmente:
// HTTPRIO1.free; //<- no puede ser destruido con NIL como constructor
//eventos.Free;
end;
result:=true;
end;
|
Funciona perfectamente con fichero de certificado.pfx. He integrado en la aplicación los dos metodos de certificación, para que se utilice el que más convenga, aunque con fichero pfx o p12 implica menos dependencias de otros componentes, por lo tanto menos trabajo de implantación de la versión. Yo al arrancar la aplicación verifico la fecha de vencimiento del certificado para lanzar un aviso cuando quedan menos de 60 días. Esto utilizando el nombre del certificado y capicom. Voy a ver la forma de hacerlo con el pfx.