# 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 # ``` **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) # ``` ### 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