addons-cm/test_prices.py
snt cf9ea887c1 [REF] Code quality improvements and structure fixes
- Add mypy.ini configuration to exclude migration scripts
- Rename migration files to proper snake_case (post-migration.py → post_migration.py)
- Add __init__.py to migration directories for proper Python package structure
- Add new portal access tests for website_sale_aplicoop
- Code formatting improvements (black, isort)
- Update copilot instructions and project configuration

Related to previous code quality refactoring work.
2026-02-21 13:51:25 +01:00

197 lines
6.6 KiB
Python

#!/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)