reingart / pyafipws

Factura Electrónica AFIP y otros servicios web (proyecto software libre) — Interfases, tools and apps for Argentina's gov't. webservices (soap, com/dll simil-ocx, pdf, dbf, xml, json, etc.) #python
http://www.sistemasagiles.com.ar/trac/wiki/ManualPyAfipWs
GNU Lesser General Public License v3.0
288 stars 227 forks source link

Ejemplo OK en Delphi 7 #13

Open rodrinig opened 9 years ago

rodrinig commented 9 years ago

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 commented 7 years ago

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 commented 3 years ago

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