From 2a194d6e98084ad809eab99ba524d60bd6a128f9 Mon Sep 17 00:00:00 2001 From: adevopg <133045315+adevopg@users.noreply.github.com> Date: Sun, 16 Feb 2025 01:01:45 +0100 Subject: [PATCH] Arreglado un problema visual del precio 6.1000000000000005 tipo a si --- .../partials/store/store_novawow.html | 42 ++++++++++--------- home/views.py | 28 +++++++------ 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/home/templates/partials/store/store_novawow.html b/home/templates/partials/store/store_novawow.html index 81b4632..159c26e 100644 --- a/home/templates/partials/store/store_novawow.html +++ b/home/templates/partials/store/store_novawow.html @@ -85,20 +85,24 @@ alert("¡Por favor, selecciona un personaje antes de añadir un ítem al carrito!"); return; } - - carrito.push({ id, nombre, precio }); + + carrito.push({ id, nombre, precio: parseFloat(precio) }); // Convertir precio a float actualizarCarrito(); } function actualizarCarrito() { carritoLista.innerHTML = ""; let total = 0; + carrito.forEach((item, index) => { total += item.precio; - const itemCarrito = `
  • ${item.nombre} - ${item.precio} monedas
  • `; + const itemCarrito = `
  • ${item.nombre} - ${item.precio.toFixed(2)} monedas + +
  • `; carritoLista.innerHTML += itemCarrito; }); - totalElement.textContent = total; + + totalElement.textContent = total.toFixed(2); totalIVAElement.textContent = (total * 1.21).toFixed(2); } @@ -112,25 +116,25 @@ }); document.getElementById("comprar").addEventListener("click", () => { - const personajeSeleccionado = document.getElementById("personaje").value; + const personajeSeleccionado = document.getElementById("personaje").value; - if (!personajeSeleccionado) { - alert("¡Por favor, selecciona un personaje antes de continuar!"); - return; - } + if (!personajeSeleccionado) { + alert("¡Por favor, selecciona un personaje antes de continuar!"); + return; + } + + if (carrito.length === 0) { + alert("El carrito está vacío"); + return; + } - if (carrito.length === 0) { - alert("El carrito está vacío"); - } else { // Crear la sesión de pago con Stripe fetch('/es/store-novawow/', { method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ - character: personajeSeleccionado, // Añadir el personaje seleccionado - carrito: carrito, // Si necesitas enviar los ítems del carrito, también puedes incluirlos aquí + character: personajeSeleccionado, + carrito: carrito, }), }) .then(response => response.json()) @@ -143,7 +147,7 @@ } }) .catch(error => console.error("Error al crear la sesión de pago:", error)); - } -}); + }); + cargarItems("Bolsas"); diff --git a/home/views.py b/home/views.py index b971f0c..74685f1 100644 --- a/home/views.py +++ b/home/views.py @@ -17,7 +17,7 @@ from .library_correo import enviar_correo from django.utils.crypto import get_random_string from django.conf import settings from django.utils.timezone import now -from decimal import Decimal +from decimal import Decimal, ROUND_HALF_UP # Configuración del logger logger = logging.getLogger(__name__) @@ -1753,9 +1753,9 @@ def store_novawow_view(request): username = request.session.get('username') if not username: return redirect('login') - + category_name = request.GET.get("category") - + # Obtener personajes del usuario desde la base de datos acore_characters with connections['acore_characters'].cursor() as cursor: cursor.execute(""" @@ -1772,7 +1772,7 @@ def store_novawow_view(request): # Obtener categorías e ítems categories = Category.objects.prefetch_related("items").all() store_data = {category.name: list(category.items.values()) for category in categories} - + # Si se está solicitando una categoría específica, devolver solo los ítems de esa categoría if category_name: items_in_category = Category.objects.get(name=category_name).items.values() @@ -1780,7 +1780,10 @@ def store_novawow_view(request): # Obtener carrito desde la sesión carrito = request.session.get('carrito', []) - total_price = sum(Decimal(item['precio']) for item in carrito) * Decimal('1.21') + + # ✅ Calcular el precio total con 2 decimales + total_price = sum(Decimal(item['precio']) for item in carrito) + total_price_with_iva = (total_price * Decimal('1.21')).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP) if request.method == 'POST': # Obtener datos del body @@ -1791,12 +1794,13 @@ def store_novawow_view(request): if not character_name: return JsonResponse({'success': False, 'message': 'Por favor, selecciona un personaje.'}) - # ✅ ACTUALIZAR EL CARRITO ANTES DE CALCULAR EL PRECIO + # ✅ ACTUALIZAR EL CARRITO Y FORZAR LA SESIÓN request.session['carrito'] = carrito request.session.modified = True # Forzar que Django guarde la sesión inmediatamente - - # ✅ CALCULAR EL PRECIO CON EL CARRITO ACTUALIZADO - total_price = sum(Decimal(item['precio']) for item in carrito) * Decimal('1.21') + + # ✅ RECALCULAR EL PRECIO CON EL CARRITO ACTUALIZADO + total_price = sum(Decimal(item['precio']) for item in carrito) + total_price_with_iva = (total_price * Decimal('1.21')).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP) # Verificar si el personaje pertenece al usuario if character_name not in characters: @@ -1805,7 +1809,7 @@ def store_novawow_view(request): # Crear sesión de pago con Stripe success_url = request.build_absolute_uri(reverse('store-novawow/success')) cancel_url = request.build_absolute_uri(reverse('store-novawow/cancel')) - stripe_response = create_checkout_session(total_price, success_url=success_url, cancel_url=cancel_url) + stripe_response = create_checkout_session(total_price_with_iva, success_url=success_url, cancel_url=cancel_url) if stripe_response["success"]: request.session['store_novawow'] = character_name @@ -1821,9 +1825,9 @@ def store_novawow_view(request): 'characters': characters, 'store_data': store_data, 'categories': categories, - 'total_price': total_price + 'total_price': total_price_with_iva }) - + def store_novawow_success_view(request): # Procesar el comando SOAP tras el pago exitoso character_name = request.session.get('store_novawow')