# Resumen de Corrección: Precios sin IVA en Tienda Online ## Problema Identificado La tienda online de Aplicoop mostraba precios **sin impuestos incluidos** cuando debería mostrar precios con IVA. ## Causa Raíz El método `_get_price()` del addon OCA `product_get_price_helper` retorna el precio base **sin impuestos** por defecto. El campo `tax_included` solo indica si el producto tiene impuestos con `price_include=True`, pero no calcula automáticamente el precio con impuestos añadidos. ## Solución Implementada ### 1. Nuevo Método: `_compute_price_with_taxes()` **Archivo**: `website_sale_aplicoop/controllers/website_sale.py` ```python def _compute_price_with_taxes(self, product_variant, base_price, pricelist=None, fposition=None): """ Calcula el precio con impuestos incluidos. Args: product_variant: product.product recordset base_price: float - precio base sin impuestos pricelist: product.pricelist recordset (opcional) fposition: account.fiscal.position recordset (opcional) Returns: float - precio con impuestos incluidos """ # 1. Obtener impuestos del producto taxes = product_variant.taxes_id.filtered( lambda tax: tax.company_id == request.env.company ) # 2. Aplicar posición fiscal si existe if fposition: taxes = fposition.map_tax(taxes) # 3. Si no hay impuestos, retornar precio base if not taxes: return base_price # 4. Calcular impuestos usando compute_all() tax_result = taxes.compute_all( base_price, currency=pricelist.currency_id if pricelist else request.env.company.currency_id, quantity=1.0, product=product_variant, ) # 5. Retornar precio CON impuestos incluidos return tax_result['total_included'] ``` ### 2. Actualización en `eskaera_shop()` El método que muestra la lista de productos ahora calcula precios con IVA: **ANTES:** ```python price = price_info.get('value', 0.0) # Sin impuestos product_price_info[product.id] = { 'price': price, # ❌ Sin IVA 'tax_included': price_info.get('tax_included', True), } ``` **DESPUÉS:** ```python base_price = price_info.get('value', 0.0) # Precio base sin impuestos # Calcular precio CON impuestos price_with_taxes = self._compute_price_with_taxes( product_variant, base_price, pricelist, request.website.fiscal_position_id ) product_price_info[product.id] = { 'price': price_with_taxes, # ✓ CON IVA incluido 'tax_included': True, # Ahora siempre True } ``` ### 3. Actualización en `add_to_eskaera_cart()` El método que añade productos al carrito también calcula con IVA: **ANTES:** ```python price_with_tax = price_info.get('value', product.list_price) # ❌ Sin IVA ``` **DESPUÉS:** ```python base_price = price_info.get('value', product.list_price) # Calcular precio CON impuestos price_with_tax = self._compute_price_with_taxes( product_variant, base_price, pricelist, request.website.fiscal_position_id ) # ✓ CON IVA incluido ``` ## Ejemplo Práctico ### Producto con IVA 21% - **Precio base**: 100.00 € - **IVA (21%)**: 21.00 € - **Precio mostrado**: **121.00 €** ✓ ### Producto con IVA 10% - **Precio base**: 100.00 € - **IVA (10%)**: 10.00 € - **Precio mostrado**: **110.00 €** ✓ ### Producto sin IVA - **Precio base**: 100.00 € - **IVA**: 0.00 € - **Precio mostrado**: **100.00 €** ✓ ## Tests Creados ### Archivo: `test_price_with_taxes_included.py` Contiene tests unitarios que verifican: 1. ✓ Cálculo correcto de IVA 21% 2. ✓ Cálculo correcto de IVA 10% 3. ✓ Productos sin IVA 4. ✓ Múltiples impuestos 5. ✓ Posiciones fiscales 6. ✓ Precios con alta precisión 7. ✓ Comportamiento de OCA `_get_price()` ## Archivos Modificados 1. **`website_sale_aplicoop/controllers/website_sale.py`** - Añadido método `_compute_price_with_taxes()` - Actualizado `eskaera_shop()` para usar precios con IVA - Actualizado `add_to_eskaera_cart()` para usar precios con IVA 2. **`website_sale_aplicoop/tests/test_price_with_taxes_included.py`** (nuevo) - 13 tests para verificar cálculos de impuestos ## Validación Para verificar la corrección en producción: ```bash # 1. Reiniciar Odoo docker-compose restart odoo # 2. Actualizar el módulo docker-compose exec odoo odoo -c /etc/odoo/odoo.conf -d odoo -u website_sale_aplicoop --stop-after-init # 3. Verificar en navegador # Ir a: http://localhost:8069/eskaera # Los precios ahora deberían mostrar IVA incluido ``` ## Beneficios ✅ **Transparencia**: Los usuarios ven el precio final que pagarán ✅ **Cumplimiento legal**: Obligatorio mostrar precios con IVA en B2C ✅ **Consistencia**: Todos los precios mostrados incluyen impuestos ✅ **Mantenibilidad**: Código limpio y documentado ✅ **Testeable**: Tests unitarios comprueban el funcionamiento ## Notas Técnicas - El método utiliza `taxes.compute_all()` de Odoo, que es el estándar para calcular impuestos - Respeta las posiciones fiscales configuradas - Compatible con múltiples impuestos por producto - Maneja correctamente productos sin impuestos - El precio base (sin IVA) se usa internamente para cálculos de descuentos - El precio final (con IVA) se muestra al usuario