addons-cm/test_with_docker_run.sh
snt 4d23e98f7b Revertir cambio: eliminar cálculo duplicado de impuestos
El método _get_price() del addon OCA ya maneja correctamente los impuestos
según la configuración de Odoo. El cálculo adicional con compute_all() estaba
duplicando los impuestos cuando price_include estaba activado.

Cambios:
- Eliminado método _compute_price_with_taxes()
- Revertido eskaera_shop() para usar directamente _get_price()
- Revertido add_to_eskaera_cart() para usar directamente _get_price()

El precio mostrado ahora respeta la configuración de impuestos de Odoo
sin duplicación.
2026-02-11 19:54:28 +01:00

224 lines
8.5 KiB
Bash
Executable file

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