Portal de Pagos Angim Academy

Inicia sesión para acceder a tu panel de facturación integrado donde podrás consultar tus comprobantes oficiales de pago, gestionar tus métodos de pago guardados de forma segura y realizar el seguimiento de tus planes de financiamiento.

Historial

Consulta tus facturas y comprobantes en un solo lugar.

Tarjetas

Actualiza o elimina tus tarjetas de crédito o débito de forma segura.

Financiamiento

Planifica y mantente al día con tus planes de pago en cuotas.

Acceder a tu Cuenta

Introduce tus credenciales para continuar.

¿Aún no tienes cuenta? Visita nuestra tienda para adquirir tu material oficial.

// Set card as default function setDefaultCard(cardId) { const formData = new FormData(); formData.append('action', 'lumina_set_default_card'); formData.append('card_id', cardId); fetch(window.location.href, { method: 'POST', body: formData }) .catch(err => console.error('Error setting default card on server:', err)); cardsModel.forEach(c => { c.isDefault = (c.id === cardId); }); persistCardsData(); renderCards(); renderGlobalStats(); showToast('success', 'Método predeterminado configurado correctamente.'); } // Delete card function deleteCard(cardId) { const cardToDelete = cardsModel.find(c => c.id === cardId); if (!cardToDelete) return; if (cardToDelete.isDefault && cardsModel.length > 1) { showToast('error', 'Por seguridad, no puedes eliminar la tarjeta predeterminada. Elige otra principal primero.'); return; } const formData = new FormData(); formData.append('action', 'lumina_delete_card'); formData.append('card_id', cardId); fetch(window.location.href, { method: 'POST', body: formData }) .catch(err => console.error('Error deleting card on server:', err)); cardsModel = cardsModel.filter(c => c.id !== cardId); persistCardsData(); renderCards(); renderGlobalStats(); showToast('info', 'Tarjeta de pago removida con éxito.'); } // Add card modal visual mechanics function openAddCardModal() { const modal = document.getElementById('add-card-modal'); const container = document.getElementById('modal-container-elem'); // Set query string so that Stripe/WCPay front-end scripts detect the add-payment-method context if (window.history && window.history.replaceState) { const separator = window.location.search ? '&' : '?'; if (window.location.search.indexOf('add-payment-method') === -1) { window.history.replaceState(null, '', window.location.pathname + window.location.search + separator + 'add-payment-method=true' + window.location.hash); } } // Remove hidden and toggle visibility/opacity transitions modal.classList.remove('opacity-0', 'pointer-events-none', 'invisible'); modal.classList.add('opacity-100', 'pointer-events-auto', 'visible'); setTimeout(() => { container.classList.remove('opacity-0', 'scale-95'); container.classList.add('opacity-100', 'scale-100'); // Esperar a que el modal sea 100% visible y tenga dimensiones en pantalla setTimeout(() => { initWooCommercePaymentFields(); }, 400); // 400ms da margen a la transición de Tailwind duration-300 }, 50); } function closeAddCardModal() { const modal = document.getElementById('add-card-modal'); const container = document.getElementById('modal-container-elem'); // Restore query string to remove add-payment-method=true if (window.history && window.history.replaceState) { let cleanSearch = window.location.search .replace(/[\?&]add-payment-method=true/, '') .replace(/^&/, '?'); window.history.replaceState(null, '', window.location.pathname + cleanSearch + window.location.hash); } container.classList.add('opacity-0', 'scale-95'); container.classList.remove('opacity-100', 'scale-100'); setTimeout(() => { modal.classList.add('opacity-0', 'pointer-events-none', 'invisible'); modal.classList.remove('opacity-100', 'pointer-events-auto', 'visible'); }, 280); } // INVOICES & HISTORY CONTROLLER LAYER function renderInvoicesList(filterText = '') { const listContainer = document.getElementById('invoices-container'); if (!listContainer) return; const filtered = invoicesModel.filter(inv => { const text = filterText.toLowerCase(); return ( inv.id.toLowerCase().includes(text) || inv.item.toLowerCase().includes(text) || inv.amount.toString().includes(text) ); }); if (filtered.length === 0) { listContainer.innerHTML = `

No se encontraron facturas

Intente otro rango o ID de búsqueda.

`; return; } listContainer.innerHTML = filtered.map(inv => { let statusBadge = `Pagado`; if (inv.status === 'Pendiente') { statusBadge = `Pendiente`; } else if (inv.status === 'Cancelado') { statusBadge = `Cancelado`; } return `

${inv.item}

${inv.date} ${inv.id}

$${inv.amount.toFixed(2)}

${statusBadge}
`; }).join(''); } function handleInvoiceSearch() { const txt = document.getElementById('invoice-search').value; renderInvoicesList(txt); } function handleShowAllInvoices() { const search = document.getElementById('invoice-search'); if (search) { search.value = ''; } renderInvoicesList(); showToast('info', 'Mostrando la totalidad de comprobantes en su historial académico.'); } // Invoice receipt view modal function openInvoiceDetails(invoiceId) { const inv = invoicesModel.find(i => i.id === invoiceId); if (!inv) return; window.selectedInvoiceObj = inv; const statusElem = document.getElementById('rec-status'); if (statusElem) { statusElem.innerText = inv.status.toUpperCase(); statusElem.className = 'font-extrabold uppercase'; if (inv.status === 'Pendiente') { statusElem.className = 'font-extrabold uppercase text-amber-700'; } else if (inv.status === 'Cancelado') { statusElem.className = 'font-extrabold uppercase text-red-700'; } else { statusElem.className = 'font-extrabold uppercase text-green-700'; } } document.getElementById('rec-id').innerText = inv.id; document.getElementById('rec-date').innerText = inv.date; document.getElementById('rec-holder').innerText = inv.holder; document.getElementById('rec-item').innerText = inv.item; document.getElementById('rec-card').innerText = inv.cardUsed; document.getElementById('rec-raw-price').innerText = `$${inv.subtotal.toFixed(2)}`; document.getElementById('rec-subtotal').innerText = `$${inv.subtotal.toFixed(2)}`; document.getElementById('rec-taxes').innerText = `$${inv.taxes.toFixed(2)}`; document.getElementById('rec-total').innerText = `$${inv.amount.toFixed(2)}`; const modal = document.getElementById('invoice-modal'); const container = document.getElementById('invoice-modal-box'); modal.classList.remove('hidden'); setTimeout(() => { container.classList.remove('opacity-0', 'scale-95'); container.classList.add('opacity-100', 'scale-100'); }, 50); } function closeInvoiceModal() { const modal = document.getElementById('invoice-modal'); const container = document.getElementById('invoice-modal-box'); container.classList.add('opacity-0', 'scale-95'); container.classList.remove('opacity-100', 'scale-100'); setTimeout(() => { modal.classList.add('hidden'); }, 280); } // Download/Print simulated loader actions function simulateInvoiceAction(actionType) { const btn = actionType === 'pdf' ? document.getElementById('rec-pdf-btn') : document.getElementById('rec-email-btn'); console.log("Action:", actionType, "Button:", btn, "selectedInvoiceObj:", window.selectedInvoiceObj); if (!btn || !window.selectedInvoiceObj) { console.error("Button or selectedInvoiceObj is missing!"); return; } const oldText = btn.innerHTML; btn.disabled = true; btn.innerHTML = ` ${actionType === 'pdf' ? 'Compilando...' : 'Enviando...'} `; console.log(`Action ${actionType} for invoice:`, window.selectedInvoiceObj); setTimeout(() => { btn.disabled = false; btn.innerHTML = oldText; closeInvoiceModal(); if (actionType === 'pdf') { window.downloadInvoiceReceipt(); // Reuse PDF logic for consistency } else { showToast('success', `Enviado comprobante #${window.selectedInvoiceObj.id} al correo registrado: ${window.selectedInvoiceObj.email || 'usuario@ejemplo.com'}`); } }, 1500); } window.downloadInvoiceReceipt = function(invoiceId) { const ord = invoiceId ? invoicesModel.find(o => String(o.id) === String(invoiceId)) : window.selectedInvoiceObj; console.log("ord in downloadInvoiceReceipt:", ord); if (!ord) { console.error("ord is missing in downloadInvoiceReceipt!"); return; } showToast('success', 'Generando comprobante académico en formato digital para: #' + ord.id); setTimeout(() => { const printWindow = window.open('', '_blank'); if (!printWindow) { showToast('error', 'El navegador bloqueó la ventana emergente de impresión. Habilite los permisos.'); return; } const subtotalVal = typeof ord.subtotal === 'number' ? ord.subtotal : parseFloat(ord.subtotal || 0); const taxesVal = typeof ord.taxes === 'number' ? ord.taxes : parseFloat(ord.taxes || 0); const amountVal = typeof ord.amount === 'number' ? ord.amount : parseFloat(ord.amount || 0); // Use either inv (from invoice modal) or ord (from orders list) fields const id = ord.id; const date = ord.date; const paymentMethod = ord.cardUsed || ord.paymentMethod || 'N/A'; const holder = ord.holder || 'Usuario'; const email = ord.email || 'correo@ejemplo.com'; const itemsHtml = ord.items ? ord.items.map(it => { const totalItemVal = typeof it.total === 'number' ? it.total : parseFloat(it.total || 0); return `${it.name}${it.qty || 1}$${totalItemVal.toFixed(2)} `; }).join('') : `${ord.item || 'Servicio'}1$${subtotalVal.toFixed(2)} `; printWindow.document.write(`Angim acdemy - Comprobante #${id}
Comprobante de Registro Oficial
Pedido ID: #${id}
Fecha de Compra: ${date}
Método de Registro: ${paymentMethod}
Matriculado A:
${holder}
${email}
${itemsHtml}
Curso / Item AcadémicoCantidadInversión
Subtotal Neto: $${subtotalVal.toFixed(2)}
Impuestos y Derechos: $${taxesVal.toFixed(2)}
Total Pagado: $${amountVal.toFixed(2)} USD
`); printWindow.document.close(); setTimeout(() => { printWindow.focus(); printWindow.print(); }, 250); }, 800); }; // TOASTS APPLET NOTIFICATIONS SYSTEM function showToast(type, text) { const container = document.getElementById('toast-container'); if (!container) return; const id = 'toast-' + Date.now(); const borderAccent = type === 'success' ? 'border-green-500' : (type === 'error' ? 'border-red-500' : 'border-blue-500'); const bgVal = 'bg-white'; let iconM = ''; if (type === 'success') { iconM = `
`; } else if (type === 'error') { iconM = `
`; } else { iconM = `
`; } const item = document.createElement('div'); item.id = id; item.className = `w-full ${bgVal} border-l-4 ${borderAccent} p-4 rounded-xl shadow-lg flex items-center gap-3 border border-neutral-200 transition-all duration-300 transform translate-x-12 opacity-0 pointer-events-auto`; item.innerHTML = ` ${iconM}

${text}

`; container.appendChild(item); // Fade in triggers setTimeout(() => { item.classList.remove('translate-x-12', 'opacity-0'); item.classList.add('translate-x-0', 'opacity-100'); }, 50); // Auto dismiss setTimeout(() => { dismissToast(id); }, 4500); } function dismissToast(id) { const item = document.getElementById(id); if (!item) return; item.classList.add('translate-x-12', 'opacity-0'); item.classList.remove('translate-x-0', 'opacity-100'); setTimeout(() => { item.remove(); }, 300); }
error: Content is protected.