Entidades maestras que usan todos los demás dominios. Una sola versión de la verdad para pilas, salas, módulos, familias, estadíos y protocolos operativos — reemplaza las 8 versiones desincronizadas del catálogo de pilas que existen actualmente.
erDiagram
MODULO {
string id PK
string descripcion
}
SALA {
string id PK
string modulo_id FK
string descripcion
}
PILA {
string id PK
string sala_id FK
string modulo_id FK
float volumen_lts
float m2
string descripcion
}
FAMILIA {
uuid id PK
string codigo
string descripcion
string tipo
date fecha_recepcion
}
ESTADIO {
int dia_cultivo PK
string nombre
float pct_sobrevivencia
}
PROTOCOLO_REVISION {
uuid id PK
int estadio_dia FK
string tipo_revision
boolean obligatorio
}
PROTOCOLO_ALIMENTO {
uuid id PK
int estadio_dia FK
string dieta_id FK
float pct_alimento_verano
float pct_alimento_invierno
date fecha_vigencia
}
PROTOCOLO_AGUA {
uuid id PK
int estadio_dia FK
float volumen_agua_tons
float pct_recambio
float vitamina_c
float calcio
float magnesio
float potasio
float nitrato_sodio
date fecha_vigencia
}
PROTOCOLO_PROBIOTICO {
uuid id PK
int estadio_dia FK
float ml_ton_verano
float ml_ton_invierno
date fecha_vigencia
}
DIETA {
string id PK
string nombre_alimento
float pct_mezcla
date fecha_vigencia
}
ESPECIE_FITOPLANCTON {
uuid id PK
string genero
string especie
string sindrome
string tipo_toxina
float limite_precautorio
float limite_peligroso
}
MODULO ||--o{ SALA : "contiene"
SALA ||--o{ PILA : "contiene"
ESTADIO ||--o{ PROTOCOLO_REVISION : "define"
ESTADIO ||--o{ PROTOCOLO_ALIMENTO : "define"
ESTADIO ||--o{ PROTOCOLO_AGUA : "define"
ESTADIO ||--o{ PROTOCOLO_PROBIOTICO : "define"
PROTOCOLO_ALIMENTO }o--|| DIETA : "usa"
Núcleo Genético selecciona y cruza reproductores de élite para producir familias. Maduración mantiene reproductores activos, registra desoves y distribuye nauplios a pilas de larvicultura. Siembra_Origen captura la proporción exacta de cada familia en cada siembra — dato que hoy se pierde en el Excel actual.
erDiagram
FAMILIA {
uuid id PK
string codigo
string descripcion
string tipo
}
REPRODUCTOR {
uuid id PK
string pila_id FK
uuid familia_id FK
string area_tipo
string ciclo
date fecha_siembra_original
date fecha_transfer
string procedencia_pila_id
int hembras
int machos
string estado
}
BIOMETRIA_REPRODUCTOR {
uuid id PK
uuid reproductor_id FK
date fecha
float peso_gr
float talla_mm
float biomasa_gr
float camaron_m2
float pct_alim
int edad_meses
}
DESOVE {
uuid id PK
uuid reproductor_id FK
date fecha_pesca
int hembras_pescadas
float pct_hembras_parchadas
int total_huevo
float pct_eclosion
int total_nauplio
float nauplio_x_hembra
float huevo_x_hembra
}
SIEMBRA_ORIGEN {
uuid id PK
uuid siembra_id FK
uuid desove_id FK
uuid familia_id FK
int cantidad_nauplios
float proporcion
}
FAMILIA ||--o{ REPRODUCTOR : "asignada a"
REPRODUCTOR ||--o{ BIOMETRIA_REPRODUCTOR : "registra"
REPRODUCTOR ||--o{ DESOVE : "produce"
DESOVE ||--o{ SIEMBRA_ORIGEN : "distribuye nauplios a"
FAMILIA ||--o{ SIEMBRA_ORIGEN : "identificada en"
Dos fases de cría: Fase 1 en módulos de larvarios, Fase 2 en módulos de exteriores. Transferencia_Origen registra en qué proporción contribuyó cada pila de Fase 1 a cada pila de Fase 2 — clave para calcular sobrevivencia y crecimiento por familia. Registro_Operativo preserva el historial de lo aplicado cada día, dato que hoy se pierde al sobreescribir la hoja diaria.
erDiagram
CORRIDA {
int numero PK
string descripcion
date fecha_inicio
date fecha_fin
string status
}
CORRIDA_MODULO {
uuid id PK
int corrida_id FK
string modulo_id FK
boolean activo
}
SIEMBRA {
uuid id PK
uuid plan_pila_dia_id FK
string pila_id FK
int corrida_id FK
string area
date fecha_real
int cant_sembrada
date fecha_resiembra
int cant_resembrada
string encargado
string estado
string origen_captura
uuid importacion_id FK
}
SIEMBRA_ORIGEN {
uuid id PK
uuid siembra_id FK
uuid desove_id FK
uuid familia_id FK
int cantidad_nauplios
float proporcion
}
CONTEO {
uuid id PK
uuid siembra_id FK
date fecha
string tipo
int cantidad
string origen_captura
uuid importacion_id FK
}
TRANSFERENCIA {
uuid id PK
string pila_destino_id FK
int corrida_id FK
string area_destino
date fecha_plan
date fecha_real
string estadio
string tipo
string responsable_cc
string status
string origen_captura
uuid importacion_id FK
}
TRANSFERENCIA_ORIGEN {
uuid id PK
uuid transferencia_id FK
uuid siembra_id FK
int cantidad
float proporcion
}
REGISTRO_OPERATIVO {
uuid id PK
uuid siembra_id FK
date fecha
float peso_prom_mg
float biomasa_kg
float pct_alimento
float alimento_total_kg
string dieta
float probiotico_lts
float recambio_tons
float magnesio_gr
float potasio_gr
string origen_captura
uuid importacion_id FK
}
CORRIDA ||--o{ CORRIDA_MODULO : "incluye modulos"
CORRIDA ||--o{ SIEMBRA : "agrupa"
SIEMBRA ||--o{ SIEMBRA_ORIGEN : "compuesta de"
SIEMBRA ||--o{ CONTEO : "registra"
SIEMBRA ||--o{ REGISTRO_OPERATIVO : "opera diario"
SIEMBRA ||--o{ TRANSFERENCIA_ORIGEN : "contribuye a"
TRANSFERENCIA ||--o{ TRANSFERENCIA_ORIGEN : "recibe de"
Cinco tipos de medición que hoy viven en archivos separados y se re-capturan manualmente en Siembras.xlsx. En el sistema nuevo, todos referencian la misma Siembra y se consultan desde un único historial. El semáforo de Muestreo_Agua_Mar genera alertas automáticas a Producción.
erDiagram
SIEMBRA {
uuid id PK
string pila_id FK
int corrida_id FK
date fecha_real
string estado
}
REVISION_CALIDAD {
uuid id PK
uuid siembra_id FK
string origen
uuid revision_origen_id FK
date fecha
time hora
string responsable
float peso_prom_mg
float talla_mm
float pct_mortalidad
float pct_transp
string grado_branquia
string intestino
string grado_mutilacion
float pct_lipidos
string tratamiento_agua
string tratamiento_alimento
string origen_captura
uuid importacion_id FK
}
LECTURA_BACTERIOLOGIA {
uuid id PK
uuid siembra_id FK
string origen
uuid revision_origen_id FK
date fecha
string responsable
int larvas_bact_amarillas
int larvas_bact_verdes
int agua_bact_amarillas
int agua_bact_verdes
float fe_mg_lt
float mn_mg_lt
float amonia_total
float ph
float temp_c
float salinidad
string tratamiento
string origen_captura
uuid importacion_id FK
}
PESO_DIARIO {
uuid id PK
uuid siembra_id FK
date fecha
float peso_muestra_gr
int larvas_contadas
float peso_prom_mg
string origen_captura
uuid importacion_id FK
}
BALANCE_IONICO {
uuid id PK
uuid siembra_id FK
date fecha
float sal_ppt
float ph_am
float ph_pm
float temp_c
float calcio
float magnesio
float potasio
float nitrato_sodio
float amonia_total
string origen_captura
uuid importacion_id FK
}
MUESTREO_AGUA_MAR {
uuid id PK
uuid especie_id FK
date fecha
time hora
string zona
float temp_c
float salinidad
float ph
int cel_ml
string semaforo
string origen_captura
}
ESPECIE_FITOPLANCTON {
uuid id PK
string genero
string especie
string sindrome
string tipo_toxina
float limite_precautorio
float limite_peligroso
}
SIEMBRA ||--o{ REVISION_CALIDAD : "evalua"
SIEMBRA ||--o{ LECTURA_BACTERIOLOGIA : "monitorea"
SIEMBRA ||--o{ PESO_DIARIO : "pesa"
SIEMBRA ||--o{ BALANCE_IONICO : "analiza"
MUESTREO_AGUA_MAR }o--|| ESPECIE_FITOPLANCTON : "identifica"
Tratamientos aplicados fuera del protocolo normal. Tratamiento es el encabezado del evento (receta, alcance, responsables). Tratamiento_Pila es el detalle por pila con cantidad calculada por ppm, fechas de seguimiento individuales y auditoría de desactivación. Genera requisición automática al Almacén y pendientes de seguimiento para Calidad y Patología.
erDiagram
TRATAMIENTO {
uuid id PK
uuid revision_origen_id FK
date fecha
string modulo_id FK
string sala_id FK
string insumo_id FK
string tipo_base
float concentracion_ppm
int no_dias_aplicaciones
int seguimiento_calidad_dias
int seguimiento_bacteriologia_dias
string alcance
string responsable_produccion
string responsable_calidad
string responsable_modulo
text observaciones
string status
}
TRATAMIENTO_PILA {
uuid id PK
uuid tratamiento_id FK
uuid siembra_id FK
float cantidad_calculada
string status
date fecha_aplicacion
date fecha_seguimiento_calidad
date fecha_seguimiento_bacteriologia
boolean seguimiento_calidad
boolean seguimiento_bacteriologia
uuid seg_cal_desactivado_por FK
datetime seg_cal_desactivado_fecha
uuid seg_cal_motivo_id FK
text seg_cal_observacion
uuid seg_bact_desactivado_por FK
datetime seg_bact_desactivado_fecha
uuid seg_bact_motivo_id FK
text seg_bact_observacion
}
CATALOGO_MOTIVO {
uuid id PK
string motivo
boolean requiere_observacion
boolean activo
}
REVISION_CALIDAD {
uuid id PK
uuid siembra_id FK
string origen
uuid revision_origen_id FK
date fecha
string responsable
}
LECTURA_BACTERIOLOGIA {
uuid id PK
uuid siembra_id FK
string origen
uuid revision_origen_id FK
date fecha
string responsable
}
TRATAMIENTO ||--o{ TRATAMIENTO_PILA : "se aplica en"
TRATAMIENTO_PILA }o--|| CATALOGO_MOTIVO : "motivo cal"
TRATAMIENTO_PILA }o--|| CATALOGO_MOTIVO : "motivo bact"
REVISION_CALIDAD ||--o{ TRATAMIENTO : "dispara"
TRATAMIENTO_PILA ||--o{ REVISION_CALIDAD : "genera seguimiento"
TRATAMIENTO_PILA ||--o{ LECTURA_BACTERIOLOGIA : "genera seguimiento"
Embarque es el hecho físico de la entrega. Venta es el hecho comercial (precio y moneda) — Ventas lo captura por separado. Pago registra los cobros y actualiza el saldo. Maneja MXN y USD con tipo de cambio DOF histórico. Reemplaza tres archivos Excel actualmente desincronizados (ConsecutivoRemisiones, CxC, y la copia interna de 885 filas).
erDiagram
CLIENTE {
int no_cliente PK
string rfc
string razon_social
string vendedor
boolean contrato_firmado
boolean pagare_firmado
float pct_anticipo
float pct_contado
int dias_credito
float pct_cosecha
}
GRANJA {
uuid id PK
uuid cliente_id FK
string nombre
string biologo
string telefono
string ubicacion
}
EMBARQUE {
uuid id PK
uuid transferencia_id FK
uuid cliente_id FK
uuid granja_id FK
string no_remision
string no_carta_porte
string status
date fecha
time hora
int cantidad_entregada
float pct_excedente
int cantidad_facturada
float peso_prom_mg
string unidad
string chofer
string biologo_transporte
float kms_totales
float casetas
float gasolina
}
VENTA {
uuid id PK
uuid embarque_id FK
float precio
string moneda
float tipo_cambio
float venta_mxn
float venta_usd
float saldo_mxn
float saldo_usd
}
PAGO {
uuid id PK
uuid cliente_id FK
uuid embarque_id FK
date fecha_pago
float cantidad_pagada
string moneda
float tipo_cambio
float pago_en_pesos
}
TIPO_CAMBIO {
date fecha PK
float tc_dof
}
CLIENTE ||--o{ GRANJA : "tiene"
CLIENTE ||--o{ EMBARQUE : "recibe"
GRANJA ||--o{ EMBARQUE : "destino de"
EMBARQUE ||--|| VENTA : "genera"
CLIENTE ||--o{ PAGO : "realiza"
PAGO }o--|| EMBARQUE : "aplica a"
Dos documentos distintos: Ventas envía sus requerimientos (Plan_Siembra_Ventas) con fechas exactas por sala. Producción responde con el plan operativo detallado (Plan_Siembra_Produccion). Plan_Pila_Dia distribuye automáticamente las pilas de la sala en los días del rango. El Programa_Entregas programa los embarques de Ventas hacia Producción.
erDiagram
CORRIDA {
int numero PK
string descripcion
date fecha_inicio
date fecha_fin
string status
}
PLAN_SIEMBRA_VENTAS {
uuid id PK
int corrida_id FK
string sala_id FK
date fecha_inicio_siembra
date fecha_fin_siembra
date fecha_cosecha_objetivo
int cantidad_solicitada
text observaciones
string status
}
PLAN_SIEMBRA_PRODUCCION {
uuid id PK
uuid plan_ventas_id FK
string sala_id FK
int corrida_id FK
int dias_larvario
string estadio_transfer
string exterior_asignado
date fecha_cosecha_plan
string encargado
string status
}
PLAN_PILA_DIA {
uuid id PK
uuid plan_produccion_id FK
string pila_id FK
date fecha_siembra
date fecha_transfer_plan
date fecha_cosecha_plan
}
PROGRAMA_ENTREGAS {
uuid id PK
uuid cliente_id FK
uuid granja_id FK
int corrida_id FK
date fecha_salida_lab
time hora_salida
date fecha_entrega_plan
int cantidad_plan
float salinidad_ppt
string unidad
text observaciones
string status
}
SIEMBRA {
uuid id PK
uuid plan_pila_dia_id FK
string pila_id FK
int corrida_id FK
date fecha_real
int cant_sembrada
string estado
}
CORRIDA ||--o{ PLAN_SIEMBRA_VENTAS : "agrupa"
PLAN_SIEMBRA_VENTAS ||--|| PLAN_SIEMBRA_PRODUCCION : "origina"
PLAN_SIEMBRA_PRODUCCION ||--o{ PLAN_PILA_DIA : "distribuye pilas"
PLAN_PILA_DIA ||--o{ SIEMBRA : "ejecuta"
PROGRAMA_ENTREGAS }o--|| CORRIDA : "referencia"
Dominio nuevo. Integra el sistema externo PROLAMAR (548 productos, $3.6M en inventario). Cubre el ciclo completo: requisición → autorización en sistema → orden de compra → entrada de mercancía → traspaso entre almacenes → salida por área. Mobile-first para el personal de Compras que opera en campo.
erDiagram
ALMACEN {
uuid id PK
string nombre
string tipo
string ubicacion
boolean activo
}
GRUPO_INSUMO {
uuid id PK
string nombre
}
INSUMO {
uuid id PK
string codigo_externo
uuid grupo_id FK
string nombre
string alias_laboratorio
string udm_interna
string udm_compra
float factor_conversion
float costo_referencia
boolean iva
boolean ieps
string imagen_url
boolean activo
}
INSUMO_LINK {
uuid id PK
uuid insumo_id FK
string plataforma
string url
string descripcion
boolean activo
}
INSUMO_NOMBRE_PROVEEDOR {
uuid id PK
uuid insumo_id FK
uuid proveedor_id FK
string nombre_proveedor
}
PROVEEDOR {
uuid id PK
string razon_social
string nombre_comercial
string rfc
string contacto
string telefono
string email
string direccion
float descuento_pct
boolean credito
int dias_credito
float limite_credito
boolean activo
}
REQUISICION {
uuid id PK
int folio
uuid almacen_id FK
date fecha
uuid generado_por FK
uuid autorizado_por FK
datetime fecha_autorizacion
string status
text observaciones
}
REQUISICION_DETALLE {
uuid id PK
uuid requisicion_id FK
uuid insumo_id FK
float cantidad_solicitada
float cantidad_autorizada
string udm
float existencia_al_momento
string status_linea
string motivo_rechazo
}
ORDEN_COMPRA {
uuid id PK
int folio
uuid requisicion_id FK
uuid proveedor_id FK
date fecha
uuid solicitado_por FK
string status
float subtotal
float iva
float ieps
float total
text observaciones
}
ORDEN_COMPRA_DETALLE {
uuid id PK
uuid orden_compra_id FK
uuid insumo_id FK
float cantidad
string udm_compra
float costo_unitario
float importe
}
COMPRA {
uuid id PK
int folio
uuid orden_compra_id FK
uuid proveedor_id FK
string tipo_documento
string no_documento
date fecha
uuid almacen_id FK
string moneda
float subtotal
float iva
float ieps
float total
string forma_pago
uuid registrado_por FK
text observaciones
}
COMPRA_DETALLE {
uuid id PK
uuid compra_id FK
uuid insumo_id FK
float cantidad
string udm_compra
float costo_unitario
float importe
}
TRASPASO {
uuid id PK
int folio
uuid almacen_origen_id FK
uuid almacen_destino_id FK
date fecha_salida
date fecha_entrada
uuid registrado_salida_por FK
uuid registrado_entrada_por FK
string status
text observaciones_salida
text observaciones_entrada
}
TRASPASO_DETALLE {
uuid id PK
uuid traspaso_id FK
uuid insumo_id FK
float cantidad_enviada
float cantidad_recibida
string udm
}
SALIDA_ALMACEN {
uuid id PK
int folio
uuid almacen_id FK
uuid area_id FK
date fecha
uuid registrado_por FK
uuid tratamiento_pila_id FK
text observaciones
}
SALIDA_ALMACEN_DETALLE {
uuid id PK
uuid salida_id FK
uuid insumo_id FK
float cantidad
string udm
float existencia_antes
float existencia_despues
}
AJUSTE_INVENTARIO {
uuid id PK
int folio
uuid almacen_id FK
date fecha
uuid insumo_id FK
string tipo
float cantidad
string udm
string motivo
uuid registrado_por FK
}
CATALOGO_AREA_ALMACEN {
uuid id PK
string nombre
string tipo
string modulo_id FK
boolean activo
}
USUARIO_AREA_ALMACEN {
uuid id PK
uuid usuario_id FK
uuid area_id FK
boolean activo
uuid asignado_por FK
date fecha_asignacion
}
GRUPO_INSUMO ||--o{ INSUMO : "clasifica"
INSUMO ||--o{ INSUMO_LINK : "tiene links"
INSUMO ||--o{ INSUMO_NOMBRE_PROVEEDOR : "nombrado por"
PROVEEDOR ||--o{ INSUMO_NOMBRE_PROVEEDOR : "nombra"
ALMACEN ||--o{ REQUISICION : "genera"
REQUISICION ||--o{ REQUISICION_DETALLE : "contiene"
INSUMO ||--o{ REQUISICION_DETALLE : "solicitado en"
REQUISICION ||--o{ ORDEN_COMPRA : "origina"
PROVEEDOR ||--o{ ORDEN_COMPRA : "recibe"
ORDEN_COMPRA ||--o{ ORDEN_COMPRA_DETALLE : "detalla"
INSUMO ||--o{ ORDEN_COMPRA_DETALLE : "comprado en"
ORDEN_COMPRA ||--o{ COMPRA : "liquidada en"
PROVEEDOR ||--o{ COMPRA : "factura"
COMPRA ||--o{ COMPRA_DETALLE : "detalla"
ALMACEN ||--o{ TRASPASO : "origen"
TRASPASO ||--o{ TRASPASO_DETALLE : "contiene"
ALMACEN ||--o{ SALIDA_ALMACEN : "despacha"
CATALOGO_AREA_ALMACEN ||--o{ SALIDA_ALMACEN : "destino"
SALIDA_ALMACEN ||--o{ SALIDA_ALMACEN_DETALLE : "detalla"
ALMACEN ||--o{ AJUSTE_INVENTARIO : "ajusta"
CATALOGO_AREA_ALMACEN ||--o{ USUARIO_AREA_ALMACEN : "restringida a"
Modelo de permisos de dos niveles: Rol global (qué puede hacer) + Usuario_Modulo (dónde puede operar, solo para Encargado_Modulo, asignado por corrida). El módulo de Importacion registra cada carga de plantilla Excel con auditoría completa de errores por línea.
erDiagram
USUARIO {
uuid id PK
string nombre
string email
uuid rol_id FK
boolean activo
datetime ultimo_acceso
}
ROL {
uuid id PK
string nombre
string descripcion
string permisos
}
USUARIO_MODULO {
uuid id PK
uuid usuario_id FK
string modulo_id FK
int corrida_id FK
date fecha_asignacion
uuid asignado_por FK
boolean activo
}
IMPORTACION {
uuid id PK
uuid usuario_id FK
datetime fecha_subida
string tipo_plantilla
string nombre_archivo
int registros_procesados
int registros_con_error
string status
text observaciones
}
IMPORTACION_ERROR {
uuid id PK
uuid importacion_id FK
int fila_excel
string campo
string valor_recibido
string mensaje_error
}
ROL ||--o{ USUARIO : "asignado a"
USUARIO ||--o{ USUARIO_MODULO : "tiene acceso a"
USUARIO ||--o{ IMPORTACION : "realiza"
IMPORTACION ||--o{ IMPORTACION_ERROR : "registra errores"