PDA

Ver la Versión Completa : Clase para Factura electrónica AFIP Argentina


aledieb
07-12-2017, 14:30:51
Hola me vi obligado a utilizar la facturas electrónicas y estuve buscando ayudas para poder implementarlo, encontré estos post https://www.clubdelphi.com/foros/showthread.php?t=73179 , http://www.clubdelphi.com/foros/showthread.php?t=88675 y a partir del trabajo de adripugliesso empecé a preparar una clase para usar la factura electrónica, aun no esta terminado, falta terminar de implementar la obtención del cae/caea y el control de errores. Está basado totalmente en el trabajo de adripugliesso, incluso verán su código casi sin modificar.

La clase esta sin terminar y hay que hacerle bastantes ajustes pero le puede servir a alguien para empezar con su sistema.
Para usarlo deben incluir la clase en el uses y hay que poner los certificados y las librerías de openssl (con el exe) en la carpeta donde estará el ejecutable de la aplicación (yo use la versión de openssl sin instalador), (se puede cambiar sin mucho trabajo)

En la sección public del formulario:

MiFCAFIP : TFCAfip;
En el evento OnCreate del formulario
MiFCAFIP := TFCAfip.Create( GetCurrentDir, ElCuitEmpresa ); // ElCuitEmpresa es un int64
MiFCAFIP.ArchClavePriv := 'claveprivada.txt'; // Archivo con la clave privada para el cuit
MiFCAFIP.ArchCertPemCRT := 'certificadopem.crt'; // Archivo con el certificado creado en la página de la Afip
En el evento OnDestroy del formulario
MiFCAFIP.Destroy;
Esta línea genera el token y el sign:
MiFCAFIP.ObtenerTokenSign;
Las propiedades
MiFCAFIP.Token; // El token generado ( WideString )
MiFCAFIP.Sign; // El sign generado ( WideString )
MiFCAFIP.expirationTA; // Texto con la fecha/hora según el código original de adripugliesso ( String )
MiFCAFIP.generationTA; // Texto con la fecha/hora según el código original de adripugliesso ( String )
MiFCAFIP.Generacion; // Fecha de generación ( TDateTime ) es lo mismo que los anteriores pero para poder usar en el código para controlar
MiFCAFIP.Expiracion; // Fecha de vencimiento ( TDateTime ) ídem
MiFCAFIP.LastError.codigo; // Código de error devuelto ( int ) solo un error por ahora
MiFCAFIP.LastError.mensaje; // Descripción de error devuelto ( String ) solo un error por ahora
Para usar los métodos (excepto el de obtención de cae que aún no termine de ajustar, pero no es difícil de implementar)

var
stResultado : TStringList;
begin
stResultado := TStringList.Create;
stResultado := MiFCAFIP.ListaComprobantes;
// Hacer lo que se necesite con stResultado
FreeAndNil( stResultado );
end;
Lo mismo para:
stResultado := MiFCAFIP.ConsultaComprobante( iCbteTipo, iCbteNro, iPtoVta );
// Este método aun no lo comprobé iCbteTipo, iCbteNro, iPtoVta son integer
// y los valores deben corresponder al comprobante que quieran consultar
stResultado := MiFCAFIP.ListaComprobantes; // Listado de códigos/descrip. comprobantes
stResultado := MiFCAFIP.ListaConceptos; // Listado de códigos/descrip. conceptos
stResultado := MiFCAFIP.ListaDocumentos; // Listado de códigos/descrip. documentos
stResultado := MiFCAFIP.ListaOpcional; // Listado de códigos/descrip. opcionales
stResultado := MiFCAFIP.ListaPuntosVenta; // Listado de Puntos de venta AUN NO COMPROBADO
stResultado := MiFCAFIP.ListaTributos; // Listado de códigos/descrip. tributos
stResultado := MiFCAFIP.ListaCotizacion( 'DOL' ); // Cotización oficial de moneda según el código devuelto en MiFCAFIP.ListaMonedas;
stResultado := MiFCAFIP.ListaMonedas; // Listado de códigos/descrip. monedas
stResultado := MiFCAFIP.ListaIvas; // Listado de códigos/descrip. IVAS
stResultado := MiFCAFIP.ListaPaises; // Listado de códigos/descrip. Países
// La única que es distinta y devuelve un integer con el último número de comprobante autorizado según los datos pasados
Var iUltComprobanteAutorizado : integer;
iUltComprobanteAutorizado := MiFCAFIP.ObtieneUltComp( puntoventa, idcomprobante : integer );

//Saber si los servidores AFIP funcionan:
if MiFCAFIP.Dummy then
ShowMessage('Servidores funcionan');

Para el caso en que se deba reiniciar el sistema se puede guardar en un archivo ini el token, sign y las fechas de generación y vencimiento y antes de generar el token/sign leerlo desde el ini y guardarlo luego de obtenerlo, método que se debería incluir en la clase o implementar la modificación de las propiedades para hacerlo fuera de la clase.
Adjunto el código de la clase y las unidades de webservice importadas.

el-mono
08-12-2017, 15:27:24
Buenísimo Alejandro. Se agradece un montón !

ElKurgan
11-12-2017, 07:49:41
Gracias por el aporte

Saludos

PabloZZZ
08-12-2018, 23:25:17
Hola a todos!

Estoy tratando de implementar todo esto.
Hay algún tutor en youtube que explique BIEN cómo es el procedimiento de generación de los certificados? Me marean con distintos nombres a las mismas cosas! token / sign / certificado / CRT / key / clave privada / CSR ... en fin...

Ahora voy a probar esta clase a ver cómo funciona!
Gracias

Dexter182
16-12-2018, 15:44:38
Hola Pablo:

A mi me sirvieron mucho estos dos videos:
Parte 1: https://www.youtube.com/watch?v=6tu4QJVbDtI
Parte 2: https://www.youtube.com/watch?v=v6r4D3Ljuy8


Saludos!