Ir al contenido
FINORA Academy
SistemaFINORA ERP

12. Buenas prácticas y errores comunes

Intermedio15 minVerificado el 25 sept. 2026

Este tutorial no introduce conceptos nuevos: reúne, en un solo lugar, las reglas y los errores reales que los tutoriales anteriores fueron citando por separado — la mayoría, encontrados por el equipo de FINORA LVE ejecutando código real contra un servidor de desarrollo, no supuestos en abstracto.

Es la regla absoluta del proyecto (finora-lve/AGENTS.md, regla 1): todo cambio es un plugin OSGi, un 2Pack, un event handler, una fábrica, un reporte Jasper o un parámetro de configuración. Cualquier excepción exige una decisión de arquitectura (ADR) aprobada explícitamente. Esto no es solo disciplina — es lo que permite actualizar iDempiere sin heredar un fork propio que hay que fusionar a mano en cada versión.

Regla 2: resolver por UUID, Value o nombre — nunca por ID numérico

Sección titulada «Regla 2: resolver por UUID, Value o nombre — nunca por ID numérico»

Un AD_Table_ID, AD_Column_ID o cualquier otro ID numérico no es el mismo número en desarrollo, en el servidor de DC GEEKS y en el de un cliente — cada base de datos asigna sus propios IDs (ver Tutorial 8). El código de FINORA LVE tiene prohibido usar un AD_*_ID literal (finora-lve/packout/README.md, regla 3); todo objeto se busca por su UUID, por su Value (código de negocio) o por el nombre de tabla/columna.

Regla 3: transacciones — y sus trampas de runtime reales

Sección titulada «Regla 3: transacciones — y sus trampas de runtime reales»

Regla 4: seguridad multi-tenant, tanto en código como en configuración de REST

Sección titulada «Regla 4: seguridad multi-tenant, tanto en código como en configuración de REST»
  • Nunca se asume que el usuario de sesión pertenece al tenant que se está modificando: cualquier operación de escritura debe validar o fijar explícitamente el AD_Client_ID/AD_Org_ID esperado.
  • Por defecto, cualquier rol autenticado puede leer casi cualquier tabla por REST salvo que exista una exclusión explícita en AD_Table_Access (ver Tutorial 10). Para una integración real, esto exige un rol de integración dedicado con exclusiones configuradas, no el rol de administrador general.
  • Los parámetros de configuración de un tenant nunca van en AD_SysConfig desde el propio plugin de localización — ese camino ni siquiera está disponible por REST para un rol de tenant. FINORA LVE los guarda en su propia tabla FVE_Config (ver Tutorial 4).

Regla 5: trampas conocidas de PostgreSQL al aplicar un 2Pack

Sección titulada «Regla 5: trampas conocidas de PostgreSQL al aplicar un 2Pack»

Regla 6: marcar lo no verificado, en vez de inventarlo

Sección titulada «Regla 6: marcar lo no verificado, en vez de inventarlo»

Toda regla fiscal o laboral cita su norma exacta (ley, providencia, artículo, Gaceta) tanto en el spec como en un comentario del código (finora-lve/AGENTS.md, regla 3). Lo que no se pudo confirmar contra la norma o un servidor real se marca explícitamente — en FINORA LVE, con [UNCERTAIN] o [DEV-UNVERIFIED] en la documentación técnica; en esta Academy, con el aside Por verificar que verás en varios tutoriales de esta sección. Tratar una suposición como un hecho confirmado es, en la práctica de este proyecto, el error más caro de corregir después — sobre todo en reglas fiscales, donde una fecha de vigencia mal asumida puede invalidar meses de documentos ya emitidos.

La auditoría independiente: ¿la forma de extender iDempiere es correcta?

Sección titulada «La auditoría independiente: ¿la forma de extender iDempiere es correcta?»

Agent 01 (investigación técnica de iDempiere en FINORA) hizo, el 24 de septiembre de 2026, una auditoría de solo lectura de cómo FINORA LVE y FINORA ERP Experience extienden iDempiere 13, comparando cada práctica contra el wiki oficial, el código del core (release-13 @ 0bbc4fa) y el foro de la comunidad (finora-erp-experience/research/IDEMPIERE_BEST_PRACTICES_AUDIT.md). No se cambió ni una línea de código para hacerla — es evaluación, no un plan de trabajo ejecutado.

Veredicto general: sí, la forma de extender iDempiere es correcta — 8,1/10. Ninguno de los hallazgos pide rediseñar nada; los pendientes son trabajo acotado (3 a 4 días-persona para los más urgentes).

Dimensión auditadaVeredictoNota
a. Sin cambios de core y fronteras OSGiAlineado9,0
b. Diccionario: 2Pack incrementalMejor que lo habitual (con un pendiente)8,5
c. Lógica de negocio y transaccionesAlineado8,5
d. Configuración por REST, setup de tenantAlineado, con una desviación justificada8,0
e. Reportes JasperAlineado8,5
f. Extensión de la UI ZKAlineado en LVE / parcial en el menú de ERP Experience7,5
g. Pruebas, multi-tenant, seguridad, rendimientoParcial (las pruebas: mejor que lo habitual)7,5
h. Ruta a iDempiere 14 y distribuciónParcial, con desviación justificada7,0

Lo que la auditoría confirma que FINORA hace mejor que la práctica habitual

Sección titulada «Lo que la auditoría confirma que FINORA hace mejor que la práctica habitual»
  • 2Pack inmutable por herramienta: el candado sha256 por bundle y la regla de “versión quemada” (ver Tutorial 8) los hace cumplir el build y el despliegue, no solo la convención — casi ningún proyecto de la comunidad lo automatiza así.
  • UUID determinísticos (uuid5) generados desde specs: regenerar el 2Pack no cambia identidades, y el XML resultante se puede revisar en un diff antes de publicarlo.
  • Orden de pack-in entre bundles (LvePackActivator, ADR-LVE-014): el core de iDempiere no resuelve esto — cada bundle instala su 2Pack en el pool de hilos sin esperar a los demás — así que el mecanismo de FINORA podría proponerse como mejora a la comunidad.
  • Retiro limpio y verificable: un uninstall-dictionary.sql generado de los mismos 2Pack, con ensayo por defecto en una transacción revertida, y una paridad de base de datos que exige cero diferencias entre desarrollo y una instalación limpia.
  • Dominio hexagonal sin servidor: las reglas fiscales y laborales se prueban en segundos, con goldens que citan la norma legal exacta — aislado de los cambios de API entre versiones de iDempiere.

Lo que la auditoría deja como pendiente real (no como error de diseño)

Sección titulada «Lo que la auditoría deja como pendiente real (no como error de diseño)»

Estos cuatro puntos no contradicen ninguna regla de este tutorial — son, más bien, la prueba de que “marcar lo no verificado” (Regla 6) también aplica puertas adentro: la auditoría existe precisamente para que estos pendientes queden escritos y priorizados, no descubiertos en producción.

  • finora-erp-experience/research/IDEMPIERE_BEST_PRACTICES_AUDIT.md (Agent 01, 2026-09-26; commits b8c7efd y 35d4007) — auditoría completa, con evidencia de código y wiki citada punto por punto
  • finora-lve/AGENTS.md (reglas 1, 3 y 7)
  • finora-lve/docs/ARCHITECTURE.md, §4.3 (trampas de runtime comprobadas en desarrollo)
  • finora-lve/packout/README.md, reglas 3 y 6 (UUID estables, trampas de PostgreSQL en 2Pack)
  • finora-erp-experience/idempiere/API_MAP.md, §6.2 y §7.2 (Cross tenant PO writing, permisos por defecto en REST)