Versión: 1.0.0
Estado: En desarrollo activo
Última actualización: 4 de Febrero 2026
Mi Ganado es una plataforma web progresiva (PWA) diseñada para la gestión integral de ganado bovino en Chile. El sistema permite a titulares de establecimientos ganaderos centralizar, trazar y gestionar eficientemente toda la información de su ganado, facilitando el cumplimiento normativo con SIPEC/SAG.
Este proyecto es parte de un ecosistema más amplio que incluye:
- Frontend (este repo): Aplicación Next.js para gestión ganadera
- Backend:
backend-agente- API NestJS con módulo ganado - Base de datos: PostgreSQL con Prisma ORM
- Infraestructura: Railway (producción) + Docker (desarrollo)
- ✅ Gestión completa de animales - CRUD con identificadores múltiples (DIIO, RFID, Chip, Bolus)
- ✅ Gestión de titulares y establecimientos - Estructura organizacional completa
- ✅ Registro de pesajes - Importación de datos desde equipos XR5000
- ✅ Control de lotes - Agrupación operativa de animales
- ✅ Movimientos de ganado - Traslados, ventas, compras y bajas
- ✅ Reportes y dashboards - Visualización de KPIs y estadísticas
- 🚧 Modo offline - Trabajo en terreno sin conectividad (en desarrollo)
- 🚧 Sincronización automática - Datos locales sincronizados con el backend (en desarrollo)
- Framework: Next.js 16.1.6 (App Router)
- UI: React 19.2.3 + TailwindCSS 4
- Componentes: shadcn/ui + Radix UI
- Estado: Zustand + TanStack Query
- Formularios: React Hook Form + Zod
- Animaciones: Framer Motion
- Iconos: Lucide React
- API: NestJS (backend-agente)
- Base de datos: PostgreSQL + Prisma ORM
- Autenticación: JWT + RBAC
- Hosting: Railway (producción)
- Node.js 20+
- npm o pnpm
- Acceso al backend
backend-agente(local o producción)
- Clonar el repositorio
git clone <repository-url>
cd mi-ganado- Instalar dependencias
npm install- Configurar variables de entorno
Crear archivo .env.local en la raíz del proyecto:
# Backend API
NEXT_PUBLIC_API_URL=http://localhost:8089
# API Key (REQUERIDA)
# Obtener del administrador del backend o generar una nueva
NEXT_PUBLIC_API_KEY=cdae5ecff427cf5474ff55279aa8b27a72d50cc670b72c79f362aefc6e98f2a7
# Para producción
# NEXT_PUBLIC_API_URL=https://jard.up.railway.appPara generar una nueva API Key:
cd ../backend-agente
npx ts-node scripts/create-api-key.ts <userId> "Mi Ganado Frontend" 365Ver más detalles en /docs/ENV-CONFIG.md
- Iniciar el servidor de desarrollo
npm run dev- Abrir en el navegador
http://localhost:3000
Para probar el sistema, usa las siguientes credenciales:
Email: admin@miganado.cl
Contraseña: admin123
Rol: ADMIN
Nota: Los tokens JWT expiran después de cierto tiempo. Si recibes errores 401, cierra sesión y vuelve a iniciar sesión para obtener un nuevo token.
mi-ganado/
├── src/
│ ├── app/ # App Router de Next.js
│ │ ├── (auth)/ # Rutas de autenticación
│ │ │ └── login/
│ │ └── dashboard/ # Rutas protegidas
│ │ ├── animales/ # Gestión de animales
│ │ ├── configuracion/ # Titulares y establecimientos
│ │ ├── lotes/ # Gestión de lotes
│ │ ├── movimientos/ # Movimientos de ganado
│ │ ├── pesajes/ # Registro de pesajes
│ │ └── reportes/ # Reportes y estadísticas
│ ├── components/
│ │ ├── animales/ # Componentes de animales
│ │ ├── auth/ # Componentes de autenticación
│ │ ├── dashboard/ # Componentes del dashboard
│ │ ├── establecimientos/ # Componentes de establecimientos
│ │ ├── titulares/ # Componentes de titulares
│ │ └── ui/ # Componentes base (shadcn)
│ ├── lib/
│ │ ├── api/ # Servicios de API
│ │ │ ├── animales.ts
│ │ │ ├── auth-client.ts
│ │ │ ├── establecimientos.ts
│ │ │ ├── lotes.ts
│ │ │ ├── movimientos.ts
│ │ │ ├── pesajes.ts
│ │ │ └── titulares.ts
│ │ └── utils.ts # Utilidades
│ ├── stores/ # Estado global (Zustand)
│ └── types/ # Tipos TypeScript
├── docs/ # Documentación del proyecto
│ ├── oficial/ # Documentación oficial
│ ├── borradores/ # Borradores
│ └── resumenes/ # Resúmenes de implementación
├── public/ # Archivos estáticos
├── CREDENCIALES-PRUEBA.md # Credenciales de prueba
├── IMPLEMENTACION-ANIMALES.md # Documentación de implementación
└── package.json
- Listado con paginación, búsqueda y filtros
- Creación con múltiples identificadores
- Visualización detallada con historial
- Edición de datos básicos y ubicación
- Eliminación con confirmación
- CRUD completo de titulares
- Validación de RUT chileno
- Gestión de estado (activo/inactivo)
- Asociación con establecimientos
- CRUD completo de establecimientos
- Asociación con titulares
- Tipos: propio, socio, externo
- Gestión de ubicación y rol predial
- Creación y gestión de lotes operativos
- Asignación de animales a lotes
- Estados: activo, cerrado, archivado
- Sesiones de pesaje por lote
- Importación desde XR5000 (CSV/TXT)
- Historial de pesos por animal
- Validación de datos
- Traslados entre establecimientos
- Ventas y compras
- Bajas por muerte
- Estados: borrador, confirmado, informado
- Stock actual por establecimiento
- Estadísticas de ganado
- Evolución de pesos
- Resumen de movimientos
# Desarrollo
npm run dev # Iniciar servidor de desarrollo
# Producción
npm run build # Construir para producción
npm run start # Iniciar servidor de producción
# Calidad de código
npm run lint # Ejecutar ESLintEl frontend consume los siguientes endpoints del backend-agente:
POST /auth/login- Iniciar sesiónGET /auth/profile- Obtener perfil del usuario
GET /api/v1/ganado/animales- Listar animalesPOST /api/v1/ganado/animales- Crear animalGET /api/v1/ganado/animales/:id- Obtener animalPATCH /api/v1/ganado/animales/:id- Actualizar animalDELETE /api/v1/ganado/animales/:id- Eliminar animal
GET /api/v1/ganado/titulares- Listar titularesPOST /api/v1/ganado/titulares- Crear titularPATCH /api/v1/ganado/titulares/:id- Actualizar titular
GET /api/v1/ganado/establecimientos- Listar establecimientosPOST /api/v1/ganado/establecimientos- Crear establecimiento
Ver documentación completa en /docs/oficial/DOCUMENTO-OFICIAL.md
Para ejecutar el proyecto completo, necesitas iniciar el backend:
cd ../backend-agente
npm run start:devEl backend estará disponible en http://localhost:8089
# Verificar health check
curl http://localhost:8089/health
# Debería retornar:
# {"status":"ok","timestamp":"...","uptime":...}Causa: Token JWT expirado o API Key inválida
Solución:
- Verifica que
NEXT_PUBLIC_API_KEYesté configurada en.env.local - Cierra sesión y vuelve a iniciar sesión en la aplicación
- Si el problema persiste, limpia el localStorage:
// En la consola del navegador (F12) localStorage.removeItem('access_token'); window.location.href = '/login';
Causa: Error del servidor, generalmente por falta de autenticación
Solución:
- Verifica que el backend esté corriendo:
curl http://localhost:8089/health - Revisa los logs del backend para más detalles
- Asegúrate de estar autenticado correctamente
Causa: Backend no está corriendo o URL incorrecta
Solución:
- Verifica que el backend esté corriendo en el puerto 8089
- Verifica que
NEXT_PUBLIC_API_URLen.env.localsea correcta - Verifica que no haya problemas de CORS
Causa: Token expirado o problemas de autenticación
Solución:
- Abre la consola del navegador (F12) y revisa los errores
- Verifica el Network tab para ver qué peticiones fallan
- Cierra sesión y vuelve a iniciar sesión
- Configuración de entorno:
/docs/ENV-CONFIG.md - Credenciales de prueba:
/docs/CREDENCIALES-PRUEBA.md - Cálculo de producto final:
/docs/CALCULO-PF-MI-GANADO.md - Propuesta SaaS:
/docs/PROPUESTA-SAAS-MI-GANADO.md
- Modo offline completo (PWA)
- Sincronización en background
- Importación XR5000 mejorada
- Gráficos de evolución de peso
- Exportación de reportes (Excel/CSV)
- Integración con SIPEC/SAG
- Módulo sanitario (vacunas, tratamientos)
- Gestión documental avanzada
- Notificaciones push
- Multi-especie (ovinos, caprinos)
El sistema utiliza un esquema de autenticación de dos niveles:
-
API Key (X-API-Key header): Requerida para todas las peticiones al backend
- Se configura en
NEXT_PUBLIC_API_KEY - Valida que la aplicación frontend está autorizada
- Se envía en todas las peticiones HTTP
- Se configura en
-
JWT Token (Authorization header): Requerido para endpoints protegidos
- Se obtiene al hacer login exitoso
- Se almacena en
localStoragecomoaccess_token - Expira después de cierto tiempo (requiere re-login)
- Se envía como
Bearer <token>en peticiones autenticadas
1. Usuario ingresa email/password
2. Frontend envía POST /auth/login con API Key
3. Backend valida credenciales y retorna JWT token
4. Frontend guarda token en localStorage
5. Todas las peticiones subsecuentes incluyen:
- X-API-Key header (API Key)
- Authorization header (JWT token)
Para problemas o dudas:
- Revisar la sección Troubleshooting arriba
- Revisar la documentación en
/docs - Verificar logs del backend:
cd ../backend-agente && npm run start:dev - Usar Network tab del navegador (F12) para debugging de peticiones HTTP
- Verificar la consola del navegador para errores de JavaScript
Proyecto privado - Todos los derechos reservados