{"id":555,"date":"2026-06-15T01:34:04","date_gmt":"2026-06-15T01:34:04","guid":{"rendered":"http:\/\/internationalpowerbrands.com\/b2b-account-new\/"},"modified":"2026-10-15T15:41:10","modified_gmt":"2026-10-15T15:41:10","slug":"b2b-account","status":"publish","type":"page","link":"https:\/\/internationalpowerbrands.com\/en\/b2b-account\/","title":{"rendered":"Portal B2B \u2013 Mi Cuenta"},"content":{"rendered":"\n<nav class=\"b2b-nav sticky top-0 w-full z-50 shadow-sm py-4 border-b transition-all duration-300\">\n    <div class=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n        <div class=\"flex justify-between items-center\" style=\"flex-wrap:wrap;row-gap:0.5rem\">\n            <a href=\"https:\/\/internationalpowerbrands.com\" class=\"flex items-center\">\n                <img decoding=\"async\" src=\"https:\/\/internationalpowerbrands.com\/wp-content\/uploads\/2026\/09\/ipb-logo-fullcolor.svg\" alt=\"IPB Logo\" class=\"h-10 md:h-16 w-auto object-contain\">\n            <\/a>\n            <div class=\"flex items-center space-x-4\" style=\"flex-wrap:wrap;justify-content:flex-end;row-gap:0.5rem\">\n                <a href=\"\/\" class=\"b2b-nav-site px-6 py-2.5 bg-[var(--navy)] hover:bg-[var(--dark-navy)] text-white text-sm font-bold rounded-md shadow-md transition-all duration-300 flex items-center\">\n                    <i data-lucide=\"arrow-left\" class=\"w-4 h-4 mr-2\"><\/i> Volver al sitio web\n                <\/a>\n                <a href=\"\/b2b-catalogs\/\" class=\"b2b-nav-portal px-6 py-2.5 bg-[var(--navy)] hover:bg-[var(--dark-navy)] text-white text-sm font-bold rounded-md shadow-md transition-all duration-300 flex items-center\">\n                    <i data-lucide=\"arrow-left\" class=\"w-4 h-4 mr-2\"><\/i> Volver al Portal\n                <\/a>\n                <a href=\"\/b2b-account\/\" class=\"b2b-nav-account px-6 py-2.5 bg-[var(--red)] text-white text-sm font-bold rounded-md shadow-md flex items-center\">\n                    <i data-lucide=\"user\" class=\"w-4 h-4 mr-2\"><\/i> Mi Cuenta\n                <\/a>\n                <a href=\"\/b2b-admin\/\" id=\"b2b-nav-admin\" class=\"hidden px-6 py-2.5 bg-[var(--navy)] text-white text-sm font-bold rounded-md shadow-md flex items-center\">\n                    <i data-lucide=\"settings\" class=\"w-4 h-4 mr-2\"><\/i> Admin\n                <\/a>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/nav>\n\n<div class=\"b2b-hero text-center mb-8 max-w-7xl mx-auto px-4 pt-8\">\n    <h1 class=\"text-4xl font-bold mb-2\"><span class=\"b2b-when-out\">Portal B2B<\/span><span class=\"b2b-when-in\">Mi Cuenta<\/span><\/h1>\n    <p class=\"text-gray-500\"><span class=\"b2b-when-out\">Inicie sesi&oacute;n para ver sus cat&aacute;logos y hacer pedidos.<\/span><span class=\"b2b-when-in\">Inicie sesi&oacute;n para ver su historial de pedidos.<\/span><\/p>\n<\/div>\n\n\n\n<div class=\"max-w-2xl mx-auto px-4 pb-16\">\n\n    <div id=\"b2b-account-login\" class=\"hidden bg-white border border-gray-100 rounded-xl shadow-sm p-8\">\n        <h2 class=\"text-xl font-bold mb-6 text-center\">Iniciar Sesi&oacute;n<\/h2>\n        <form onsubmit=\"b2bDoLogin(event)\">\n            <div class=\"mb-4\">\n                <label class=\"block text-sm font-bold mb-1\" for=\"b2b-login-email\">Correo electr&oacute;nico o usuario<\/label>\n                <input type=\"text\" id=\"b2b-login-email\" name=\"username\" autocomplete=\"username\" autocapitalize=\"none\" spellcheck=\"false\" required class=\"w-full border border-gray-200 rounded-md px-4 py-2.5 focus:outline-none focus:ring-2 focus:ring-[var(--navy)]\">\n            <\/div>\n            <div class=\"mb-4\">\n                <label class=\"block text-sm font-bold mb-1\" for=\"b2b-login-pass\">Contrase&ntilde;a<\/label>\n                <input type=\"password\" id=\"b2b-login-pass\" name=\"password\" autocomplete=\"current-password\" required class=\"w-full border border-gray-200 rounded-md px-4 py-2.5 focus:outline-none focus:ring-2 focus:ring-[var(--navy)]\">\n            <\/div>\n            <p id=\"b2b-login-error\" role=\"alert\" class=\"hidden text-sm text-[var(--red)] font-bold mb-4\"><\/p>\n            <button type=\"submit\" id=\"b2b-login-btn\" class=\"w-full bg-[var(--navy)] hover:bg-[var(--red)] text-white font-bold py-2.5 rounded-md shadow-md transition-all duration-300\">Iniciar Sesi&oacute;n<\/button>\n            <p class=\"text-center mt-4\"><a href=\"\/wp-login.php?action=lostpassword\" class=\"text-sm text-[var(--navy)] underline\">&iquest;Olvid&oacute; su contrase&ntilde;a?<\/a><\/p>\n        <\/form>\n        <p class=\"b2b-signup text-center text-sm text-gray-500 mt-6 pt-5 border-t border-gray-100\">&iquest;A&uacute;n no es cliente? <a href=\"\/#contacto\" class=\"text-[var(--navy)] font-bold underline\">Solicite acceso<\/a><\/p>\n    <\/div>\n\n    <div id=\"b2b-account-changepw\" class=\"hidden bg-white border border-gray-100 rounded-xl shadow-sm p-8\">\n        <h2 class=\"text-xl font-bold mb-2\">Cree una Nueva Contrase&ntilde;a<\/h2>\n        <p class=\"text-gray-500 text-sm mb-6\">Por seguridad, debe establecer una nueva contrase&ntilde;a antes de continuar.<\/p>\n        <form onsubmit=\"b2bChangePassword(event)\">\n            <div class=\"mb-4\">\n                <label class=\"block text-sm font-bold mb-1\" for=\"b2b-newpw-1\">Nueva contrase&ntilde;a<\/label>\n                <input autocomplete=\"new-password\" type=\"password\" id=\"b2b-newpw-1\" required minlength=\"8\" class=\"w-full border border-gray-200 rounded-md px-4 py-2.5 focus:outline-none focus:ring-2 focus:ring-[var(--navy)]\">\n            <\/div>\n            <div class=\"mb-4\">\n                <label class=\"block text-sm font-bold mb-1\" for=\"b2b-newpw-2\">Confirmar contrase&ntilde;a<\/label>\n                <input autocomplete=\"new-password\" type=\"password\" id=\"b2b-newpw-2\" required minlength=\"8\" class=\"w-full border border-gray-200 rounded-md px-4 py-2.5 focus:outline-none focus:ring-2 focus:ring-[var(--navy)]\">\n            <\/div>\n            <p id=\"b2b-changepw-error\" role=\"alert\" class=\"hidden text-sm text-[var(--red)] font-bold mb-4\"><\/p>\n            <button type=\"submit\" id=\"b2b-changepw-btn\" class=\"w-full bg-[var(--navy)] hover:bg-[var(--red)] text-white font-bold py-2.5 rounded-md shadow-md transition-all duration-300\">Guardar Contrase&ntilde;a<\/button>\n        <\/form>\n    <\/div>\n\n    <div id=\"b2b-account-dashboard\" class=\"hidden\">\n        <div class=\"flex justify-between items-center mb-8 bg-white border border-gray-100 rounded-xl shadow-sm p-6\" style=\"flex-wrap:wrap;row-gap:0.5rem\">\n            <div>\n                <p class=\"text-sm text-gray-500\">Bienvenido,<\/p>\n                <p class=\"font-bold text-lg\" id=\"b2b-account-name\"><\/p>\n            <\/div>\n            <a href=\"#\" onclick=\"b2bLogout(); return false;\" class=\"px-4 py-2 text-sm font-bold text-[var(--red)] border border-[var(--red)] rounded-md hover:bg-[var(--red)] hover:text-white transition-all duration-300 flex items-center\">\n                <i data-lucide=\"log-out\" class=\"w-4 h-4 mr-2\"><\/i> Cerrar Sesi&oacute;n\n            <\/a>\n        <\/div>\n\n        <div id=\"b2b-saved-section\" class=\"hidden mb-10\">\n            <h2 class=\"text-xl font-bold mb-1\">Pedidos Guardados<\/h2>\n            <p class=\"text-gray-500 text-sm mb-4\">Pedidos que guard&oacute; para completar m&aacute;s tarde. Cont&iacute;nuelos cuando est&eacute; listo para enviarlos.<\/p>\n            <div id=\"b2b-saved-list\" class=\"space-y-4\"><\/div>\n        <\/div>\n\n        <h2 class=\"text-xl font-bold mb-4\">Historial de Pedidos<\/h2>\n        <div id=\"b2b-orders-loading\" class=\"text-center text-gray-500 py-8\">Cargando pedidos&#8230;<\/div>\n        <div id=\"b2b-orders-empty\" class=\"hidden text-center text-gray-500 py-8\">Todav&iacute;a no tiene pedidos registrados.<\/div>\n        <div id=\"b2b-orders-list\" class=\"space-y-4\"><\/div>\n    <\/div>\n\n<\/div>\n\n\n\n<footer class=\"b2b-footer py-8 mt-auto\">\n    <div class=\"max-w-7xl mx-auto px-4 text-center\">\n        <p class=\"font-bold text-lg mb-2\">IPB &#8211; International Power Brands<\/p>\n        <p class=\"text-sm silver\">&copy; 2026 Todos los derechos reservados.<\/p>\n    <\/div>\n<\/footer>\n\n<script>\ndocument.addEventListener('DOMContentLoaded', function () {\n    if (typeof lucide !== 'undefined') {\n        lucide.createIcons();\n    }\n\n    if (typeof b2bIsAdmin !== 'undefined' && b2bIsAdmin) {\n        document.getElementById('b2b-nav-admin').classList.remove('hidden');\n    }\n\n    if (typeof b2bLoggedIn !== 'undefined' && b2bLoggedIn) {\n        if (typeof b2bForcePasswordChange !== 'undefined' && b2bForcePasswordChange) {\n            document.getElementById('b2b-account-changepw').classList.remove('hidden');\n        } else {\n            document.getElementById('b2b-account-dashboard').classList.remove('hidden');\n            document.getElementById('b2b-account-name').textContent = b2bUserName || '';\n            b2bLoadOrders();\n            b2bLoadSavedCarts();\n        }\n    } else {\n        document.getElementById('b2b-account-login').classList.remove('hidden');\n    }\n});\n\nfunction b2bDoLogin(e) {\n    e.preventDefault();\n    var btn = document.getElementById('b2b-login-btn');\n    var errEl = document.getElementById('b2b-login-error');\n    errEl.classList.add('hidden');\n    btn.disabled = true;\n    btn.innerText = 'Iniciando sesi\u00f3n...';\n\n    fetch('\/wp-json\/b2b\/v1\/login', {\n        method: 'POST',\n        credentials: 'same-origin',\n        headers: { 'Content-Type': 'application\/json' },\n        body: JSON.stringify({\n            username: document.getElementById('b2b-login-email').value,\n            password: document.getElementById('b2b-login-pass').value\n        })\n    }).then(function (r) { return r.json().then(function (data) { return { ok: r.ok, data: data }; }); })\n      .then(function (res) {\n        if (res.ok && res.data && res.data.success) {\n            var params = new URLSearchParams(window.location.search);\n            var redirect = params.get('redirect_to');\n            window.location.href = redirect || window.location.pathname;\n        } else {\n            errEl.textContent = (res.data && res.data.message) ? res.data.message : 'Correo o contrase\u00f1a incorrectos.';\n            errEl.classList.remove('hidden');\n            btn.disabled = false;\n            btn.innerText = 'Iniciar Sesi\u00f3n';\n        }\n    }).catch(function () {\n        errEl.textContent = 'Hubo un error al iniciar sesi\u00f3n.';\n        errEl.classList.remove('hidden');\n        btn.disabled = false;\n        btn.innerText = 'Iniciar Sesi\u00f3n';\n    });\n}\n\nfunction b2bChangePassword(e) {\n    e.preventDefault();\n    var btn = document.getElementById('b2b-changepw-btn');\n    var errEl = document.getElementById('b2b-changepw-error');\n    errEl.classList.add('hidden');\n\n    var pw1 = document.getElementById('b2b-newpw-1').value;\n    var pw2 = document.getElementById('b2b-newpw-2').value;\n    if (pw1 !== pw2) {\n        errEl.textContent = 'Las contrase\u00f1as no coinciden.';\n        errEl.classList.remove('hidden');\n        return;\n    }\n\n    btn.disabled = true;\n    btn.innerText = 'Guardando...';\n\n    fetch('\/wp-json\/b2b\/v1\/change-password', {\n        method: 'POST',\n        credentials: 'same-origin',\n        headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': b2bNonce },\n        body: JSON.stringify({ new_password: pw1 })\n    }).then(function (r) { return r.json().then(function (data) { return { ok: r.ok, data: data }; }); })\n      .then(function (res) {\n        if (res.ok && res.data && res.data.success) {\n            document.getElementById('b2b-account-changepw').classList.add('hidden');\n            document.getElementById('b2b-account-dashboard').classList.remove('hidden');\n            document.getElementById('b2b-account-name').textContent = b2bUserName || '';\n            b2bLoadOrders();\n            b2bLoadSavedCarts();\n        } else {\n            errEl.textContent = (res.data && res.data.message) ? res.data.message : 'No se pudo actualizar la contrase\u00f1a.';\n            errEl.classList.remove('hidden');\n            btn.disabled = false;\n            btn.innerText = 'Guardar Contrase\u00f1a';\n        }\n    }).catch(function () {\n        errEl.textContent = 'Hubo un error al actualizar la contrase\u00f1a.';\n        errEl.classList.remove('hidden');\n        btn.disabled = false;\n        btn.innerText = 'Guardar Contrase\u00f1a';\n    });\n}\n\nfunction b2bLogout() {\n    if (typeof b2bLogoutUrl !== 'undefined' && b2bLogoutUrl) {\n        window.location.href = b2bLogoutUrl;\n    }\n}\n\nfunction b2bLoadOrders() {\n    fetch('\/wp-json\/b2b\/v1\/orders', {\n        credentials: 'same-origin',\n        headers: { 'X-WP-Nonce': b2bNonce }\n    }).then(function (r) { return r.json(); })\n      .then(function (data) {\n        document.getElementById('b2b-orders-loading').classList.add('hidden');\n        var orders = (data && data.orders) ? data.orders : [];\n        if (!orders.length) {\n            document.getElementById('b2b-orders-empty').classList.remove('hidden');\n            return;\n        }\n        var html = orders.map(function (o) {\n            var meta = o.date + (o.company ? ' \u00b7 ' + o.company : '');\n            var deliv = o.delivery_date ? '<span class=\"text-gray-500\">Embarque: <b class=\"text-[var(--navy)]\">' + o.delivery_date + (o.cancel_date ? ' &rarr; ' + o.cancel_date : '') + '<\/b><\/span>' : '';\n            return '' +\n                '<div class=\"bg-white border border-gray-100 rounded-xl shadow-sm p-5\">' +\n                '  <div class=\"flex flex-wrap justify-between items-start gap-2 mb-2\">' +\n                '    <div><p class=\"font-bold\">Pedido #' + o.number + '<\/p><p class=\"text-sm text-gray-500\">' + meta + '<\/p><\/div>' +\n                '    <span class=\"b2b-presale-badge\">' + o.status + '<\/span>' +\n                '  <\/div>' +\n                '  <div class=\"flex flex-wrap gap-x-6 gap-y-1 text-sm mb-3\">' +\n                '    <span class=\"text-gray-500\">Unidades: <b class=\"text-[var(--navy)]\">' + (o.units || 0) + '<\/b><\/span>' +\n                '    <span class=\"text-gray-500\">Total: <b class=\"text-[var(--red)]\">' + o.currency + Number(o.total).toFixed(2) + '<\/b><\/span>' +\n                '    ' + deliv +\n                '  <\/div>' +\n                '  <div class=\"flex flex-wrap gap-2\">' +\n                '    <button onclick=\"b2bToggleOrderDetail(' + o.id + ', this)\" class=\"text-sm font-bold text-[var(--navy)] border border-[var(--navy)] rounded-md px-4 py-1.5 hover:bg-[var(--navy)] hover:text-white transition-all\">Ver detalle<\/button>' +\n                '    <button onclick=\"b2bReorder(' + o.id + ', this)\" class=\"text-sm font-bold text-white bg-[var(--red)] hover:bg-[var(--dark-navy)] rounded-md px-4 py-1.5 transition-all\">Volver a pedir<\/button>' +\n                '    <button onclick=\"b2bDownloadOrderExcel(' + o.id + ', this)\" class=\"text-sm font-bold text-green-700 border border-green-600 rounded-md px-4 py-1.5 hover:bg-green-600 hover:text-white transition-all\">Excel<\/button>' +\n                '  <\/div>' +\n                '  <div id=\"b2b-order-detail-' + o.id + '\" class=\"hidden mt-4\"><\/div>' +\n                '<\/div>';\n        }).join('');\n        document.getElementById('b2b-orders-list').innerHTML = html;\n    }).catch(function () {\n        document.getElementById('b2b-orders-loading').textContent = 'No se pudo cargar el historial de pedidos.';\n    });\n}\n\nfunction b2bToggleOrderDetail(id, btn) {\n    var panel = document.getElementById('b2b-order-detail-' + id);\n    if (!panel) return;\n    if (!panel.classList.contains('hidden')) {\n        panel.classList.add('hidden');\n        btn.innerText = 'Ver detalle';\n        return;\n    }\n    panel.classList.remove('hidden');\n    btn.innerText = 'Ocultar detalle';\n    if (panel.dataset.loaded === '1') return;\n    panel.innerHTML = '<p class=\"text-sm text-gray-400 py-3\">Cargando detalle...<\/p>';\n    fetch('\/wp-json\/b2b\/v1\/order\/' + id, { credentials: 'same-origin', headers: { 'X-WP-Nonce': b2bNonce } })\n      .then(function (r) { return r.json(); })\n      .then(function (d) { b2bRenderOrderDetail(d, panel); panel.dataset.loaded = '1'; })\n      .catch(function () { panel.innerHTML = '<p class=\"text-sm text-[var(--red)] py-3\">No se pudo cargar el detalle.<\/p>'; });\n}\n\nfunction b2bRenderOrderDetail(d, panel) {\n    var head = '<div class=\"bg-gray-50 border border-gray-100 rounded-lg p-4 mb-4 flex flex-wrap gap-x-8 gap-y-2 text-sm\">';\n    head += '<div><span class=\"text-gray-400 text-xs uppercase block\">Unidades<\/span><b class=\"text-[var(--navy)]\">' + d.units + '<\/b><\/div>';\n    head += '<div><span class=\"text-gray-400 text-xs uppercase block\">Total<\/span><b class=\"text-[var(--red)]\">' + d.currency + Number(d.total).toFixed(2) + '<\/b><\/div>';\n    if (d.delivery_date) { head += '<div><span class=\"text-gray-400 text-xs uppercase block\">Inicio de embarque<\/span><b>' + d.delivery_date + '<\/b><\/div>'; }\n    if (d.cancel_date) { head += '<div><span class=\"text-gray-400 text-xs uppercase block\">Fecha de cancelacion<\/span><b>' + d.cancel_date + '<\/b><\/div>'; }\n    if (d.company) { head += '<div><span class=\"text-gray-400 text-xs uppercase block\">Cliente<\/span><b>' + d.company + '<\/b><\/div>'; }\n    head += '<div><span class=\"text-gray-400 text-xs uppercase block\">Estado<\/span><b>' + d.status + '<\/b><\/div>'; if (d.customer_po) { head += '<div><span class=\"text-gray-400 text-xs uppercase block\">Tu PO<\/span><b>' + d.customer_po + '<\/b><\/div>'; }\n    if (d.catalog) { head += '<div><span class=\"text-gray-400 text-xs uppercase block\">Cat\u00e1logo<\/span><b>' + d.catalog + '<\/b><\/div>'; }\n    head += '<\/div>';\n\n    var body = '';\n    (d.products || []).forEach(function (p) {\n        body += '<div class=\"border border-gray-100 rounded-lg p-3 mb-3\">';\n        body += '<div class=\"flex items-center gap-3 mb-3\">';\n        body += '<img decoding=\"async\" src=\"' + p.image + '\" class=\"w-12 h-12 object-contain bg-gray-50 rounded border flex-shrink-0\">';\n        body += '<div class=\"min-w-0\"><p class=\"font-bold text-sm text-[var(--navy)] leading-tight\">' + p.name + '<\/p><p class=\"text-xs text-gray-400\">SKU: ' + (p.sku || '-') + '<\/p><\/div>';\n        body += '<\/div>';\n        body += '<div class=\"overflow-x-auto\"><table class=\"text-sm border-collapse min-w-full\">';\n        body += '<thead><tr class=\"text-gray-400 text-xs uppercase\"><th class=\"text-left py-1 pr-3 font-bold whitespace-nowrap\">Ancho<\/th>';\n        p.sizes.forEach(function (s) { body += '<th class=\"py-1 px-3 text-center font-bold\">' + s + '<\/th>'; });\n        body += '<th class=\"py-1 pl-4 text-center font-bold\">Total<\/th><\/tr><\/thead><tbody>';\n        p.rows.forEach(function (row) {\n            body += '<tr class=\"border-t border-gray-100\">';\n            body += '<td class=\"py-2 pr-3 font-bold text-[var(--navy)] whitespace-nowrap\">' + row.width + '<\/td>';\n            p.sizes_raw.forEach(function (sr) {\n                var q = row.qtys[sr] || 0;\n                body += '<td class=\"py-2 px-3 text-center ' + (q ? 'text-[var(--navy)] font-bold' : 'text-gray-300') + '\">' + (q || '-') + '<\/td>';\n            });\n            body += '<td class=\"py-2 pl-4 text-center font-bold text-[var(--navy)]\">' + row.total_qty + '<\/td>';\n            body += '<\/tr>';\n        });\n        body += '<\/tbody><\/table><\/div>';\n        body += '<div class=\"flex flex-wrap justify-end gap-x-6 gap-y-1 mt-3 text-sm\"><span class=\"text-gray-400\">Precio: <b class=\"text-[var(--navy)]\">' + d.currency + Number(p.unit_price).toFixed(2) + '<\/b> c\/u<\/span><span class=\"text-gray-400\">Subtotal: <b class=\"text-[var(--red)]\">' + d.currency + Number(p.total_price).toFixed(2) + '<\/b><\/span><\/div>';\n        body += '<\/div>';\n    });\n\n    panel.innerHTML = head + body;\n}\n\nfunction b2bReorder(id, btn) {\n    var original = btn.innerText;\n    btn.disabled = true; btn.innerText = 'Agregando...';\n    fetch('\/wp-json\/b2b\/v1\/reorder', {\n        method: 'POST', credentials: 'same-origin',\n        headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': b2bNonce },\n        body: JSON.stringify({ order_id: id })\n    }).then(function (r) { return r.json().then(function (d) { return { ok: r.ok, data: d }; }); })\n      .then(function (res) {\n        if (res.ok && res.data && res.data.success) {\n            if (res.data.skipped > 0) {\n                alert('Se agregaron ' + res.data.added + ' productos al carrito. ' + res.data.skipped + ' no estan disponibles y se omitieron.');\n            }\n            window.location.href = '\/b2b-portal\/?resumed=1';\n        } else {\n            btn.disabled = false; btn.innerText = original;\n            alert((res.data && res.data.message) ? res.data.message : 'No se pudieron agregar los productos (sin disponibilidad).');\n        }\n    }).catch(function () {\n        btn.disabled = false; btn.innerText = original;\n        alert('No se pudo procesar la reorden.');\n    });\n}\n\nfunction b2bExportToExcel(d, filename) {\n    if (typeof XLSX === 'undefined') { alert('No se pudo cargar el generador de Excel. Intente de nuevo.'); return; }\n    var aoa = [];\n    aoa.push(['Pedido', d.number || d.name || '']);\n    if (d.date) { aoa.push(['Fecha', d.date]); }\n    if (d.status) { aoa.push(['Estado', d.status]); }\n    if (d.company) { aoa.push(['Cliente', d.company]); }\n    if (d.catalog) { aoa.push(['Cat\u00e1logo', d.catalog]); }\n    if (d.delivery_date) { aoa.push(['Inicio de embarque', d.delivery_date]); }\n    if (d.cancel_date) { aoa.push(['Fecha de cancelacion', d.cancel_date]); }\n    aoa.push(['Unidades', d.units || 0]);\n    aoa.push(['Total', (d.currency || '') + Number(d.total || 0).toFixed(2)]);\n    aoa.push([]);\n    aoa.push(['Producto', 'SKU', 'Ancho', 'Talla', 'Cantidad', 'Precio unit.', 'Subtotal']);\n    var grand = 0;\n    (d.products || []).forEach(function (p) {\n        (p.rows || []).forEach(function (row) {\n            (p.sizes_raw || []).forEach(function (sr, i) {\n                var q = row.qtys[sr] || 0;\n                if (!q) { return; }\n                var sub = q * Number(p.unit_price || 0);\n                grand += sub;\n                aoa.push([p.name, p.sku, row.width, p.sizes[i], q, Number(Number(p.unit_price || 0).toFixed(2)), Number(sub.toFixed(2))]);\n            });\n        });\n    });\n    aoa.push([]);\n    aoa.push(['', '', '', '', 'Total', '', Number(grand.toFixed(2))]);\n    var ws = XLSX.utils.aoa_to_sheet(aoa);\n    ws['!cols'] = [{ wch: 40 }, { wch: 14 }, { wch: 8 }, { wch: 8 }, { wch: 10 }, { wch: 12 }, { wch: 12 }];\n    var wb = XLSX.utils.book_new();\n    XLSX.utils.book_append_sheet(wb, ws, 'Pedido');\n    XLSX.writeFile(wb, filename);\n}\n\nfunction b2bDownloadOrderExcel(id, btn) {\n    var original = btn ? btn.innerText : '';\n    if (btn) { btn.disabled = true; btn.innerText = '...'; }\n    fetch('\/wp-json\/b2b\/v1\/order\/' + id, { credentials: 'same-origin', headers: { 'X-WP-Nonce': b2bNonce } })\n      .then(function (r) { return r.json(); })\n      .then(function (d) { b2bExportToExcel(d, 'pedido-' + (d.number || id) + '.xlsx'); if (btn) { btn.disabled = false; btn.innerText = original; } })\n      .catch(function () { if (btn) { btn.disabled = false; btn.innerText = original; } alert('No se pudo descargar el pedido.'); });\n}\n\nfunction b2bDownloadSavedExcel(id) {\n    fetch('\/wp-json\/b2b\/v1\/saved-cart\/' + id, { credentials: 'same-origin', headers: { 'X-WP-Nonce': b2bNonce } })\n      .then(function (r) { return r.json(); })\n      .then(function (d) { var nm = (d.name || 'pedido').replace(\/[^a-z0-9]+\/gi, '-').toLowerCase(); b2bExportToExcel(d, 'pedido-guardado-' + nm + '.xlsx'); })\n      .catch(function () { alert('No se pudo descargar el pedido guardado.'); });\n}\n\nfunction b2bLoadSavedCarts() {\n    fetch('\/wp-json\/b2b\/v1\/saved-carts', {\n        credentials: 'same-origin',\n        headers: { 'X-WP-Nonce': b2bNonce }\n    }).then(function (r) { return r.json(); })\n      .then(function (data) {\n        var carts = (data && data.saved_carts) ? data.saved_carts : [];\n        var section = document.getElementById('b2b-saved-section');\n        var list = document.getElementById('b2b-saved-list');\n        if (!section || !list) return;\n        if (!carts.length) { section.classList.add('hidden'); list.innerHTML = ''; return; }\n        section.classList.remove('hidden');\n        list.innerHTML = '';\n        carts.forEach(function (c) {\n            var prods = (c.products || []).join(', ');\n            var card = document.createElement('div');\n            card.className = 'bg-white border border-gray-100 rounded-xl shadow-sm p-5';\n            var head = document.createElement('div');\n            head.className = 'flex flex-wrap justify-between items-center mb-1';\n            var nm = document.createElement('p'); nm.className = 'font-bold'; nm.textContent = c.name;\n            var dt = document.createElement('span'); dt.className = 'text-xs text-gray-400'; dt.textContent = c.created;\n            head.appendChild(nm); head.appendChild(dt);\n            var meta = document.createElement('p');\n            meta.className = 'text-sm text-gray-500 mb-3';\n            meta.textContent = c.item_count + ' pares' + (prods ? ' \u00b7 ' + prods : '');\n            var foot = document.createElement('div');\n            foot.className = 'flex flex-wrap justify-between items-center gap-2';\n            var total = document.createElement('p');\n            total.className = 'font-bold text-[var(--red)]';\n            total.textContent = c.currency + Number(c.total).toFixed(2);\n            var actions = document.createElement('div');\n            actions.className = 'flex gap-2';\n            var cont = document.createElement('button');\n            cont.className = 'px-4 py-2 text-sm font-bold bg-[var(--navy)] text-white rounded-md hover:bg-[var(--red)] transition-all';\n            cont.textContent = 'Continuar';\n            cont.onclick = function () { b2bResumeCart(c.id, cont); };\n            var del = document.createElement('button');\n            del.className = 'px-4 py-2 text-sm font-bold text-[var(--red)] border border-[var(--red)] rounded-md hover:bg-[var(--red)] hover:text-white transition-all';\n            del.textContent = 'Eliminar';\n            del.onclick = function () { b2bDeleteSavedCart(c.id, del); };\n            var xls = document.createElement('button');\n            xls.className = 'px-4 py-2 text-sm font-bold text-green-700 border border-green-600 rounded-md hover:bg-green-600 hover:text-white transition-all';\n            xls.textContent = 'Excel';\n            xls.onclick = function () { b2bDownloadSavedExcel(c.id); };\n            actions.appendChild(cont); actions.appendChild(xls); actions.appendChild(del);\n            foot.appendChild(total); foot.appendChild(actions);\n            card.appendChild(head); card.appendChild(meta); card.appendChild(foot);\n            list.appendChild(card);\n        });\n    }).catch(function () { \/* silent *\/ });\n}\n\nfunction b2bResumeCart(id, btn) {\n    if (btn) { btn.disabled = true; btn.innerText = 'Cargando...'; }\n    fetch('\/wp-json\/b2b\/v1\/resume-cart', {\n        method: 'POST', credentials: 'same-origin',\n        headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': b2bNonce },\n        body: JSON.stringify({ id: id })\n    }).then(function (r) { return r.json().then(function (d) { return { ok: r.ok, data: d }; }); })\n      .then(function (res) {\n        if (res.ok && res.data && res.data.success) {\n            window.location.href = '\/b2b-portal\/?resumed=1';\n        } else {\n            if (btn) { btn.disabled = false; btn.innerText = 'Continuar'; }\n            alert((res.data && res.data.message) ? res.data.message : 'No se pudo continuar el pedido.');\n        }\n    }).catch(function () {\n        if (btn) { btn.disabled = false; btn.innerText = 'Continuar'; }\n        alert('No se pudo continuar el pedido.');\n    });\n}\n\nfunction b2bDeleteSavedCart(id, btn) {\n    if (!confirm('Eliminar este pedido guardado?')) return;\n    if (btn) { btn.disabled = true; }\n    fetch('\/wp-json\/b2b\/v1\/delete-saved-cart', {\n        method: 'POST', credentials: 'same-origin',\n        headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': b2bNonce },\n        body: JSON.stringify({ id: id })\n    }).then(function (r) { return r.json(); })\n      .then(function () { b2bLoadSavedCarts(); })\n      .catch(function () { if (btn) { btn.disabled = false; } alert('No se pudo eliminar.'); });\n}\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Volver al sitio web Volver al Portal Mi Cuenta Admin Portal B2BMi Cuenta Inicie sesi&oacute;n [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"blank","meta":{"_acf_changed":false,"_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-555","page","type-page","status-publish","hentry"],"acf":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"trp-custom-language-flag":false,"woocommerce_thumbnail":false,"woocommerce_single":false,"woocommerce_gallery_thumbnail":false},"uagb_author_info":{"display_name":"jpiris2500@gmail.com","author_link":"https:\/\/internationalpowerbrands.com\/en\/author\/jpiris2500gmail-com\/"},"uagb_comment_info":0,"uagb_excerpt":"Volver al sitio web Volver al Portal Mi Cuenta Admin Portal B2BMi Cuenta Inicie sesi&oacute;n [&hellip;]","_links":{"self":[{"href":"https:\/\/internationalpowerbrands.com\/en\/wp-json\/wp\/v2\/pages\/555","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/internationalpowerbrands.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/internationalpowerbrands.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/internationalpowerbrands.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/internationalpowerbrands.com\/en\/wp-json\/wp\/v2\/comments?post=555"}],"version-history":[{"count":20,"href":"https:\/\/internationalpowerbrands.com\/en\/wp-json\/wp\/v2\/pages\/555\/revisions"}],"predecessor-version":[{"id":17015,"href":"https:\/\/internationalpowerbrands.com\/en\/wp-json\/wp\/v2\/pages\/555\/revisions\/17015"}],"wp:attachment":[{"href":"https:\/\/internationalpowerbrands.com\/en\/wp-json\/wp\/v2\/media?parent=555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}