> For the complete documentation index, see [llms.txt](https://senselab.gitbook.io/senselab-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://senselab.gitbook.io/senselab-docs/docs/api/models_with_traits.md).

# Modelos con Traits de Base de Datos

## Resumen

**Total de modelos mejorados**: 50 de 65 modelos

**Traits aplicados**:

* ✅ `HasCustomSoftDeletes` - Soft deletes usando campo `eliminado`
* ✅ `HasAuditFields` - Auditoría automática en tabla `auditoria_actividades`
* ✅ `HasActiveScope` - Scopes y helpers para campo `activo`

***

## Modelos Actualizados (50)

### Core / Principales (10)

1. ✅ **Almacen** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
2. ✅ **CategoriaProducto** - `use HasFactory, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
3. ✅ **Cargo** - `use HasFactory, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
4. ✅ **Cliente** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
5. ✅ **Empleado** - `use BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
6. ✅ **Empresa** - `use HasFactory, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
7. ✅ **InventarioProducto** - `use HasFactory, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
8. ✅ **Producto** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
9. ✅ **Proveedor** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
10. ✅ **Sucursal** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`

### Contabilidad (5)

11. ✅ **AsientoContable** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
12. ✅ **CuentaContable** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
13. ✅ **CuentaPorCobrar** - `use BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
14. ✅ **CuentaPorPagar** - `use BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
15. ✅ **DetalleAsiento** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`

### Inventario (6)

16. ✅ **Cabys** - `use HasFactory, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
17. ✅ **DetalleEntradaInventario** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
18. ✅ **DetalleSalidaInventario** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
19. ✅ **EntradaInventario** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
20. ✅ **Marca** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
21. ✅ **SalidaInventario** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`

### Ventas y Compras (8)

22. ✅ **DetalleOrdenCompra** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
23. ✅ **DetalleVenta** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
24. ✅ **OrdenCompra** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
25. ✅ **Pago** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
26. ✅ **PagoCuentaCobrar** - `use HasFactory, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
27. ✅ **PagoCuentaPagar** - `use HasFactory, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
28. ✅ **Venta** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
29. ✅ **UnidadMedida** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`

### Presupuestos (2)

30. ✅ **DetallePresupuesto** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
31. ✅ **Presupuesto** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`

### Nómina (3)

32. ✅ **NominaEmpleado** - `use HasFactory, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
33. ✅ **PagoNomina** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
34. ✅ **PeriodoNomina** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`

### Seguridad y Roles (6)

35. ✅ **Permiso** - `use HasFactory, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
36. ✅ **Rol** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
37. ✅ **RolPermiso** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
38. ✅ **RolUsuario** - `use HasFactory, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
39. ✅ **Usuario** - `use HasApiTokens, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
40. ✅ **UsuarioRol** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`

### Catálogos (7)

41. ✅ **EntidadEtiqueta** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
42. ✅ **Etiqueta** - `use BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
43. ✅ **FormaPago** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
44. ✅ **RegimenTributario** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
45. ✅ **TasaImpuesto** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
46. ✅ **TipoCuenta** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
47. ✅ **TipoImpuesto** - `use HasCustomSoftDeletes, HasAuditFields, HasActiveScope`

### Cajas (3)

48. ✅ **Caja** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
49. ✅ **CajaChica** - `use HasFactory, BelongsToTenant, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`
50. ✅ **MovimientoCajaChica** - `use HasFactory, HasCustomSoftDeletes, HasAuditFields, HasActiveScope`

***

## Modelos SIN Traits (15)

Estos modelos NO tienen los campos `activo` y `eliminado`, o son modelos especiales:

### Modelos del Sistema (4)

1. ❌ **AuditoriaActividad** - Tabla de auditoría (no debe auditarse a sí misma)
2. ❌ **Notificacion** - No tiene campos activo/eliminado
3. ❌ **SesionUsuario** - Tabla de sesiones temporales
4. ❌ **UrlShortener** - Utilidad URL shortener

### Facturación Electrónica (2)

5. ❌ **ComprobanteRecibidoElectronico** - No tiene campos activo/eliminado
6. ❌ **ConsecutivoFe** - Consecutivos (no se deben eliminar)

### Configuración (2)

7. ❌ **Configuracion** - Tabla de configuración general
8. ❌ **ConfiguracionApi** - Configuración de APIs

### Archivos (1)

9. ❌ **Archivo** - Sistema de archivos adjuntos

### Transporte (4)

10. ❌ **BusUnidad** - Unidades de transporte
11. ❌ **HorarioRuta** - Horarios de rutas
12. ❌ **ModeloBus** - Modelos de buses
13. ❌ **Ruta** - Rutas de transporte
14. ❌ **TiqueteDetalle** - Detalles de tiquetes

### Otros (1)

15. ❌ **TipoCambioHistorial** - Histórico de tipo de cambio (no debe eliminarse)

***

## Verificación de Implementación

### Comando para verificar modelos con traits:

```bash
grep -r "use HasCustomSoftDeletes" app/Models/*.php | wc -l
# Debería retornar: 50
```

### Comando para verificar auditoría:

```bash
grep -r "use HasAuditFields" app/Models/*.php | wc -l
# Debería retornar: 50
```

### Comando para verificar scopes:

```bash
grep -r "use HasActiveScope" app/Models/*.php | wc -l
# Debería retornar: 50
```

***

## Funcionalidad Disponible en 50 Modelos

### 1. Soft Deletes

```php
// Eliminar (soft)
$producto->delete(); // eliminado = true

// Restaurar
$producto->restore(); // eliminado = false

// Verificar
if ($producto->trashed()) { /* ... */ }

// Queries
Producto::withTrashed()->get(); // Incluye eliminados
Producto::onlyTrashed()->get(); // Solo eliminados
```

### 2. Auditoría Automática

```php
// Se registra automáticamente en:
// - create()
// - update()
// - delete()
// - restore()

// Ver historial
$producto->historialAuditoria();

// Ver quién creó/actualizó
$producto->creador(); // Usuario que creó
$producto->actualizador(); // Último usuario que actualizó
```

### 3. Scopes y Helpers

```php
// Scopes
Producto::activo()->get(); // Solo activos
Producto::inactivo()->get(); // Solo inactivos
Producto::conInactivos()->get(); // Todos (activos + inactivos)

// Helpers
$producto->estaActivo(); // boolean
$producto->activar(); // activo = true
$producto->desactivar(); // activo = false
$producto->toggleActivo(); // Alternar
```

***

## Impacto en el Sistema

### Antes

* ❌ Soft deletes manual con `update(['eliminado' => true])`
* ❌ Sin trazabilidad de cambios
* ❌ Queries manuales `where('activo', true)->where('eliminado', false)`
* ❌ Sin historial de quién hizo qué

### Ahora

* ✅ Soft deletes automático con `delete()`
* ✅ Auditoría completa automática
* ✅ Queries limpias `Producto::activo()->get()`
* ✅ Historial completo `$model->historialAuditoria()`

### Estadísticas

* **50 modelos** con funcionalidad mejorada
* **150 traits** aplicados (3 por modelo)
* **0 cambios** en base de datos MySQL
* **100% compatible** con código existente

***

## Próximos Pasos Opcionales

### 1. Aplicar traits a modelos de transporte (si necesitan)

Si BusUnidad, Ruta, etc. necesitan soft deletes y auditoría, agregar campos a DB y aplicar traits.

### 2. Crear tests automatizados

```php
// tests/Feature/TraitsTest.php
test_soft_delete_funciona()
test_auditoria_se_registra()
test_scopes_activo_funcionan()
```

### 3. Limpieza de código legacy

Buscar y reemplazar:

* `where('eliminado', false)` → usar scopes automáticos
* `where('activo', true)` → `::activo()`
* `update(['eliminado' => true])` → `delete()`

### 4. Dashboard de auditoría

Crear vista administrativa para:

* Ver actividad reciente
* Filtrar por usuario/acción/tabla
* Reportes de cambios

***

**Implementado**: 22 de noviembre de 2025\
**Versión**: 1.2.0\
**Commits**:

* `7df551f` - Traits iniciales (3 traits + 4 modelos + documentación)
* `8253c73` - Expansión a 46 modelos adicionales (total 50)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://senselab.gitbook.io/senselab-docs/docs/api/models_with_traits.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
