Según la resolución de AFIP a partir de un cronograma las facturas electrónicas impresas deben contener el código QR. Un código que al escanearlo contiene los datos del comprobante y dirige directamente a un vinculo de la página de AFIP que valida los datos de ese comprobante.
Como el servidor WSFEv1 no tuvo cambios en los últimos años no contempla ese dato. Por lo que la interfaz WSAFIPFE (versión 94.80 o superior) lo calcula automáticamente y genera en un archivo (indicado en la propiedad f1detalleqrarchivo) la imagen de ese código QR. Ese archivo debe ser incluido localmente (por cada lenguaje, compilador o generador de informes) en el reporte o informe que se usa para imprimir la factura electrónica.
Es decir que al ejecutar el método f1caesolicitar (o f1compconsultar) además de los datos habituales (CAE y demás) la interfaz genera en la ruta indicada por f1detalleqrarchivo el archivo BMP con el código QR que corresponde a ese CAE recién autorizado (o consultado). Si la ruta o el nombre es inválido o faltan permisos de escritorio la propiedad archivoqrError contiene el texto del error por el que no se crea el archivo (si el S.O. devuelve ese error).
Por esto la propiedad f1detalleqrarchivo se maneja exactamente igual que el resto de todos los campos de entrada de f1caesolicitar y f1compconsultar incluso en el modo en lote. El ejemplo WSFEv1 y la planilla de test también muestran este campo. También el ejemplo f1compconsultar muestra como usar esta propiedad para generar el código QR de un comprobante ya autorizado.
Junto con la propiedad f1detalleqrArchivo hay otras que sirven para configurar la imagen generada (desde el instalador 94.20 en adelante):
f1DetalleQRformato
f1DetalleQRResolucion
f1DetalleQRTolerencia
el formato del archivo: 1 BMP (por defecto), 2 EMF, 3 EXIF, 4 GIF, 5 ICON, 6 JPG (JPEG), 7 MEM, 8 PNG, 9 TIFF, 10 WMF. Asegurarse que el formato usado coincida con la extensión en el nombre del archivo. Recomendado 6.
de 1 a 100 (20 por defecto) a mayor resolución mayor definición y mayor tamaño de archivo (20 equivale a una imagen de 400x400 piexeles aprox.). Recomendado 4.
0, 1, 2 (por defecto) o 3 a mayor tolerancia (al error) mayor tamaño de archivo y más probabilidad que el lector lea el código si la tinta o el papel es deficiente. Recomendado 0.
Tener en cuenta que la imagen generada debe ser luego incluida en el generador de informes que usa cada aplicación y no todos los generadores aceptan todos los formatos y tamaños. La propiedad ArchivoQRError contiene el texto del error en caso que la imagen no se genere (generalmente porque la ruta o nombre ingresado no es válido)
Por lo demás los campos son propiedades iguales a las ya existentes en la interfaz sin cambios en el instalador, tipo de datos, formas de cargar o llamar a un método o cualquiera otra característica que permanecen sin alterar.
En cuanto a la imagen generada es un código QR que al escanearlo muestra un texto (en formato JSON) con los datos del comprobante (cae, total, etc. según una resolución de AFIP). La propiedad f1qrtexto contiene ese texto (y la f1qrtexto64 ídem pero en base 64) calculado por si es necesario generar la imagen con otras librerías. Ese texto (codificado en el QR, tener en cuenta que en el formato JSON es indistinto mayúsculas/minúsculas y el orden los datos) contiene además un vinculo que dirige al portal de AFIP donde la propia página compara los datos del texto (CAE y demás) con los almacenados en el servidor de AFIP y así mostrar automáticamente si ese CAE fue impreso con datos auténticos (es decir los informados al momento de ejecutar el método f1caesolicitar , los que quedaron el archivo XML enviado y por lo tanto en el servidor de AFIP, son iguales a los impresos en el comprobante de ese CAE). Actualmente esta URL solo lleva a una página estática de AFIP ya que no lo tiene implementado.
Servicio WSMTXCA:
(Instalador 94.80 o superior) el código QR se maneja de igual forma que en el WSFEv1 usando las propiedades:
fxqrArchivo
fxqrFormato
fxqrResolucion
fxqrTolerancia
El ejemplo y planilla de test fueron actualizados para mostrar el orden de las sentencias. También se puede usar en el ejemplo para consultar comprobante
Servicio WSBFE:
(Instalador 94.40 o superior) el código QR se maneja de igual forma que en el WSFEV1 usando las propiedades:
bqrArchivo
bqrFormato
bqrResolucion
bqrTolerancia
El ejemplo fue actualizado para mostrar el orden de las sentencias. También se pueden usar en el método para consultar comprobante del WSBFE.
Generar código QR de comprobante externo (Instalador 94.80 o superior) para cualquier servicios o comprobante.
Si se tienen los datos completos de un comprobante electrónico (cae, y demás datos con los que fue autorizado, o si es un comprobante con CAE anticipado que se imprime en el dia dia pero se informa al periodo) no importa de que servicio sea (ya que ese dato no figura en el QR) es posible generar el código QR simplemente cargando los datos en la interfaz (como si se lo fuera a autorizar) y llamar al método f1qrGenerar. Por ejemplo:
Dim fe As New WSAFIPFE.Factura
If fe.iniciar(1, "cuit emisor", "no es necesario certificado", "archivo de licencia para el CUIT que ya se está usando") Then
fe.F1CabeceraCantReg = 1
fe.F1CabeceraPtoVta = 1
fe.F1CabeceraCbteTipo = 1
fe.f1Indice = 0
fe.qrVersion = 1
fe.F1DetalleConcepto = 1
fe.F1DetalleDocTipo = 80
fe.F1DetalleDocNro = "20123456780"
fe.F1DetalleCbteDesdeS = "123"
fe.F1DetalleCbteFch = "20210114"
fe.F1DetalleImpTotal = 121
fe.F1DetalleMonId = "PES"
fe.F1DetalleMonCotiz = 1
fe.F1Detalleqrtipocodigo = "E"
REM fe.F1Detalleqrtipocodigo = "A" si es un CAE anticipado
fe.F1DetalleCAEA = "CAE o CAEA del comprobante"
fe.F1DetalleQRArchivo = "d:\mipropioqr.jpg"
fe.f1detalleqrtolerancia = 1
fe.f1detalleqrresolucion = 4
fe.f1detalleqrformato = 6
If fe.f1qrGenerar(99) Then
MsgBox("gráfico generado con los datos. " + fe.f1qrmanualTexto)
Else
MsgBox("error al generar imagen " + fe.ArchivoQRError+ " "+fe.Ultimomensajeerror)
End If
ELSE
MsgBox("error al iniciar " + fe.Ultimomensajeerror)
End If
De igual forma si tiene el texto (en base 64) que está contenido en un código QR de un comprobante electrónico (escaneado por algún dispositivo o el devuelto por la propiedad f1qrtexto64) con ese texto es posible recuperar los datos del comprobante que le dieron origen (en las mismas propiedades usadas por el método f1qrgenerar) por ejemplo (instalador 94.80 o superior).
Dim fe As New WSAFIPFE.Factura
Dim texto64 As String texto64="eyJ2ZXIiOjEsImZlY2hhIjoiMjAyMC0xMC0xMyIsImN1aXQiOjMwMDAwMDAwMDA3LCJwdG9WdGEiOjEwLCJ0aXBvQ21wIjoxLCJucm9DbXAiOjk0LCJpbXBvcnRlIjoxMjEwMCwibW9uZWRhIjoiRE9MIiwiY3R6Ijo2NSwidGlwb0RvY1JlYyI6ODAsIm5yb0RvY1JlYyI6MjAwMDAwMDAwMDEsInRpcG9Db2RBdXQiOiJFIiwiY29kQXV0Ijo3MDQxNzA1NDM2NzQ3Nn0="
If fe.iniciar(1, "20000000001", "no es necesario certificado", "archivo de licencia para el cuit receptor u origen del comprobante del código QR") Then
If fe.f1qrLeer(0, texto64) Then
MsgBox("cuit emisor " + fe.cuit + " receptor " + fe.F1DetalleDocNro + " cae " + fe.F1DetalleCAEA)
fe.F1DetalleQRArchivo = "d:\qrleido.bmp"
fe.f1detalleqrformato = 1
fe.f1detalleqrresolucion = 5
fe.f1detalleqrtolerancia = 0
If fe.f1qrGenerar(99) Then
MsgBox("grafico generado de los datos leidos")
Else
MsgBox("error al generar " + fe.UltimoMensajeError + fe.ArchivoQRError)
End If
Else
MsgBox("mensaje error " + fe.UltimoMensajeError)
End If
Else
MsgBox("fallo iniciar " + fe.UltimoMensajeError)
End If
El método f1qrleer en el primer parámetro se indica en que campos (de servicio) debe restaurar el código QR (0=WSFEV1, 10=WSBFE, 100=WSMTXA)
Foro:https://groups.google.com/g/factura-electronica-y-otros-servicios-argentina-wsafipfe