var
WSAA, WSFEv1, tra, cms, ta, CAE, ok: Variant;
Id: integer;
Certificado, ClavePrivada, cache, url_wsdl, proxy, CUIT,
TotalNeto, TotalIVA, Fecha: string;
begin
try
CoInitialize(NIL);
try
// Crear objeto interface Web Service Autenticación y Autorización
WSAA := CreateOleObject('WSAA');
// Generar un Ticket de Requerimiento de Acceso (TRA)
tra := WSAA.CreateTRA;
// Certificado: certificado es el firmado por la AFIP
// ClavePrivada: la clave privada usada para crear el certificado
// Generar el mensaje firmado (CMS)
// Especificar la ubicacion de los archivos certificado y clave privada
cms := WSAA.SignTRA(tra, Certificado, ClavePrivada);
// Llamar al web service para autenticar:
ta := WSAA.CallWSAA(cms, 'https://wsaahomo.afip.gov.ar/ws/services/LoginCms'); // Hologación
// 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
WSFEv1 := CreateOleObject('WSFEv1');
// Setear tocken y sing de autorización (pasos previos)
WSFEv1.Token := WSAA.Token;
WSFEv1.Sign := WSAA.Sign;
WSFEv1.CUIT := CUIT;
// Conectar al Servicio Web de Facturación
cache := ''; // directorio temporal (usar predeterminado)
url_wsdl := 'https://wswhomo.afip.gov.ar/wsfev1/service.asmx'; // usar servicios1 para producción
proxy := ''; // información de servidor intermedio (si corresponde)
ok := WSFEv1.Conectar(cache, url_wsdl, proxy); // homologación
if not(OK) then
raise Exception.Create('Conexion erronea');
with Comprobante do
begin
TotalNeto := FormatFloat('0.##', (StrToCurr(ImporteNetoGrav1) +
StrToCurr(ImporteNetoGrav2) +
StrToCurr(ImporteNetoGrav3)));
TotalIVA := FormatFloat('0.##', (StrToCurr(ImporteIVA1) +
StrToCurr(ImporteIVA2) +
StrToCurr(ImporteIVA3)));
Id := WSFEv1.CompUltimoAutorizado(TipoComp, PuntoVenta);
DateTimeToString(Fecha, 'yyyymmdd', Date);
// Llamo al WebService de Autorización para obtener el CAE
WSFEv1.CrearFactura(1 {Concepto = Productos}, TipoDoc, NroDoc, TipoComp, PuntoVenta,
Id + 1, Id + 1, Total, '0.00' { total conceptos }, TotalNeto,
TotalIVA, PercepRetDeIngrBrutos, ImporteOpEx,
Fecha, '', '', '', {fecha_vto_pago y desde / hasta. Solo usado por servicios }
'PES', '1.000');
if StrToCurr(ImporteIVA1) > 0 then
WSFEv1.AgregarIva(CodigoIVA(AlicuotaIVA1), ImporteNetoGrav1, ImporteIVA1);
if StrToCurr(ImporteIVA2) > 0 then
WSFEv1.AgregarIva(CodigoIVA(AlicuotaIVA2), ImporteNetoGrav2, ImporteIVA2);
if StrToCurr(ImporteIVA3) > 0 then
WSFEv1.AgregarIva(CodigoIVA(AlicuotaIVA3), ImporteNetoGrav3, ImporteIVA3);
// ingresos brutos -> Segun tabla AFIP Codigo = 02 Descripcion = Impuestos provinciales
if StrToCurr(PercepRetDeIngrBrutos) > 0 then
WSFEv1.AgregarTributo(2, 'Impuestos provinciales', Total, { fix mePorcIngBrutos, } PercepRetDeIngrBrutos);
end;
// solicito CAE
CAE := WSFEv1.CAESolicitar;
if WSFEv1.Resultado <> 'A' then
begin
Writeln;
with Comprobante do
Writeln(Format('No se obtuvo cae para comp %s nro %s fecha %s', [TipoComp, NroComp, FechaEmision]));
Writeln('Obs: ' + WSFEv1.Obs);
Writeln('ErrMsg: ' + WSFEv1.ErrMsg);
end;
if WSFEv1.Resultado = 'A' then
begin
// grabo en el archivo que me mandaron el CAE y fecha vto
Comprobante.CAE := CAE;
Comprobante.FechaVtoCae := WSFEv1.Vencimiento;
end;
end;
finally
CoUninitialize;
end;