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.
224 lines
8.5 KiB
Bash
Executable file
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"
|