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.
156 lines
5.3 KiB
Bash
Executable file
156 lines
5.3 KiB
Bash
Executable file
#!/bin/bash
|
|
# Script para ejecutar tests de website_sale_aplicoop
|
|
|
|
echo "=========================================="
|
|
echo "Ejecutando tests de website_sale_aplicoop"
|
|
echo "=========================================="
|
|
|
|
# Ejecutar tests específicos de precios
|
|
docker-compose exec -T odoo odoo shell -c /etc/odoo/odoo.conf -d odoo << 'PYTHON_SCRIPT'
|
|
import logging
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
# Cargar el módulo
|
|
env = self.env
|
|
|
|
# Test 1: Verificar que el método _compute_price_with_taxes existe
|
|
print("\n=== Test 1: Verificar método _compute_price_with_taxes ===")
|
|
try:
|
|
from odoo.addons.website_sale_aplicoop.controllers.website_sale import AplicoopWebsiteSale
|
|
controller = AplicoopWebsiteSale()
|
|
print("✓ Método _compute_price_with_taxes encontrado")
|
|
print(f" Firma: {controller._compute_price_with_taxes.__doc__}")
|
|
except Exception as e:
|
|
print(f"✗ Error: {e}")
|
|
|
|
# Test 2: Crear producto con impuesto y verificar cálculo
|
|
print("\n=== Test 2: Calcular precio con impuesto 21% ===")
|
|
product = None
|
|
try:
|
|
# Obtener o crear impuesto
|
|
tax_21 = env['account.tax'].search([
|
|
('amount', '=', 21.0),
|
|
('type_tax_use', '=', 'sale'),
|
|
('company_id', '=', env.company.id)
|
|
], limit=1)
|
|
|
|
if not tax_21:
|
|
# Crear tax group si no existe
|
|
country_es = env.ref('base.es', raise_if_not_found=False)
|
|
if not country_es:
|
|
country_es = env['res.country'].search([('code', '=', 'ES')], limit=1)
|
|
|
|
tax_group = env['account.tax.group'].search([
|
|
('company_id', '=', env.company.id),
|
|
('country_id', '=', country_es.id if country_es else False)
|
|
], limit=1)
|
|
|
|
if not tax_group:
|
|
tax_group = env['account.tax.group'].create({
|
|
'name': 'IVA',
|
|
'company_id': env.company.id,
|
|
'country_id': country_es.id if country_es else False,
|
|
})
|
|
'name': 'IVA 21% Test',
|
|
'amount': 21.0,
|
|
'amount_type': 'percent',
|
|
'type_tax_use': 'sale',
|
|
'price_include': False,
|
|
'company_id': env.company.id,
|
|
'country_id': country_es.id if country_es else False,
|
|
'tax_group_id': tax_group.id,
|
|
})
|
|
print(f" Impuesto creado: {tax_21.name}")
|
|
else:
|
|
print(f" Impuesto encontrado: {tax_21.name}")
|
|
|
|
# Crear producto de prueba
|
|
product = env['product.product'].search([
|
|
('name', '=', 'Test Product Tax Calculation')
|
|
], limit=1)
|
|
|
|
if not product:
|
|
product = env['product.product'].create({
|
|
'name': 'Test Product Tax Calculation',
|
|
'list_price': 100.0,
|
|
'taxes_id': [(6, 0, [tax_21.id])],
|
|
'company_id': env.company.id,
|
|
})
|
|
print(f" Producto creado: {product.name}")
|
|
else:
|
|
print(f" Producto encontrado: {product.name}")
|
|
|
|
# Calcular precio con 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_with_tax = tax_result['total_included']
|
|
price_without_tax = tax_result['total_excluded']
|
|
|
|
print(f" Precio base: {base_price:.2f} €")
|
|
print(f" Precio sin impuestos: {price_without_tax:.2f} €")
|
|
print(f" Precio con impuestos: {price_with_tax:.2f} €")
|
|
print(f" Impuesto aplicado: {price_with_tax - price_without_tax:.2f} €")
|
|
|
|
if abs(price_with_tax - 121.0) < 0.01:
|
|
print("✓ Test PASADO: 100 + 21% = 121.00")
|
|
else:
|
|
print(f"✗ Test FALLADO: Esperado 121.00, obtenido {price_with_tax:.2f}")
|
|
else:
|
|
print("✗ Producto sin impuestos configurados")
|
|
|
|
except Exception as e:
|
|
print(f"✗ Error en test: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
|
|
# Test 3: Verificar comportamiento de OCA _get_price
|
|
print("\n=== Test 3: Verificar OCA _get_price ===")
|
|
if product:
|
|
try:
|
|
pricelist = env['product.pricelist'].search([
|
|
('company_id', '=', env.company.id)
|
|
], limit=1)
|
|
|
|
if not pricelist:
|
|
pricelist = env['product.pricelist'].create({
|
|
'name': 'Test Pricelist',
|
|
'company_id': env.company.id,
|
|
})
|
|
|
|
price_info = product._get_price(
|
|
qty=1.0,
|
|
pricelist=pricelist,
|
|
fposition=False,
|
|
)
|
|
|
|
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 abs(price_info['value'] - 100.0) < 0.01:
|
|
print("✓ OCA retorna precio base SIN impuestos (esperado)")
|
|
else:
|
|
print(f"✗ OCA debería retornar 100.0, retornó {price_info['value']:.2f}")
|
|
|
|
except Exception as e:
|
|
print(f"✗ Error en test OCA: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
else:
|
|
print("✗ Test 3 omitido: producto no creado en Test 2")
|
|
|
|
# Hacer commit para que los cambios persistan
|
|
env.cr.commit()
|
|
PYTHON_SCRIPT
|