jQuery(document).ready(function($) { // Mostrar u ocultar el campo de ahorro mensual y ajustar las opciones del select de tiempo $('input[name="save-monthly"]').change(function() { const $timeSelect = $('select[name="time"]'); if ($(this).val() === 'yes') { $('#monthly-deposit-field').show(); // Limitar el select de tiempo a 1 año en adelante $timeSelect.empty(); $timeSelect.append(''); $timeSelect.append(''); $timeSelect.append(''); $timeSelect.append(''); $timeSelect.append(''); } else { $('#monthly-deposit-field').hide(); // Restaurar las opciones originales del select de tiempo $timeSelect.empty(); $timeSelect.append(''); $timeSelect.append(''); $timeSelect.append(''); $timeSelect.append(''); $timeSelect.append(''); $timeSelect.append(''); $timeSelect.append(''); $timeSelect.append(''); } }); $('#fixed-term-deposits').on('submit', function(event) { event.preventDefault(); // Ocultar el área de resultados al inicio del submit $('.content-hidden').hide(); $('.content-calculadora .page-main > div.content-form form.form-credits .form-submit img').show(); // Obtener valores del formulario const initialDeposit = parseFloat($('input[name="minimum-deposit"]').val().replace(/[$,]/g, '')) || 0; const saveMonthly = $('input[name="save-monthly"]:checked').val(); const timePeriodDays = parseInt($('select[name="time"]').val()); // Plazo en días const monthlyDeposit = parseFloat($('input[name="monthly-deposit"]').val().replace(/[$,]/g, '')) || 0; // Validar que el monto inicial sea mayor a 10,000 if (initialDeposit < 10000) { $('.notification').text('El monto inicial debe ser igual o mayor a $10,000.00').show(); $('.content-calculadora .page-main > div.content-form form.form-credits .form-submit img').hide(); return; } else { $('.notification').hide(); } // Validar el monto del ahorro mensual si la opción está activada if (saveMonthly === 'yes') { const maxMonthlyDeposit = initialDeposit * 0.02; if (monthlyDeposit < 100) { $('.notification').text('El ahorro mensual debe ser al menos $100.00').show(); $('.content-calculadora .page-main > div.content-form form.form-credits .form-submit img').hide(); return; } else if (monthlyDeposit > maxMonthlyDeposit) { $('.notification').text(`El ahorro mensual no puede ser mayor al 2% del depósito inicial ($${maxMonthlyDeposit.toFixed(2)})`).show(); $('.content-calculadora .page-main > div.content-form form.form-credits .form-submit img').hide(); return; } else { $('.notification').hide(); } } // Realizar consulta AJAX para obtener la tasa de interés correcta $.ajax({ url: '/wp-admin/admin-ajax.php', type: 'POST', data: { action: 'get_interest_rate', timePeriod: Math.floor(timePeriodDays / 30), // Enviar el tiempo en meses aproximados a la consulta saveMonthly: saveMonthly }, success: function(response) { // Verificar si la respuesta es válida if (!response || typeof response.tasa_anual === 'undefined' || typeof response.tasa_anual_estrella === 'undefined') { alert('Error al obtener las tasas de interés. Intenta nuevamente.'); $('.content-calculadora .page-main > div.content-form form.form-credits .form-submit img').hide(); return; } let annualInterestRate; // Asignar la tasa de interés en base a la respuesta de ahorro mensual if (saveMonthly === 'yes') { annualInterestRate = parseFloat(response.tasa_anual_estrella) / 100; } else { annualInterestRate = parseFloat(response.tasa_anual) / 100; } console.log('Tasa: ' + annualInterestRate); // Asegurarse de que la tasa de interés sea un número válido if (isNaN(annualInterestRate)) { alert('Error: Tasa de interés no válida.'); $('.content-calculadora .page-main > div.content-form form.form-credits .form-submit img').hide(); return; } // Cálculo de interés diario let totalSavings = initialDeposit; let interestEarned = 0; const dailyInterestRate = annualInterestRate / 365; function getDaysInMonth(month, year) { return new Date(year, month, 0).getDate(); } // Suponiendo que el cálculo comienza en el mes de mayo del año 2024 //let currentMonth = 4; // Representa mayo (según la lógica original) //let currentYear = 2025; // Obtener la fecha actual let now = new Date(); // Obtener el mes actual (JavaScript maneja los meses de 0 a 11, por lo que se suma 1) let currentMonth = now.getMonth() + 2; // Mes actual + 1 // Obtener el año actual let currentYear = now.getFullYear(); // Ajustar si el mes es diciembre (12) if (currentMonth > 12) { currentMonth = 1; currentYear += 1; } let remainingDays = timePeriodDays; // Días totales a calcular if (saveMonthly === 'yes') { // Capitalización de intereses cada 12 meses let capital = initialDeposit; let interestThisPeriod = 0; let monthCount = 0; while (remainingDays > 0) { monthCount++; // A partir del segundo mes, se suma el depósito mensual al inicio del mes if (monthCount > 1) { capital += monthlyDeposit; } // Calcular el mes anterior al actual let previousMonth = currentMonth - 1; let previousYear = currentYear; if (previousMonth < 1) { previousMonth = 12; previousYear--; } // Obtener el número de días del mes anterior const daysInPreviousMonth = getDaysInMonth(previousMonth, previousYear); const daysToCalculate = daysInPreviousMonth; // Calcular el interés para este mes basado en el capital actual let monthlyInterest = capital * dailyInterestRate * daysToCalculate; interestThisPeriod += monthlyInterest; console.log(`Mes: ${currentMonth}, Días del mes anterior: ${daysInPreviousMonth}, Interés ganado: ${monthlyInterest.toFixed(2)}, Capital base: ${capital.toFixed(2)}`); // Si se completa un período de 12 meses, capitalizamos los intereses acumulados if (monthCount % 12 === 0) { capital += interestThisPeriod; interestEarned += interestThisPeriod; interestThisPeriod = 0; } remainingDays -= daysToCalculate; currentMonth++; if (currentMonth > 12) { currentMonth = 1; currentYear++; } } // Si la simulación termina antes de completar un período de 12 meses, capitalizamos lo acumulado if (interestThisPeriod > 0) { capital += interestThisPeriod; interestEarned += interestThisPeriod; } totalSavings = capital + monthlyDeposit; } else { // Lógica original para opción sin ahorro mensual while (remainingDays > 5) { console.log('Restantes: ' + remainingDays); let previousMonth = currentMonth - 1; let previousYear = currentYear; if (previousMonth < 1) { previousMonth = 12; previousYear--; } const daysInPreviousMonth = getDaysInMonth(previousMonth, previousYear); const daysToCalculate = daysInPreviousMonth; const baseAmount = saveMonthly === 'yes' ? totalSavings : initialDeposit; const monthlyInterest = baseAmount * dailyInterestRate * daysToCalculate; interestEarned += monthlyInterest; if (saveMonthly === 'yes') { totalSavings += monthlyInterest + monthlyDeposit; } else { totalSavings = initialDeposit + interestEarned; } console.log(`Mes: ${currentMonth}, Días del mes anterior: ${daysInPreviousMonth}, Interés ganado: ${monthlyInterest.toFixed(2)}, Total Ahorros: ${totalSavings.toFixed(2)}`); remainingDays -= daysToCalculate; currentMonth++; if (currentMonth > 12) { currentMonth = 1; currentYear++; } } } // Calcular el tiempo en años o meses let timeText; if (timePeriodDays < 365) { let months = Math.floor(timePeriodDays / 30); // Redondear hacia abajo a meses completos timeText = months === 1 ? "1 mes" : `${months} meses`; } else { let years = Math.floor(timePeriodDays / 365); // Redondear hacia abajo a años completos timeText = years === 1 ? "1 año" : `${years} años`; } // Mostrar los resultados en el HTML $('.content-hidden').show(); $('input.form-btn').val('Recalcular'); $('.content-hidden').css('opacity', 1); $('.num-anios').text(timeText); // Mostrar meses o años de manera dinámica $('#initial-deposit .result-value').text('$' + initialDeposit.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})); $('#years-saving .result-value').text(timeText); $('#amount-value').text('$' + totalSavings.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})); $('#interes .result-value').text('$' + interestEarned.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})); // Mostrar el total de ahorro mensual en el nuevo campo let totalMonthlySaving = 0; if (saveMonthly === 'yes') { totalMonthlySaving = monthlyDeposit * Math.floor(timePeriodDays / 30); // Multiplicar por la cantidad de meses $('#tipodpf').text('Estrella'); $('.row-text-info.montly-saving').show(); $('.path-next-step.form-btn').text('Lo quiero'); $('.path-next-step.form-btn').attr('href', '#'); } else { $('#tipodpf').text('Regular'); $('.row-text-info.montly-saving').hide(); // Cambiar botón $('.path-next-step.form-btn').text('Conoce más'); $('.path-next-step.form-btn').attr('href', 'https://www.bgeneral.com/personas/plazo-fijo/'); } $('#montly-saving .result-value').text('$' + totalMonthlySaving.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})); // Ocultar el loader $('.content-calculadora .page-main > div.content-form form.form-credits .form-submit img').hide(); // Hacer scroll hacia los resultados en móviles o tablets if ($(window).width() <= 900) { $('html, body').animate({ scrollTop: $('#results').offset().top }, 1000); } }, error: function() { alert('Error al realizar la solicitud. Intenta nuevamente.'); $('.content-calculadora .page-main > div.content-form form.form-credits .form-submit img').hide(); } }); }); // Formatear campos de valores a moneda al instante $('input.value-currency').keyup(function(e) { var newValue = '$' + number_format($(this).val(), 0); $(this).val(newValue); }); // Modal para "Lo quiero" Plazo Fijo Estrella $(document).on('click', '.path-next-step.form-btn', function(e) { if ($('#tipodpf').text() === 'Estrella') { e.preventDefault(); $('').appendTo('body'); // Mostrar el modal $('#modal-estrellas').fadeIn(); } }); // Cerrar el modal cuando se hace clic en el botón de cierre o fuera del modal $(document).on('click', '.close-btn', function() { $('#modal-estrellas').fadeOut(function() { $(this).remove(); }); }); $(document).on('click', '.modal', function(e) { if ($(e.target).is('.modal')) { $('#modal-estrellas').fadeOut(function() { $(this).remove(); }); } }); function number_format(amount, decimals) { amount += ''; // por si pasan un numero en vez de un string amount = parseFloat(amount.replace(/[^0-9\.]/g, '')); // elimino cualquier cosa que no sea numero o punto decimals = decimals || 0; // por si la variable no fue fue pasada // si no es un numero o es igual a cero retorno el mismo cero if (isNaN(amount) || amount === 0) return parseFloat(0).toFixed(decimals); // si es mayor o menor que cero retorno el valor formateado como numero amount = '' + amount.toFixed(decimals); var amount_parts = amount.split('.'), regexp = /(\d+)(\d{3})/; while (regexp.test(amount_parts[0])) amount_parts[0] = amount_parts[0].replace(regexp, '$1' + ',' + '$2'); return amount_parts.join('.'); } });