Skip to content

Commit 61716dd

Browse files
authored
Merge pull request #30 from jap-2024-grupo2/feature/modificaciones-carrito
Agregamos datos por método de pago con sus respectivas verificaciones
2 parents 08f0fa7 + d1de6f2 commit 61716dd

File tree

2 files changed

+178
-18
lines changed

2 files changed

+178
-18
lines changed

cart.html

Lines changed: 63 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
<div class="navbar-container"></div>
1919

2020
<main>
21-
2221
<section class="h-100 h-custom">
2322
<div class="container h-100 py-5">
2423
<div class="row d-flex justify-content-center align-items-center h-100">
@@ -42,6 +41,34 @@
4241

4342
<div id="cart-alert" class="my-4"></div>
4443

44+
<div class="d-flex justify-content-center">
45+
<div class="card w-100 w-md-75 w-lg-50 shadow-2-strong mb-5 mb-lg-0" style="border-radius: 16px;">
46+
<div class="card-body p-4">
47+
<div class="row">
48+
<div class="">
49+
<div class="d-flex justify-content-between" style="font-weight: 500;">
50+
<p class="mb-2">USD (Dólares)</p>
51+
<p class="mb-2 usd-total"></p>
52+
</div>
53+
<div class="d-flex justify-content-between" style="font-weight: 500;">
54+
<p class="mb-0">UYU (Pesos uruguayos)</p>
55+
<p class="mb-0 uyu-total"></p>
56+
</div>
57+
<hr class="my-4">
58+
<div class="d-flex justify-content-between mb-4" style="font-weight: 500;">
59+
<p class="mb-2">Subtotal (UYU)</p>
60+
<p class="mb-2 grand-total"></p>
61+
</div>
62+
<div class="d-flex justify-content-center">
63+
<!-- Botón para abrir el modal inicial -->
64+
<a class="btn btn-primary" role="button" id="open-modal">Continuar con la compra</a>
65+
</div>
66+
</div>
67+
</div>
68+
</div>
69+
</div>
70+
</div>
71+
4572
<!-- Modal de Selección de Envío -->
4673
<div class="modal fade" id="modalShippingOptions" aria-hidden="true" aria-labelledby="modalShippingLabel"
4774
tabindex="-1">
@@ -101,8 +128,7 @@ <h5 class="modal-title" id="modalShippingLabel">Selecciona el Tipo de Envío</h5
101128
</div>
102129
</div>
103130
<div class="modal-footer">
104-
<button class="btn btn-primary" data-bs-dismiss="modal"
105-
onclick="openPaymentOptions()">Siguiente</button>
131+
<button class="btn btn-primary" onclick="openPaymentOptions()">Siguiente</button>
106132
</div>
107133
</div>
108134
</div>
@@ -128,6 +154,7 @@ <h5 class="modal-title" id="modalPaymentLabel">Opciones de Pago</h5>
128154
<label class="form-label">Elige cómo pagar</label>
129155
<hr class="my-2">
130156

157+
<!-- Opciones de método de pago -->
131158
<div>
132159
<input type="radio" name="payment-method" value="credit-card" id="paymentCreditCard"
133160
checked>
@@ -139,6 +166,34 @@ <h5 class="modal-title" id="modalPaymentLabel">Opciones de Pago</h5>
139166
<label for="paymentBankTransfer">Transferencia bancaria</label>
140167
</div>
141168
</div>
169+
170+
<!-- Campos para tarjeta de crédito -->
171+
<div id="creditCardFields" class="payment-fields">
172+
<label for="cardNumber">Número de tarjeta</label>
173+
<input type="text" id="cardNumber" class="form-control mb-3"
174+
placeholder="1234 5678 9012 3456">
175+
176+
<label for="cardName">Nombre en la tarjeta</label>
177+
<input type="text" id="cardName" class="form-control mb-3" placeholder="Nombre completo">
178+
179+
<label for="cardExpiry">Fecha de expiración</label>
180+
<input type="text" id="cardExpiry" class="form-control mb-3" placeholder="MM/AA">
181+
182+
<label for="cardCVC">Código CVC</label>
183+
<input type="text" id="cardCVC" class="form-control mb-3" placeholder="123">
184+
</div>
185+
186+
<!-- Campos para transferencia bancaria -->
187+
<div id="bankTransferFields" class="payment-fields" style="display: none;">
188+
<label for="bankName">Nombre del banco</label>
189+
<input type="text" id="bankName" class="form-control mb-3" placeholder="Nombre del banco">
190+
191+
<label for="accountNumber">Número de cuenta</label>
192+
<input type="text" id="accountNumber" class="form-control mb-3" placeholder="1234567890">
193+
194+
<label for="swiftCode">Código SWIFT</label>
195+
<input type="text" id="swiftCode" class="form-control mb-3" placeholder="SWIFT/BIC">
196+
</div>
142197
</div>
143198
</div>
144199
</div>
@@ -176,8 +231,8 @@ <h4 class="text-center">Resumen de compra</h4>
176231
</div>
177232

178233
<div class="text-end">
179-
<button id="pay-button" type="button" class="btn btn-primary btn-lg">
180-
Pagar
234+
<button id="pay-button" type="button" class="btn btn-primary btn-md">
235+
Finalizar compra
181236
</button>
182237
</div>
183238
</div>
@@ -187,20 +242,13 @@ <h4 class="text-center">Resumen de compra</h4>
187242
</div>
188243
</div>
189244
<div class="modal-footer">
190-
<button class="btn btn-primary" data-bs-dismiss="modal" onclick="openShippingOptions()">Volver
191-
atrás</button>
245+
<button class="btn text-primary border-0 bg-transparent text-decoration-underline"
246+
data-bs-dismiss="modal" onclick="openShippingOptions()">Volver atrás</button>
192247
</div>
193248
</div>
194249
</div>
195250
</div>
196251

197-
<div class="d-flex justify-content-center">
198-
<!-- Botón para abrir el modal inicial -->
199-
<a class="btn btn-primary" role="button" id="open-modal">Continuar con la compra</a>
200-
</div>
201-
202-
203-
204252
</div>
205253
</div>
206254
</div>
@@ -219,6 +267,7 @@ <h4 class="text-center">Resumen de compra</h4>
219267
<div></div>
220268
</div>
221269
</div>
270+
222271
<script src="js/bootstrap.bundle.min.js"></script>
223272
<script src="js/init.js"></script>
224273
<script src="js/navbar.js"></script>

js/cart.js

Lines changed: 115 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ function calculateTotals() {
154154
const totalConvertedUSD = totalUSD * USD_TO_UYU
155155

156156
// Actualizamos los totales en el DOM
157-
document.querySelector('.usd-total').textContent = `USD ${totalUSD}`
158-
document.querySelector('.uyu-total').textContent = `UYU ${totalUYU}`
157+
document.querySelectorAll('.usd-total').forEach((element)=>{element.textContent = `USD ${totalUSD}`})
158+
document.querySelectorAll('.uyu-total').forEach((element)=>{element.textContent = `UYU ${totalUYU}`})
159159

160160
// Calculamos el costo de envío y actualizamos la visualización
161161
calculateShippingCost(totalConvertedUSD, totalUYU)
@@ -193,7 +193,7 @@ function calculateShippingCost(totalConvertedUSD, totalUYU) {
193193
const grandTotal = totalConvertedUSD + totalUYU + shippingCost
194194

195195
// Actualizamos el DOM con el grandTotal final
196-
document.querySelector('.grand-total').textContent = `UYU ${grandTotal.toFixed(0)}`
196+
document.querySelectorAll('.grand-total').forEach((element)=>{element.textContent = `UYU ${grandTotal.toFixed(0)}`})
197197
}
198198

199199
// Función para separar la moneda del valor numérico
@@ -217,7 +217,13 @@ document.getElementById('pay-button').addEventListener('click', function () {
217217
text: 'Agrega productos al carrito antes de continuar.'
218218
})
219219
} else {
220-
// Si hay productos, mostramos una alerta con dos opciones
220+
221+
// Verificamos que los campos de pago son válidos
222+
if (!validatePaymentFields()){
223+
return // si los campos no son válidos, no continuamos la ejecución
224+
}
225+
226+
// Si hay productos y los campos de pago son válidos, mostramos una alerta con dos opciones
221227
Swal.fire({
222228
title: 'Confirmar Pago',
223229
text: '¿Estás seguro que deseas proceder con el pago?',
@@ -358,3 +364,108 @@ function validateAddressAndShipping() {
358364

359365
return true
360366
}
367+
368+
// Función para manejar el cambio de los campos de método de pago
369+
document.querySelectorAll('input[name="payment-method"]').forEach((radioButton)=>{
370+
radioButton.addEventListener("change", function(){
371+
const creditCardFields = document.getElementById("creditCardFields")
372+
const bankTransferFields = document.getElementById("bankTransferFields")
373+
374+
if (this.value === "credit-card"){
375+
creditCardFields.style.display = "block"
376+
bankTransferFields.style.display = "none"
377+
} else if (this.value === "bank-transfer") {
378+
creditCardFields.style.display = "none"
379+
bankTransferFields.style.display = "block"
380+
}
381+
})
382+
})
383+
384+
// Función para validar los campos de pago
385+
function validatePaymentFields() {
386+
const paymentMethod = document.querySelector('input[name="payment-method"]:checked').value
387+
388+
if (paymentMethod === 'credit-card') {
389+
// Validación para tarjeta de crédito
390+
const cardNumber = document.getElementById('cardNumber').value.trim()
391+
const cardName = document.getElementById('cardName').value.trim()
392+
const cardExpiry = document.getElementById('cardExpiry').value.trim()
393+
const cardCVC = document.getElementById('cardCVC').value.trim()
394+
395+
if (!cardNumber || !cardName || !cardExpiry || !cardCVC) {
396+
Swal.fire({
397+
icon: 'error',
398+
title: 'Campos incompletos',
399+
text: 'Por favor completa todos los campos de tarjeta de crédito.'
400+
})
401+
return false
402+
}
403+
404+
// Validamos el formato de tarjeta
405+
if (!/^\d{16}$/.test(cardNumber)) {
406+
Swal.fire({
407+
icon: 'error',
408+
title: 'Número de tarjeta inválido',
409+
text: 'El número de tarjeta debe tener 16 dígitos.'
410+
})
411+
return false
412+
}
413+
414+
// Validamos fecha de expiración (simplemente comprueba el formato MM/AA)
415+
if (!/^\d{2}\/\d{2}$/.test(cardExpiry)) {
416+
Swal.fire({
417+
icon: 'error',
418+
title: 'Fecha de expiración inválida',
419+
text: 'La fecha de expiración debe tener el formato MM/AA.'
420+
})
421+
return false
422+
}
423+
424+
// Validamos CVC
425+
if (!/^\d{3}$/.test(cardCVC)) {
426+
Swal.fire({
427+
icon: 'error',
428+
title: 'CVC inválido',
429+
text: 'El código CVC debe tener 3 dígitos.'
430+
})
431+
return false
432+
}
433+
} else if (paymentMethod === 'bank-transfer') {
434+
// Validación para transferencia bancaria
435+
const bankName = document.getElementById('bankName').value.trim()
436+
const accountNumber = document.getElementById('accountNumber').value.trim()
437+
const swiftCode = document.getElementById('swiftCode').value.trim()
438+
439+
if (!bankName || !accountNumber || !swiftCode) {
440+
Swal.fire({
441+
icon: 'error',
442+
title: 'Campos incompletos',
443+
text: 'Por favor completa todos los campos de transferencia bancaria.'
444+
})
445+
return false
446+
}
447+
448+
// Validamos el formato de la cuenta bancaria
449+
if (!/^\d+$/.test(accountNumber)) {
450+
Swal.fire({
451+
icon: 'error',
452+
title: 'Número de cuenta inválido',
453+
text: 'El número de cuenta debe ser numérico.'
454+
})
455+
return false
456+
}
457+
458+
// Validamos el formato SWIFT
459+
if (!/^[A-Za-z0-9]{8,11}$/.test(swiftCode)) {
460+
Swal.fire({
461+
icon: 'error',
462+
title: 'Código SWIFT inválido',
463+
text: 'El código SWIFT debe tener entre 8 y 11 caracteres alfanuméricos.'
464+
})
465+
return false
466+
}
467+
}
468+
469+
return true // Si todos los campos son válidos
470+
}
471+

0 commit comments

Comments
 (0)