Wiki source code of CAEA - Ampliaciones al modulo LYEI
Last modified by admin on 2026/07/18 17:45
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | = CAEA {{id name="caea" /}}= | ||
| 2 | |||
| 3 | == Ampliaciones al modulo LYEI {{id name="ampliaciones-al-modulo-lyei" /}}== | ||
| 4 | |||
| 5 | = Nuevas entradas en C_ExternalService {{id name="nuevas-entradas-en-c_externalservice" /}}= | ||
| 6 | |||
| 7 | == Homo {{id name="homo" /}}== | ||
| 8 | |||
| 9 | MTXCAService Homologacion\\https://fwshomo.afip.gov.ar/wsmtxca/services/MTXCAService\\WebService de Gestion de CAEA y otras operaciones. Ambiente de Homologacion. | ||
| 10 | |||
| 11 | == Prod {{id name="prod" /}}== | ||
| 12 | |||
| 13 | MTXCAService Produccion\\https://serviciosjava.afip.gob.ar/wsmtxca/services/MTXCAService\\WebService de Gestion de CAEA y otras operaciones. Ambiente de Produccion. | ||
| 14 | |||
| 15 | = Nuevas columnas en C_Invoice {{id name="nuevas-columnas-en-c_invoice" /}}= | ||
| 16 | |||
| 17 | *. **LYEICAEAInformed**: para que el proceso de informe de comprobantes sepa qué documentos debe informar. La semántica del campo es la siguiente | ||
| 18 | **. NULL (por defecto): no debe realizarse actividad alguna relacionada con CAEA, ya sea por no ser factura electrónica o por haber obtenido su CAE de manera tradicional.\\ | ||
| 19 | **. P (pending): pendiente a informar si es que la factura se generó mediante CAEA.\\ | ||
| 20 | **. A (Aprobado)\\ | ||
| 21 | **. O (Observado)\\ | ||
| 22 | **. R (Rechazado)\\ | ||
| 23 | **. E (error): se obtuvo un error al intentar informar\\ | ||
| 24 | *. **LYEICAEAInformedDetail**: se almacena información de respuesta ya sea un error, una observación o un rechazo (dependiendo el campo LYEICAEAInformed). | ||
| 25 | |||
| 26 | Cuando se está trabajando con un punto de venta con CAEA, al completar la factura, en el campo CAE de la misma se volcará el CAEA obtenido con anterioridad. | ||
| 27 | |||
| 28 | **Cuando el campo LYEICAEAInformed no es NULL estaremos entonces en presencia de una factura cuyo CAE fue obtenido mediante CAEA**. | ||
| 29 | |||
| 30 | = Nueva tabla de historico de CAEAs obtenidos {{id name="nueva-tabla-de-historico-de-caeas-obtenidos" /}}= | ||
| 31 | |||
| 32 | Tabla: | ||
| 33 | |||
| 34 | *. **C_LYEICAEARequest** | ||
| 35 | |||
| 36 | En la tabla se almacenarán únicamente los pedidos autorizados. En los casos donde se presenten errores, los mismos quedarán registrados en los logs del proceso de recuperación de CAEA. | ||
| 37 | |||
| 38 | Campos principales (segun pagina 66 de la documentacion oficial): | ||
| 39 | |||
| 40 | *. **Periodo**. Indica año y el mes al que corresponde el CAEA. Formato AAAAMM, tal como lo usa/requiere el servicio de AFIP.\\ | ||
| 41 | *. **Orden**. Especifica el orden de secuencia en el trascurso del tiempo. Valores permitidos: 1: primer quincena 2: segunda quincena.\\ | ||
| 42 | *. **CAEA**. El CAEA obtenido\\ | ||
| 43 | *. **FechaDesde**. Fecha de inicio de la vigencia del CAEA.\\ | ||
| 44 | *. **FechaHasta**. Fecha de fin de la vigencia del CAEA.\\ | ||
| 45 | *. **FechaTopeInforme**. Fecha tope para informar los comprobantes donde se utilizó el CAEA.\\ | ||
| 46 | *. **Observaciones**. Indica los motivos por los cuales el pedido fue aceptado con observaciones, en caso de corresponder. No son errores.\\ | ||
| 47 | *. **Ambiente**: Homo o Prod | ||
| 48 | |||
| 49 | = Nueva tabla de historico de CAEAs no usados {{id name="nueva-tabla-de-historico-de-caeas-no-usados" /}}= | ||
| 50 | |||
| 51 | Tabla: | ||
| 52 | |||
| 53 | *. **C_LYEICAEANotUsed** | ||
| 54 | |||
| 55 | En esta tabla se almacenarán los resultados de informar un CAEA no utilizado. Dado que este informe puede ser por punto de venta, se requiere una tabla adicional para almacenar el resultado de dicha ejecución por cada punto de venta. Esta sería una tabla “detalle” de la tabla **C_LYEICAEARequest**. Si para un **C_LYEICAEARequest** no existen entradas en **C_LYEICAEANotUsed** significa que o bien todavía no se notificó al respecto a AFIP o bien el CAEA sí fue utilizado para todos los puntos de venta. | ||
| 56 | |||
| 57 | *. **C_LYEICAEARequest_ID**, es una referencia al CAEA obtenid\\ | ||
| 58 | *. **PtoVta**: El punto de venta sobre el cual se informa que no se utilizó el CAEA (referencia a **C_LYEIElectronicPOSConfig_ID**). Será NULL si es que se informa para todos los PtoVta. Si hay varios puntos de venta informados, se tendrán varios registros asociados al CAEA en cuestión.\\ | ||
| 59 | *. **Status**:. Estado de informar a AFIP, opciones: | ||
| 60 | **. A (Aprobada): Cuando al informar el CAEA no utilizado, el proceso recibe que la solicitud es aceptada.\\ | ||
| 61 | **. R (Rechazada): Cuando al informar el CAEA no utilizado, el proceso recibe que la solicitud es aceptada.\\ | ||
| 62 | *. **Detail**: Informacion relacionada con potenciales errores al informar CAEA no utilizado.\\ | ||
| 63 | *. **Ambiente**: Homo o Prod | ||
| 64 | |||
| 65 | Estas 2 nuevas tablas serán sendas pestañas en la ventana de Facturacion Electronica. | ||
| 66 | |||
| 67 | = Cambios en configuracion de pto.vta. electronico {{id name="cambios-en-configuracion-de-pto.vta.-electronico" /}}= | ||
| 68 | |||
| 69 | Nuevo drop down con las opciones de **Metodo obtencion CAE** (CAE o CAEA), con posibilidad de incorporar otras alternativas si en el futuro es necesario. | ||
| 70 | |||
| 71 | [[image:image1.png]] | ||
| 72 | |||
| 73 | Si para el punto de venta se selecciona CAE se obtendrá el CAE mediante WSFE (como hasta ahora). | ||
| 74 | |||
| 75 | Si para el punto de venta se selecciona CAEA, se obtendrá el CAE usando el CAEA obtenido con anterioridad. Si al completar una factura no se obtuvo un CAEA de manera acorde a los plazos requeridos por AFIP, se informará el error en cuestión. | ||
| 76 | |||
| 77 | = Nuevas clases cliente del WS {{id name="nuevas-clases-cliente-del-ws" /}}= | ||
| 78 | |||
| 79 | Según: https://serviciosjava.afip.gob.ar/wsmtxca/services/MTXCAService?wsdl | ||
| 80 | |||
| 81 | Package: ar.gov.afip.wsmtxca.service.impl.service | ||
| 82 | |||
| 83 | Si bien en primera instancia pueden generarse mediante el AxisJar.jar del proyecto Libertya (java -classpath AxisJar.jar org.apache.axis.wsdl.WSDL2Java), es necesario generar las clases con el soporte para la recuperación del XMLRequest y XMLResponse, dado que ante algún inconveniente AFIP requiere esta información. | ||
| 84 | |||
| 85 | Para esto se deberán aplicar las modificaciones correspondientes al proyecto Axis y generar las clases autogeneradas con dichos cambios. Ver revisión r10 de LYEI. | ||
| 86 | |||
| 87 | = Completando una factura {{id name="completando-una-factura" /}}= | ||
| 88 | |||
| 89 | En el completado de una factura, el provider seguirá siendo la clase de registración de facturas electrónicas con nombre: **org.libertya.locale.ar.electronicInvoice.utils.LYEIWSFE**, sin embargo una vez instanciada la clase y recuperada la información de configuración (**posConfig**), al ejecutar el **generateCAE()** se deberá evaluar si se debe obtener un CAE de AFIP o bien simplemente copiar el CAEA obtenido con anterioridad (ver proceso de obtención de CAEA), dependiendo la configuración del punto de venta electrónico. | ||
| 90 | |||
| 91 | En caso de que el punto de venta utilice CAEA, se copiará éste al campo CAE de la factura y el campo **LYEICAEAInformed** pasará de NULL a **P** (Pending). | ||
| 92 | |||
| 93 | Tener en cuenta que la factura es recibida a LYEIWSFE, pero el metodo generateCAE() solo retorna un mensaje de error o nada si no hay errores, con lo cual es importante ver cómo setear el LYEICAEAInformed en la factura desde LYEI pero SIN tener que tocar LY CORE. | ||
| 94 | |||
| 95 | = Proceso de obtención de CAEA {{id name="proceso-de-obtención-de-caea" /}}= | ||
| 96 | |||
| 97 | Ver 2.4.4 de la documentación de AFIP: //“Esta operación permite solicitar un CAEA. El cliente envía el requerimiento, el cual es atendido por el WS, superadas las validaciones se otorgará un CAEA y su respectivo período de vigencia (fecha de validez desde y fecha de validez hasta). Podrá ser solicitado dentro de los 5 (cinco) días corridos anteriores al comienzo de cada quincena y hasta el final de la misma. Habrá dos quincenas, la primera abarca desde el primero hasta el quince de cada mes y la segunda desde el dieciséis hasta el último día del mes.”//. | ||
| 98 | |||
| 99 | El proceso debe obtener un nuevo CAEA accediendo al servicio en cuestión, teniendo en cuenta el ambiente (homo / prod). | ||
| 100 | |||
| 101 | Si el proceso nota que ya tiene un CAEA válido para el período en cuestión (basándose en la tabla **C_LYEICAEARequest**), no debe gestionar uno nuevo. Esto es: el proceso debe ser idempotente en estos casos. | ||
| 102 | |||
| 103 | Proceso (con posibilidad de invocación desde terminal): | ||
| 104 | |||
| 105 | *. **org.libertya.locale.ar.electronicInvoice.process.LYEICAEARequestProcess** | ||
| 106 | |||
| 107 | Argumentos: | ||
| 108 | |||
| 109 | *. **Compañía**\\ | ||
| 110 | *. **Organización**\\ | ||
| 111 | *. **Ambiente (homo / prod)**\\ | ||
| 112 | *. **CurrentPeriod (actual o siguiente?)** | ||
| 113 | |||
| 114 | La ejecución del mismo dependerá de las tareas programadas / cron que se definan según las necesidades del caso. | ||
| 115 | |||
| 116 | La ejecución del proceso deberá generar información relevante (invocación, argumentos, errores) a los archivos de log a fin de poder hacer el seguimiento correspondiente. | ||
| 117 | |||
| 118 | = Proceso de información de comprobante CAEA {{id name="proceso-de-información-de-comprobante-caea" /}}= | ||
| 119 | |||
| 120 | Ver 2.4.5 de la documentación de AFIP: //“Por cada comprobante se enviará una solicitud”//. | ||
| 121 | |||
| 122 | El proceso deberá barrer con las facturas que tengan estado **LYEICAEAInformed** = **P** (Pending) o **E** (Error) y actualizar la informacion en **LYEICAEAInformed** / **LYEICAEAInformedDetail**. | ||
| 123 | |||
| 124 | Proceso (con posibilidad de invocación desde terminal): | ||
| 125 | |||
| 126 | *. **org.libertya.locale.ar.electronicInvoice.process.LYEICAEANotifyDocumentProcess** | ||
| 127 | |||
| 128 | Argumentos: | ||
| 129 | |||
| 130 | *. **Compañía**\\ | ||
| 131 | *. **Organización**\\ | ||
| 132 | *. **C_Invoice_ID** si se desea informar un comprobante en particular o sin argumento si se desean informar todos los comprobantes pendientes a informar\\ | ||
| 133 | *. **PtoVta** si se desea informar un punto de venta en particualr o sin argumento si se desean informar todos\\ | ||
| 134 | *. **CAEA** si se desea informar los comprobantes de un CAEA en particular o sin argumento si se desean informar todos los comprobantes pendientes a informar | ||
| 135 | |||
| 136 | La ejecución del mismo dependerá de las tareas programadas / cron que se definan según las necesidades del caso. | ||
| 137 | |||
| 138 | Si bien el resultado de la ejecución (aceptado, rechazado, observado) quedará almacenado en cada comprobante, la ejecución del proceso deberá generar información relevante (invocación, argumentos, errores) a los archivos de log a fin de poder hacer el seguimiento correspondiente para otros casos de ejecución problemáticos, por ejemplo por temas de conectividad. | ||
| 139 | |||
| 140 | Por ahora que sea un proceso que se pueda ejecutar desde una ventana o croneado en LY. | ||
| 141 | |||
| 142 | = Proceso información CAEA no utilizado / Proceso información CAEA no utilizado para un PtoVta {{id name="proceso-información-caea-no-utilizado-proceso-información-caea-no-utilizado-para-un-ptovta" /}}= | ||
| 143 | |||
| 144 | Ver 2.4.5 de la documentación de AFIP: //“Este método permite informar un CAEA que no fue utilizado, es decir que ningún comprobante fue emitido con ese CAEA. Cabe aclarar que el CAEA no deberá ser utilizado en comprobantes que se emitan posteriormente”//. | ||
| 145 | |||
| 146 | Ver 2.4.8 de la documentación de AFIP: “Este método permite informar un CAEA que no fue utilizado para un Punto de Venta, es decir que ningún comprobante fue emitido con ese CAEA y ese Punto de Venta. Cabe aclarar que el CAEA y Punto de Venta indicados no deberán ser utilizados en comprobantes que se emitan posteriormente.” | ||
| 147 | |||
| 148 | El proceso deberá validar que no exista ninguna factura generada con dicho CAEA y realizar la notificación correspondiente a AFIP. Esto debería realizarse siempre vencido el plazo de utilización del CAEA en cuestión. Se debe gestionar los campos **Status** y **Detail** de la tabla C_LYEICAEANotUsed acordemente. | ||
| 149 | |||
| 150 | Podemos tener que para un CAEA algunos puntos de venta han emitido y otros no. Esto es similar al anterior pero además del CAEA se debe enviar el PtoVta, esto es: en la tabla C_LYEICAEANotUsed se debe incluir también el PtoVta sobre el cual se está informando. | ||
| 151 | |||
| 152 | Por consiguiente, el proceso deberá barrer con las facturas cuyo LYEICAEAInformed no es null a fin de determinar si existen o no facturas cuyo CAE fue obtenido mediante un CAEA en particular, agrupándolas por punto de venta. En función del caso se informará por cada punto de venta que no haya emitido (contrastando con la configuración de obtención de CAE en la pestaña de configuración de punto de venta electrónico), o bien sin punto de venta si ninguno de estos han emitido. | ||
| 153 | |||
| 154 | Proceso (con posibilidad de invocación desde terminal): | ||
| 155 | |||
| 156 | *. **org.libertya.locale.ar.electronicInvoice.process.LYEICAEANotUsedProcess** | ||
| 157 | |||
| 158 | Argumentos: | ||
| 159 | |||
| 160 | *. **Compañía**\\ | ||
| 161 | *. **Organización**\\ | ||
| 162 | *. **CAEA** si se desea especificar un CAEA en particular. Si no se especifica, se toma el CAEA más reciente pero que no sea del período actual. | ||
| 163 | |||
| 164 | La ejecución del mismo dependerá de las tareas programadas / cron que se definan según las necesidades del caso. | ||
| 165 | |||
| 166 | Si bien el resultado de la ejecución (aceptado, rechazado) quedará almacenado en las entradas de la tabla **C_LYEICAEANotUsed**, la ejecución del proceso deberá generar información relevante (invocación, argumentos, errores) a los archivos de log a fin de poder hacer el seguimiento correspondiente para otros casos de ejecución problemáticos, por ejemplo por temas de conectividad. | ||
| 167 | |||
| 168 | = Numeración sin saltos en Facturas {{id name="numeración-sin-saltos-en-facturas" /}}= | ||
| 169 | |||
| 170 | **Esto para LY CORE**: la numeración en FE no puede tener saltos. Documentos en borrador van usando nuevos números de secuencia. Actualmente la secuencia utilizada es la definida en el tipo de documento. | ||
| 171 | |||
| 172 | La idea es no utilizar esa secuencia sino hasta completar, y temporalmente asignarle otro valor único como el primary Key (C_Invoice_ID) o algo así al guardar y dejarlo en borrador. | ||
| 173 | |||
| 174 | Al final del complete de la factura asignar la secuencia actualizando la misma para garantizar que no existan. | ||
| 175 | |||
| 176 | Tabla: AD_Sequence, secuenciadores de LY. | ||
| 177 | |||
| 178 | DocumentNo_M_Product\\DocumentNo_AD_Org\\…\\DocumentNo_C_Invoice_CAEA | ||
| 179 | |||
| 180 | Verlo inicialmente para facturas. | ||
| 181 | |||
| 182 | *. para todos los tipos de factura, lo que es draft con un numero previsorio y luego uno posta al completar\\ | ||
| 183 | *. si es cae o fiscal se considera el de AFIP/fiscal\\ | ||
| 184 | *. si son manuales o CAEA, queda el número que está en secuenciador al final del complete | ||
| 185 | |||
| 186 | [[image:image2.png]] | ||
| 187 | |||
| 188 | == Secuencias: alternativa para versión 1 de CAEA bajo LYEI {{id name="secuencias-alternativa-para-versión-1-de-caea-bajo-lyei" /}}== | ||
| 189 | |||
| 190 | Dada la complejidad en la gestión de secuencias en LY (no se encuentra centralizado en una única clase, por ejemplo para facturas es un híbrido entre MInvoice, CalloutInvoiceExt y MSequence), se propone la siguiente alternativa más directa, al menos en una etapa inicial del módulo LYEI. | ||
| 191 | |||
| 192 | La solución consiste en atacar la problemática específicamente para la necesidad de numeración CAEA: | ||
| 193 | |||
| 194 | 1) Dejar la lógica de secuencias actual sin modificaciones. | ||
| 195 | |||
| 196 | 2) Crear nueva columna en **AD_Sequence** bajo el componente LYEI llamada por ejemplo **lyeicurrentnextcaea** (en realidad 2 columnas una para la seq. de homo y una para la seq. de prod). | ||
| 197 | |||
| 198 | 3) Actuar de manera similar a cuando AFIP devuelve el número de documento del comprobante autorizado para comprobantes CAE. O sea, en LYEIWSFE para CAE hacemos: | ||
| 199 | |||
| 200 | ~/~/ CAE RECIBIDO\\electronicInvoiceCae = resp.getFeDetResp()[0].getCAE();\\~/~/ FECHA VTO RECIBIDO\\electronicInvoiceVtoCae = new java.sql.Timestamp(parsedDate.getTime());\\~/~/ NRO COMPROBANTE\\**electronicInvoiceNroCbte** = ""+resp.getFeDetResp()[0].getCbteDesde(); | ||
| 201 | |||
| 202 | Y luego el CORE de LY (MInvoice) toma el valor de **electronicInvoiceNroCbte** como el que debe asignarse a la factura en cuestión. | ||
| 203 | |||
| 204 | Por consiguiente, para CAEA podríamos aplicar el mismo criterio: | ||
| 205 | |||
| 206 | ~/~/ CAEA obtenido\\electronicInvoiceCae = mtxca.currentCAEA().getCAEA();\\~/~/ CAE Vto\\electronicInvoiceVtoCae = mtxca.currentCAEA().getFechaHasta();\\~/~/ Numero de comprobante…\\**electronicInvoiceNroCbte** = createNroComprobanteCAEA(); | ||
| 207 | |||
| 208 | En donde **createNroComprobanteCAEA()** gestiona el campo **currentnextcaea** de **AD_Sequence**, y el valor retornado por dicho método es el que se le asigna finalmente al comprobante que se está completando en ese momento. | ||
| 209 | |||
| 210 | Al utilizar transacciones en la instanciación de la secuencia, en caso de cualquier rollback de la transacción, el valor de **lyeicurrentnextcaea** vuelve a su valor original previo a la transacción. | ||
| 211 | |||
| 212 | Dado que **lyeicurrentnextcaea** es utilizado exclusivmente en la instancia de obtención de CAE mediante CAEA, no se presentarán problema de saltos de numeración como actualmente ocurre con la gestión tradicional. | ||
| 213 | |||
| 214 | Esta solución tiene la ventaja de: | ||
| 215 | |||
| 216 | *. El esfuerzo de desarrollo es considerablemente menor con respecto a una solución más abarcativa.\\ | ||
| 217 | *. Continúa la misma lógca que para la numeración de documentos bajo CAE.\\ | ||
| 218 | *. No se requerirá contar con una nueva versión de CORE dado que los cambios son exclusivos de LYEI.\\ | ||
| 219 | *. Centralizamos en un único lugar la resolución para este requerimiento específico de CAEA.\\ | ||
| 220 | *. No es invasivo al aislar la problemática exclusivamente a comprobantes CAEA, conlleva menos riesgo.\\ | ||
| 221 | *. No genera conflictos si a futuro se decide desarrollar una solución más general para las secuencias. | ||
| 222 | |||
| 223 | = Informes {{id name="informes" /}}= | ||
| 224 | |||
| 225 | CAEA -> Informe: Comprobantes pendientes de informar. Parametro: Periodo y Quincena (obligatorio?). PtoVta (opcional). Organizacion (opcional). ¿Ambiente (Homo/Prod)? | ||
| 226 | |||
| 227 | CAEA -> Informe: CAEA sin usar pendientes de informar. Parametro: Periodo y Quincena (obligatorio?). PtoVta (opcional). Organizacion (opcional). ¿Ambiente (Homo/Prod)? |