Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Factura Electronica Paraguay - SIFEN (https://www.clubdelphi.com/foros/showthread.php?t=95864)

JCz 09-09-2022 03:17:13

Factura Electronica Paraguay - SIFEN
 
1 Archivos Adjunto(s)
Buenas;

Adjunto las clases generadas por el asistente del Delphi para la generación de los XML de la factura electronica.

JCz 11-09-2022 01:06:42

1 Archivos Adjunto(s)
por si sirva a alguien como guia, paso formato de los xml de, cambiando los datos sensibles por XXXXXX
Factura
AutoFactura
Nota de Credito
Nota de debito
Nota de Remision

dec 11-09-2022 19:14:52

Hola a todos,

Muchas gracias, también en nombre de quienes han descargado tus archivos, por tu aportación. :)

Casimiro Notevi 11-09-2022 19:30:40

^\||/^\||/^\||/

JCz 20-09-2022 02:05:00

Adjunto la función que utilizo para generar la url del QR

Código Delphi [-]
function TdmSIGCZFE.generarQR(
                              _QRVersion : AnsiString;                      // Version del Manual Técnico = 150
                              _QRId : AnsiString;                             // código CDC string de 44 caracteres 
                              _QRdFeEmiDE : AnsiString;                 // Fecha emision del D.E.
                              _QRdRucRec : AnsiString;                   // RUC del contribuyente
                              _QRdTotGralOpe : AnsiString;             // importe total de la operación
                              _QRdTotIVA : AnsiString;                   // importe del IVA de la operación
                              _QRcItems : AnsiString;                    // cantidad de items facturado
                              _QRDigestValue : AnsiString;            // Digest de la firma
                              _QRIdCSC : AnsiString;                    // id del Codigo CSC facilitado por la SET para la generación de la url (puede haber 2)
                              _QRCSC : AnsiString): AnsiString;    // Código CSC facilitado por la SET para la generación de la url  (puede haber 2)
var
      _cHashQR : AnsiString;
      _QR,_QRCalcHash : AnsiString;
begin

      _QR := 'nVersion='+_QRVersion +'&' +
              'Id='+_QRId+'&' +
              'dFeEmiDE='+ lowercase((String2Hex(_QRdFeEmiDE))) +'&' +   //convertimos la fecha en su valor hexadecimal
              ''+_QRdRucRec +'&' +
              'dTotGralOpe='+_QRdTotGralOpe + '&' +
              'dTotIVA='+ _QRdTotIVA + '&' +
              'cItems='+ _QRcItems + '&' +
              'DigestValue=' + lowercase((String2Hex(_QRDigestValue))) + '&' +  //convertimos el digest de la firma en su valor hexadecimal
              'IdCSC=' + _QRIdCSC;


      _QRCalcHash := _QR + _QRCSC;                              // al valor calculado en paso anterior se adiciona el codigo CSC
      _cHashQR    :=  GetStrHashSHA256(_QRCalcHash);  // el resultado del paso anterior lo Generaramos el Hash

      _QR := _QR + '&cHashQR=' + _cHashQR;

      if idAmbienteActual = 1 then // ambiente de prueba
            _QR := urlQRPrueba + _QR
      else  if idAmbienteActual = 2 then  // ambiente de producción
            _QR := urlQRProduccion + _QR;

      result := StringReplace(_QR,'&','&',[rfReplaceAll, rfIgnoreCase]);  // escapamos el & por '&'
end;

abajo las otras funciones utilizadas


Código Delphi [-]
function String2Hex(const Buffer: AnsiString): string;
begin
  SetLength(Result, Length(Buffer) * 2);
  BinToHex(PAnsiChar(Buffer), PChar(Result), Length(Buffer));
end;

Código Delphi [-]
function GetStrHashSHA256(Str: String): String;
var
  HashSHA: THashSHA2;
begin
    HashSHA := THashSHA2.Create;
    HashSHA.GetHashString(Str);
    result := HashSHA.GetHashString(Str,SHA256);
end;

JCz 20-09-2022 02:12:49

el resultado de la función se debe agregar al xml en el tag

Código:

<gCamFuFD>
<dCarQR>h_t_t_p_s://ekuatia.set.gov.py/consultas-test/qr?nVersion=150&amp;Id=010XXXXXX001001000006212022091914019076583&amp;dFeEmiDE=323032322d30392d31395431393a33313a3331&amp;dRucRec=XXXXXX&amp;dTotGralOpe=1036424.00&amp;dTotIVA=94220.35&amp;cItems=3&amp;DigestValue=70757447585833595a5a66555263354d2f724658716135504c776c64716f7a46635449384b44323843666f3d&amp;IdCSC=0001&amp;cHashQR=d4691e96002fdc2ed6518055f2ba983a59cd940a24f7ed43a3f82454d5fbc719
</dCarQR>
</gCamFuFD>


JCz 21-10-2022 00:13:01

Firma Xml
 
1 Archivos Adjunto(s)
Para la firma del XML utilizo la librería de Chilkat; paso en adjunto como lo hago.

Saludos!!

JEBOJEDA 13-01-2023 14:46:11

hola buen dia

en el archivo recibe.pas, llama una funciona que el compilador no lo encuentra y no veo una unidad en el USES tampoco,

--- > function rEnviDe(const rEnviDe: rEnviDe): rRetEnviDe; stdcall;

Gracias. y Saludos...

JCz 15-01-2023 02:03:09

Recibe.pas es para consumir el servicio que recibe el xml dela factura electrónica, con que versión de Delphi lo estás probando? Como tratas de consumir el web service?

JCz 15-01-2023 02:26:32

Cita:

Empezado por JEBOJEDA (Mensaje 550002)
hola buen dia

en el archivo recibe.pas, llama una funciona que el compilador no lo encuentra y no veo una unidad en el USES tampoco,

--- > function rEnviDe(const rEnviDe: rEnviDe): rRetEnviDe; stdcall;

Gracias. y Saludos...

Ahora me percaté, debes cambiar esa función por esta
Código Delphi [-]
  function  rEnviDe(const rEnviDe: UnicodeString): UnicodeString; stdcall;

hoyosfelix 02-08-2023 04:25:47

Sifen en Lazarus.
 
Hola.


Gracias por compartir tu código aquí.


Te hago una pregunta:

¿Vos decís que va a ser posible implementar todo esto en Lazarus?


Saludos.

JCz 02-08-2023 04:39:53

Cita:

Empezado por hoyosfelix (Mensaje 552226)
Hola.


Gracias por compartir tu código aquí.


Te hago una pregunta:

¿Vos decís que va a ser posible implementar todo esto en Lazarus?


Saludos.

Hola, no veo porque no se podría ya que ambos tienen Pascal como lenguaje base, desconozco si Lazarus tiene el equivalente al componente Httprio que es en gran parte el utilizado para el consumo del webservice del SIFEN.

Saludos y suerte con el proyecto.

Casimiro Notevi 02-08-2023 09:32:10

Seguramente este: https://wiki.lazarus.freepascal.org/...ervice_Toolkit

marioerp 05-08-2023 16:13:47

Ejemplo
 
Cita:

Empezado por JCz (Mensaje 550029)
Ahora me percaté, debes cambiar esa función por esta
Código Delphi [-]
  function  rEnviDe(const rEnviDe: UnicodeString): UnicodeString; stdcall;


Podrian publicar un ejemplo llamando al servicio de consultar ruc..

Gracias.

JCz 05-08-2023 19:30:12

Consulta Ruc - Sifen
 
2 Archivos Adjunto(s)
Cita:

Empezado por marioerp (Mensaje 552260)
Podrian publicar un ejemplo llamando al servicio de consultar ruc..

Gracias.

Buenas


Paso como lo tengo yo.


Saludos

marioerp 06-08-2023 23:04:38

Gracias JCZ, estoy tratando de consumir con delphi 10.2, al parecer el HTTPRIO en esta version no tiene la propiedad HTTPWebNode.SecureProtocols.

Podrias pasarme tu contacto (email o whatsapp) para ver si podemos conversar un poco mas?

JCz 08-08-2023 02:11:45

Cita:

Empezado por marioerp (Mensaje 552266)
Gracias JCZ, estoy tratando de consumir con delphi 10.2, al parecer el HTTPRIO en esta version no tiene la propiedad HTTPWebNode.SecureProtocols.

Podrias pasarme tu contacto (email o whatsapp) para ver si podemos conversar un poco mas?

Buenas, para procesar no es necesario configurar en tiempo de ejecución el TLS, yo lo hago porque uno de los (PSC) Code100 emite mal el certificado, según manual 150 debe ser TLS2 pero CODE100 emite mal y hay que forzar el envío en TLS1.

Si tienes el Certificado de otro PSC puede obviar esa sección. Yo uso D11, no tengo como probar en D10.

Saludos

marioerp 08-08-2023 05:34:34

Cita:

Empezado por JCz (Mensaje 552279)
Buenas, para procesar no es necesario configurar en tiempo de ejecución el TLS, yo lo hago porque uno de los (PSC) Code100 emite mal el certificado, según manual 150 debe ser TLS2 pero CODE100 emite mal y hay que forzar el envío en TLS1.

Si tienes el Certificado de otro PSC puede obviar esa sección. Yo uso D11, no tengo como probar en D10.

Saludos


Del mismo emisor es mi certificado, code 100.

marioerp 09-08-2023 15:25:25

Consultar ruc de la set
 
1 Archivos Adjunto(s)
Buenas.

Adjunto proyecto de consultar ruc de la set... Tengo problemas para anhadirle el certificado, si pueden corregir donde estoy errando seria de gran ayuda.

JCz 09-08-2023 16:08:15

Cita:

Empezado por marioerp (Mensaje 552287)
Buenas.

Adjunto proyecto de consultar ruc de la set... Tengo problemas para anhadirle el certificado, si pueden corregir donde estoy errando seria de gran ayuda.

Buenas

1- El certificado debe estar instalado en la PC

2- No haz incluido el procedure findclientcertificate

Código Delphi [-]
procedure TdmRIO.findClientCertificate(
  const Sender: TObject; const ARequest: TURLRequest;
  const ACertificateList: TCertificateList; var AnIndex: Integer);
var
    i : integer;
begin
      for I := 0 to ACertificateList.Count-1 do begin
          if SameText(ACertificateList[i].SerialNum,'74926b31c944fe9648575fa99162761a') then begin
            AnIndex := I;
            break;
          end;
      end;
end;

3- "Descomenta" esta parte

Código Delphi [-]
 HTTPRIOConsultaRUC.HTTPWebNode.ClientCertificate.SerialNum := '74926b31c944fe9648575fa99162761a';
 HTTPRIOConsultaRUC.HTTPWebNode.OnNeedClientCertificate := findClientCertificate;
 HTTPRIOConsultaRUC.OnBeforeExecute := BeforeExecute;
 HTTPRIOConsultaRUC.OnAfterExecute  := AfterExecute;

4- Utiliza el protocolo TLS1.1

Código Delphi [-]
HTTPRIOConsultaRUC.HTTPWebNode.SecureProtocols := [THTTPSecureProtocol.TLS11];

Saludos

marioerp 09-08-2023 16:41:55

Ruc
 
Ejecutando hasta la linea
ssRequest.WriteString(SobreSoap('rEnviConsRUC', RUC, Random(1000)));

Me da este error.

Project ConsultarRuc.exe raised exception class ESOAPHTTPException with message 'Error (400) - 'https://sifen.set.gov.py/de/ws/consultas/consulta-ruc.wsdl?wsdl''.

valores:
defWSDL = '';

defURL := 'https://sifen.set.gov.py/de/ws/consultas/consulta-ruc.wsdl?wsdl';
...
Estos valores no sera el problema, esta bien?

JCz 09-08-2023 17:21:52

Cita:

Empezado por marioerp (Mensaje 552291)
Ejecutando hasta la linea
ssRequest.WriteString(SobreSoap('rEnviConsRUC', RUC, Random(1000)));

Me da este error.

Project ConsultarRuc.exe raised exception class ESOAPHTTPException with message 'Error (400) - 'https://sifen.set.gov.py/de/ws/consultas/consulta-ruc.wsdl?wsdl''.

valores:
defWSDL = '';

defURL := 'https://sifen.set.gov.py/de/ws/consultas/consulta-ruc.wsdl?wsdl';
...
Estos valores no sera el problema, esta bien?

Buenas
defURL de ser https://sifen.set.gov.py/de/ws/consu...sulta-ruc.wsdl quita el ?wsdl al final.

Saludos.

marioerp 09-08-2023 18:49:44

Consulta de ruc
 
Es correcta, la direccion era el problema, osea el ultimo problema, ya trae los datos, aprovechando vas variables ya se puede mostrar.

JCz, si puedes, podrias escribirme a mi correo yousyus13@gmail.com o pasame el tuyo, quisiera adraderte mejor.

JCz 04-10-2023 13:25:29

XML de Eventos
 
1 Archivos Adjunto(s)
Buenas

Paso xml de ejemplo de como generar los xml de los eventos de Cancelación e Inutilización.

Cancelación seria lo mismo de anular una factura pre impresa (Aplica solamente a D.E. aprobados por el SIFEN)

Inutilización es para inutilizar una numeración o rango de numeraciones, ya sea por D.E. rechazado insalvable o tambien por saltear una numeración o rango de numeraciones.

Saludos.

nous 08-01-2024 02:46:44

Valores con acentos Ej: ó
 
JCz Primeramente quiero agradecerte por tus aportes, a los que estamos tratando de utilizar Delphi para conectarnos al SIFEN

Tengo una consulta como se enviaría los casos de Acentos Ej: La Factura Electrónica no se utilizo., estoy ya días tratando de solucionar este tema pero mis esfuerzo fueron siempre error 400 ósea no conecta al Servicio, para los casos de Texto con Acentos

Específicamente para los eventos de Inutilización. Te agradecería como los estas manejando eso.

JCz 08-01-2024 12:56:35

Cita:

Empezado por nous (Mensaje 553879)
JCz Primeramente quiero agradecerte por tus aportes, a los que estamos tratando de utilizar Delphi para conectarnos al SIFEN

Tengo una consulta como se enviaría los casos de Acentos Ej: La Factura Electrónica no se utilizo., estoy ya días tratando de solucionar este tema pero mis esfuerzo fueron siempre error 400 ósea no conecta al Servicio, para los casos de Texto con Acentos

Específicamente para los eventos de Inutilización. Te agradecería como los estas manejando eso.

Buen Dia

No había caído en cuenta de tal error, realice una prueba y efectivamente; si envías un texto con tilde retorna error 400; incluso si conviertes en UTF8.

Como la inutilización la uso sólo en caso de DE rechazados; tenía como texto fijo un valor sin tilde por ello no me di cuenta.

Si alguien pudo enviar estaría bueno comentar como lo hizo; ya probé varias formas y me retorna siempre error 400

Saludos.

JCz 08-01-2024 17:40:44

Cita:

Empezado por JCz (Mensaje 553889)
Buen Dia

No había caído en cuenta de tal error, realice una prueba y efectivamente; si envías un texto con tilde retorna error 400; incluso si conviertes en UTF8.

Como la inutilización la uso sólo en caso de DE rechazados; tenía como texto fijo un valor sin tilde por ello no me di cuenta.

Si alguien pudo enviar estaría bueno comentar como lo hizo; ya probé varias formas y me retorna siempre error 400

Saludos.



Código Delphi [-]
procedure TdmRIO.BeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
begin

    SOAPRequest.Size:=0;
    ssResponse:=TStringStream.Create(UTF8Encode(ssRequest.DataString));
    SOAPRequest.Position := 0;
    SOAPRequest.CopyFrom( ssResponse, ssResponse.Size);
    ssResponse.Free;
    SOAPRequest.Position := 0;
end;

Buenas; referente a la consulta; por algún motivo delphi modifica la codificación antes de enviar el archivo; por ello agregué UTF8Encode otra vez antes de enviar.


Con ello solucioné el error.


Espero te sirva.


Saludos

nous 09-01-2024 15:34:24

Siii sr. con eso me funciono perfectamente!!!! Gracias Totales!!!!

lucasvaz25 09-07-2024 20:49:43

dificultades para enviar el DE
 
Estimados, he comenzado el desarrollo del envío del DE al SIFEN, pero tengo dificultades para consumir el WS. Si alguien puede ayudarme, se lo agradezco.Soy nuevo en el foro, si estoy haciendo algo mal, pido disculpas.

JCz 09-07-2024 20:52:53

Cita:

Empezado por lucasvaz25 (Mensaje 556618)
Estimados, he comenzado el desarrollo del envío del DE al SIFEN, pero tengo dificultades para consumir el WS. Si alguien puede ayudarme, se lo agradezco.Soy nuevo en el foro, si estoy haciendo algo mal, pido disculpas.

Hola Lucas
Como lo estás intentando? Tenes algo hecho? Con que versión de Delphi estás trabajando?; son consultas básicas para saber donde estás parado, pues tu consulta es algo genérica.

lucasvaz25 09-07-2024 20:53:38

sigue mi código de envio
 
Código Delphi [-]
FHttpRio.HTTPWebNode.URL        := Url;
 FHttpRio.HTTPWebNode.SOAPAction := ''; // URLSoapAction + Qualificador;
 Acao := TStringList.Create;
  try
    Acao.Text := SOAP;
    Acao.SaveToFile( 'P:\prueba.xml' );
    Stream := TMemoryStream.Create;
    try
      FHttpRio.HTTPWebNode.Execute( Acao.Text, Stream );
      StrStream := TStringStream.Create( '', TEncoding.UTF8 );
      try
        StrStream.LoadFromStream( Stream );
        Resposta := TStringList.Create;
        try
          Resposta.Delimiter := '|';
          Resposta.Text      := StrStream.DataString;
          LTempXMLDoc := LoadXMLData( Resposta.Text );
          Node        := LTempXMLDoc.DocumentElement;
          if Node.ChildNodes.Count = 2 then
            Node := Node.ChildNodes[ 1 ].ChildNodes[ 0 ].ChildNodes[ 0 ]
          else if Node.ChildNodes.Count = 1 then
            Node := Node.ChildNodes[ 0 ].ChildNodes[ 0 ].ChildNodes[ 0 ];
          Result := Node.XML;
        finally
          Resposta.Free;
        end;
      finally
        StrStream.Free;
      end;
    finally
      Stream.Free;
    end;
  finally
    Acao.Free;
  end;

lucasvaz25 09-07-2024 20:59:15

Utilizo la versión Delphi 10.4, ya logré armar el XML, también tenía problemas con la firma, pero los pude resolver. Finalmente, al intentar probar el envío, siempre devuelve el error 400.

JCz 09-07-2024 21:18:29

1 Archivos Adjunto(s)
Cita:

Empezado por lucasvaz25 (Mensaje 556620)
Código Delphi [-]
FHttpRio.HTTPWebNode.URL        := Url;
 FHttpRio.HTTPWebNode.SOAPAction := ''; // URLSoapAction + Qualificador;
 Acao := TStringList.Create;
  try
    Acao.Text := SOAP;
    Acao.SaveToFile( 'P:\prueba.xml' );
    Stream := TMemoryStream.Create;
    try
      FHttpRio.HTTPWebNode.Execute( Acao.Text, Stream );
      StrStream := TStringStream.Create( '', TEncoding.UTF8 );
      try
        StrStream.LoadFromStream( Stream );
        Resposta := TStringList.Create;
        try
          Resposta.Delimiter := '|';
          Resposta.Text      := StrStream.DataString;
          LTempXMLDoc := LoadXMLData( Resposta.Text );
          Node        := LTempXMLDoc.DocumentElement;
          if Node.ChildNodes.Count = 2 then
            Node := Node.ChildNodes[ 1 ].ChildNodes[ 0 ].ChildNodes[ 0 ]
          else if Node.ChildNodes.Count = 1 then
            Node := Node.ChildNodes[ 0 ].ChildNodes[ 0 ].ChildNodes[ 0 ];
          Result := Node.XML;
        finally
          Resposta.Free;
        end;
      finally
        StrStream.Free;
      end;
    finally
      Stream.Free;
    end;
  finally
    Acao.Free;
  end;


Consulta; Tienes el certificado para la firma del XML y comunicación con el SIFEN?

Llegaste a consumir el webservice de Consulta de RUC? la pregunta va pues es el webservice más básico y si lograste consumir el mismo es que vas por buen camino.

te paso como consumo el webservice de consulta de RUC, te servirá para empezar.

Saludos

lucasvaz25 09-07-2024 21:30:24

Cita:

Empezado por JCz (Mensaje 556622)
Consulta; Tienes el certificado para la firma del XML y comunicación con el SIFEN?

Llegaste a consumir el webservice de Consulta de RUC? la pregunta va pues es el webservice más básico y si lograste consumir el mismo es que vas por buen camino.

te paso como consumo el webservice de consulta de RUC, te servirá para empezar.

Saludos

Aún no he logrado consumir ningún servicio, pero tengo el certificado. Empezaré por esa parte entonces. Iré informando sobre mi progreso. Agradezco el soporte.

lucasvaz25 10-07-2024 19:34:46

Gracias!!
 
Buenas tardes, estimados. Me gustaría, en primer lugar, agradecer la ayuda, ya que pude realizar la comunicación con el ws. Algunos datos de la documentación están desactualizados y eso estaba causando la dificultad. Ahora tengo algunas cosas que resolver.
Por ejemplo, el retorno del Sifen al transmitir FE es que el valor del campo dDesTiDE es inválido, Pero el valor informado es el que consta en la documentación: Factura electrónica.
¿Alguien ha pasado por esto?

JCz 10-07-2024 20:10:21

Cita:

Empezado por lucasvaz25 (Mensaje 556644)
Buenas tardes, estimados. Me gustaría, en primer lugar, agradecer la ayuda, ya que pude realizar la comunicación con el ws. Algunos datos de la documentación están desactualizados y eso estaba causando la dificultad. Ahora tengo algunas cosas que resolver.
Por ejemplo, el retorno del Sifen al transmitir FE es que el valor del campo dDesTiDE es inválido, Pero el valor informado es el que consta en la documentación: Factura electrónica.
¿Alguien ha pasado por esto?

Pasa tu xml para mirar como lo envias; tené en cuenta la codificación tambien que debe ser en UTF8 para que te acepte las tildes y ñ.

Saludos.

lucasvaz25 10-07-2024 20:35:31

1 Archivos Adjunto(s)
Cita:

Empezado por JCz (Mensaje 556646)
Pasa tu xml para mirar como lo envias; tené en cuenta la codificación tambien que debe ser en UTF8 para que te acepte las tildes y ñ.

Saludos.

Archivo Adjunto 4188 sigue el xml.

JCz 10-07-2024 20:58:40

Cita:

Empezado por lucasvaz25 (Mensaje 556651)
Archivo Adjunto 4188 sigue el xml.

está dañado el archivo; ten en cuenta lo del cambio de codificación, unos mensajes más arriba comentado.

JCz 10-07-2024 20:59:16

Cita:

Empezado por JCz (Mensaje 553899)
Código Delphi [-]
procedure TdmRIO.BeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
begin

    SOAPRequest.Size:=0;
    ssResponse:=TStringStream.Create(UTF8Encode(ssRequest.DataString));
    SOAPRequest.Position := 0;
    SOAPRequest.CopyFrom( ssResponse, ssResponse.Size);
    ssResponse.Free;
    SOAPRequest.Position := 0;
end;

Buenas; referente a la consulta; por algún motivo delphi modifica la codificación antes de enviar el archivo; por ello agregué UTF8Encode otra vez antes de enviar.


Con ello solucioné el error.


Espero te sirva.


Saludos



me referia a este

lucasvaz25 18-07-2024 21:51:53

1101: TEST - Número de timbrado inválido
 
Estoy utilizando el timbrado válido de un cliente en un entorno de prueba, pero la respuesta de Sifen indica que es inválido. ¿Alguien ha pasado por esta situación?


La franja horaria es GMT +2. Ahora son las 16:21:12.

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