PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → E-Factura
E-Factura
Débuté par Miguel, 07 fév. 2023 07:52 - 31 réponses
Posté le 07 février 2023 - 07:52
Bueno días a tod@s
Alguien a implantado la factura electrónica con windev?
Si es así, aparte de firmar los pdf con firma digital ¿se debe tener en cuenta algo más?

Gracias
Saludos,
Posté le 09 février 2023 - 14:55
Buenas,

Yo estoy intentando implementarlo.
Debes tener en cuenta que para hacer uso de los servicios web de Face la peticiones las tendrás que hacer con ws-security, ahora me estoy peleando a ver como se hace eso en windev...

Un saludo,
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 09 février 2023 - 16:08
Hola. ¿A que tipo de factura electrónica os referis? ¿España? Las facturas electronicas con la Administración son ficheros XML con la información de facturación y firmados digitalmente que luego se suben al portal de FACe.

Rubén
Posté le 09 février 2023 - 17:06
Hola, pido disculpas por no haber especificado que es entre empresas B2B. nueva ley de AEAT
He asistido a un Webinar y aunque se está hablando mucho de esto, aun no lo tienen muy claro, de hecho, en la web de AEAT la poca documentación que hay pone que aún es un borrador.
Tampoco tenían claro que el SII sirva para este fin.
• Fase 1: dirigida a las grandes empresas cuya facturación anual sea superior a 8 millones de euros. En este caso, dispondrán de un plazo de un año desde su publicación en el BOE.
• Fase 2: El resto de empresas y autónomos dispondrán de un plazo de 3 años tras la publicación de la ley en el BOE. Para ello se establecerá un calendario gradual.
Aunque mi caso es la fase 1 lo que me preocupa es que al mismo tiempo dicen que deberá estar para el 1 de enero de 2024.
No me enrollo más, si queréis el video del webinar os pongo el enlace.

Gracias
Saludos,
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 09 février 2023 - 17:42
Si por favor. Gracias.

Rubén
Posté le 10 février 2023 - 08:51
Buenos días, os paso el link al webinar.



Me interesa conocer vuestra opinión sobre esto.
Saludos
Posté le 10 février 2023 - 10:15
Buenos días,

Gracias por el video, me lo miro en un hueco.

Entiendo entonces que alguno de los dos ya ha desarrollado la facturae en windev?

Ya tengo implementado la firma del fichero xml que luego habrá que subir a FACE, pero esa subida la quiero hacer utilizando los web services que hay para ello. La cosa está es que en la peticiones soap hay que un implementar ws-security 1.0 X.509 Token Profile. No me queda muy claro si eso se puede hacer a través de windev.

Alguno de los dos lo sabe?

Gracias, un saludo.
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 10 février 2023 - 14:16
Hola. En principio X.509 parece que esta soportado

https://help.windev.com/…

Rubén
Message modifié, 10 février 2023 - 14:16
Posté le 08 septembre 2023 - 19:19
Buenas tardes,
una pregunta curiosa. La generación del fichero Facturae firmado, la has realizado exclusivamente con windev o has utlizado librerias externas ?. Es porque yo tuve que utilizar unas librerias en java (de la AEAT) para poder generar las diferentes firmas y me da miedo que esto deje de funcionar algun dia.

Gracias
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 29 septembre 2023 - 17:36
Para Corina, acabo de ver esto en la ayuda. Firma digital en SOAP.

https://doc.windev.com/en-US/…

Rubén
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 29 septembre 2023 - 17:40
Para Raul.

Puedes definir la XMLSignature para usar X.509 como tipo de firma y entonces usar XmlSign con el XML indicando el nodo donde va la firma

https://doc.windev.com/en-US/…
https://doc.windev.com/en-US/…

Si no hay errores con las actualizaciones de Windev deberia ser suficiente. Si usas las ya probadas de Javea, fantastico.

Rubén
Posté le 03 octobre 2023 - 10:33
"Rubén Sánchez Peña" a émis l'idée suivante :
Para Raul.

Puedes definir la XMLSignature para usar X.509 como tipo de firma y entonces
usar XmlSign con el XML indicando el nodo donde va la firma

https://doc.windev.com/en-US/…
https://doc.windev.com/en-US/…

Si no hay errores con las actualizaciones de Windev deberia ser suficiente.
Si usas las ya probadas de Javea, fantastico.

Rubén


Gracias Rubén,
cuando tenga tiempo libre lo investigo. Me da miedo que con alguna
actualización de java o factura-e deje de funcionar.
Membre enregistré
8 messages
Posté le 26 juillet 2024 - 14:41
Para Rubén,

¿Has conseguido firmar la facturaE con la instrucción XMLSign?

Actualmente la estoy firmando con AutoFirma, mediante la línea de comando, pero preferiría hacerlo con XMLSign para que no sea necesario tenerlo instalado, pero con las pruebas que he realizado hasta ahora no consigo que me funcione bien (aparece una ventana de Windows pidiendo una tarjeta inteligente).

Si pudieses facilitarme un ejemplo de código, te lo agradecería.

Lluís.
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 26 juillet 2024 - 21:32
Hola. Por desgracia no. Como mencionaba arriba ya soporta X.509 pero no he encontrado la forma de usar XADES para hacer la firma del XML. Quizas podrian importarse librerias .Net que soporten esos tipos de firmas, pero lo mas sencillo de momento es usar AutoFirma. Si encontrase algo lo compartiré aqui.

Un saludo

Rubén
Membre enregistré
8 messages
Posté le 28 juillet 2024 - 12:38
Muchas gracias Rubén.

También seguiré investigando y si por fin encuentro la solución, también la compartiré aquí.

Saludos.
Lluís.
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 28 juillet 2024 - 13:56
Hola. He estado trasteando y he encontrado una solución rápida con librerias .NET. En particular la libreria FirmaXadesNet que esta disponible en

https://administracionelectronica.gob.es/ctt/verPestanaGeneral.htm…

Usando esas librerias .NET y el código en WD:

using FirmaXadesNet;
using FirmaXadesNet.Crypto;
using FirmaXadesNet.Signature.Parameters;
using System;
using System.IO;
using System.Windows.Forms;

PUBLIC static void FirmarDocumento()
{

XadesService xadesService = new XadesService();
SignatureParameters parametros = new SignatureParameters();

string ficheroFactura = "Facturae.xml";

// Política de firma de factura-e 3.1
parametros.SignaturePolicyInfo = new SignaturePolicyInfo();
parametros.SignaturePolicyInfo.PolicyIdentifier = "http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf";
parametros.SignaturePolicyInfo.PolicyHash = "Ohixl6upD6av8N7pEvDABhEL6hM=";
parametros.SignaturePackaging = SignaturePackaging.ENVELOPED;
parametros.DataFormat = new DataFormat();
parametros.DataFormat.MimeType = "text/xml";
parametros.SignerRole = new SignerRole();
parametros.SignerRole.ClaimedRoles.Add("emisor");

using (parametros.Signer = new Signer(FirmaXadesNet.Utils.CertUtil.SelectCertificate("","")))
{
using (FileStream fs = new FileStream(ficheroFactura, FileMode.Open))
{
var docFirmado = xadesService.Sign(fs, parametros);

// if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
// {
docFirmado.Save("Facturae.xml.sign");
MessageBox.Show("Fichero guardado correctamente.");
// }
}
}

}


Se realiza la firma del documento XML compatible con Facturae.

La prueba la he hecho con WD SaaS 2024.

Un saludo

Rubén
Membre enregistré
8 messages
Posté le 06 août 2024 - 15:10
Rubén,

Se agradece el trasteo...

Para mi desgracia no he trabajado nunca ni con .NET, ni con C#, por lo que los errores que me están saliendo al intentar implementarlo en WD, no soy capaz de reconducirlos.

He descargado las librerías .NET y las he adjuntado al proyecto, y aparentemente Ok.

He creado un procedimiento global y en él he pegado el código que adjuntas y aparece un "error CS0246: No se puede encontrar el tipo o el nombre de espacio de nombre 'var' ("falta una directiva using o una referencia de ensamblado?)".

He probado varias cosas, pero no veo por donde salir, ya que si me tomo el mensaje literal tendría que quitarle el 'va' al inicio de la línea "var docFirmado=xadesService.Sign(fs,parametros);" y no le veo el sentido,

Saludos.
Lluís.
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 06 août 2024 - 19:15
Hola. ¿Usaste el código que puse arriba? Tiene los using necesarios para que funcione.

¿Que versión de WD usas? Si la tengo te puedo pasar un ejemplo que me funcione.

Un saludo

Rubén
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 06 août 2024 - 19:47
Buenas. He publicado un ejemplo en los repositorios frances/inglés para WD26:

https://repository.windev.com/resource.awp…

Un saludo

Rubén
Membre enregistré
8 messages
Posté le 08 août 2024 - 18:20
Hola Rubén,

Muchas gracias por el ejemplo del repositorio. Funciona perfectamente.

Uso WD29. El problema lo tenía con los ensamblajes. Le he dicho a WD que "Recargue los ensamblados .NET" y ha funcionado correctamente.

Saludos.
Lluís.
Message modifié, 08 août 2024 - 19:04
Membre enregistré
8 messages
Posté le 08 août 2024 - 19:00
Buenas,

De cara a poder ponerlo en producción, he hecho algunas modificaciones en el código que de momento funcionan correctamente:
- Enviar como parámetros el nombre de los ficheros origen y destino, así como el rol (emisor/receptor)
- Controlar si se produce algún error

Pero no veo como sacar la selección del certificado del procedimiento y también enviarlo como parámetro desde la ficha.

El código de la ficha quedaría como sigue:
sFicheroFacturaOrigen is string = "C:\\Tmp\\FacturaE.xml"
sFicheroFacturaDestino is string = "C:\\Tmp\\FacturaE.xsig"
sRol is string = "emisor"

bResultado is boolean = FirmarDocumento(sFicheroFacturaOrigen,sFicheroFacturaDestino,sRol)
Info(bResultado= True ? "Correcto" ELSE "Error")


y el código del procedimiento:
using FirmaXadesNet;
using FirmaXadesNet.Crypto;
using FirmaXadesNet.Signature.Parameters;
using System;
using System.IO;
using System.Windows.Forms;

PUBLIC static bool FirmarDocumento(string ficheroFacturaOrigen,string ficheroFacturaDestino,string rol)
{
XadesService xadesService = new XadesService();
SignatureParameters parametros = new SignatureParameters();

// Política de firma de factura-e 3.1
parametros.SignaturePolicyInfo = new SignaturePolicyInfo();
parametros.SignaturePolicyInfo.PolicyIdentifier = "http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf";
parametros.SignaturePolicyInfo.PolicyHash = "Ohixl6upD6av8N7pEvDABhEL6hM=";
parametros.SignaturePackaging = SignaturePackaging.ENVELOPED;
parametros.DataFormat = new DataFormat();
parametros.DataFormat.MimeType = "text/xml";
parametros.SignerRole = new SignerRole();
parametros.SignerRole.ClaimedRoles.Add(rol);

try
{
using (parametros.Signer = new Signer(FirmaXadesNet.Utils.CertUtil.SelectCertificate("","")))
{
using (FileStream fs = new FileStream(ficheroFacturaOrigen, FileMode.Open))
{
var docFirmado = xadesService.Sign(fs, parametros);
docFirmado.Save(ficheroFacturaDestino);
}
}
RETURN True;
}
catch
{
RETURN False;
}
}


Agradecería cualquier ayuda para sacar la selección del certificado del procedimiento y también enviarlo como parámetro desde la ficha.

Entiendo que sería añadir el parámetro ", Signer certificado" al incio del procedimiento y sustituir "new Signer(FirmaXadesNet.Utils.CertUtil.SelectCertificate("",""))" por "certificado" ... pero ¿cómo hay que hacerlo en la ficha para enviar ese tipo de dato (Signer)?

Saludos.
Lluís.
Message modifié, 08 août 2024 - 19:07
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 08 août 2024 - 21:40
Hola. Por desgracia no creo que eso sea posible. El tipo de los objetos que puedes pasar como parametro es limitado desde WD a otros lenguajes y viceversa. Además la varible tipo Certificado de WD no va a ser compatible con lo que espera .NET.

Una opción sería crear otra función .NET que seleccione el certificado y lo guarde en una variable global del código .NET. Luego podrias usar esa variable para usarlo en la firma.

¿Porque precisas separar la firma de la selección del certificado? Funcionalmente lo que aparece es lo mismo en WD y en .NET. En .NET puedes seleccionar el tipo de certificados que quieres que aparezcan en el listado de certificados disponibles en vez de que aparezcan todos como en el ejemplo.

Un saludo

Rubén
Membre enregistré
8 messages
Posté le 11 août 2024 - 20:40
Hola Rubén,

El tema de la incompatibilidad del tipo de variable del Certificado es realmente el problema donde me quedé en el anterior mensaje.

La idea es primero seleccionar el certificado, luego seleccionar una o varias facturas y en un bucle enviarlas a firmar sin tener que volver a pedir (seleccionar) para cada una el certificado.

Actualmente uso Autofirma y en la selección del certificado (previo a Autofirma), selecciono solo los que no han caducado y tienen determinadas características de firma, con lo que al usuario solo le muestro los certificados viables para que escoja y a Autofirma le envio el nombre del certificado,

Igual a .NET también se le podría enviar el nombre del certificado (string) y que lo seleccione sin tener que pasar por la selección manual dentro de .NET ... pero desconozco como se hace.

Cualquier ayuda se agradece.

Saludos.
Lluís.
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 11 août 2024 - 21:31
Hola. Es lo que te comentaba. Puedes sacar la selección del certificado a otra función y que te guarde el certificado en una variable global del código .NET. Se lo asignas en esa función a la variable global y usas esa variable en la firma.

SelectCertificate devuelve una variable de tipo X509Certificate2 y el using es

using System.Security.Cryptography.X509Certificates;

Tienees el código de la función en https://github.com/ctt-gob-es/FirmaXadesNet/blob/master/FirmaXadesNet/Utils/CertUtil.cs

No deberia ser muy complicado.

Un saludo

Rubén
Membre enregistré
8 messages
Posté le 12 août 2024 - 10:56
Gracias Rubén.

Al final tendré que aprender algo de C# ... a ver si consigo sacarlo.

Saludos.
Lluís.
Message modifié, 12 août 2024 - 10:57
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 12 août 2024 - 12:54
Ok, le echo un vistazo y te cuento.

Rubén
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 12 août 2024 - 13:30
Buenas. He subido una nueva versión del ejemplo. Permite seleccionar el certificado, guardarlo y usarlo varias veces. La variable que guarda el certificado esta puesta en la ventana donde se hace la firma, aunque puede ponerse en una variable global del proyecto. El certificado se pasa como parametro al procedimiento de firma.

https://depot.pcsoft.fr/resource.awp…

Un saludo

Rubén
Membre enregistré
8 messages
Posté le 14 août 2024 - 14:11
Hola Rubén,

Muchísimas gracias por el desarrollo ... funciona perfectamente.

Con estas modificaciones que has hecho, lo podré implantar sin problemas.

Saludos.
Lluís.
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 14 août 2024 - 17:51
Un placer.

Rubén
Posté le 16 août 2024 - 08:30
Buenos dias,
he estado trasteando con las librerias, y por algun motivo no se cargan
el algun PC (estoy en ello).

Por si quereis cargar el certificado desde un ficher (a mi me va
mejor), no he conseguido cargarlo desde un campo binario de windev.

clCertificado is X509Certificate2("Ruta al
certificado.pfx","Contraseña")
gpclPclCertificado = new Signer(clCertificado)
FirmarDocumento(gpclPclCertificado)


Saludos y gracias
Raül Vidiella
Posté le 16 août 2024 - 09:57
Una pregunta, sabeis a que corresponden estas dos líneas de coódigo ?

parametros.SignaturePolicyInfo.PolicyIdentifier =
"http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf";

parametros.SignaturePolicyInfo.PolicyHash =
"Ohixl6upD6av8N7pEvDABhEL6hM=";

Gracias.
Raül Vidiella
Membre enregistré
829 messages
Popularité : +40 (42 votes)
Posté le 16 août 2024 - 18:48
Hola. Lo tienes todo en el mismo enlace del PDF:

El elemento xades:SignaturePolicyIdentifier debe incluir los siguientes contenidos
en los elementos en que se subdivide:
o Una referencia explícita al presente documento de política de firma en el elemento
xades:SigPolicyId. Para ello aparecerá la URL de su localización.
<xades:SigPolicyId>
<xades:Identifier>http://www.facturae.es/politica_de_firma_formato_facturae/politic
a_de_firma_formato_facturae_v3_1.pdf</xades:Identifier>
.....
o La huella digital de este documento y el algoritmo utilizado en el elemento
<xades:SigPolicyHash>

Son informaciones fijas.

Un saludo

Rubén