Saltar a contenido

Base de datos

Tablas involucradas en la query de lotes

erDiagram
    HAC_CERTIFICADO {
        int id_certificado PK
        int remate_id FK
        int cert_estado_id FK
        int regcuenta_id FK
        int consignatario_regcuenta_id FK
        int establecimiento_id FK
        int formulario_id FK
        int orden_final
        int orden_venta
        decimal precio_base
    }

    HAC_REMATES {
        int id_remate PK
        varchar nombre_remate
        tinyint oculta_localidad
        tinyint oculta_provincia
        tinyint oculta_vendedor
    }

    HAC_CERT_DETALLE {
        int certificado_id FK
        int hac_categ_id FK
    }

    HAC_CATEGORIA {
        int id_hac_categ PK
        varchar nombre_categoria
    }

    HAC_PRE_ORDEN {
        int certficado_id FK
        int remate_id FK
        int formulario_id FK
        int orden
    }

    REG_CUENTA_ESTABLECIMIENTO {
        int id_establecimiento PK
        varchar nombre_establecimiento
        varchar latlong
        int localidad_id FK
        int provincia_id FK
        timestamp updated_at
    }

    ATRIBUTOS_VALORES {
        int atributo_id FK
        varchar tablename
        int record_id
        varchar valor_atributo
    }

    ATRIBUTOS {
        int id_atributo PK
        varchar nombre_atributo
        varchar tag
        varchar tipo_atributo
        tinyint deshabilitado_atributo
        timestamp updated_at
    }

    HAC_OFERTAS {
        int id_oferta PK
        int certificado_id FK
        decimal importe_oferta
        int estado_oferta
        tinyint rechazada
    }

    HAC_CERTIFICADO_MOV {
        int certificado_id FK
        int venta_estado_id FK
    }

    meilisearch_sync_queue {
        int certificado_id PK
        tinyint is_delete
        timestamp created_at
    }

    HAC_CERTIFICADO ||--o{ HAC_CERT_DETALLE : "tiene"
    HAC_CERT_DETALLE }o--|| HAC_CATEGORIA : "categoría"
    HAC_CERTIFICADO ||--o{ HAC_PRE_ORDEN : "pre-orden"
    HAC_CERTIFICADO ||--o{ ATRIBUTOS_VALORES : "atributos EAV"
    ATRIBUTOS_VALORES }o--|| ATRIBUTOS : "definición"
    HAC_CERTIFICADO ||--o{ HAC_OFERTAS : "ofertas"
    HAC_CERTIFICADO ||--o{ HAC_CERTIFICADO_MOV : "movimientos"
    HAC_CERTIFICADO }o--|| REG_CUENTA_ESTABLECIMIENTO : "establecimiento"
    HAC_CERTIFICADO }o--|| HAC_REMATES : "remate"

Tabla de cola

La tabla meilisearch_sync_queue es el único punto de comunicación entre los triggers de MySQL y el worker Python. Es intencionalmente simple:

  • PK = certificado_id → deduplicación automática, sin lógica extra
  • INSERT IGNORE en todos los triggers excepto el DELETE de HAC_CERTIFICADO
  • ON DUPLICATE KEY UPDATE is_delete = 1 solo en el trigger de DELETE para que un lote eliminado siempre se borre del índice aunque estuviera encolado para upsert

Atributos EAV

Los atributos del lote están en un modelo EAV (Entity-Attribute-Value):

ATRIBUTOS_VALORES
  tablename = 'HAC_CERTIFICADOS'
  record_id = id_certificado
  atributo_id → ATRIBUTOS.id_atributo
  valor_atributo

La query usa GROUP_CONCAT para aplanar todos los atributos en un string JSON (replace_lote) que Python parsea y expande como campos attr_* en el documento de Meilisearch. Por ejemplo:

replace_lote = '"[raza]":"Angus","[peso]":"320","[est_repr]":"Preñadas"'

Se convierte en:

{
  "attr_raza": "Angus",
  "attr_peso": "320",
  "attr_est_repr": "Preñadas"
}