Sistema web multi-tenant de gestión agropecuaria (PWA instalable).
- Frontend: Next.js 15 (App Router) + TypeScript + Tailwind CSS + shadcn/ui
- Backend: Supabase (PostgreSQL + Auth + Storage + Edge Functions + Realtime)
- Base de datos: PostgreSQL 15 con PostGIS (polígonos de lotes)
- Multi-tenancy: Row Level Security (RLS) nativo de PostgreSQL
- Mapas: Leaflet + react-leaflet
- PWA/Offline: serwist + Dexie.js (IndexedDB)
- Gráficos: Recharts / Tremor
- Formularios: React Hook Form + Zod
- IA: Claude API (Anthropic) para asistente y OCR de facturas
- Hosting: Vercel (frontend) + Supabase (backend/DB)
agrosistema/
├── apps/web/ # Aplicación Next.js (frontend + PWA)
│ ├── src/
│ │ ├── app/ # App Router de Next.js
│ │ ├── components/ # Componentes React
│ │ ├── lib/supabase/ # Clientes de Supabase (browser + server)
│ │ ├── hooks/ # Hooks React personalizados
│ │ └── types/ # Tipos TypeScript del modelo
│ └── public/ # Assets estáticos + manifest PWA
├── supabase/
│ └── migrations/ # Migraciones SQL versionadas (schema completo + RLS)
├── scripts/ # Scripts de seed y utilidades
└── docs/ # Documentación técnica
- Node.js 20+
- Cuenta gratis en Supabase
- Supabase CLI:
npm install -g supabase
- Ir a https://supabase.com → New project
- Elegir región cercana (San Pablo o Virginia para Argentina)
- Guardar el password de la DB
# Clonar/descomprimir
cd agrosistema/apps/web
npm install
# Configurar variables de entorno
cp .env.local.example .env.local
# Editar .env.local con los valores del panel de Supabase
# (Project Settings → API)# Desde la raíz del proyecto
supabase login
supabase link --project-ref <tu-project-ref>
supabase db pushO copiar el contenido de supabase/migrations/*.sql y pegarlo en
Supabase Studio → SQL Editor → Run.
# Desde Supabase Studio → SQL Editor ejecutar:
scripts/seed.sqlUsuario admin creado: admin@agrosistema.com / admin1234 (cambiar en producción).
cd apps/web
npm run devAbrir http://localhost:3000
Toda tabla que contiene datos de empresa tiene una columna empresa_id y
una política RLS que filtra automáticamente según el usuario autenticado.
Imposible que un usuario vea datos de una empresa a la que no pertenece.
La tabla stock NUNCA se edita directamente. Todos los cambios pasan por
movimientos_stock. Un trigger en PostgreSQL recalcula el stock automáticamente
en cada movimiento. Trazabilidad total garantizada.
Cuando se aplica un producto a un lote, el costo que se imputa es el del momento de la compra (no el actual). Así los reportes históricos no se distorsionan por cambios de precio.
Los períodos contables cerrados no se pueden modificar sin un proceso explícito de reapertura con auditoría.
Ver docs/PLAN_DESARROLLO.md.
Ver docs/MODELO_DATOS.mermaid (v9 completo).
Privado.