Conectando...
Gliica
Administración
SG
Sabrina Gutiérrez
Administrador
Principal
Dashboard
Clientes
Fondos / Saldos
Informes
Informes / E. Cuenta
Contratos
Configuración
Tarifario completo
Config. tipos OP
Tickets soporte0
Bitácora
Limpieza sistema
Manual admin
Config. Gliica
Alertas3
v5.0 · Sesión sin expiración
Gliica · 2026
Salir
Dashboard
Gliica International · Sabrina Gutiérrez · Administrador
👥
Clientes activos
4
↑ +1 este mes
📋
OPs activas
0
cargando...
💰
Volumen mayo
$47.2k
↑ +18% vs abril
📊
Comisiones cobradas
$1,369
2.9% · $218k acum.
OPs que requieren acción
Haz clic para gestionar
Saldos por cliente
Distribución OPs
Gestión de clientes
ClienteEmpresa / RIFContratoVigenciaSaldoOPs activasVol. 2026ComisiónEstado
Fondos y Saldos
Movimientos
Generador de informes automáticos
Basados en datos reales del sistema
📊
Informe mensual
OPs ejecutadas del período con cargos y comisiones
📋
Estado de cuenta
Balance corriente con saldo disponible
🤝
Referencia comercial
Carta comercial para uso ante terceros (no bancaria)
Historial de informes
TipoClientePeríodoGenerado
Ref.ClienteEmpresaInicioVencimientoComisiónEstadoDías
📌 Tarifario basado en Anexo D del Contrato. Cambia de Manual a Auto para que el cargo aplique automáticamente en nuevas OPs. Los cambios de comisión requieren 30 días de notificación (Cláusula 7).
Tarifario vigente · Ajustable
Concepto (Anexo D)ValorUnidadTipo
Calculadora de cargos totales
🛠️ Define los tipos de OP visibles para los clientes. Activa/desactiva y agrega nuevas categorías.
Tipos de OP disponibles para clientes
Bitácora completa
Registro inmutable de todas las acciones
⚠️ Las limpiezas son permanentes. Úsalas solo cuando sea necesario. Haz exportación antes si quieres respaldo.
Manual del Administrador · Gliica Portal v5
Alertas activas
Configuración Gliica
Firma, sello, referencia comercial y alertas
🖊️ Firma y sello oficial de Gliica
Se imprime en todos los contratos y referencias comerciales. Sube la firma de Sabrina Gutiérrez y el sello de Liberty Global C.A.
FIRMA
📝 Clic para subir firma
SELLO
🔵 Clic para subir sello
🤝 Texto de referencia comercial
Este texto aparece en la referencia comercial que se imprime para los clientes. Puedes personalizarlo.
📧 EmailJS — Correos automáticos
🖨️ Imprimir documentos del cliente
Gliica
Portal cliente
CL
Carlos López
Constructora Andina C.A.
Cliente
Principal
Dashboard
Mis OPs3
Autoservicio
Mi saldo / Fondos
Estado de cuenta
Favoritos
Documentos
Mis tarifas
Soporte
Mensajes2
Tickets soporte
Manual / FAQ
Mi perfil
Contrato
LB2026-0142
Salir
Dashboard
Portal de cliente · Gliica International
Movimientos
Estado de cuenta detallado
Con desglose de comisiones y cargos por operación
📋 Esta es tu tabla de tarifas según el Anexo D de tu contrato. Solo consulta — tu ejecutivo gestiona cualquier cambio.
Mis tarifas vigentes · Solo lectura
Mensajes de tu ejecutivo
Mi perfil
Nueva Orden de Operación
OP · —
1 · Tipo
2 · Datos
3 · Confirmar
Paso 1 de 3
Nuevo cliente
Firma y sello se usan en todas sus OPs impresas. Credenciales para acceso al portal.
Acceso al portal
Datos de la empresa
Representante legal
Contrato
Firma y sello oficial (para OPs impresas)
📝 Clic para subir firma (PNG/JPG)
🔵 Clic para subir sello (PNG/JPG)
Nueva OP — Administrador
Para uso de emergencia a nombre de un cliente
🛡️ Esta OP se marcará como creada por el administrador.
Registrar entrada de fondos
📎 Adjuntar comprobante
Solicitar carga de fondos
Transfiere los fondos a la cuenta de Gliica y adjunta el comprobante aquí. El saldo se acreditará tras confirmación del administrador.
📎 Adjuntar comprobante
Nuevo favorito
Devolver OP con observaciones
La OP pasará a Pendiente de corrección. El cliente verá las obs. y podrá corregir y reenviar.
Restablecer contraseña de cliente
Asigna una nueva contraseña. Notifica al cliente por correo o teléfono.
Ticket —
Responder
Nuevo ticket de soporte
Programar OP para otra fecha
📅 Si no deseas programar, deja la fecha vacía y la OP se envía hoy.
'; var w=window.open('','_blank','width=900,height=700'); if(!w||w.closed||typeof w.closed=='undefined'){ alert('⚠️ Tu navegador bloqueó la ventana de impresión.\n\nPor favor:\n1. Busca el ícono de popup bloqueado en la barra del navegador (arriba a la derecha)\n2. Haz clic en él y selecciona "Permitir siempre"\n3. Intenta imprimir de nuevo'); return; } w.document.write(html);w.document.close();setTimeout(function(){w.print();},500); }; /* ─ PRINT ANEXO B — Tarifario ─ */ window.printAnexoB = function(){ var id=(document.getElementById('print-cl-sel')||{}).value||''; if(!id&&DB.clients.length>0){id=DB.clients[0].id;} var c=id?gC(id):{empresa:'(cliente no seleccionado)',rif:'',contrato:''}; var rows=DB.tariffs.map(function(t){ return ''+t.name+''+t.value+(t.unit==='%'?'%':' USD')+''+(t.auto?'Automático':'Manual')+''+(t.desc||'')+''; }).join(''); var html='Anexo B - Tarifario' +'
LIBERTY GLOBAL C.A. / LIBERTY GLOBAL LLC
' +'

ANEXO B — TARIFARIO DE SERVICIOS

' +'
Contrato: '+c.contrato+' · Contratante: '+c.empresa+'
' +'
Conforme a Cláusula 5ª — La comisión del '+((DB.clients.find(function(x){return x.id===id;})||{commission:0.029}).commission*100).toFixed(1)+'% aplica SOLO sobre cada depósito recibido, no sobre cada OP
' +''+rows+'
ServicioTarifaAplicaciónDescripción
' +'
' +'Nota: Los cargos de corresponsales bancarios son fijados por terceros y están fuera del control de Gliica (Cláusula 10ª). ' +'Las tarifas pueden modificarse con 30 días de notificación previa (Cláusula 6ª).
' +''; var w=window.open('','_blank'); if(!w||w.closed){alert('⚠️ Popup bloqueado. Permite popups para este sitio en tu navegador.');return;} w.document.write(html);w.document.close();setTimeout(function(){w.print();},500); }; /* ─ PRINT ANEXO C — Representantes autorizados ─ */ window.printAnexoC = function(){ var id=(document.getElementById('print-cl-sel')||{}).value||''; if(!id){if(DB.clients.length>0){id=DB.clients[0].id;}else{alert('No hay clientes.');return;}} var c=gC(id); var s=DB.settings||{}; var today=new Date().toLocaleDateString('es-VE',{day:'2-digit',month:'long',year:'numeric'}); var html='Anexo C - Representantes' +'
LIBERTY GLOBAL C.A. / LIBERTY GLOBAL LLC
' +'

ANEXO C — REPRESENTANTES AUTORIZADOS

' +'
Contrato '+c.contrato+' · '+c.empresa+'
' +'

Los siguientes representantes están autorizados para emitir, firmar y sellar Órdenes de Operación (OP) con plenos efectos vinculantes para el Contratante ante el Prestador de Servicios:

' +'' +'' +'' +'' +'
#Nombre completoC.I. / PasaporteCargoCorreo autorizadoTipo de autorización
1'+c.rep+''+c.ci+''+c.cargo+''+c.email+'Principal — firma individual
2    Por designar
3    Por designar
' +'

Instrucciones para Órdenes de Operación: Toda OP debe estar firmada y sellada por el Representante Autorizado. ' +'Las OPs sin firma válida o remitidas por canales no autorizados serán rechazadas sin responsabilidad del Prestador de Servicios (Cláusula 19ª).

' +'

Canales autorizados: Correo institucional registrado · Portal operativo portal.gliica.com · Correo: po@gliica.com

' +'
En Caracas, a los '+today+'
' +'
' +'
'+(s.firmaGliicaB64?'':'
')+'
' +(s.selloGliicaB64?'':'') +'SABRINA GUTIERREZ
Liberty Global C.A.
' +'

' +''+c.rep+'
'+c.empresa+'
' +''; var w=window.open('','_blank'); if(!w||w.closed){alert('⚠️ Popup bloqueado. Permite popups para este sitio en tu navegador.');return;} w.document.write(html);w.document.close();setTimeout(function(){w.print();},500); }; /* ─ PRINT REFERENCIA COMERCIAL (Admin) ─ */ window.printRefAdmin = function(){ var id=(document.getElementById('print-cl-sel')||{}).value||''; if(!id){if(DB.clients.length>0){id=DB.clients[0].id;}else{alert('No hay clientes.');return;}} var c=gC(id); var s=DB.settings||{}; var bal=calcBal(id); var opsTotal=DB.ops.filter(function(o){return o.clientId===id;}).length; var today=new Date().toLocaleDateString('es-VE',{day:'2-digit',month:'long',year:'numeric'}); var bodyTxt=(s.refTextBody||'Por medio de la presente, Liberty Global C.A. hace constar que la empresa antes identificada mantiene con nosotros una relación comercial activa bajo Contrato de Administración de Pagos y Recursos bajo Mandato Mercantil, con toda responsabilidad y cumplimiento de sus obligaciones contractuales.') .replace('{{diasVigencia}}','30'); var html='Referencia Comercial - '+c.empresa+'' +'
LIBERTY GLOBAL C.A. · RIF: J-29769685-7
' +'
Av. Libertador c/c La Joya, Edf. Unidad Técnica del Este, P2, Of. 5, Chacao, Caracas · po@gliica.com

' +'

REFERENCIA COMERCIAL

' +'

Caracas, '+today+'

A quien corresponda:

' +'
IDENTIFICACIÓN DEL CONTRATANTE:
' +'Razón Social: '+c.empresa+'
' +'RIF/ID Fiscal: '+c.rif+'
' +'Representante: '+c.rep+' · C.I. '+c.ci+'
' +'Contrato N°: '+c.contrato+' · Vigente: '+c.contractStart+' al '+c.contractEnd+'
' +'
'+bodyTxt.replace(/\n/g,'

')+'

' +'
' +'NOTA LEGAL: Liberty Global C.A. NO realiza intermediación financiera (Art. 7 LISB). Actúa como mandatario mercantil (Art. 376 C.Com.). ' +'La presente referencia se emite a solicitud de parte y no implica garantía de obligaciones de terceros. Vigencia: 30 días hábiles desde la fecha de emisión.
' +'
' +'
'+(s.firmaGliicaB64?'':'
')+'
' +(s.selloGliicaB64?'':'') +'SABRINA GUTIERREZ
C.I. V-7.374.811 · Presidente
Liberty Global C.A.
' +'
' +''+c.rep+'
'+c.cargo+'
'+c.empresa+'
Sello del Contratante
' +''; var w=window.open('','_blank'); if(!w||w.closed){alert('⚠️ Popup bloqueado. Permite popups para este sitio en tu navegador.');return;} w.document.write(html);w.document.close();setTimeout(function(){w.print();},500); }; /* ─ Override aN to init config view when navigating to it ─ */ var _orig_aN = window.aN; window.aN = function(id, el){ _orig_aN(id, el); if(id==='aconfig') initConfigView(); }; /* ─ Override syncAll to also update notif UI ─ */ var _orig_syncAll_notif = syncAll; syncAll = function(){ return _orig_syncAll_notif().then(function(){ syncNotifUI(); }).catch(function(){}); }; /* ─ Override doLogin ─ */ window.doLogin = function(){ var uEl=document.getElementById('login-user'), pEl=document.getElementById('login-pass'); var u=(uEl?uEl.value:'').trim(), p=(pEl?pEl.value:'').trim(); if(!u||!p){ var e=document.getElementById('login-err');if(e)e.style.display='block'; return; } var errEl=document.getElementById('login-err');if(errEl)errEl.style.display='none'; var btn=document.querySelector('.login-btn'); if(btn){btn.textContent='Conectando...';btn.disabled=true;} var reset=function(){if(btn){btn.textContent='Ingresar al portal';btn.disabled=false;}}; function enterPortal(role, clientId){ document.getElementById('s-login').classList.remove('on'); if(role==='admin'){ document.getElementById('s-admin').classList.add('on'); initAdmin(); startSession('admin'); startPoll('admin'); if(typeof loadExchangeRates==='function') loadExchangeRates(); } else { if(typeof trigger2FA==='function'){ trigger2FA({user:u}, function(){ initClient(clientId); document.getElementById('s-client').classList.add('on'); startSession('client'); startPoll('client'); }); } else { initClient(clientId); document.getElementById('s-client').classList.add('on'); startSession('client'); startPoll('client'); } } } function demoFallback(){ var usr=DB.users.find(function(x){return x.user.toLowerCase()===u.toLowerCase()&&x.pass===p;}); if(!usr){ var e=document.getElementById('login-err');if(e)e.style.display='block';reset();return; } _apiOk=false; DB.session={role:usr.role,clientId:usr.clientId||null,userId:usr.id}; enterPortal(usr.role,usr.clientId); reset(); // Show demo mode indicator console.log('⚠️ Modo demo — API no disponible'); } api('login',{user:u,pass:p}) .then(function(d){ reset(); if(d&&d.ok){ _apiOk=true; _token=d.token; localStorage.setItem('gliica_token',_token); DB.session={role:d.role,clientId:d.clientId||null,userId:d.userId}; syncAll().then(function(){ enterPortal(d.role,d.clientId); }).catch(function(){ enterPortal(d.role,d.clientId); }); } else { var e=document.getElementById('login-err');if(e)e.style.display='block'; } }) .catch(function(){ demoFallback(); }); }; /* ─ Override logout ─ */ window.logout = function(){ if(_token){ api('logout',{}).catch(function(){}); } _token=''; localStorage.removeItem('gliica_token'); stopPoll(); if(typeof stopSession==='function') stopSession(); DB.session={role:null,clientId:null}; document.querySelectorAll('.scr').forEach(function(s){s.classList.remove('on');}); var l=document.getElementById('s-login');if(l)l.classList.add('on'); var u=document.getElementById('login-user');if(u)u.value=''; var p=document.getElementById('login-pass');if(p)p.value=''; }; /* ─ Patch markComplete to save to API ─ */ var _orig_markComplete = window.markComplete; window.markComplete = function(opId){ _orig_markComplete(opId); api('complete_op',{opId:opId}).then(function(){syncAll();}).catch(function(){}); }; /* ─ Patch confirmReturn to save to API ─ */ var _orig_confirmReturn = window.confirmReturn; window.confirmReturn = function(){ _orig_confirmReturn(); var op=DB.ops.find(function(o){return o.status==='pendiente_correccion'||o.status==='devuelta';}); if(op) api('return_op',{opId:op.id,comment:op.returnComment||''}).catch(function(){}); }; /* ─ Patch saveClient to save to API ─ */ var _orig_saveClient = window.saveClient; window.saveClient = function(){ _orig_saveClient(); var nc=DB.clients[DB.clients.length-1]; if(nc){ var pEl=document.getElementById('nc-pass'); api('save_client',Object.assign({},nc,{pass:pEl?pEl.value:'changeme'})).catch(function(){}); // Refresh ALL affected sections immediately if(typeof renderContracts==='function') renderContracts(); if(typeof populateSelects==='function') populateSelects(); setTimeout(syncAll,500); } }; /* ─ Save OP to API after client submits ─ */ var _orig_submitClientOP = window.submitClientOP; window.submitClientOP = function(useSched){ _orig_submitClientOP(useSched); var op=DB.ops[0]; if(op) api('save_op',Object.assign({},op,{token:_token})).then(function(){syncAll();}).catch(function(){}); }; /* ─ Patch saveTicket to API ─ */ var _orig_saveTicket = window.saveTicket; window.saveTicket = function(){ _orig_saveTicket(); api('create_ticket',{ subject:(document.getElementById('tc-sub')||{}).value||'', message:(document.getElementById('tc-msg')||{}).value||'', category:(document.getElementById('tc-cat')||{}).value||'', opRef:(document.getElementById('tc-op')||{}).value||'' }).then(function(){syncAll();}).catch(function(){}); }; /* ─ Patch respondTicket to API ─ */ var _orig_respondTicket = window.respondTicket; window.respondTicket = function(){ _orig_respondTicket(); var tk=DB.tickets.find(function(t){return t.id===DB.tkOpId;}); if(tk){ api('respond_ticket',{ ticketId:tk.id, message:(document.getElementById('tka-resp')||{}).value||'', status:(document.getElementById('tka-status')||{}).value||'in_progress' }).then(function(){syncAll();}).catch(function(){}); } }; /* ─ Patch saveFund — capture values BEFORE original clears form ─ */ var _orig_saveFund = window.saveFund; window.saveFund = function(isClient){ // Capture values NOW before original closes modal/clears form var monto = parseFloat((document.getElementById(isClient?'cf-monto':'fe-monto')||{}).value)||0; var clientId = isClient ? DB.session.clientId : (document.getElementById('fe-cl')||{}).value||''; var desc = (document.getElementById(isClient?'cf-desc':'fe-desc')||{}).value || (isClient?'Solicitud carga fondos':'Entrada de fondos'); var voucher = (document.getElementById(isClient?'cf-b64':'fe-b64')||{}).value||''; var status = isClient ? 'pending' : 'confirmed'; if(!monto) return; // original will show alert // Run original (closes modal, shows alert, updates local DB) _orig_saveFund(isClient); // Save to API with pre-captured values if(monto && clientId){ api('save_entry',{ clientId: clientId, type:'in', amount:monto, currency:'USD', desc:desc, voucher:voucher, status:status }).then(function(d){ // Force immediate sync so both admin and client see update syncAll(); }).catch(function(e){ console.log('Fund save fallback (demo mode)'); }); // Force sync regardless of API result (for demo mode too) setTimeout(function(){ try{renderFondos();renderAdminDash();}catch(e){} }, 200); } }; /* ─ Patch doResetPass to API ─ */ var _orig_doResetPass = window.doResetPass; window.doResetPass = function(){ var np=(document.getElementById('rp-new')||{}).value||''; var nc=(document.getElementById('rp-conf')||{}).value||''; if(np&&np===nc&&DB.passResetId){ api('reset_password',{clientId:DB.passResetId,newPass:np}) .then(function(d){if(d&&d.ok){if(typeof toast==='function')toast('Contraseña actualizada ✅');document.getElementById('m-reset-pass').classList.remove('on');}}) .catch(function(){}); } else { if(_orig_doResetPass) _orig_doResetPass(); } }; /* ─ Exchange rates (silent) ─ */ window.loadExchangeRates = function(){ var strip=document.getElementById('fx-strip'); fetch('https://api.frankfurter.app/latest?base=USD&to=EUR,COP') .then(function(r){return r.json();}) .then(function(d){ var ves=document.getElementById('fx-ves'),eur=document.getElementById('fx-eur'),cop=document.getElementById('fx-cop'),tim=document.getElementById('fx-time'); if(ves)ves.textContent='BCV ref.'; if(eur)eur.textContent=d.rates&&d.rates.EUR?d.rates.EUR.toFixed(4):'0.92'; if(cop)cop.textContent=d.rates&&d.rates.COP?Math.round(d.rates.COP).toLocaleString('en'):'3,950'; if(tim)tim.textContent='Actualizado '+new Date().toLocaleTimeString('es',{hour:'2-digit',minute:'2-digit'}); if(strip)strip.style.display='flex'; }).catch(function(){ if(strip)strip.style.display='flex'; var ves=document.getElementById('fx-ves');if(ves)ves.textContent='Ref. BCV'; }); }; /* ─ Check for stored token on load ─ */ document.addEventListener('DOMContentLoaded',function(){ // Show API connection status on login screen fetch('api.php?action=login',{method:'POST',headers:{'Content-Type':'application/json'},body:'{}',signal:AbortSignal.timeout(3000)}) .then(function(r){return r.json();}) .then(function(){ var h=document.getElementById('login-mode-hint'); if(h){h.textContent='🟢 Conectado al servidor · po@gliica.com / admin123';} }) .catch(function(){ var h=document.getElementById('login-mode-hint'); if(h){h.textContent='🟡 Modo demo · po@gliica.com / admin123 · demo@empresa.com / demo123';} }); // Also update admin password in demo if logged in as old admin if(_token){ api('sync','GET').then(function(d){ // Token still valid — auto login not implemented, just clean it if(!d||!d.ok) localStorage.removeItem('gliica_token'); }).catch(function(){}); } // Exchange rates setTimeout(function(){if(typeof loadExchangeRates==='function')loadExchangeRates();},1000); setInterval(function(){if(typeof loadExchangeRates==='function')loadExchangeRates();},5*60*1000); }); })();