Ver Mensaje Individual
  #7  
Antiguo 05-02-2025
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 162
Reputación: 14
ramherfer Va por buen camino
Cita:
Empezado por seccion_31 Ver Mensaje
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.
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.