Skip to content

feat(comercial): mirror ref_empresa desde OAE + cleanup botones legacy

Alan Amox requested to merge comercial into qa

Implementa la via 2 del sync de ref_empresa/ref_portafolio contra el upstream real de empresas (portal_financiero.empresas_grupo_caabsa, catalogo unificado del modulo /oae/empresas). Mismo patron exitoso que ref_usuario: reconcile masivo manual + hook event-driven, sin esperar al mirror externo formal.

Implementacion ref_empresa + ref_portafolio:

  • services/ventas_ref_empresas.py: helper sincronizar_empresa_ref (event-driven, 1 empresa) y reconciliar_ref_empresas (masivo, todo el conjunto). Universo activa AND estado=operativa. Portafolio normalizado UPPER+trim+collapse-spaces. portafolio_id=NULL para empresas sin portafolio. clave_canonica_mirror = str(empresas_grupo_caabsa.id) para blindar contra cambios de nombre. Soft-delete preserva FK comerciales y reporta dependencias colgantes (LN, ventas, grants, vendedores, metas, locks). ref_portafolio se conserva aunque pierda todas sus empresas (decision 2026-05-26).

  • routers/ventas_ref.py: POST /ref/empresas/reconcile gateado a comercial_super_admin. Devuelve counters + reporte de dependencias.

  • routers/empresas.py: hooks event-driven en POST/PUT/DELETE (best- effort, no rompe OAE si db_ventas cae). RFCs no se cablean (no afectan el criterio).

  • lib/ventas.api.ts + LineasNegocioAdmin.tsx: wrapper reconciliarRefEmpresas + boton violeta Sincronizar empresas desde OAE en la toolbar.

Cleanup de botones legacy:

  • Eliminados los endpoints, services y botones de Sembrar empresas y portafolios (sustituido por el reconcile oficial) y Sembrar usuarios OAE (sustituido por el reconcile de ref_usuario commiteado el 2026-05-26). Imports e iconos huerfanos limpiados.

Reescritura del Sembrar lineas de negocio:

  • El cruce de empresa ya no usa empresa_tableau_legacy (que ya no se llena en el nuevo flujo). Ahora cruza norm(empresa_tableau) del legacy contra norm(nombre_comercial) y norm(alias) del catalogo OAE, resolviendo a ref_empresa via clave_canonica_mirror=str(id_oae). Prioridad: nombre_comercial gana sobre alias en caso de colision (el alias colisionado se ignora y se cuenta en aliases_ignorados_por_nombre). Aliases que colisionan entre 2 empresas sin involucrar nombre se descartan como ambiguos. Reporte dividido en empresas_no_matcheadas (accion: agregar alias en OAE) vs empresas_sin_sync (accion: apretar reconcile de empresas) vs ambiguos.

Gate del boton Reset catalogos legacy:

  • Restringido a aamox@caabsa.com.mx en cualquier ambiente (verificacion por email en el front). Backend sigue gateado a comercial_super_admin. Los demas botones desechables ya no existen, solo este queda como herramienta de iteracion para el dev del modulo.

Spec_mirrors.md actualizado a v2.4: nueva seccion 6.4 con matriz de re-sync ante cambios upstream (95 porciento invariante por la indireccion surrogate) y 6.5 con caveat de rename del nombre_comercial, query SQL de diagnostico, y esqueleto del mini-script de rematch (no se construye hasta el primer caso real, YAGNI).

Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com

Merge request reports

Loading