El modo "en lote" es un característica especial del WSFEv1 (no esta presente en los otros web service) que permite autorizar y recibir los CAE de un lote de facturas en una sola llamada. Esto es enviar los datos, por ejemplo, de 100 facturas tipo A (1, 2, 3, ... 100) y recibir como respuesta 100 CAE individuales. No debe confundirse este modo "en lote" con el modo "en grupo" que consiste en enviar un solo registro acumulando los totales de un grupo de documentos (generalmente ticket, por ejemplo del 1 al 1000) para recibir un único CAE.. Aunque el modo "en lote" puede complicar la lógica de programación tiene la ventaja que obtiene la autorización del CAE hasta 10 veces más rápido que si se autoriza 1 por 1. Para el modo en lote del WSFEv1 es recomendable usar la versión 92.80 o superior del instalador.
En general el procedimiento para autorizar en lote usa los métodos y propiedades habituales pero teniendo en cuenta que se usa la propiedad "f1indice" para indicar a que factura del lote nos estamos refiriendo. Un código a modo de ejemplo básico, en visual basic, de como se obtendrían 2 CAE en una sola ejecución del método FECAEsolicitar para 2 facturas tipo A diferentes seria (para este código usar versión 92.80 o superior de la interfaz para incluir el código QR):
Dim fe As New WSAFIPFE.Factura
Dim lResultado As Boolean = False
Dim nContador As Integer
Dim nNumero As Integer
If fe.iniciar(0, "CUIT emisor", "certifciado pfx", "") Then
If fe.f1ObtenerTicketAcceso() Then
nNumero = fe.F1CompUltimoAutorizado(4, 1)
fe.F1CabeceraCantReg = 2
fe.F1CabeceraPtoVta = 4
fe.F1CabeceraCbteTipo = 1
For nContador = 0 To fe.F1CabeceraCantReg - 1
fe.f1Indice = nContador
fe.F1DetalleConcepto = 1
fe.F1DetalleDocTipo = 80
fe.F1DetalleDocNro = "20111111112"
fe.F1DetalleCbteDesde = nNumero + nContador + 1
fe.F1DetalleCbteHasta = nNumero + nContador + 1
fe.F1DetalleCbteFch = "20110417"
If nContador = 0 Then
fe.F1DetalleImpTotal = 184.05 - 7.8
Else
fe.F1DetalleImpTotal = 184.05
End If
fe.F1DetalleImpTotalConc = 0
fe.F1DetalleImpNeto = 150
fe.F1DetalleImpOpEx = 0
If nContador = 0 Then
fe.F1DetalleImpTrib = 0
Else
fe.F1DetalleImpTrib = 7.8
End If
fe.F1DetalleImpIva = 26.25
fe.F1DetalleFchServDesde = ""
fe.F1DetalleFchServHasta = ""
fe.F1DetalleFchVtoPago = ""
fe.F1DetalleMonId = "PES"
fe.F1DetalleMonCotiz = 1
If nContador = 0 Then
fe.F1DetalleTributoItemCantidad = 0
Else
fe.F1DetalleTributoItemCantidad = 1
fe.f1IndiceItem = 0
fe.F1DetalleTributoId = 3
fe.F1DetalleTributoDesc = "Impuesto Municipal Matanza"
fe.F1DetalleTributoBaseImp = 150
fe.F1DetalleTributoAlic = 5.2
fe.F1DetalleTributoImporte = 7.8
End If
fe.f1detalleqrArchivo = "d:\imagen"+trim(str(nContador))+".bmp"
fe.F1DetalleIvaItemCantidad = 2
fe.f1IndiceItem = 0
fe.F1DetalleIvaId = 5
fe.F1DetalleIvaBaseImp = 100
fe.F1DetalleIvaImporte = 21
fe.f1IndiceItem = 1
fe.F1DetalleIvaId = 4
fe.F1DetalleIvaBaseImp = 50
fe.F1DetalleIvaImporte = 5.25
fe.F1DetalleCbtesAsocItemCantidad = 0
fe.F1DetalleOpcionalItemCantidad = 0
Next
fe.ArchivoXMLRecibido = "c:\recibido.xml"
fe.ArchivoXMLEnviado = "c:\enviado.xml"
lResultado = fe.F1CAESolicitar()
If lResultado Then
MsgBox("resultado verdadero")
Else
MsgBox("resultado falso")
End If
MsgBox("resultado: " + fe.F1RespuestaResultado)
MsgBox("es reproceso: " + fe.F1RespuestaReProceso)
MsgBox("registros procesados" + str(fe.F1RespuestaCantidadReg))
MsgBox("errores (1) :" + fe.f1ErrorMsg1)
MsgBox("último error :" + fe.UltimoMensajeError)
If fe.F1RespuestaCantidadReg > 0 Then
For nContador = 0 To fe.F1RespuestaCantidadReg - 1
fe.f1Indice = nContador
MsgBox("resultado detallado " + fe.F1RespuestaDetalleResultado)
MsgBox("cae " + fe.F1RespuestaDetalleCae)
Dim nI As Integer
For nI = 0 To fe.F1RespuestaDetalleObservacionItemCantidad - 1
fe.f1IndiceItem = nI
MsgBox("error detalle " + nI.ToString + " " + fe.F1RespuestaDetalleObservacionMsg)
Next
Next
End If
Else
MsgBox("fallo acceso " + fe.UltimoMensajeError)
End If
Else
MsgBox("fallo iniciar" + fe.UltimoMensajeError)
End If
Analizando este código se pueden deducir las siguientes consideraciones al usar el modo en lote:
Se usan las mismas propiedades y métodos habituales. No hay código extra.
En la propiedad "F1CabeceraCantReg" se establace la cantidad de comprobantes del lote (en este caso 2).
En las propiedades "F1CabeceraPtoVta" y ".F1CabeceraCbteTipo" se indica el punto de venta y el tipo de comprobante. Es decir todo el lote pertenece a ese punto de venta y ese tipo de comprobante (no puede haber por ejemplo facturas A y notas de crédito A, en el mismo lote).
En la propiedad "f1indice" se carga a que comprobante del lote no estamos refiriendo (0 para la primera, 1 la segunda, etc).
Los demás datos se cargan en las propiedades habituales, notar que en ".F1DetalleCbteDesde" y ".F1DetalleCbteHasta" no se carga el primer y ultimo número de lote, sino el número individual de cada comprobante (1 y 1 para el primer comprobante, 2 y 2 para el segundo, etc).
En el código, a modo de ejemplo, se alteran los datos del primer y segundo comprobante para no informar 2 comprobantes iguales y hacer más gráfico el ejemplo (sentencia IF antes de cargar el totol de la factura y antes de informar los tributos).
De la misma manera la respuesta es leida en las propiedad habituales, teniendo en cuenta que "F1RespuestaCantidadReg" indicará la cantidad de comprobantes procedados por AFIP y que "f1indice" se usa para referencia a que comprobante del lote estamos recuperando los resultados (CAE o error).
Notar que al recuperar los resultados de un lote de comprobantes es fundamental tener en cuenta que:
En caso de fallos de conexión determinar hasta que comprobantes AFIP llegó a autorizar, recuperando los resultados perdidos o bien volviendo a enviar los datos tal como se explica en fallos de conexión
En caso de recibir la respuesta normalmente, tener en cuenta que la propiedad "F1RespuestaResultado" puede contener el valor "A" (aceptado, todo el lote), "R" (rechazado, todo el lote), "P" (aceptación parcial). y en cualquiera de los casos usar la propiedad "F1RespuestaCantidadReg" para recuperar cuantos registros procesó AFIP y la propiedad "f1indice" para apuntar a cada uno de esos registros y recuperar los datos en las propiedades habituales.
Los 2 primeras puntos pueden complicar bastante la lógica de programación, asegurarse que el código contemple todas las posibilidades.
El modo en lote en la modalidad de producción (o real) requieren una licencia extra cuyo costo se publica en la lista de precios.
los valores cargados en el campo (f1detalleqrArchivo) indicar la ruta y nombre de archivo donde la interfaz guardará localmente la imagen QR de cada uno de los comprobantes con CAE. ¡ATENCION! si se cargan 100 comprobantes a autorizar en f1detalleqrarchivo se deben cargar 100 nombre diferentes (uno para cada comprobantes).
En cuanto a la cantidad de comprobantes a enviar en cada lote ( F1CabeceraCantReg) el limite esta dado por el valor devuelto por el método f1CompTotXRequest() (actualmente 350 para el modo homologación del WSFEv1).
También es posible combinar el modo en lote con el modo en grupo, por ejemplo: informar 10 grupos de ticket C final, el primero de 1 a 100 (F1DetalleCbteDesde, F1DetalleCbteHasta) el segundo de 101 a 200 y asi enviar 10 grupos de comprobantes en un solo lote y recuperar los 10 CAE.
Todas las consideraciones de esta página tambien valen para el método F1CAEARegInformativo que admite el modo en lote de igual forma y proceso que el método F1CAEsolicitar aquí explicado.