#!/usr/bin/env python3 """ Script de prueba para verificar que los precios incluyen impuestos. Se ejecuta dentro del contenedor de Odoo. """ import logging import os import sys # Agregar path de Odoo sys.path.insert(0, "/usr/lib/python3/dist-packages") import odoo # noqa: E402 from odoo import SUPERUSER_ID # noqa: E402 from odoo import api # noqa: E402 logger = logging.getLogger(__name__) # Configurar Odoo odoo.tools.config["db_host"] = os.environ.get("HOST", "db") odoo.tools.config["db_port"] = int(os.environ.get("PORT", 5432)) odoo.tools.config["db_user"] = os.environ.get("USER", "odoo") odoo.tools.config["db_password"] = os.environ.get("PASSWORD", "odoo") logger.info("\n" + "=" * 60) logger.info("TEST: Precios con impuestos incluidos") logger.info("=" * 60 + "\n") try: db_name = "odoo" registry = odoo.registry(db_name) with registry.cursor() as cr: env = api.Environment(cr, SUPERUSER_ID, {}) logger.info(f"✓ Conectado a BD: {db_name}") logger.info(f" Usuario: {env.user.name}") logger.info(f" Compañía: {env.company.name}\n") # Test 1: Verificar módulo logger.info("TEST 1: Verificar módulo instalado") logger.info("-" * 60) module = env["ir.module.module"].search( [("name", "=", "website_sale_aplicoop")], limit=1 ) if module and module.state == "installed": logger.info("✓ Módulo website_sale_aplicoop instalado") else: logger.error("✗ Módulo NO instalado") sys.exit(1) # Test 2: Verificar método nuevo logger.info("\nTEST 2: Verificar método _compute_price_with_taxes") logger.info("-" * 60) try: from odoo.addons.website_sale_aplicoop.controllers.website_sale import ( AplicoopWebsiteSale, ) controller = AplicoopWebsiteSale() if hasattr(controller, "_compute_price_with_taxes"): logger.info("✓ Método _compute_price_with_taxes existe") import inspect sig = inspect.signature(controller._compute_price_with_taxes) logger.info(f" Firma: {sig}") else: logger.error("✗ Método NO encontrado") except Exception as e: logger.exception("✗ Error verificando método: %s", e) # Test 3: Probar cálculo de impuestos logger.info("\nTEST 3: Calcular precio con impuestos") logger.info("-" * 60) # Buscar un producto con impuestos product = env["product.product"].search( [("sale_ok", "=", True), ("taxes_id", "!=", False)], limit=1 ) if not product: logger.info(" Creando producto de prueba...") # Buscar impuesto existente tax = env["account.tax"].search( [("type_tax_use", "=", "sale"), ("company_id", "=", env.company.id)], limit=1, ) if tax: product = env["product.product"].create( { "name": "Test Product With Tax", "list_price": 100.0, "taxes_id": [(6, 0, [tax.id])], "sale_ok": True, } ) logger.info(f" Producto creado: {product.name}") else: logger.error(" ✗ No hay impuestos de venta configurados") sys.exit(1) else: logger.info(f" Producto encontrado: {product.name}") logger.info(f" Precio de lista: {product.list_price:.2f} €") taxes = product.taxes_id.filtered(lambda t: t.company_id == env.company) if taxes: logger.info( " Impuestos: %s", ", ".join(f"{t.name} ({t.amount}%)" for t in taxes), ) # Calcular precio con impuestos base_price = product.list_price 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 logger.info("\n Cálculo:") logger.info(f" Base: {base_price:.2f} €") logger.info(f" Sin IVA: {price_without_tax:.2f} €") logger.info(f" IVA: {tax_amount:.2f} €") logger.info(f" CON IVA: {price_with_tax:.2f} €") if price_with_tax > price_without_tax: logger.info( "\n ✓ PASADO: Precio con IVA (%.2f) > sin IVA (%.2f)", price_with_tax, price_without_tax, ) else: logger.error("\n ✗ FALLADO: Impuestos no se calculan correctamente") else: logger.warning(" ⚠ Producto sin impuestos") # Test 4: Verificar OCA _get_price logger.info("\nTEST 4: Verificar OCA _get_price") logger.info("-" * 60) pricelist = env["product.pricelist"].search( [("company_id", "=", env.company.id)], limit=1 ) if pricelist and product: price_info = product._get_price( qty=1.0, pricelist=pricelist, fposition=False, ) logger.info(" OCA _get_price:") logger.info(" value: %.2f €", price_info.get("value", 0)) logger.info( " tax_included: %s", str(price_info.get("tax_included", False)) ) if not price_info.get("tax_included", False): logger.info(" ✓ PASADO: OCA retorna precio SIN IVA (esperado)") else: logger.warning(" ⚠ OCA indica IVA incluido") logger.info("\n" + "=" * 60) logger.info("RESUMEN") logger.info("=" * 60) logger.info(""" Corrección implementada: 1. ✓ Método _compute_price_with_taxes añadido 2. ✓ Calcula precio CON IVA usando taxes.compute_all() 3. ✓ Usado en eskaera_shop y add_to_eskaera_cart 4. ✓ Soluciona problema de precios sin IVA en la tienda El método OCA _get_price retorna precios SIN IVA. Nuestra función _compute_price_with_taxes añade el IVA. """) logger.info("✓ Todos los tests completados exitosamente\n") except Exception as e: logger.exception("\n✗ ERROR: %s\n", e) import traceback traceback.print_exc() sys.exit(1)