# Base de Datos - Mecánicas Diesel

## Descripción

Base de datos PostgreSQL para el sistema de gestión de talleres de mecánica diesel.

## Schemas

| Schema | Descripción |
|--------|-------------|
| `service_management` | Órdenes de servicio, diagnósticos, cotizaciones |
| `parts_management` | Inventario de refacciones específico del taller |
| `vehicle_management` | Vehículos diesel, flotas, motores |

**NOTA:** Los schemas `auth`, `core`, `inventory` se heredan de erp-core.

## Configuración

### 1. Variables de Entorno

Copiar `.env.example` a `.env` y configurar:

```bash
cp .env.example .env
# Editar valores en .env
```

### 2. Iniciar con Docker

```bash
# Solo base de datos y Redis
docker-compose up -d postgres redis

# Verificar salud
docker-compose ps

# Ver logs
docker-compose logs -f postgres
```

### 3. Ejecutar Scripts Manualmente

Si no usas Docker, ejecutar en orden:

```bash
psql -U mecanicas_user -d mecanicas_diesel -f database/init/00-extensions.sql
psql -U mecanicas_user -d mecanicas_diesel -f database/init/01-create-schemas.sql
psql -U mecanicas_user -d mecanicas_diesel -f database/init/02-rls-functions.sql
psql -U mecanicas_user -d mecanicas_diesel -f database/init/03-service-management-tables.sql
psql -U mecanicas_user -d mecanicas_diesel -f database/init/04-parts-management-tables.sql
psql -U mecanicas_user -d mecanicas_diesel -f database/init/05-vehicle-management-tables.sql
psql -U mecanicas_user -d mecanicas_diesel -f database/init/06-seed-data.sql
```

## Arquitectura Multi-Tenant

### Row-Level Security (RLS)

Todas las tablas principales implementan RLS con políticas completas:

```sql
-- Establecer tenant en sesión
SELECT set_current_tenant_id('uuid-del-tenant');

-- Las queries se filtran automáticamente
SELECT * FROM service_management.service_orders;
-- Solo retorna órdenes del tenant actual
```

### Crear Políticas RLS

Para nuevas tablas:

```sql
-- Automático: crea políticas SELECT, INSERT, UPDATE, DELETE
SELECT create_tenant_rls_policies('schema_name', 'table_name');
```

## Tablas Principales

### service_management

- `service_orders` - Órdenes de servicio
- `order_items` - Líneas de trabajo/refacciones
- `work_bays` - Bahías de trabajo
- `diagnostics` - Diagnósticos realizados
- `diagnostic_items` - Hallazgos del diagnóstico
- `quotes` - Cotizaciones
- `services` - Catálogo de servicios

### parts_management

- `parts` - Refacciones
- `part_categories` - Categorías
- `suppliers` - Proveedores
- `warehouse_locations` - Ubicaciones
- `inventory_movements` - Kardex
- `inventory_adjustments` - Ajustes

### vehicle_management

- `vehicles` - Vehículos registrados
- `vehicle_engines` - Especificaciones del motor
- `fleets` - Flotas
- `engine_catalog` - Catálogo de motores (global)
- `maintenance_reminders` - Recordatorios

## Convenciones

### Nombres

- Tablas: plural en inglés, snake_case
- Columnas: snake_case
- PKs: `id UUID`
- FKs: `entity_id UUID`
- Tenant: `tenant_id UUID`

### Campos Estándar

```sql
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
tenant_id UUID NOT NULL
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
created_by UUID
```

### Soft Delete (opcional)

```sql
deleted_at TIMESTAMP WITH TIME ZONE
deleted_by UUID
```

## Triggers Automáticos

- `trigger_set_updated_at()` - Actualiza `updated_at` en cada UPDATE
- `update_fleet_vehicle_count()` - Mantiene conteo de vehículos en flotas

## Herramientas

### Adminer (UI de BD)

```bash
docker-compose --profile tools up -d adminer
# Acceder en http://localhost:8080
```

### Conexión Directa

```bash
docker-compose exec postgres psql -U mecanicas_user -d mecanicas_diesel
```

## Migraciones

Para cambios futuros, usar el sistema de migraciones de tu ORM (Prisma, TypeORM, etc.).

Ejemplo con Prisma:

```bash
npx prisma migrate dev --name add_new_field
```

## Backup

```bash
# Backup
docker-compose exec postgres pg_dump -U mecanicas_user mecanicas_diesel > backup.sql

# Restore
docker-compose exec -T postgres psql -U mecanicas_user -d mecanicas_diesel < backup.sql
```
