Buenas, primero que nada queria hacer publica una pequeña charla privada que tuvimos con Amadis con respecto al tema; nos parecio buena idea porque quiza le sirva a alguien.
Hola agustin. Tenés algún formulario completo a modo de ejemplo de como confeccionar una factura y generar el pdf para ver como es el asuunto y lego adaptar a las necesidades. El codigo que colocaste me parece simple (aunque no logré que funcione). EL manual de afip trabaja todo por xml. Y nunca he usado webservices y xml y no se para que lado disparar. Muchas gracia
Hola Amadis,
El codigo que publique es tal y como lo uso. Lo unico que le "falta" para que compile es la unit del proyecto en la que contiene los tipos que maneja mi sistema, de ahi la linea que aparece por ahi "with comprobante" bla bla bla. Eso lo tenes que reemplazar vos con los datos de la factura que oportunamente lees de algun lado (bd, archivo texto, o hasta podrias pedirlos por pantalla campo a campo)
El tema es que la factura nosotros ya la tenemos generada (tenemos un sistema de gestion que ya funciona) y le agregamos este modulo para las facturas electronicas. Entonces directamente le mandamos como parametro una factura ya hecha (no la armamos en el momento)
La libreria lo unico que hace es meterse en el webservice de la afip, y para una determinada factura te devuelve el cae y fecha de vencimiento de cae (o errores si hubiera). No genera ningun pdf (lo tenes que hacer vos).
En mi caso el pdf lo genero yo mismo, como dije antes, usando QuickReport. Para añadirle el codigo de barras reglamentario uso esta otra herramienta
http://www.sistemasa...CódigosdeBarras (PyI25: Generador de Códigos de Barras)
Dentro del reporte, solte un componente TQRImage que contendra la imagen con el codigo de barras y en el evento OnBeforePrint uso el siguiente codigo para poder generar la imagen
var
PYI25: Variant;
CodeString, JPEGFile: string;
Imagen: TJPEGImage;
begin
Imagen := NIL;
PYI25 := CreateOleObject('PYI25');
CodeString := sCUIT_Emisor + Comp.TipoComp + Comp.PuntoVenta + Comp.CAE + Comp.FechaVtoCae;
CodeString := CodeString + PyI25.DigitoVerificadorModulo10(CodeString);
JPEGFile := ExtractFilePath(ParamStr(0)) + CodeString + '.jpeg';
PyI25.GenerarImagen(CodeString, JPEGFile, 9, 0, 90, 'JPEG');
Imagen:= TJPEGImage.Create;
Imagen.LoadFromFile(JPEGFile);
Espero te sirva de algo
Buenos Días Agustín, he logrado hacer compilar un proyecto con la FEAFIP.dll.
Entonces si no entiendo mal la Factura electrónica no es más que una Factura normal con el agregado del CAE (en codigo de barra) y la habilitación del mismo mediante la FEAFIP.dll?.
Te hago otras consultas tontas seguramente. Descargue el PYi25 pero no he podido registrar la dll. larga un par de errores de las otras dll python25 etc.
Y en el proyecto si intento esta linea PYI25 := CreateOleObject('PYI25'); larga error aquí no reconoce el objeto.
Otra consultita, que he realizado a la mesa de ayuda de afip pero nunca me dieron pelota.
Yo me he generado mis certificados csr, lo he subido con mi clave fiscal a la afip, y he generado el crt y tengo tambien el .key.
EL CRT tiene vencimiento el año proximo. La consulta es, una vez terminado el sistema debo reemplazar estos certificados con los de la empresa que vaya a emitir la factura?? ¿o siempre queda con mi key?. La otra. Una vez vencido el CRT se debe gestionar otro? y reemplazar el antiguo?.
Desde ya muchísimas gracias por toda tu ayuda y tiempo.
Hola Amadis
En efecto, la FE es una simple factura normal pero que fue autorizada por la AFIP y te devuelven el CAE, fecha de vencimiento del CAE y un Id (numero de transaccion). Esos 3 valores te los tenes que guardar en algun lado (por ejemplo base de datos). El id te va a servir para hacer consultas y recuperar datos de facturas ya autorizadas, no lo probe aun, pero hay metodos para eso
Con el tema del codigo de barras, lamento a veces no explicar bien las cosas. Para que te ande tenes que instalar la interface del desarrollador de la biblioteca PyI25
Aca esta el enlace: https://code.google....mo.exe&can=2&q=
Admito que el desarrollador es bastante desprolijo con su pagina y vas a encontrar 1500 descargas repartidas por todos lados. PEro yo con ese puedo usar sin problemas el WSFEv1 y el PYI125
Tema certificados: Son credenciales de acceso, esos archivos equivalen a decir: "Yo soy Amadis y mi contraseña es esta..., pueden verificar que soy yo porque tengo los archivos que dicen que soy Amadis". Me seguis? Quiere decir que esos archivos estan habilitados para vos. Si los uso yo o cualquier otro en tu nombre, las facturas van a quedar como que las emitiste vos. Asi que si, cada empresa tiene que tener sus propios certifiacdos y clave.
Por eso mismo en mi sistema agregamos un apartado de configuracion para la factura electronica. Ahi le pedimos que nos indique la ruta de los 2 archivos, las 2 URL de los webservice de la AFIP (por si quiere usar para pruebas o produccion, o por si cambia) y tambien el nro de CUIT
Espero haber sido de ayuda
Buenas Tardes Agustín. Finalmente voy haciendo andar las cosas. Ya tengo funcionando el pyi25.
ahora otra consulta, en la instrucción para el generado del código de barras, ¿que significa la siguiente linea?
CodeString := '20939802593' + '1' + '20' + caee + VtoCae;
En realidad lo que quiero saber es QUÉ ES lo que está antes de + cae .... etc. ¿que significan esos números? O son sólo numeros cualesquiera para el nombre del archivo ??.
Otra cosa, veo que la instrucción genera un jpg con el código, ese JPG ¿lo guardas o lo eliminas luego de generar la factura?.
Otra mas... leí por ahí que en ocaciones no se autoriza la operación.¿te ha pasado?.
Si hay errores son devueltos en este parámetro? ShowMessage(lwsfev1.ErrorDesc);?
Otra... ¿el cae lo generas al momento de finalizar la factura y lo visualizas en pantalla? o lo imprimis directamente al pie de la boleta?. Te pregunto porque en la web de estos componentes PY... tienen una imagen de su sistema y veo que generan primero y lo muestran
Te estoy muy agradecido por todo tu tiempo y ayuda.
Muchas gracias.
Hola de nuevo Amadis
Con respecto al codigo de barras en el ejemplo que te pase arriba creo que estan bien detallados los parametros.
Pero basicamente el CodeString lo conformas asi:
CodeString := CUIT Emisor + Tipo Comprobante + Punto Venta + CAE + Fecha Venc CAE + Digito Verificador
Te quedaria entonces todo un string concatenado con esos datos. El digito verificador se lo pedis al mismo pyi25 ejecutando la funcion DigitoVerificadorModulo10(CodeString). Eso tiene que salir en la factura impreso abajo de la imagen del codigo de barras
El jpg en particular yo lo guardo y los voy archivando, pero de cualquier modo, siempre que se tenga los datos es posible reconstruirlo, y siempre deberia ser el mismo
Lo del fallo en la autorizacion, en realidad fallar es algo muy raro que pase, si falla es porque estas mandando mal algun valor. Por ejemplo, decis que el total es 120, y que tenes 21% aplicado sobre un valor de 100; obviamente la cuenta no da y te retorna error. Los errores yo los muestro con WSFEv1.ErrMsg. La que mencionas ni sabia que existia . Basicamente si cuando pedis CAE, si WSFEV1.Resultado = 'A' entonces autorizo bien; sino, esta mal
Otro tema que me paso el otro dia, a tener en cuenta: La fecha de la pc en cuestion tiene que estar sincronizada con el huso horario de buenos aires. Sino una excepcion enorme con errores de python. Pero se soluciono poniendo la fecha y hora en regla (era una pc con la pila de la bios gastada y tenia en fecha cualquier cosa.. pero haciendo pruebas, con 30 min adelantado o atrasado ya no te deja entrar)
Yo para gestionar las facturas, mantengo el circuito original del sistema. Se carga la factura y se guarda en la base de datos. Luego hay un par de campos nuevos que agregamos, serian: CAE, FechaVtoCae, IdGestion (el id con el que mandamos a autorizar), y un booleano EsFacturaElectronica; si es apenas grabada va a quedar con valores por defecto obviamente (string vacios, booleano en falso, etc)
Lo hacemos de esta manera porque al grabarla nos aseguramos que la factura es valida, por ejemplo que habia stock suficiente, no habia bloqueos por deudas pendientes de clientes, o algun otro error X. Ademas alguno de nuestros clientes cargan continuamente facturas y no "pueden andar esperando a que el sistema autorice". Para ellos es mejor cargar todo y luego en un momento con mas calma, las mandan a autorizar, no necesariamente tiene que ser en linea
Para mandarla a autorizar, tenemos un cuadro de busquedas en el cual permitimos seleccionar la factura deseada y enviarla a autorizar. Ahi es donde se ejecuta toda la rutina y si todo va bien, le mostramos un dialogo indicando exito y si quiere visualizar el comprobante, que seria un Preview a un QuickReport en formato PDF; si decide abrirlo ahi ya puede elegir si lo imprime, lo guarda como PDF.
Ademas al autorizar, se actualizan de esa factura los campos de la base de datos que te mencione arriba. Si llegara a mandar a autorizar de nuevo la misma le mostramos un warning diciendo que ya estaba autorizada y cual es el CAE y la fecha de Vencimiento
Hasta ahi bien. Luego en el cuadro de busqueda de facturas del que te comentaba arriba, para las facturas que fueron correctamente autorizadas, habilitamos un boton para que pueda generar el PDF (el mismo que le mostramos cuando autorizo exitosamente). Al tener ya los campos en la base es posible reconstruir como te comentaba el codigo de barras e imprimir el CAE y su vencimiento
En el caso de que falle la autorizacion, hacemos un raise Exception informando el error que devuelve la AFIP, eso como te comente mas arriba con el WSFEv1.ErrMsg. Un ejemplo facil que podes probar para ver como devuelve es intentar autorizar una factura en donde el CUIT del emisor y receptor sean iguales. Los errores vuelven con un codigo de error y es bastante presentable a un usuario comun, no hace falta hacer algun manejo raro de excepciones ni andar interceptando nada
En sintesis, al cliente no le interesa tanto "ver el CAE", solamente apretar algun boton y que si todo va bien, poder obtener un archivo digital para enviar por mail la factura en cuestion, o imprimirla si gusta
Saludos y como siempre, cualquier inquietud me comentas