# CLAUDE.md — Naturcalabacera App Reservas Guía operativa para agentes de Claude Code trabajando en este repo. Lee este archivo antes de tocar código o sugerir SQL. --- ## 1. Base de datos (Supabase) — CRÍTICO La instancia de Supabase es **compartida** entre varios proyectos. Hay dos schemas: - `public` → **otro proyecto, NO tocar**. - `natur_reservas` → este proyecto. > **Toda sentencia SQL debe cualificar el schema explícitamente**: `natur_reservas.reservations`, `natur_reservas.contracts`, etc. > Nunca escribir `reservations` a secas en migraciones, queries ad-hoc, RLS, triggers, vistas o funciones. Aplica también al SQL Editor del dashboard. ### Ejemplo correcto ```sql ALTER TABLE natur_reservas.reservations ADD COLUMN IF NOT EXISTS start_time TIME; ``` ### Migraciones Viven en `supabase/migrations/NNN_*.sql`. Se aplican con `supabase db push` o pegando el SQL en el dashboard. **Antes de añadir una nueva**, revisar las anteriores y replicar la convención de cualificar con `natur_reservas.`. --- ## 2. Stack y estructura Monorepo pnpm con workspaces: - `apps/web` — Frontend React + TypeScript + Vite + Tailwind. Vista principal: calendario de reservas (mensual + anual). - `apps/api` — Backend Express. Webhooks (n8n relay para correos), jobs. - `packages/shared` — Tipos (`Reservation`, `Property`, etc.) y utilidades (`PROPERTY_CONFIG`, pricing). Comandos raíz: ```bash pnpm install pnpm dev:web # frontend (http://localhost:5173) pnpm dev:api # API pnpm build # build web + api pnpm lint pnpm test # tests del paquete shared ``` --- ## 3. Dominio - 2 propiedades: **Los Dragos** (`los_dragos`) y **La Esquinita** (`la_esquinita`). - 2 orígenes de reserva: **Teneriffa2000** (alquiler estándar) y **Naturcalabacera** (vacacional + eventos). - Reservas Naturcalabacera pueden marcarse `is_event = true` (boda, cumpleaños, etc.) con su propio cálculo de canon (precio base por noche + extra por pax sobre `includedPersons`, tarifa por año, IGIC). - Horarios opcionales `start_time` / `end_time` (cualquier reserva, cualquier origen): cuando ambas reservas en conflicto los tienen, el solapamiento se calcula a nivel de momento (fecha + hora), no solo de fecha. Permite encajar varios eventos el mismo día. --- ## 4. Despliegue Gitea + Dokploy en `72.62.155.93`. URLs con `traefik.me` (HTTP). Dockerfile por app. --- ## 5. Convenciones del repo - Sin commits sin permiso explícito del usuario. - Calendario empieza en **lunes** (`weekStartsOn: 1`) en todas las vistas. - Comentarios mínimos: solo cuando el "por qué" no es obvio del código. - Idioma de interfaz: español. Identificadores en inglés.