Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ejemplo OK en Delphi 7 #13

Open
rodrinig opened this issue Jun 24, 2015 · 2 comments
Open

Ejemplo OK en Delphi 7 #13

rodrinig opened this issue Jun 24, 2015 · 2 comments

Comments

@rodrinig
Copy link

Ejemplo de Uso de Interface COM con Web Services AFIP (PyAfipWs)
Autor original WSFE: 2009 (C) Mariano Reingart reingart@gmail.com
Adaptado para WSFEv1: 2015 (C) Rodrigo Iniguez rodrinig@hotmail.com
Licencia: GPLv3+

program consola;
{$APPTYPE CONSOLE}
uses
ActiveX,
ComObj,
Dialogs,
SysUtils;

var
WSAA, WSFEv1: Variant;
tra, path, Certificado, ClavePrivada, cms, ta: String;
qty, LastId, LastCBTE, cae, ok , OkUlt: 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 ;

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;
WriteLn(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)
cms := WSAA.SignTRA(tra, Path + Certificado, Path + ClavePrivada);
WriteLn(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
WriteLn(ta);
showmessage(ta);
WriteLn('Token:' + WSAA.Token);
WriteLn('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 := '20267565393';
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 := 1;
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', Date);
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)
WriteLn(WSFEv1.XmlRequest );
WriteLn( WSFEv1.XmlResponse );
Showmessage( WSFEv1.XmlResponse );
If WSFEv1.errmsg <> '' Then
WriteLn(WSFEv1.errmsg);

WriteLn('Obs ' + WSFEv1.obs);
WriteLn('Resultado: ' + WSFEv1.Resultado);
WriteLn('cae: ' + WSFEv1.CAE);

//cae := WSFEv1.CAE() ;
ShowMessage('CAE: ' + cae );
showmessage('Presione Enter para terminar');
ReadLn;
CoUninitialize;
end

@DeGsoft
Copy link

DeGsoft commented May 4, 2017

Tengo problemas con este codigo, funciona mal cuando se cambia tipo_cbte a 6.
"El número o fecha del comprobante no se corresponde con el próximo a autorizar"
Lo hice funcionar pero tuve que cambiar el punto_vta a 3 (1 y 2 fallan), eso esta bien?
Cuando pase a producción y tenga un solo punto de ventas no va a repetirse el error?

@guidohalley
Copy link

Hola, Esto sigue funcionando ?, soy trainee y me pidieron que aplique esto, si me pueden especificar como podria integrarlo, o en donde encuentro la documentacion. MUCHAS GRACIAS

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants