Modelo de datos · ERD Conceptual v5

Sistema de Gestión · Comercializadora de Larvas

57 entidades · 9 dominios · Sinaloa, México
2026-05-18 · Confidencial

Catálogos compartidos

Base de toda la operación

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"

Genética y Maduración

Origen de la cadena productiva

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"

Producción (larvicultura)

Fase 1: módulos · Fase 2: exteriores

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"

Calidad y Agua

Monitoreo diario · 100k+ registros históricos

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

Fuera de protocolo · Requisición automática · Seguimiento con auditoría

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"

Comercial

Embarques · CxC · Pagos

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"

Planeación

Ventas → Producción · doble flujo

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"

Almacén y Compras

Insumos · Requisiciones · OC · Entradas · Salidas · Traspasos

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"

Usuarios e Importación

Roles y permisos · Acceso por módulo · Auditoría de importaciones desde Excel

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"