unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, IDEWindowIntf, Forms, Controls, Graphics,
Dialogs, StdCtrls, XMLPropStorage, ActiveX, ComObj{, XMLConf, xmldom, XMLIntf,}
{msxmldom, XMLDoc };
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
WSAA, WSFEv1: Variant;
tra, path, pathTra, Certificado, ClavePrivada, cms, ta: String;
qty, LastId, LastCBTE, cae, ok , OkUlt, ok_WSAA: Variant;
tipo_cbte, punto_vta, tipo_doc, presta_serv, id,
cbt_desde, cbt_hasta : Integer;
fecha, nro_doc, imp_total, imp_tot_conc, imp_neto, impto_liq,
impto_liq_rni, imp_op_ex, fecha_cbte, fecha_venc_pago,
fecha_serv_desde, fecha_serv_hasta, venc : String;
cache ,url_wsdl ,proxy : String ;
moneda_id , moneda_ctz : string ;
base_imp, importe : string ;
Token , Sign , ta_xml : Variant;
w_archivo : string;
//nodo: IXMLNode;
//dXML: TXMLDocument;
f : TextFile;
begin
CoInitialize(nil);
// Crear objeto interface Web Service Autenticación y Autorización
WSAA := CreateOleObject('WSAA') ;
// Generar un Ticket de Requerimiento de Acceso (TRA)
tra := WSAA.CreateTRA;
Memo1.Lines.Add(tra);
// Especificar la ubicacion de los archivos certificado y clave privada
path := GetCurrentDir + '\';
// Certificado: certificado es el firmado por la AFIP
// ClavePrivada: la clave privada usada para crear el certificado
Certificado := 'reingart.crt'; // certificado de prueba
ClavePrivada := 'reingart.key'; // clave privada de prueba' +
// Generar el mensaje firmado (CMS)
Memo1.Lines.Add(Path + Certificado);
Memo1.Lines.Add(Path + ClavePrivada);
cms := WSAA.SignTRA(tra, Path + Certificado, Path + ClavePrivada);
Memo1.Lines.Add(cms);
// Llamar al web service para autenticar:
ta := WSAA.CallWSAA(cms, 'https://wsaahomo.afip.gov.ar/ws/services/LoginCms'); // Hologación
//ta = WSAA.CallWSAA(cms, 'https://wsaa.afip.gov.ar/ws/services/LoginCms'); // Producción
// Imprimir el ticket de acceso, ToKen y Sign de autorización
Memo1.Lines.Add(ta);
showmessage(ta);
Memo1.Lines.Add('Token:' + WSAA.Token);
Memo1.Lines.Add('Sign:' + WSAA.Sign);
// Una vez obtenido, se puede usar el mismo token y sign por 6 horas
// (este período se puede cambiar)
// Crear objeto interface Web Service de Factura Electrónica
cache := ''; // directorio temporal (usar predeterminado)
url_wsdl := 'https://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL ';// usar servicios1 para producción
proxy:= '';
WSFEv1 := CreateOleObject('WSFEv1');
// Setear tocken y sing de autorización (pasos previos)
WSFEv1.Token := WSAA.Token;
WSFEv1.Sign := WSAA.Sign;
// CUIT del emisor (debe estar registrado en la AFIP)
WSFEv1.Cuit := '20108714965';
//WSFEv1.LanzarExcepciones := False;
// Conectar al Servicio Web de Facturación
ok := WSFEv1.Conectar(cache, url_wsdl, proxy); // homologación
//ok := WSFE.Conectar('https://wsw.afip.gov.ar/wsfe/service.asmx'); // producción
// Llamo a un servicio nulo, para obtener el estado del servidor (opcional)
{WSFEv1.Dummy;
WriteLn('appserver status ' + WSFEv1.AppServerStatus);
WriteLn('dbserver status ' + WSFEv1.DbServerStatus);
WriteLn('authserver status ' + WSFEv1.AuthServerStatus);}
// Recupera cantidad máxima de registros (opcional)
//qty := WSFE.RecuperarQty;
// Recupera último número de secuencia ID
//LastId := WSFEv1.RecuperaLastCMP();
// Recupero último número de comprobante para un punto de venta y tipo (opcional)
tipo_cbte := 1; punto_vta := 3;
LastCBTE := WSFEv1.CompUltimoAutorizado(punto_vta, tipo_cbte) + 1; //+ 1
//WriteLn(WSFEv1.FECompUltimoAutorizado) ;
// Establezco los valores de la factura o lote a autorizar:
DateTimeToString(Fecha, 'yyyymmdd', Now);
id := LastId + 1; presta_serv := 3;
tipo_doc := 80; nro_doc := '20277448530';
cbt_desde := LastCBTE ;
cbt_hasta := LastCBTE ;
imp_total := '121.00'; imp_tot_conc := '0.00'; imp_neto := '100.00';
impto_liq := '21.00'; impto_liq_rni := '0.00'; imp_op_ex := '0.00';
fecha_cbte := Fecha; fecha_venc_pago := Fecha;
moneda_id := 'PES';
moneda_ctz := '1.000';
// Fechas del período del servicio facturado (solo si presta_serv = 1)
fecha_serv_desde := Fecha; fecha_serv_hasta := Fecha;
// Llamo al WebService de Autorización para obtener el CAE
ok := WSFEv1.CrearFactura ( presta_serv,
tipo_doc, nro_doc, tipo_cbte, punto_vta,
cbt_desde, cbt_hasta, imp_total, imp_tot_conc, imp_neto,
impto_liq, impto_liq_rni, imp_op_ex, fecha_cbte, fecha_venc_pago,
fecha_serv_desde, fecha_serv_hasta,moneda_id,moneda_ctz ); // si presta_serv = 0 no pasar estas fechas
//Agrego tasas de IVA
id := 5 ; // 21%
base_imp := '100.00';
importe := '21.00';
ok := WSFEv1.AgregarIva(id, base_imp, importe);
{If tipo_cbte = 1 Then // solo para facturas A
begin
ok := WSFEv1.AgregarOpcional(5, '02'); // IVA Excepciones (01: Locador/Prestador, 02: Conferencias, 03: RG 74, 04: Bienes de cambio, 05: Ropa de trabajo, 06: Intermediario).
ok := WSFEv1.AgregarOpcional(61, '80'); // Firmante Doc Tipo (80: CUIT, 96: DNI, etc.)
ok := WSFEv1.AgregarOpcional(62, '20267565393'); // Firmante Doc Nro
ok := WSFEv1.AgregarOpcional(7, '01'); // Car?er del Firmante (01: Titular, 02: Director/Presidente, 03: Apoderado, 04: Empleado)
End;}
WSFEv1.Reprocesar := True ;
//cae :=
cae := WSFEv1.CAESolicitar;
If WSFEv1.Excepcion <> '' Then
begin
showmessage( WSFEv1.Excepcion) ;
showmessage( WSFEv1.Traceback) ;
showmessage( WSFEv1.XmlRequest) ;
showmessage( WSFEv1.XmlResponse) ;
end;
showmessage( 'Resultado ' + WSFEv1.Resultado);
showmessage( 'CAE' + WSFEv1.CAE);
//' Imprimo pedido y respuesta XML para depuración (errores de formato)
Memo1.Lines.Add(WSFEv1.XmlRequest );
Memo1.Lines.Add( WSFEv1.XmlResponse );
Showmessage( WSFEv1.XmlResponse );
If WSFEv1.errmsg <> '' Then
Memo1.Lines.Add(WSFEv1.errmsg);
Memo1.Lines.Add('Obs ' + WSFEv1.obs);
Memo1.Lines.Add('Resultado: ' + WSFEv1.Resultado);
Memo1.Lines.Add('cae: ' + WSFEv1.CAE);
//cae := WSFEv1.CAE() ;
ShowMessage('CAE: ' + cae );
CoUninitialize;
end;
end.