// SoberanIA Argentina - Revolutionary Fintech Application class SoberanIAApp { constructor() { this.data = { usuarios_actuales: 1247500, redistribuido_total: 45320780000, peso_d_circulacion: 32654892300, jubilados_beneficiados: 872500, comercios_adheridos: 28750, pool_sorteos: 12500000, soberania_porcentaje: 45, provincias: [ { nombre: "Buenos Aires", usuarios: 450000, beneficiarios: 315000, penetracion: 2.6 }, { nombre: "CABA", usuarios: 120000, beneficiarios: 84000, penetracion: 3.9 }, { nombre: "Córdoba", usuarios: 98000, beneficiarios: 68600, penetracion: 2.6 }, { nombre: "Santa Fe", usuarios: 85000, beneficiarios: 59500, penetracion: 2.5 }, { nombre: "Mendoza", usuarios: 75000, beneficiarios: 52500, penetracion: 3.8 }, { nombre: "Tucumán", usuarios: 65000, beneficiarios: 45500, penetracion: 4.1 } ], productos_destacados: [ { titulo: "Smartphone Samsung A54", precio: 299000, precio_ml: 386700, vendedor: "TechCoopBA", rating: 4.8, ahorro: 87700, categoria: "tecnologia", id: 1 }, { titulo: "Heladera Gafa 365L", precio: 485000, precio_ml: 627000, vendedor: "ElectroCoopSF", rating: 4.9, ahorro: 142000, categoria: "hogar", id: 2 }, { titulo: "Notebook Lenovo IdeaPad", precio: 520000, precio_ml: 728000, vendedor: "CompuCoopCor", rating: 4.7, ahorro: 208000, categoria: "tecnologia", id: 3 }, { titulo: "Smart TV 55 pulgadas", precio: 680000, precio_ml: 884000, vendedor: "TechCoopBA", rating: 4.6, ahorro: 204000, categoria: "tecnologia", id: 4 }, { titulo: "Lavarropas Automático 8kg", precio: 420000, precio_ml: 546000, vendedor: "ElectroCoopSF", rating: 4.8, ahorro: 126000, categoria: "hogar", id: 5 }, { titulo: "Zapatillas Running Nike", precio: 89000, precio_ml: 115700, vendedor: "SportCoopMdz", rating: 4.5, ahorro: 26700, categoria: "deportes", id: 6 }, { titulo: "Microondas LG 28L", precio: 180000, precio_ml: 234000, vendedor: "ElectroCoopSF", rating: 4.7, ahorro: 54000, categoria: "hogar", id: 7 }, { titulo: "Tablet Samsung 10.1", precio: 220000, precio_ml: 286000, vendedor: "TechCoopBA", rating: 4.6, ahorro: 66000, categoria: "tecnologia", id: 8 } ], ganadores_recientes: [ { fecha: "2025-06-01", ganador: "María G.", categoria: "Jubilada", premio: 2500000, provincia: "Buenos Aires" }, { fecha: "2025-05-25", ganador: "Carlos R.", categoria: "Jubilado", premio: 1800000, provincia: "Córdoba" }, { fecha: "2025-05-18", ganador: "Ana M.", categoria: "Vulnerable", premio: 1200000, provincia: "Santa Fe" }, { fecha: "2025-05-11", ganador: "Luis M.", categoria: "General", premio: 800000, provincia: "CABA" }, { fecha: "2025-05-04", ganador: "Elena S.", categoria: "Jubilada", premio: 2100000, provincia: "Buenos Aires" }, { fecha: "2025-04-27", ganador: "Roberto P.", categoria: "Jubilado", premio: 1900000, provincia: "Mendoza" } ], testimonios: [ { nombre: "María González", edad: 68, ubicacion: "San Isidro, Buenos Aires", testimonio: "Gracias a SoberanIA puedo comprar medicamentos sin preocuparme. He ganado dos sorteos que me cambiaron la vida.", monto_ganado: 2500000 }, { nombre: "Carlos Rodríguez", edad: 72, ubicacion: "Córdoba Capital", testimonio: "Después de 40 años de trabajo, mi jubilación no alcanzaba. Con SoberanIA recuperé la dignidad.", monto_ganado: 1800000 }, { nombre: "Ana Fernández", edad: 65, ubicacion: "Rosario, Santa Fe", testimonio: "Mis nietos ahora pueden estudiar gracias a los sorteos de SoberanIA. Es una bendición.", monto_ganado: 1200000 }, { nombre: "Elena Silva", edad: 70, ubicacion: "La Plata, Buenos Aires", testimonio: "Por primera vez en años puedo ayudar a mis hijos. SoberanIA cambió mi vida completamente.", monto_ganado: 2100000 } ], noticias: [ { fecha: "Junio 8, 2025", titulo: "SoberanIA alcanza 2500 comercios adheridos en Tucumán", descripcion: "La economía local registra 18% de aumento en transacciones sin intermediarios." }, { fecha: "Junio 5, 2025", titulo: "BCRA reconoce al PESO-D como medio de pago oficial", descripcion: "Fortalece la soberanía monetaria digital argentina." }, { fecha: "Junio 3, 2025", titulo: "Jubilados de Mendoza reciben $45M en redistribución", descripcion: "El sistema cooperativo supera todas las expectativas de impacto social." }, { fecha: "Junio 1, 2025", titulo: "Nueva alianza con cooperativas agropecuarias", descripcion: "Productos del campo directo al consumidor con 0% comisión." } ] }; this.state = { currentSection: 'dashboard', isLoggedIn: false, user: null, cart: [], balance: 25450.00, sorteoTarget: this.getNextSundayAt8PM(), countdownInterval: null }; this.charts = {}; this.productsLoaded = false; this.init(); } init() { // Wait for DOM to be fully loaded if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { this.setupApp(); }); } else { this.setupApp(); } } setupApp() { this.setupEventListeners(); this.startCounters(); this.initializeCharts(); this.loadDynamicContent(); this.startCountdown(); this.updateCountersInterval(); this.updateBalance(); this.updateCartDisplay(); console.log('SoberanIA App initialized successfully'); } setupEventListeners() { // Navigation links const navLinks = document.querySelectorAll('.nav__link'); navLinks.forEach(link => { link.addEventListener('click', (e) => { e.preventDefault(); const section = link.getAttribute('data-section'); if (section) { this.navigateToSection(section); } }); }); // Mobile menu toggle const navToggle = document.getElementById('nav-toggle'); const navMenu = document.getElementById('nav-menu'); if (navToggle) { navToggle.addEventListener('click', () => { if (navMenu) { navMenu.classList.toggle('active'); } }); } // Close mobile menu when clicking nav links navLinks.forEach(link => { link.addEventListener('click', () => { if (navMenu) { navMenu.classList.remove('active'); } }); }); // Modal controls this.setupModalControls(); // Form handlers this.setupFormHandlers(); // Marketplace functionality this.setupMarketplaceControls(); // Fintech functionality this.setupFintechControls(); // Cart functionality this.setupCartControls(); console.log('Event listeners setup complete'); } setupModalControls() { // Register modal triggers const registerBtn = document.getElementById('register-btn'); const heroRegister = document.getElementById('hero-register'); if (registerBtn) { registerBtn.addEventListener('click', (e) => { e.preventDefault(); if (this.state.isLoggedIn) { this.logout(); } else { this.openModal('register-modal'); } }); } if (heroRegister) { heroRegister.addEventListener('click', (e) => { e.preventDefault(); this.openModal('register-modal'); }); } // Login modal const loginBtn = document.getElementById('login-btn'); if (loginBtn) { loginBtn.addEventListener('click', (e) => { e.preventDefault(); if (!this.state.isLoggedIn) { this.openModal('login-modal'); } }); } // Send money modal const sendMoneyBtn = document.getElementById('send-money-btn'); if (sendMoneyBtn) { sendMoneyBtn.addEventListener('click', (e) => { e.preventDefault(); if (this.state.isLoggedIn) { this.openModal('send-money-modal'); } else { this.showToast('Por favor inicia sesión primero', 'error'); } }); } // Sell product modal const sellProductBtn = document.getElementById('sell-product-btn'); if (sellProductBtn) { sellProductBtn.addEventListener('click', (e) => { e.preventDefault(); if (this.state.isLoggedIn) { this.openModal('sell-product-modal'); } else { this.showToast('Por favor inicia sesión primero', 'error'); } }); } // Modal close buttons document.querySelectorAll('.modal-close').forEach(btn => { btn.addEventListener('click', (e) => { e.preventDefault(); const modalId = btn.getAttribute('data-modal'); if (modalId) { this.closeModal(modalId); } else { // Find the closest modal and close it const modal = btn.closest('.modal'); if (modal) { this.closeModal(modal.id); } } }); }); // Close modal on backdrop click document.querySelectorAll('.modal').forEach(modal => { modal.addEventListener('click', (e) => { if (e.target === modal) { this.closeModal(modal.id); } }); }); } setupFormHandlers() { // Register form const registerForm = document.getElementById('register-form'); if (registerForm) { registerForm.addEventListener('submit', (e) => { e.preventDefault(); this.handleRegister(e.target); }); } // Login form const loginForm = document.getElementById('login-form'); if (loginForm) { loginForm.addEventListener('submit', (e) => { e.preventDefault(); this.handleLogin(e.target); }); } // Send money form const sendMoneyForm = document.getElementById('send-money-form'); if (sendMoneyForm) { sendMoneyForm.addEventListener('submit', (e) => { e.preventDefault(); this.handleSendMoney(e.target); }); } // Sell product form const sellProductForm = document.getElementById('sell-product-form'); if (sellProductForm) { sellProductForm.addEventListener('submit', (e) => { e.preventDefault(); this.handleSellProduct(e.target); }); } } setupMarketplaceControls() { // Product search const productSearch = document.getElementById('product-search'); if (productSearch) { productSearch.addEventListener('input', (e) => { this.filterProducts(e.target.value); }); } // Category filters document.querySelectorAll('.filter-btn').forEach(btn => { btn.addEventListener('click', (e) => { e.preventDefault(); document.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); const category = btn.getAttribute('data-category'); this.filterProductsByCategory(category); }); }); } setupFintechControls() { // Investment calculators document.querySelectorAll('.investment-input').forEach(input => { input.addEventListener('input', (e) => { this.calculateInvestment(e.target); }); }); // Credit calculators document.querySelectorAll('.credit-input, .credit-term').forEach(input => { input.addEventListener('input', (e) => { this.calculateCredit(e.target); }); input.addEventListener('change', (e) => { this.calculateCredit(e.target); }); }); // QR and history buttons const receiveBtn = document.getElementById('receive-money-btn'); const historyBtn = document.getElementById('history-btn'); if (receiveBtn) { receiveBtn.addEventListener('click', (e) => { e.preventDefault(); this.showToast('QR generado para recibir pagos PESO-D', 'success', 'QR Generado'); }); } if (historyBtn) { historyBtn.addEventListener('click', (e) => { e.preventDefault(); this.showTransactionHistory(); }); } } setupCartControls() { // Cart close const cartClose = document.getElementById('cart-close'); if (cartClose) { cartClose.addEventListener('click', (e) => { e.preventDefault(); this.closeCart(); }); } // Checkout const checkoutBtn = document.getElementById('checkout-btn'); if (checkoutBtn) { checkoutBtn.addEventListener('click', (e) => { e.preventDefault(); this.handleCheckout(); }); } } navigateToSection(sectionId) { console.log('Navigating to section:', sectionId); // Update active nav link document.querySelectorAll('.nav__link').forEach(link => { link.classList.remove('active'); }); const activeLink = document.querySelector(`[data-section="${sectionId}"]`); if (activeLink) { activeLink.classList.add('active'); } // Update active section document.querySelectorAll('.section').forEach(section => { section.classList.remove('active'); }); const activeSection = document.getElementById(sectionId); if (activeSection) { activeSection.classList.add('active'); console.log('Section activated:', sectionId); } else { console.error('Section not found:', sectionId); } this.state.currentSection = sectionId; // Load section-specific content if needed if (sectionId === 'marketplace' && !this.productsLoaded) { setTimeout(() => { this.loadProducts(); this.productsLoaded = true; }, 100); } // Re-initialize charts if needed for fintech section if (sectionId === 'fintech') { setTimeout(() => { this.initializeFintechCharts(); }, 200); } // Scroll to top window.scrollTo({ top: 0, behavior: 'smooth' }); } openModal(modalId) { const modal = document.getElementById(modalId); if (modal) { modal.classList.add('active'); document.body.style.overflow = 'hidden'; console.log('Modal opened:', modalId); } else { console.error('Modal not found:', modalId); } } closeModal(modalId) { const modal = document.getElementById(modalId); if (modal) { modal.classList.remove('active'); document.body.style.overflow = 'auto'; console.log('Modal closed:', modalId); } } showToast(message, type = 'info', title = '') { const toastContainer = document.getElementById('toast-container'); if (!toastContainer) { console.error('Toast container not found'); return; } const toast = document.createElement('div'); toast.className = `toast toast--${type}`; const icons = { success: 'fas fa-check-circle', error: 'fas fa-exclamation-circle', info: 'fas fa-info-circle' }; toast.innerHTML = `
${title ? `
${title}
` : ''}
${message}
`; toastContainer.appendChild(toast); setTimeout(() => { if (toast.parentNode) { toast.remove(); } }, 5000); } handleRegister(form) { const formData = new FormData(form); const userData = { username: formData.get('username'), email: formData.get('email'), dni: formData.get('dni'), password: formData.get('password'), confirmPassword: formData.get('confirm-password'), category: formData.get('category') }; // Validate DNI if (!/^\d{8}$/.test(userData.dni)) { this.showToast('DNI debe tener exactamente 8 dígitos', 'error', 'Error de Validación'); return; } // Validate passwords match if (userData.password !== userData.confirmPassword) { this.showToast('Las contraseñas no coinciden', 'error', 'Error de Validación'); return; } // Validate required fields if (!userData.username || !userData.email || !userData.category) { this.showToast('Todos los campos son obligatorios', 'error', 'Error de Validación'); return; } // Simulate registration this.state.user = { username: userData.username, email: userData.email, dni: userData.dni, category: userData.category }; this.state.isLoggedIn = true; this.closeModal('register-modal'); this.showToast('¡Registro exitoso! Bienvenido a la revolución fintech cooperativa', 'success', '¡Bienvenido!'); this.updateUIForLoggedInUser(); // Add welcome bonus this.state.balance += 1000; this.showToast('Has recibido $1,000 PESO-D de bienvenida', 'success', 'Bono de Bienvenida'); this.updateBalance(); // Reset form form.reset(); } handleLogin(form) { const formData = new FormData(form); // Simulate login this.state.user = { username: formData.get('username'), email: formData.get('username'), category: 'general' }; this.state.isLoggedIn = true; this.closeModal('login-modal'); this.showToast('Sesión iniciada correctamente', 'success', 'Bienvenido de vuelta'); this.updateUIForLoggedInUser(); // Reset form form.reset(); } handleSendMoney(form) { const formData = new FormData(form); const amount = parseFloat(formData.get('amount')); const recipient = formData.get('recipient'); if (!recipient) { this.showToast('Ingresa el destinatario', 'error'); return; } if (amount <= 0) { this.showToast('El monto debe ser mayor a 0', 'error'); return; } if (amount > this.state.balance) { this.showToast('Saldo insuficiente para realizar la transferencia', 'error', 'Error de Saldo'); return; } this.state.balance -= amount; this.updateBalance(); this.closeModal('send-money-modal'); this.showToast(`Enviaste $${amount.toLocaleString()} PESO-D a ${recipient} exitosamente`, 'success', 'Transferencia Exitosa'); // Reset form form.reset(); } handleSellProduct(form) { const formData = new FormData(form); const newProduct = { titulo: formData.get('title'), precio: parseInt(formData.get('price')), precio_ml: parseInt(formData.get('price')) * 1.3, // 30% más en MercadoLibre vendedor: this.state.user.username, rating: 5.0, categoria: formData.get('category'), id: Date.now(), ahorro: parseInt(formData.get('price')) * 0.3 }; this.data.productos_destacados.push(newProduct); this.loadProducts(); this.closeModal('sell-product-modal'); this.showToast('Producto publicado exitosamente con 0% de comisión', 'success', 'Publicación Exitosa'); // Reset form form.reset(); } updateUIForLoggedInUser() { const loginBtn = document.getElementById('login-btn'); const registerBtn = document.getElementById('register-btn'); if (loginBtn && registerBtn && this.state.user) { loginBtn.innerHTML = ` ${this.state.user.username}`; registerBtn.innerHTML = ' Salir'; } } logout() { this.state.isLoggedIn = false; this.state.user = null; this.state.cart = []; this.state.balance = 25450.00; const loginBtn = document.getElementById('login-btn'); const registerBtn = document.getElementById('register-btn'); if (loginBtn && registerBtn) { loginBtn.innerHTML = ' Ingresar'; registerBtn.innerHTML = ' Registro GRATIS'; } this.updateBalance(); this.updateCartDisplay(); this.showToast('Sesión cerrada correctamente', 'info', 'Hasta luego'); } startCounters() { const counters = document.querySelectorAll('.counter'); counters.forEach(counter => { const target = parseInt(counter.getAttribute('data-target')); if (isNaN(target)) return; const duration = 2000; const step = target / (duration / 16); let current = 0; const updateCounter = () => { current += step; if (current < target) { counter.textContent = Math.floor(current).toLocaleString(); requestAnimationFrame(updateCounter); } else { counter.textContent = target.toLocaleString(); } }; // Start animation when element is visible const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { updateCounter(); observer.unobserve(entry.target); } }); }); observer.observe(counter); }); } updateCountersInterval() { setInterval(() => { // Simulate real-time growth this.data.usuarios_actuales += Math.floor(Math.random() * 15) + 5; this.data.redistribuido_total += Math.floor(Math.random() * 2000000) + 500000; this.data.peso_d_circulacion += Math.floor(Math.random() * 800000) + 250000; this.data.pool_sorteos += Math.floor(Math.random() * 50000) + 10000; // Update displays without animation const userCounter = document.querySelector('[data-target="1247500"]'); if (userCounter) { userCounter.textContent = this.data.usuarios_actuales.toLocaleString(); } // Update sorteo pool const poolElements = document.querySelectorAll('.sorteo-pool strong'); poolElements.forEach(el => { el.textContent = `$${this.data.pool_sorteos.toLocaleString()}`; }); }, 5000); } initializeCharts() { // Wait for charts to be visible before initializing setTimeout(() => { this.createGrowthChart(); this.createRedistributionChart(); this.createSorteoDistributionChart(); }, 1000); } initializeFintechCharts() { // Additional charts for fintech section if needed console.log('Fintech charts initialized'); } createGrowthChart() { const ctx = document.getElementById('growthChart'); if (!ctx) { console.log('Growth chart canvas not found'); return; } const months = []; const users = []; const baseDate = new Date(2024, 0, 1); // January 2024 for (let i = 0; i <= 18; i++) { const date = new Date(baseDate); date.setMonth(baseDate.getMonth() + i); months.push(date.toLocaleDateString('es-AR', { month: 'short', year: '2-digit' })); // Exponential growth curve const growth = 250000 + (1200000 * (1 - Math.exp(-i/8))); users.push(Math.floor(growth)); } this.charts.growth = new Chart(ctx, { type: 'line', data: { labels: months, datasets: [{ label: 'Usuarios Registrados', data: users, borderColor: '#0033A0', backgroundColor: 'rgba(0, 51, 160, 0.1)', fill: true, tension: 0.4, pointBackgroundColor: '#0033A0', pointBorderColor: '#FFFFFF', pointBorderWidth: 2, pointRadius: 4 }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { y: { beginAtZero: false, ticks: { callback: function(value) { return (value / 1000000).toFixed(1) + 'M'; } }, grid: { color: 'rgba(0, 0, 0, 0.1)' } }, x: { grid: { color: 'rgba(0, 0, 0, 0.1)' } } } } }); console.log('Growth chart created'); } createRedistributionChart() { const ctx = document.getElementById('redistributionChart'); if (!ctx) { console.log('Redistribution chart canvas not found'); return; } this.charts.redistribution = new Chart(ctx, { type: 'doughnut', data: { labels: ['Jubilados (70%)', 'Sectores Vulnerables (20%)', 'Pool General (10%)'], datasets: [{ data: [70, 20, 10], backgroundColor: ['#0033A0', '#75AADB', '#FFFFFF'], borderColor: ['#0033A0', '#75AADB', '#0033A0'], borderWidth: 2 }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: 'bottom', labels: { padding: 20, usePointStyle: true, font: { size: 12 } } } } } }); console.log('Redistribution chart created'); } createSorteoDistributionChart() { const ctx = document.getElementById('sorteoDistributionChart'); if (!ctx) { console.log('Sorteo distribution chart canvas not found'); return; } this.charts.sorteoDistribution = new Chart(ctx, { type: 'pie', data: { labels: ['Jubilados', 'Vulnerables', 'General'], datasets: [{ data: [70, 20, 10], backgroundColor: ['#0033A0', '#75AADB', '#E3F2FD'], borderColor: '#FFFFFF', borderWidth: 3 }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } } } }); console.log('Sorteo distribution chart created'); } loadDynamicContent() { this.loadNews(); this.loadProducts(); this.loadTestimonials(); this.loadProvincialStats(); this.loadWinners(); console.log('Dynamic content loaded'); } loadNews() { const container = document.getElementById('news-container'); if (!container) return; container.innerHTML = this.data.noticias.map(noticia => `
${noticia.fecha}

${noticia.titulo}

${noticia.descripcion}

`).join(''); } loadProducts() { const container = document.getElementById('products-container'); if (!container) return; container.innerHTML = this.data.productos_destacados.map(producto => `

${producto.titulo}

$${producto.precio.toLocaleString()}
ML: $${producto.precio_ml.toLocaleString()} Ahorras: $${producto.ahorro.toLocaleString()}
Por ${producto.vendedor}
${'★'.repeat(Math.floor(producto.rating))}${'☆'.repeat(5-Math.floor(producto.rating))} ${producto.rating}
`).join(''); console.log('Products loaded:', this.data.productos_destacados.length); } getProductIcon(categoria) { const icons = { 'tecnologia': 'laptop', 'hogar': 'home', 'ropa': 'tshirt', 'deportes': 'futbol' }; return icons[categoria] || 'box'; } filterProducts(searchTerm) { const products = document.querySelectorAll('.product-card'); products.forEach(product => { const title = product.querySelector('.product-card__title'); if (title) { const matches = title.textContent.toLowerCase().includes(searchTerm.toLowerCase()); product.style.display = matches ? 'block' : 'none'; } }); } filterProductsByCategory(category) { const products = document.querySelectorAll('.product-card'); products.forEach(product => { const productCategory = product.getAttribute('data-category'); const show = category === 'all' || productCategory === category; product.style.display = show ? 'block' : 'none'; }); } addToCart(productId) { if (!this.state.isLoggedIn) { this.showToast('Por favor inicia sesión primero', 'error'); return; } const product = this.data.productos_destacados.find(p => p.id === productId); if (!product) { console.error('Product not found:', productId); return; } const existingItem = this.state.cart.find(item => item.id === productId); if (existingItem) { existingItem.quantity += 1; } else { this.state.cart.push({ ...product, quantity: 1 }); } this.updateCartDisplay(); this.showCart(); this.showToast(`${product.titulo} agregado al carrito`, 'success'); console.log('Product added to cart:', product.titulo); } viewProduct(productId) { const product = this.data.productos_destacados.find(p => p.id === productId); if (product) { this.showToast(`Viendo: ${product.titulo} - Ahorro vs ML: $${product.ahorro.toLocaleString()}`, 'info', 'Detalles del Producto'); } } showCart() { const cartSidebar = document.getElementById('cart-sidebar'); if (cartSidebar) { cartSidebar.classList.add('active'); } } updateCartDisplay() { const cartItems = document.getElementById('cart-items'); const cartTotal = document.getElementById('cart-total'); if (!cartItems || !cartTotal) return; if (this.state.cart.length === 0) { cartItems.innerHTML = '

Tu carrito está vacío

'; cartTotal.innerHTML = '0'; return; } cartItems.innerHTML = this.state.cart.map(item => `
${item.titulo}
$${item.precio.toLocaleString()} × ${item.quantity}
Ahorras: $${(item.ahorro * item.quantity).toLocaleString()}
`).join(''); const total = this.state.cart.reduce((sum, item) => sum + (item.precio * item.quantity), 0); const totalSavings = this.state.cart.reduce((sum, item) => sum + (item.ahorro * item.quantity), 0); cartTotal.innerHTML = `${total.toLocaleString()}
Ahorras: $${totalSavings.toLocaleString()}`; } removeFromCart(productId) { this.state.cart = this.state.cart.filter(item => item.id !== productId); this.updateCartDisplay(); this.showToast('Producto eliminado del carrito', 'info'); } closeCart() { const cartSidebar = document.getElementById('cart-sidebar'); if (cartSidebar) { cartSidebar.classList.remove('active'); } } handleCheckout() { if (this.state.cart.length === 0) { this.showToast('Tu carrito está vacío', 'error'); return; } const total = this.state.cart.reduce((sum, item) => sum + (item.precio * item.quantity), 0); const totalSavings = this.state.cart.reduce((sum, item) => sum + (item.ahorro * item.quantity), 0); if (total > this.state.balance) { this.showToast('Saldo insuficiente. Recarga tu wallet PESO-D', 'error', 'Error de Pago'); return; } this.state.balance -= total; const itemCount = this.state.cart.length; this.state.cart = []; this.updateBalance(); this.updateCartDisplay(); this.closeCart(); this.showToast(`Compra realizada por $${total.toLocaleString()}. Ahorraste $${totalSavings.toLocaleString()} vs MercadoLibre. ${itemCount} producto${itemCount > 1 ? 's' : ''} comprado${itemCount > 1 ? 's' : ''}.`, 'success', '¡Compra Exitosa!'); } loadTestimonials() { const container = document.getElementById('testimonials-carousel'); if (!container) return; container.innerHTML = this.data.testimonios.map(testimonio => `
"${testimonio.testimonio}"

${testimonio.nombre}, ${testimonio.edad} años

${testimonio.ubicacion}

+$${testimonio.monto_ganado.toLocaleString()}
`).join(''); } loadProvincialStats() { const container = document.getElementById('provincial-stats'); if (!container) return; container.innerHTML = this.data.provincias.map(provincia => `

${provincia.nombre}

Usuarios: ${provincia.usuarios.toLocaleString()}
Beneficiarios: ${provincia.beneficiarios.toLocaleString()}
Penetración: ${provincia.penetracion}%
Cobertura: ${Math.round((provincia.beneficiarios/provincia.usuarios)*100)}%
`).join(''); } loadWinners() { const tbody = document.getElementById('winners-tbody'); if (!tbody) return; tbody.innerHTML = this.data.ganadores_recientes.map(winner => ` ${winner.fecha} ${winner.ganador} ${winner.categoria} $${winner.premio.toLocaleString()} `).join(''); } calculateInvestment(input) { const amount = parseFloat(input.value) || 0; const rate = parseFloat(input.getAttribute('data-rate')); const result = amount * rate - amount; // Annual return const resultElement = input.parentElement.querySelector('.investment-result span'); if (resultElement) { resultElement.textContent = result.toLocaleString(); } } calculateCredit(input) { const container = input.closest('.credit-option'); if (!container) return; const amountInput = container.querySelector('.credit-input'); const termSelect = container.querySelector('.credit-term'); const resultElement = container.querySelector('.credit-result span'); if (!amountInput || !termSelect || !resultElement) return; const amount = parseFloat(amountInput.value) || 0; const monthlyRate = parseFloat(amountInput.getAttribute('data-rate')); const term = parseInt(termSelect.value); if (amount && monthlyRate && term) { // Simple interest calculation const totalInterest = amount * monthlyRate * term; const totalAmount = amount + totalInterest; const monthlyPayment = totalAmount / term; resultElement.textContent = monthlyPayment.toLocaleString(); } } updateBalance() { const balanceElements = document.querySelectorAll('.balance-amount'); balanceElements.forEach(el => { el.textContent = `$${this.state.balance.toLocaleString()}`; }); } showTransactionHistory() { const mockHistory = [ { fecha: '2025-06-08', descripcion: 'Compra en TechCoopBA', monto: -299000, tipo: 'compra' }, { fecha: '2025-06-07', descripcion: 'Transferencia recibida de Carlos R.', monto: 50000, tipo: 'recibido' }, { fecha: '2025-06-06', descripcion: 'Inversión en Bonos Argentinos', monto: -100000, tipo: 'inversion' }, { fecha: '2025-06-05', descripcion: 'Premio sorteo semanal', monto: 1200000, tipo: 'premio' }, { fecha: '2025-06-04', descripcion: 'Staking PESO-D completado', monto: 25000, tipo: 'interes' }, { fecha: '2025-06-03', descripcion: 'Transferencia a Ana F.', monto: -75000, tipo: 'envio' } ]; const historyHTML = `

Historial de Transacciones

${mockHistory.map(tx => `
${tx.descripcion}
${tx.fecha}
${tx.monto > 0 ? '+' : ''}$${Math.abs(tx.monto).toLocaleString()}
`).join('')}
`; // Create a custom toast for transaction history const toastContainer = document.getElementById('toast-container'); if (!toastContainer) return; const toast = document.createElement('div'); toast.className = 'toast toast--info'; toast.style.maxWidth = '450px'; toast.innerHTML = `
${historyHTML}
`; toastContainer.appendChild(toast); setTimeout(() => { if (toast.parentNode) { toast.remove(); } }, 10000); // Show longer for history } getNextSundayAt8PM() { const now = new Date(); const nextSunday = new Date(); const daysUntilSunday = (7 - now.getDay()) % 7; if (daysUntilSunday === 0 && now.getHours() >= 20) { // If it's Sunday after 8 PM, go to next Sunday nextSunday.setDate(now.getDate() + 7); } else { nextSunday.setDate(now.getDate() + daysUntilSunday); } nextSunday.setHours(20, 0, 0, 0); return nextSunday; } startCountdown() { const updateCountdown = () => { const now = new Date().getTime(); const distance = this.state.sorteoTarget.getTime() - now; if (distance < 0) { // Reset to next week this.state.sorteoTarget = this.getNextSundayAt8PM(); this.showToast('¡Sorteo realizado! Próximo sorteo programado', 'success', 'Sorteo Completado'); return; } const days = Math.floor(distance / (1000 * 60 * 60 * 24)); const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); const seconds = Math.floor((distance % (1000 * 60)) / 1000); // Update countdown displays const daysEl = document.getElementById('days'); const hoursEl = document.getElementById('hours'); const minutesEl = document.getElementById('minutes'); const secondsEl = document.getElementById('seconds'); const sorteoCountdown = document.getElementById('sorteo-countdown'); if (daysEl) daysEl.textContent = days; if (hoursEl) hoursEl.textContent = hours; if (minutesEl) minutesEl.textContent = minutes; if (secondsEl) secondsEl.textContent = seconds; if (sorteoCountdown) { sorteoCountdown.textContent = `${days}d ${hours}h ${minutes}m`; } }; // Update immediately updateCountdown(); // Update every second if (this.state.countdownInterval) { clearInterval(this.state.countdownInterval); } this.state.countdownInterval = setInterval(updateCountdown, 1000); } // Cleanup method destroy() { if (this.state.countdownInterval) { clearInterval(this.state.countdownInterval); } // Destroy charts Object.values(this.charts).forEach(chart => { if (chart && typeof chart.destroy === 'function') { chart.destroy(); } }); } } // Initialize the application document.addEventListener('DOMContentLoaded', () => { window.app = new SoberanIAApp(); console.log('SoberanIA Argentina app loaded successfully'); }); // Handle page unload window.addEventListener('beforeunload', () => { if (window.app) { window.app.destroy(); } });