# CHANGELOG

## 2026-07-23 - Editor dispositivos: empresa, scraper patente, asignación desde empresa

### Backend
- **Scraper patentechile.com mejorado**: Playwright Stealth v2 + ad blocker (bloquea ~30 dominios de ads + imágenes/media/fonts). Espera activa para resolver Cloudflare challenge. Nota: Cloudflare puede bloquear IP del servidor; funciona mejor en producción
- **`playwright-stealth==2.0.3`** agregado como dependencia

### Frontend (G4sDispositivosPage.jsx)
- **Selector de empresa en editor**: Buscador con autocompletado de empresas activas, asigna `empresa_id` al guardar, botón para quitar empresa
- **Botón "Buscar datos" (scraper)**: Consulta patentechile.com al lado del campo patente, auto-rellena marca, modelo, año, color, tipo del vehículo
- **Manejo de errores**: Toast con mensaje claro si Cloudflare bloquea o no hay datos

### Frontend (G4sEmpresaDetallePage.jsx)
- **Botón "Asignar" dispositivo**: Desde la vista de empresa, busca dispositivos en stock y los asigna a la empresa
- **Botón "Desasignar"**: Hover en cada dispositivo muestra X roja para quitar dispositivo de la empresa (vuelve a stock)

## 2026-07-22 - Paginación dinámica y Filtros avanzados en Dispositivos

### Backend
- **Nuevo endpoint `GET /dispositivos/filtros`**: Retorna valores distintos de `gps_marca`, `vehiculo_tipo`, `vehiculo_marca` y `activity_status` para poblar los selectores de filtro
- **Endpoint `GET /dispositivos` mejorado**: Acepta parámetros `page` (en vez de `skip`), `limit` dinámico, y filtros adicionales: `gps_marca`, `vehiculo_tipo`, `vehiculo_marca`, `activity_status`. Respuesta incluye `page`, `limit`, `total_pages`

### Frontend (G4sDispositivosPage.jsx)
- **Paginación dinámica**: Selector de registros por página (25, 50, 100, 500, 1000) con navegación primera/anterior/siguiente/última página
- **Panel de filtros avanzados**: Botón "Filtros" desplegable con selectores para Estado, Conectividad, GPS Marca, Vehículo Tipo, Vehículo Marca. Incluye badge con conteo de filtros activos y botón "Limpiar filtros"
- **Barra de paginación**: Muestra "Mostrando X-Y de Z" con indicador de página actual

### API Lib (gestion4satApi.js)
- Nueva función `getDispositivosFiltros()` para obtener opciones de filtro
- `getDispositivos()` actualizado con nuevos parámetros de filtro y paginación basada en `page`

## 2026-07-22 - Paginación Sync, Estado de Pago Manual, payment_conditions por empresa

### Cambios Backend
- **Sync Facto mejorado**: Paginación completa (hasta 200 páginas), filtro por rango de fechas (`date_from`, `date_to`), batch insert de 500, mapeo correcto de `estado_sii` y `estado_pago`
- **Endpoint `/facto/info`**: Muestra total Facto API vs local DB
- **Endpoint `/facto/raw-document/{id}`**: JSON crudo de Facto para debugging
- **Endpoint `/facto/dtes` mejorado**: Filtros por `search`, `document_type_id`, `estado_pago`, `date_from`, `date_to`
- **Endpoint PATCH `/facto/dtes/{id}/estado-pago`**: Cambio manual de estado de pago
- **Endpoint PATCH `/facto/dtes/bulk-estado-pago`**: Cambio masivo de estado de pago
- **`payment_conditions` por empresa**: Campo en modelo empresa (0/15/30/60 días), usado al emitir DTE

### Cambios Frontend
- **G4sFacturacionPage.jsx**: Reescrita con paginación (30/página), búsqueda, filtros, diálogo de sync con fechas, visor JSON, badge de pago clickeable, UI mejorada para Capturar Patentes
- **G4sEmpresasPage.jsx**: Selector de "Condición de Pago (SII)" en formulario de empresa
- **G4sLayout.jsx**: Icono campana de notificaciones en header con badge de alertas pendientes

### Investigación API Facto
- Confirmado via OpenAPI spec: el campo "Impago" de la web Facto NO está en la API REST
- Solución implementada: Linkify automático + marcado manual
