# Cambios Recientes del Proyecto

**Última actualización**: 18 de febrero de 2026

## Resumen Ejecutivo

El proyecto ha recibido importantes mejoras en rendimiento, arquitectura y estabilidad durante febrero de 2026:

1. **Refactoring de `product_main_seller`** - Eliminación de campo alias innecesario
2. **Lazy Loading v18.0.1.3.0** - Mejora de rendimiento de 10-20s → 500-800ms
3. **Template Rendering Fixes v18.0.1.3.1** - Solución definitiva para errores QWeb
4. **Date Calculation Fixes v18.0.1.3.1** - Correcciones críticas en validación de fechas

---

## 📅 Timeline de Cambios

### 18 de Febrero (Hoy)

#### `[REF] product_main_seller: Remover campo alias default_supplier_id`

**Commit**: `ed048c8`

**Cambio**: Se eliminó el campo `default_supplier_id` que era un alias innecesario

**Razón**:
- Campo redundante que duplicaba `main_seller_id`
- Los addons custom ya usan `main_seller_id` directamente
- Evitar crear extensiones innecesarias en addons OCA

**Impacto**:
- ✅ Código más limpio
- ✅ Menos confusión en arquitectura
- ⚠️ Revisar cualquier código personalizado que use `default_supplier_id`

**Archivos Afectados**:
- `product_main_seller/models/product_template.py` - Se removió campo alias

**Acción Requerida**:
```bash
# Actualizar addon en instancia Odoo
docker-compose exec odoo odoo -d odoo -u product_main_seller --stop-after-init
```

**Para Developers**:
```python
# ❌ ANTES
product.default_supplier_id  # Alias innecesario

# ✅ AHORA (preferido)
product.main_seller_id  # Campo original
```

---

### 16 de Febrero (v18.0.1.3.1)

#### `[FIX] website_sale_aplicoop: Critical date calculation fixes`

**Versión**: 18.0.1.3.1

**Cambios Principales**:

1. **Date Calculation Logic**:
   - Corregido cálculo de `cutoff_date`: Changed `days_ahead <= 0` to `days_ahead < 0`
   - Permite que cutoff_date sea el mismo día que hoy
   - Agregado `store=True` en `delivery_date` para persistencia

2. **Constraints & Validations**:
   - Nueva constraint `_check_cutoff_before_pickup`
   - Valida que pickup_day >= cutoff_day en órdenes semanales
   - Previene configuraciones inválidas

3. **Cron Job Automático**:
   - Nuevo `_cron_update_dates` que recalcula fechas diariamente
   - Asegura que las fechas computadas permanezcan actuales

4. **UI Improvements**:
   - Nueva sección "Calculated Dates" en formulario
   - Muestra readonly cutoff_date, pickup_date, delivery_date
   - Mejor visibilidad de fechas automáticas

**Testing**:
- 6 nuevos tests de regresión con tag `post_install` y `date_calculations`
- Validación de todas las combinaciones de días (49 combinaciones)
- Asegura que cutoff puede ser hoy sin errores

**Para Developers**:
```python
# Ahora es seguro establecer cutoff_date al mismo día
if today == cutoff_day:  # ✅ Funciona correctamente
    # La validación permite esto
    pass
```

---

### 12 de Febrero (v18.0.1.3.0)

#### `[ADD] website_sale_aplicoop: Lazy Loading Implementation`

**Versión**: 18.0.1.3.0

**Cambio Mayor**: Implementación de lazy loading configurable para productos

**Resultados de Rendimiento**:
- **Antes**: Carga de página = 10-20 segundos (todos los productos)
- **Después**:
  - Página 1: 500-800ms (20 productos)
  - Páginas subsecuentes: 200-400ms vía AJAX
  - **Mejora**: 95% más rápido

**Configuración**:
```
Settings > Website > Shop Performance
  [✓] Enable Lazy Loading
  [20] Products Per Page
```

**Características**:
- Botón "Load More" configurable
- Spinner durante carga
- Event listeners re-attached en nuevos productos
- Botón se oculta automáticamente cuando no hay más productos

**Archivos Modificados**:
- `website_sale_aplicoop/models/group_order.py` - Método `_get_products_paginated()`
- `website_sale_aplicoop/views/website_templates.xml` - Nuevo template `eskaera_shop_products`
- `website_sale_aplicoop/static/js/` - JavaScript para AJAX y event handling

**Documentación**:
- [LAZY_LOADING.md](LAZY_LOADING.md) - Documentación técnica completa
- [LAZY_LOADING_QUICK_START.md](LAZY_LOADING_QUICK_START.md) - Guía rápida
- [UPGRADE_INSTRUCTIONS_v18.0.1.3.0.md](UPGRADE_INSTRUCTIONS_v18.0.1.3.0.md) - Pasos de actualización

---

### Febrero 2-16 (v18.0.1.2.0 - v18.0.1.3.0)

#### `[FIX] website_sale_aplicoop: Move template logic to controller`

**Commit**: `5721687` - FINAL SOLUTION

**Problema**:
```
TypeError: 'NoneType' object is not callable
Template: website_sale_aplicoop.eskaera_shop_products
```

**Causa Raíz**: QWeb no puede parsear:
- Conditionals complejos en `t-set`
- Operadores 'or' encadenados en `t-attf-*`
- Cadenas profundas de atributos con lógica

**Solución**: Mover TODA la lógica al controller

```python
# Controller prepara datos limpios
def _prepare_product_display_info(self, product, price_info):
    price = price_info.get(product.id, {}).get('price') or 0.0
    uom = product.uom_id.category_id.name if product.uom_id and product.uom_id.category_id else ''
    return {
        'display_price': float(price),
        'safe_uom_category': uom,
    }

# Template usa acceso simple
# <span t-esc="product_display['display_price']"/>
```

**Documentación**:
- [FINAL_SOLUTION_SUMMARY.md](FINAL_SOLUTION_SUMMARY.md) - Análisis completo
- [QWEB_BEST_PRACTICES.md](QWEB_BEST_PRACTICES.md) - Mejores prácticas

**Para Developers**:
Este es el patrón recomendado para todos los templates complejos:
1. Preparar datos en el controller
2. Pasar dict simple al template
3. Template solo accede atributos, sin lógica

---

## 🎯 Cambios Transversales

### Mejoras de Código

| Commit | Descripción |
|--------|-------------|
| 6fbc7b9 | Remover atributos string= redundantes en website_sale_aplicoop |
| 5c89795 | Corregir errores de traducción obligatorios (linting) |
| 40ce973 | Infinite scroll + search filter integration |
| dc44ace | Agregar configuración ESLint |
| b15e9bc | Aumentar threshold de complejidad ciclomática en flake8 |

### Pruebas

- Tests de regresión para date calculations (v18.0.1.3.1)
- Tests de lazy loading (v18.0.1.3.0)
- Validación de constraints de fechas

---

## 📚 Documentación Actualizada

- **`.github/copilot-instructions.md`** - Actualizado con nuevos patrones y fixes
- **`README.md`** - Información sobre v18.0.1.3.1 y lazy loading
- **`product_main_seller/README.md`** - Actualizado sin `default_supplier_id`
- **`docs/README.md`** - Nuevo índice de documentación de fixes
- **`website_sale_aplicoop/README.md`** - Changelog actualizado

---

## ⚠️ Cosas Importantes para Developers

### 1. Patrón de Templates QWeb
**Cambio Crítico**: Nunca poner lógica en templates, siempre en controller

```python
# ✅ CORRECTO
def _prepare_data(self):
    return {'price': 100.0, 'name': 'Product'}

# ❌ INCORRECTO (No hagas esto)
# <t t-set="price" t-value="product.list_price or 0"/>
```

### 2. Field Names en product_main_seller
**Cambio**: Use `main_seller_id` en lugar de `default_supplier_id`

```python
# ✅ CORRECTO
product.main_seller_id

# ❌ OBSOLETO
product.default_supplier_id  # Ya no existe
```

### 3. Lazy Loading Configuration
Si trabajas con website_sale_aplicoop, la configuración está en:

```
Settings > Website > Shop Performance
```

No es necesario modificar código, es configurable.

### 4. Date Calculations en Eskaera
Ahora puedes usar cutoff_date = hoy sin problemas:

```python
# ✅ Ahora funciona
order.cutoff_date = today  # Antes fallaba
```

---

## 🔍 Cambios Detectados pero No Documentados

Verifica si necesitas cambios en:

1. Código que usa `default_supplier_id` de `product_main_seller`
2. Lógica en templates (especialmente en website_sale_aplicoop)
3. Configuración de lazy loading si tienes instancia personalizada

---

## 📞 Para Más Detalles

- Refactoring product_main_seller: Ver commit `ed048c8`
- Lazy loading: Ver [docs/LAZY_LOADING.md](LAZY_LOADING.md)
- Template fixes: Ver [docs/FINAL_SOLUTION_SUMMARY.md](FINAL_SOLUTION_SUMMARY.md)
- Date calculations: Ver [website_sale_aplicoop/README.md](../website_sale_aplicoop/README.md)

---

**Última actualización**: 2026-02-18
**Versión Actual**: 18.0.1.3.1
**Status**: ✅ Production Ready
