#!/bin/bash # Script para ejecutar tests usando docker run (contenedor aislado) echo "==========================================" echo "Ejecutando tests con docker run" echo "==========================================" # Verificar que la red de docker-compose existe docker network inspect addons-cm_default >/dev/null 2>&1 || { echo "Creando red de docker..." docker network create addons-cm_default } # Ejecutar tests en un contenedor temporal docker run --rm \ --network addons-cm_default \ -v "$(pwd)":/mnt/extra-addons \ -e HOST=db \ -e PORT=5432 \ -e USER=odoo \ -e PASSWORD=odoo \ odoo:18 \ python3 << 'PYTHON_TEST' import sys import os # Configurar paths sys.path.insert(0, '/usr/lib/python3/dist-packages') os.chdir('/mnt/extra-addons') import odoo from odoo import api, SUPERUSER_ID # Configurar Odoo odoo.tools.config['db_host'] = 'db' odoo.tools.config['db_port'] = 5432 odoo.tools.config['db_user'] = 'odoo' odoo.tools.config['db_password'] = 'odoo' odoo.tools.config['addons_path'] = '/usr/lib/python3/dist-packages/odoo/addons,/mnt/extra-addons' print("\n=== Conectando a la base de datos ===") try: # Conectar a la base de datos db_name = 'odoo' registry = odoo.registry(db_name) with registry.cursor() as cr: env = api.Environment(cr, SUPERUSER_ID, {}) print("✓ Conectado a la base de datos Odoo") print(f" Base de datos: {db_name}") print(f" Usuario: {env.user.name}") print(f" Compañía: {env.company.name}") # Test 1: Verificar que el módulo está instalado print("\n=== Test 1: Verificar módulo website_sale_aplicoop ===") module = env['ir.module.module'].search([ ('name', '=', 'website_sale_aplicoop') ], limit=1) if module and module.state == 'installed': print(f"✓ Módulo instalado (versión: {module.installed_version})") else: print(f"✗ Módulo NO instalado (estado: {module.state if module else 'no encontrado'})") # Test 2: Verificar método _compute_price_with_taxes print("\n=== Test 2: Verificar método _compute_price_with_taxes ===") try: from odoo.addons.website_sale_aplicoop.controllers.website_sale import AplicoopWebsiteSale controller = AplicoopWebsiteSale() if hasattr(controller, '_compute_price_with_taxes'): print("✓ Método _compute_price_with_taxes encontrado") # Verificar firma del método import inspect sig = inspect.signature(controller._compute_price_with_taxes) params = list(sig.parameters.keys()) print(f" Parámetros: {params}") else: print("✗ Método _compute_price_with_taxes NO encontrado") except ImportError as e: print(f"✗ Error al importar controlador: {e}") # Test 3: Calcular precio con impuesto 21% print("\n=== Test 3: Calcular precio con impuesto 21% ===") # Buscar o crear impuesto 21% tax_21 = env['account.tax'].search([ ('amount', '=', 21.0), ('type_tax_use', '=', 'sale'), ('company_id', '=', env.company.id) ], limit=1) if not tax_21: print(" Buscando impuestos existentes...") all_taxes = env['account.tax'].search([ ('type_tax_use', '=', 'sale'), ('company_id', '=', env.company.id) ]) print(f" Impuestos de venta encontrados: {len(all_taxes)}") for tax in all_taxes[:5]: # Mostrar primeros 5 print(f" - {tax.name}: {tax.amount}%") # Usar el primer impuesto disponible if all_taxes: tax_21 = all_taxes[0] print(f" Usando impuesto: {tax_21.name} ({tax_21.amount}%)") else: print(f" Impuesto encontrado: {tax_21.name} ({tax_21.amount}%)") if tax_21: # Buscar un producto existente con impuesto product = env['product.product'].search([ ('taxes_id', 'in', [tax_21.id]) ], limit=1) if not product: print(" No se encontró producto con este impuesto, buscando cualquier producto...") product = env['product.product'].search([ ('sale_ok', '=', True) ], limit=1) if product: print(f" Producto encontrado: {product.name}") print(f" Precio lista: {product.list_price:.2f} €") print(f" Impuestos actuales: {[t.name for t in product.taxes_id]}") else: print(f" Producto encontrado: {product.name}") if product: # Probar cálculo de impuestos base_price = 100.0 taxes = product.taxes_id.filtered( lambda t: t.company_id == env.company ) if taxes: tax_result = taxes.compute_all( base_price, currency=env.company.currency_id, quantity=1.0, product=product, ) price_without_tax = tax_result['total_excluded'] price_with_tax = tax_result['total_included'] tax_amount = price_with_tax - price_without_tax print(f"\n Cálculo de impuestos:") print(f" Precio base: {base_price:.2f} €") print(f" Precio sin impuestos: {price_without_tax:.2f} €") print(f" Impuestos aplicados: {tax_amount:.2f} €") print(f" Precio CON impuestos: {price_with_tax:.2f} €") # Verificar que el precio con impuestos es mayor if price_with_tax > price_without_tax: print(f" ✓ Test PASADO: Los impuestos se suman correctamente") else: print(f" ✗ Test FALLADO: El precio con impuestos debería ser mayor") else: print(" ⚠ Producto sin impuestos configurados") else: print(" ✗ No se encontró ningún producto para probar") else: print(" ✗ No se encontró ningún impuesto") # Test 4: Verificar comportamiento de OCA _get_price print("\n=== Test 4: Verificar OCA _get_price (sin impuestos) ===") product = env['product.product'].search([ ('sale_ok', '=', True) ], limit=1) if product: pricelist = env['product.pricelist'].search([ ('company_id', '=', env.company.id) ], limit=1) if pricelist: try: price_info = product._get_price( qty=1.0, pricelist=pricelist, fposition=False, ) print(f" Producto: {product.name}") print(f" Precio OCA (value): {price_info.get('value', 0):.2f} €") print(f" Tax included: {price_info.get('tax_included', False)}") print(f" Original value: {price_info.get('original_value', 0):.2f} €") print(f" Discount: {price_info.get('discount', 0):.1f}%") if not price_info.get('tax_included', False): print(" ✓ OCA retorna precio SIN impuestos incluidos (comportamiento esperado)") else: print(" ⚠ OCA indica que los impuestos están incluidos") except Exception as e: print(f" ✗ Error al llamar _get_price: {e}") else: print(" ✗ No se encontró pricelist") else: print(" ✗ No se encontró producto") print("\n=== Resumen ===") print("Los cambios implementados:") print("1. Método _compute_price_with_taxes añadido al controlador") print("2. Este método calcula el precio CON impuestos incluidos") print("3. Se usa en eskaera_shop y add_to_eskaera_cart") print("4. Soluciona el problema de mostrar precios sin IVA") print() except Exception as e: print(f"\n✗ Error general: {e}") import traceback traceback.print_exc() print("\n=== Tests completados ===\n") PYTHON_TEST echo "" echo "Tests finalizados"