{"id":21104,"date":"2026-09-24T11:37:36","date_gmt":"2026-09-24T14:37:36","guid":{"rendered":"https:\/\/jobstore.cl\/?page_id=21104"},"modified":"2026-09-30T15:09:50","modified_gmt":"2026-09-30T18:09:50","slug":"bitacora-karina","status":"publish","type":"page","link":"https:\/\/jobstore.cl\/index.php\/bitak\/","title":{"rendered":"BITAK"},"content":{"rendered":"<style id=\"jkb-noaf-css\">\n@keyframes jkbAfOn{from{outline-offset:0}to{outline-offset:0}}\ninput:-webkit-autofill,select:-webkit-autofill,textarea:-webkit-autofill{animation-name:jkbAfOn;animation-duration:1ms;}\ninput:autofill,select:autofill,textarea:autofill{animation-name:jkbAfOn;animation-duration:1ms;}\n<\/style>\n<script id=\"jkb-noaf-js\">\n(function(){\n  if(window.jkbNoAf) return; window.jkbNoAf = true;\n  var SEL = 'input:not([type=hidden]):not([type=checkbox]):not([type=radio]):not([type=file]):not([type=submit]):not([type=button]):not([type=password]),select,textarea';\n  var prev = new WeakMap();\n  function esAuto(e){ try{ return e.matches(':autofill'); }catch(_){ try{ return e.matches(':-webkit-autofill'); }catch(__){ return false; } } }\n  function blindar(){\n    Array.prototype.forEach.call(document.querySelectorAll('form'), function(f){ if(f.getAttribute('autocomplete')!=='off') f.setAttribute('autocomplete','off'); });\n    Array.prototype.forEach.call(document.querySelectorAll(SEL), function(e){\n      if(e.getAttribute('autocomplete')!=='jkb-no-autofill') e.setAttribute('autocomplete','jkb-no-autofill');\n      if(!esAuto(e)) prev.set(e, e.value);\n    });\n  }\n  function devolver(e){\n    if(!e || e===document.activeElement || !prev.has(e)) return;\n    var v = prev.get(e);\n    if(e.value===v) return;\n    e.value = v;\n    try{ e.dispatchEvent(new Event('input',{bubbles:true})); e.dispatchEvent(new Event('change',{bubbles:true})); }catch(_){}\n    if(window.console) console.warn('[BITAK] Autorrelleno del navegador revertido en', e.id||e.name||e.getAttribute('data-g')||e.tagName);\n  }\n  document.addEventListener('animationstart', function(ev){\n    if(ev.animationName!=='jkbAfOn') return;\n    var e = ev.target; setTimeout(function(){ devolver(e); }, 0);\n  }, true);\n  \/\/ Respaldo: un campo que cambi\u00f3 sin que nadie lo escribiera y qued\u00f3 marcado como autorrellenado.\n  document.addEventListener('input', function(ev){\n    var e = ev.target; if(!e || !e.matches || !e.matches(SEL)) return;\n    if(e!==document.activeElement && ev.isTrusted && esAuto(e)) { setTimeout(function(){ devolver(e); }, 0); return; }\n    if(!esAuto(e)) prev.set(e, e.value);\n  }, true);\n  blindar(); setInterval(blindar, 400);\n})();\n<\/script>\n<style id=\"jkb-gsx-css\">\n.jkbGsx{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin:6px 0 14px;}\n@media (max-width:980px){.jkbGsx{grid-template-columns:repeat(2,minmax(0,1fr));}}\n@media (max-width:560px){.jkbGsx{grid-template-columns:1fr;}}\n.jkbGsxCol{border:1px solid #d9dce1;border-radius:8px;padding:10px 10px 4px;background:#fafbfc;min-width:0;}\n.jkbGsxCol>h4{margin:0 0 8px;font-size:14px;font-weight:700;color:#1d1d1f;border-bottom:1px solid #e3e5e8;padding-bottom:6px;}\n.jkbGsx .jkb-field,.jkbGsx .jkbGsxF,.jkbGsx [data-slot]>div{margin:0 0 8px;min-width:0;}\n.jkbGsx label{display:block;font-size:12px;font-weight:600;color:#555;margin:0 0 3px;}\n.jkbGsx input:not([type=checkbox]),.jkbGsx select,.jkbGsx textarea{width:100%;box-sizing:border-box;}\n.jkbGsx textarea{min-height:74px;}\n.jkbGsxPar{display:grid;grid-template-columns:1fr 1fr;gap:8px;}\n.jkbGsxPar.cc{grid-template-columns:42% 1fr;}\n.jkbGsxChk{display:flex !important;align-items:center;gap:6px;font-weight:500 !important;}\n.jkbGsxChk input{width:auto !important;}\n.jkbGsxNota{font-size:11.5px;color:#666;}\n.jkbGsxHide,.jkbGsxHideSet{display:none !important;}\n.jkbGsx #jkbEqSerie,.jkbGsx [name=numero_serie]{font-weight:700;}\n<\/style>\n<script id=\"jkb-gsx-js\">\n(function(){\n  if(window.jkbGsxCargado) return; window.jkbGsxCargado = true;\n  var $ = function(id){ return document.getElementById(id); };\n  var esc = function(s){ return String(s==null?'':s).replace(\/[&<>\"']\/g,function(c){return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c];}); };\n  var REGIONES = [['AP','Arica y Parinacota'],['TA','Tarapac\u00e1'],['AN','Antofagasta'],['AT','Atacama'],['CO','Coquimbo'],['VS','Valpara\u00edso'],['RM','Metropolitana de Santiago'],['LI','O\\'Higgins'],['ML','Maule'],['NB','\u00d1uble'],['BI','Biob\u00edo'],['AR','La Araucan\u00eda'],['LR','Los R\u00edos'],['LL','Los Lagos'],['AI','Ays\u00e9n'],['MA','Magallanes']];\n  var PAISES = [['CHL','Chile'],['ARG','Argentina'],['PER','Per\u00fa'],['BOL','Bolivia'],['COL','Colombia'],['BRA','Brasil'],['URY','Uruguay'],['PRY','Paraguay'],['ECU','Ecuador'],['VEN','Venezuela'],['MEX','M\u00e9xico'],['USA','Estados Unidos'],['ESP','Espa\u00f1a']];\n  var CODIGOS = [['+56','Chile +56'],['+54','Argentina +54'],['+51','Per\u00fa +51'],['+591','Bolivia +591'],['+57','Colombia +57'],['+55','Brasil +55'],['+598','Uruguay +598'],['+595','Paraguay +595'],['+593','Ecuador +593'],['+58','Venezuela +58'],['+52','M\u00e9xico +52'],['+1','EE.UU.\/Canad\u00e1 +1'],['+34','Espa\u00f1a +34']];\n  var COMP = {\n    'Pantalla':['L\u00edneas\/bloques\/bandas','Sin imagen','T\u00e1ctil no responde','Vidrio roto o trizado','Manchas o p\u00edxeles','Parpadeo','Brillo o color an\u00f3malo'],\n    'Bater\u00eda':['Se descarga r\u00e1pido','Servicio de bater\u00eda \/ condici\u00f3n','Hinchada','Se apaga sola'],\n    'Carga \/ conector':['No carga con cable','No carga inal\u00e1mbrica (MagSafe)','Conector da\u00f1ado o suelto'],\n    'Encendido':['No enciende','Se reinicia','Arranque en bucle (logo)'],\n    'C\u00e1mara posterior':['No funciona','Imagen borrosa o manchas','Vidrio de lente roto','Flash no funciona'],\n    'C\u00e1mara frontal \/ Face ID':['Face ID no disponible','C\u00e1mara frontal no funciona','Touch ID no funciona'],\n    'Audio':['Altavoz sin sonido o distorsionado','Micr\u00f3fono no funciona','Auricular (receptor) sin sonido'],\n    'Botones':['Bot\u00f3n lateral \/ encendido','Botones de volumen','Bot\u00f3n de acci\u00f3n \/ silencio'],\n    'Conectividad':['Sin servicio \/ se\u00f1al','Wi\u2011Fi o Bluetooth','SIM \/ eSIM no reconocida','GPS \/ ubicaci\u00f3n'],\n    'Carcasa':['Vidrio posterior roto','Carcasa doblada o golpeada'],\n    'L\u00edquido':['Contacto con l\u00edquido'],\n    'Software':['Falla de software \/ actualizaci\u00f3n','Activaci\u00f3n \/ bloqueo'],\n    'Teclado \/ trackpad (Mac)':['Teclas no funcionan','Trackpad no responde'],\n    'Otro':['Otro (detallar en notas)']\n  };\n  var CLASIF = ['Env\u00edo directo','Reparaci\u00f3n en taller (Carry-In)','Env\u00edo a Apple (Mail-In)','Reemplazo de unidad completa','Solo diagn\u00f3stico','Otro'];\n  function opts(lista, vacio){ return (vacio?'<option value=\"\">'+esc(vacio)+'<\/option>':'') + lista.map(function(x){ return '<option value=\"'+esc(x[0])+'\">'+esc(x[1])+'<\/option>'; }).join(''); }\n  function optsComp(){ var h='<option value=\"\">Seleccionar<\/option>'; Object.keys(COMP).forEach(function(c){ h+='<optgroup label=\"'+esc(c)+'\">'+COMP[c].map(function(p){ var v=c+' \/ '+p; return '<option value=\"'+esc(v)+'\">'+esc(p)+'<\/option>'; }).join('')+'<\/optgroup>'; }); return h; }\n  function regionNombre(c){ for(var i=0;i<REGIONES.length;i++) if(REGIONES[i][0]===c) return REGIONES[i][1]; return c||''; }\n  function paisNombre(c){ for(var i=0;i<PAISES.length;i++) if(PAISES[i][0]===c) return PAISES[i][1]; return c||''; }\n\n  function partirNombre(full){\n    var t = String(full||'').trim().split(\/\\s+\/).filter(Boolean);\n    if(!t.length) return ['',''];\n    if(t.length===1) return [t[0],''];\n    if(t.length<=3) return [t[0], t.slice(1).join(' ')];\n    return [t.slice(0,2).join(' '), t.slice(2).join(' ')];\n  }\n  function partirTel(tel){\n    var s = String(tel||'').replace(\/[\\s\\-().]\/g,'');\n    if(!s) return ['+56',''];\n    if(s.charAt(0)==='+'){\n      var cods = CODIGOS.map(function(c){return c[0];}).sort(function(a,b){return b.length-a.length;});\n      for(var i=0;i<cods.length;i++) if(s.indexOf(cods[i])===0) return [cods[i], s.slice(cods[i].length)];\n      return ['+56', s.replace(\/^\\+\/,'')];\n    }\n    if(\/^56\\d{9}$\/.test(s)) return ['+56', s.slice(2)];\n    return ['+56', s];\n  }\n  function armarDir(g){\n    var p = [g.l1, g.l2, g.ciudad, g.region ? regionNombre(g.region) : ''];\n    if(g.pais && g.pais!=='CHL') p.push(paisNombre(g.pais));\n    return p.map(function(x){ return String(x||'').trim(); }).filter(Boolean).join(', ');\n  }\n\n  \/* --- HTML del bloque; modo 'eq' (ficha, por id) o 'ing' (Ingreso, por name) --- *\/\n  function campo(modo, k, label, html){\n    return '<div class=\"jkbGsxF'+(modo==='eq'?' jkb-field':'')+'\"><label>'+label+'<\/label>'+html+'<\/div>';\n  }\n  function inp(modo, k, extra){ return '<input data-g=\"'+k+'\"'+(modo==='ing'?' name=\"gsx_'+k+'\"':'')+(extra||'')+'>'; }\n  function sel(modo, k, inner){ return '<select data-g=\"'+k+'\"'+(modo==='ing'?' name=\"gsx_'+k+'\"':'')+'>'+inner+'<\/select>'; }\n  function bloque(modo){\n    var eq = modo==='eq';\n    return '<div class=\"jkbGsx\" data-gsx-modo=\"'+modo+'\">'\n      + '<div class=\"jkbGsxCol\"><h4>Dispositivo<\/h4>'\n        + '<div data-slot=\"tipo\"><\/div><div data-slot=\"modelo\"><\/div>'\n        + (eq ? campo(modo,'config','Configuraci\u00f3n <span class=\"jkbGsxNota\">(GSX)<\/span>', inp(modo,'config',' placeholder=\"Ej: IPHONE 16,ROW,128GB,WHT\"')) : '<div data-slot=\"config\"><\/div>')\n        + '<div data-slot=\"serie\"><\/div>'\n        + (eq ? campo(modo,'imei','IMEI', inp(modo,'imei',' inputmode=\"numeric\"')) : '<div data-slot=\"imei\"><\/div>')\n        + campo(modo,'imei2','IMEI 2', inp(modo,'imei2',' inputmode=\"numeric\"'))\n        + (eq ? '' : '<div data-slot=\"buscar\"><\/div><div data-slot=\"acc\"><\/div>')\n      + '<\/div>'\n      + '<div class=\"jkbGsxCol\"><h4>Reparaci\u00f3n<\/h4>'\n        + (eq ? '<div class=\"jkbGsxPar\"><div data-slot=\"ot\"><\/div><div data-slot=\"sro\"><\/div><\/div>' : '')\n        + (eq ? '<div class=\"jkbGsxPar\"><div data-slot=\"fecha\"><\/div>'+campo(modo,'hora','Hora', '<input type=\"time\" data-g=\"hora\">')+'<\/div>'\n              : campo(modo,'rec','Fecha y hora de recepci\u00f3n', '<div class=\"jkbGsxNota\" data-g-reloj>Se registra autom\u00e1ticamente al guardar.<\/div>'))\n        + campo(modo,'comp','Componente o problema notificado por el cliente', sel(modo,'comp',optsComp()))\n        + '<div data-slot=\"notas\"><\/div>'\n        + campo(modo,'po','Pedido de compra', inp(modo,'po',' placeholder=\"Vac\u00edo = IW OT\u2026\"'))\n        + campo(modo,'ref','Referencia', inp(modo,'ref',' placeholder=\"Vac\u00edo = IW OT\u2026\"'))\n        + campo(modo,'clasif','Clasificaci\u00f3n de la reparaci\u00f3n', sel(modo,'clasif','<option value=\"\">Seleccionar<\/option>'+CLASIF.map(function(c){return '<option>'+esc(c)+'<\/option>';}).join('')))\n      + '<\/div>'\n      + '<div class=\"jkbGsxCol\"><h4>Cliente<\/h4>'\n        + '<div data-slot=\"rut\"><\/div>'\n        + campo(modo,'nombre','Nombre'+(eq?'':' <span class=\"req\">*<\/span>'), inp(modo,'nombre', eq?'':' required'))\n        + campo(modo,'apellido','Apellido', inp(modo,'apellido'))\n        + '<div data-slot=\"email\"><\/div>'\n        + '<div class=\"jkbGsxF'+(eq?' jkb-field':'')+'\"><label>N\u00famero de tel\u00e9fono<\/label><div class=\"jkbGsxPar cc\">'+sel(modo,'cc',opts(CODIGOS))+inp(modo,'tel',' inputmode=\"tel\" placeholder=\"912345678\"')+'<\/div><\/div>'\n        + '<div class=\"jkbGsxF'+(eq?' jkb-field':'')+'\"><label class=\"jkbGsxChk\"><input type=\"checkbox\" data-g=\"sms\"'+(modo==='ing'?' name=\"gsx_sms\" value=\"1\"':'')+'> Actualizaci\u00f3n por SMS<\/label><\/div>'\n      + '<\/div>'\n      + '<div class=\"jkbGsxCol\"><h4>Direcci\u00f3n<\/h4>'\n        + campo(modo,'empresa','Empresa', inp(modo,'empresa'))\n        + campo(modo,'l1','L\u00ednea de direcci\u00f3n 1', inp(modo,'l1',' placeholder=\"Calle y n\u00famero\"'))\n        + campo(modo,'l2','L\u00ednea de direcci\u00f3n 2', inp(modo,'l2',' placeholder=\"Depto, oficina, villa\u2026\"'))\n        + campo(modo,'ciudad','Ciudad \/ comuna', inp(modo,'ciudad'))\n        + '<div class=\"jkbGsxPar\">'+campo(modo,'region','Regi\u00f3n', sel(modo,'region',opts(REGIONES,'Seleccionar')))+campo(modo,'cp','C\u00f3digo postal', inp(modo,'cp',' inputmode=\"numeric\"'))+'<\/div>'\n        + campo(modo,'pais','Pa\u00eds\/Regi\u00f3n', sel(modo,'pais',opts(PAISES)))\n      + '<\/div>'\n    + '<\/div>';\n  }\n\n  \/* --- utilidades comunes de sincronizaci\u00f3n con los campos antiguos --- *\/\n  function Ctl(root, origs){\n    var c = { root: root, o: origs, last: {cli:'', tel:'', dir:''} };\n    c.g = function(k){ return root.querySelector('[data-g=\"'+k+'\"]'); };\n    c.v = function(k){ var e=c.g(k); if(!e) return ''; return e.type==='checkbox' ? (e.checked?'1':'') : String(e.value||'').trim(); };\n    c.set = function(k,val){ var e=c.g(k); if(!e) return; if(e.type==='checkbox') e.checked=!!val; else e.value = (val==null?'':val); };\n    c.vals = function(){ var o={}; ['nombre','apellido','empresa','cc','tel','sms','l1','l2','ciudad','region','cp','pais','imei','imei2','config','comp','po','ref','clasif','hora'].forEach(function(k){ o[k]=c.v(k); }); return o; };\n    c.componer = function(){\n      var g = c.vals();\n      var cli = (g.nombre+' '+g.apellido).trim().replace(\/\\s+\/g,' ');\n      var num = g.tel.replace(\/[^0-9]\/g,'');\n      var tel = num ? (g.cc||'+56')+num : '';\n      var dir = armarDir(g);\n      [['cli',cli],['tel',tel],['dir',dir]].forEach(function(x){\n        var o = c.o[x[0]]; if(!o) return;\n        if(o.value !== x[1]){ o.value = x[1]; try{ o.dispatchEvent(new Event('input',{bubbles:true})); o.dispatchEvent(new Event('change',{bubbles:true})); }catch(e){} }\n        c.last[x[0]] = x[1];\n      });\n    };\n    c.desdeCli = function(v){ var p=partirNombre(v); c.set('nombre',p[0]); c.set('apellido',p[1]); };\n    c.desdeTel = function(v){ var p=partirTel(v); c.set('cc',p[0]); c.set('tel',p[1]); };\n    c.desdeDir = function(v){ c.set('l1',v); c.set('l2',''); c.set('ciudad',''); c.set('region',''); c.set('cp',''); };\n    c.recordar = function(){ ['cli','tel','dir'].forEach(function(k){ if(c.o[k]) c.last[k]=c.o[k].value; }); };\n    c.revisar = function(){ \/\/ cambios hechos por otros m\u00f3dulos (autocompletar RUT, reservas, Chilexpress, PDF)\n      if(c.o.cli && c.o.cli.value!==c.last.cli){ c.desdeCli(c.o.cli.value); c.last.cli=c.o.cli.value; }\n      if(c.o.tel && c.o.tel.value!==c.last.tel){ c.desdeTel(c.o.tel.value); c.last.tel=c.o.tel.value; }\n      if(c.o.dir && c.o.dir.value!==c.last.dir){ c.desdeDir(c.o.dir.value); c.last.dir=c.o.dir.value; }\n    };\n    root.addEventListener('input', function(e){ if(e.target.closest && e.target.closest('[data-g]')) c.componer(); });\n    root.addEventListener('change', function(e){ if(e.target.closest && e.target.closest('[data-g]')) c.componer(); });\n    return c;\n  }\n  function mover(root, slot, el, label){\n    var dest = root.querySelector('[data-slot=\"'+slot+'\"]'); if(!dest || !el) return;\n    if(el.parentNode!==dest) dest.appendChild(el);\n    if(label){ var l = el.querySelector('label'); if(l){ var h=l.querySelector('.jkb-hint'); l.textContent = label+' '; if(h && slot!=='notas') l.appendChild(h); } }\n  }\n\n  \/* ================= FICHA DE EQUIPO ================= *\/\n  var FICHA = null;\n  function montarFicha(){\n    var form = $('jkbFormEquipo'); if(!form || !form.getAttribute('data-orden')) return false;\n    if(FICHA) return true;\n    var h1 = $('jkbEqH1'); if(!h1) return false;\n    var w = document.createElement('div'); w.innerHTML = bloque('eq'); var root = w.firstChild;\n    h1.parentNode.insertBefore(root, h1.nextSibling);\n    h1.textContent = '1 \u00b7 Dispositivo y cliente (estructura GSX)';\n    var F = function(id){ var e=$(id); return e ? e.closest('.jkb-field') : null; };\n    mover(root,'tipo',F('jkbEqTipoDispositivo'),'Tipo de dispositivo');\n    mover(root,'modelo',F('jkbEqModelo'),'Modelo');\n    mover(root,'serie',F('jkbEqSerie'),'N\u00famero de serie');\n    mover(root,'ot',F('jkbEqOt'),'OT');\n    mover(root,'sro',F('jkbEqSro'),'SRO');\n    mover(root,'fecha',F('jkbEqFechaIngreso'),'Fecha de recepci\u00f3n');\n    mover(root,'notas',F('jkbEqDiagnostico'));\n    var ln = F('jkbEqDiagnostico') && F('jkbEqDiagnostico').querySelector('label'); if(ln){ ln.innerHTML = 'Notas del cliente <span class=\"jkb-hint\">(falla informada al ingreso)<\/span>'; }\n    mover(root,'rut',F('jkbEqRut'),'RUT');\n    mover(root,'email',F('jkbEqEmail'),'Correo electr\u00f3nico');\n    ['jkbEqCliente','jkbEqTelefono','jkbEqDireccion'].forEach(function(id){ var f=F(id); if(f) f.classList.add('jkbGsxHide'); });\n    Array.prototype.forEach.call(form.querySelectorAll('.jkb-field-row'), function(r){ if(!r.querySelector('input,select,textarea,button') && !r.id) r.parentNode.removeChild(r); });\n    var h2 = $('jkbEqH2'); if(h2) h2.textContent = '2 \u00b7 Ingreso, cobertura y entrega';\n    FICHA = Ctl(root, {cli:$('jkbEqCliente'), tel:$('jkbEqTelefono'), dir:$('jkbEqDireccion')});\n    return true;\n  }\n  function cargarFicha(eq){\n    var c = FICHA; if(!c) return;\n    var g = (eq && eq.gsx) || null, cu = (g && g.customer) || {}, ad = cu.address || {}, de = (g && g.device) || {}, re = (g && g.repair) || {};\n    if(g){\n      c.set('nombre', cu.firstName||''); c.set('apellido', cu.lastName||''); c.set('empresa', cu.companyName||'');\n      c.set('cc', (cu.phone&&cu.phone.countryCode)||'+56'); c.set('tel', (cu.phone&&cu.phone.number)||''); c.set('sms', !!cu.smsUpdates);\n      c.set('l1', ad.line1||''); c.set('l2', ad.line2||''); c.set('ciudad', ad.city||''); c.set('region', ad.stateCode||''); c.set('cp', ad.postalCode||''); c.set('pais', ad.countryCode||'CHL');\n      c.set('po', re.purchaseOrderNumber||''); c.set('ref', re.referenceNumber||''); c.set('clasif', re.repairClassification||'');\n      var ci = re.componentIssue||{}; c.set('comp', ci.component ? (ci.component+(ci.issue?' \/ '+ci.issue:'')) : '');\n    } else {\n      c.desdeCli(eq ? eq.cliente : ''); c.desdeTel(eq ? eq.telefono : ''); c.desdeDir(eq ? (eq.direccion||'') : '');\n      ['empresa','po','ref','clasif','comp'].forEach(function(k){ c.set(k,''); }); c.set('sms',false); c.set('pais','CHL');\n    }\n    if(c.g('comp') && c.v('comp')==='' && g && g.repair && g.repair.componentIssue && g.repair.componentIssue.component){ \/\/ valor fuera de la lista\n      var o=document.createElement('option'); var ci2=g.repair.componentIssue; o.value=o.textContent=ci2.component+(ci2.issue?' \/ '+ci2.issue:''); c.g('comp').appendChild(o); c.g('comp').value=o.value; }\n    c.set('imei', (eq && (eq.imei || de.imei)) || ''); c.set('imei2', (eq && (eq.imei2 || de.imei2)) || '');\n    c.set('config', (eq && (eq.modelo_config || de.configDescription)) || '');\n    c.set('hora', (eq && eq.hora_ingreso) || '');\n    var dis = !!($('jkbEqCliente') && $('jkbEqCliente').disabled);\n    Array.prototype.forEach.call(c.root.querySelectorAll('[data-g]'), function(e){ if(e.tagName!=='DIV') e.disabled = dis; });\n    c.recordar();\n  }\n  function prefijo(cob){ return 'IW'; }\n  window.jkbGsxBase = function(base){\n    var c = FICHA; var dlg=$('jkbDlgEquipo'); if(!c || !dlg || !dlg.open) return;\n    var g = c.vals();\n    var pref = prefijo(base.cobertura);\n    if(!g.po && base.ot){ g.po = pref+' OT'+base.ot; c.set('po', g.po); }\n    if(!g.ref && base.ot){ g.ref = pref+' OT'+base.ot; c.set('ref', g.ref); }\n    var partes = String(g.comp||'').split(' \/ ');\n    base.imei = g.imei; base.imei2 = g.imei2; base.modelo_config = g.config;\n    if(g.hora) base.hora_ingreso = g.hora;\n    base.gsx = {\n      version: 1,\n      device: { serialNumber: base.numero_serie||'', imei: g.imei, imei2: g.imei2, productDescription: base.modelo||'', configDescription: g.config, deviceType: base.tipo_dispositivo||'' },\n      customer: { firstName: g.nombre, lastName: g.apellido, companyName: g.empresa, emailAddress: base.email||'',\n                  phone: { countryCode: g.cc||'+56', number: g.tel.replace(\/[^0-9]\/g,'') }, smsUpdates: !!g.sms, rut: base.rut||'',\n                  address: { line1: g.l1, line2: g.l2, city: g.ciudad, stateCode: g.region, postalCode: g.cp, countryCode: g.pais||'CHL' } },\n      repair: { unitReceivedDateTime: base.fecha_ingreso ? (base.fecha_ingreso+'T'+(g.hora||'00:00')+':00') : '',\n                purchaseOrderNumber: g.po, referenceNumber: g.ref, repairClassification: g.clasif,\n                componentIssue: { component: partes[0]||'', issue: partes.slice(1).join(' \/ ') }, customerNotes: base.diagnostico||'' }\n    };\n  };\n  (function vigilarFicha(n){\n    var dlg = $('jkbDlgEquipo');\n    if(!dlg){ if(n<160) setTimeout(function(){ vigilarFicha(n+1); }, 250); return; }\n    var timer = null;\n    function alAbrir(){\n      var intentos = 0;\n      (function paso(){\n        if(montarFicha()){ cargarFicha(window.jkbEqActual || null); return; }\n        if(++intentos < 40) setTimeout(paso, 150);\n      })();\n      clearInterval(timer);\n      timer = setInterval(function(){ if(!dlg.open){ clearInterval(timer); return; } if(FICHA) FICHA.revisar(); }, 800);\n    }\n    new MutationObserver(function(){ if(dlg.open) alAbrir(); }).observe(dlg, {attributes:true, attributeFilter:['open']});\n    if(dlg.open) alAbrir();\n  })(0);\n\n  \/* ================= INGRESO DE EQUIPOS ================= *\/\n  var ING = null;\n  function montarIngreso(){\n    var form = $('jkbIngForm'); if(!form || ING) return !!ING;\n    var E = function(n){ return form.elements[n] || null; };\n    var W = function(n){ var e=E(n); return e ? e.closest('.jkb-ing-grid > div') : null; };\n    if(!E('cliente') || !E('numero_serie')) return false;\n    var setCli = W('cliente') ? W('cliente').closest('fieldset') : null;\n    var setEq = W('numero_serie') ? W('numero_serie').closest('fieldset') : null;\n    var fs = document.createElement('fieldset'); fs.id='jkbGsxIngSet';\n    fs.innerHTML = '<legend>Dispositivo y cliente (estructura GSX)<\/legend>' + bloque('ing');\n    var ref = setCli || setEq; if(!ref) return false;\n    ref.parentNode.insertBefore(fs, ref);\n    var root = fs.querySelector('.jkbGsx');\n    mover(root,'tipo',W('tipo_dispositivo'),'Tipo de dispositivo');\n    mover(root,'modelo',W('modelo'),'Modelo');\n    mover(root,'config',W('modelo_config'),'Configuraci\u00f3n');\n    mover(root,'serie',W('numero_serie'),'N\u00famero de serie *');\n    mover(root,'imei',W('imei'),'IMEI');\n    mover(root,'buscar',W('buscar_mi'),'Buscar mi (Find My)');\n    mover(root,'acc',W('accesorios'),'Accesorios recibidos');\n    var wDx = W('diagnostico'); mover(root,'notas',wDx);\n    var ln = wDx && wDx.querySelector('label'); if(ln) ln.textContent = 'Notas del cliente (falla informada)';\n    mover(root,'rut',W('rut'),'RUT');\n    mover(root,'email',W('email'),'Correo electr\u00f3nico');\n    ['cliente','telefono','direccion'].forEach(function(n){ var w=W(n); if(w) w.classList.add('jkbGsxHide'); var e=E(n); if(e) e.removeAttribute('required'); });\n    [setCli, setEq].forEach(function(s){ if(s && !s.querySelector('.jkb-ing-grid > div:not(.jkbGsxHide)')) s.classList.add('jkbGsxHideSet'); });\n    Array.prototype.forEach.call(form.querySelectorAll('fieldset > legend'), function(l){ if(\/Falla y estado\/.test(l.textContent)) l.textContent = 'Estado f\u00edsico y fotos'; });\n    ING = Ctl(root, {cli:E('cliente'), tel:E('telefono'), dir:E('direccion')});\n    ING.set('cc','+56'); ING.set('pais','CHL'); ING.recordar();\n    form.addEventListener('reset', function(){ setTimeout(function(){ Array.prototype.forEach.call(root.querySelectorAll('[data-g]'), function(e){ if(e.tagName==='DIV') return; if(e.type==='checkbox') e.checked=false; else e.value=''; }); ING.set('cc','+56'); ING.set('pais','CHL'); ING.last={cli:'',tel:'',dir:''}; ING.revisar(); }, 30); });\n    form.addEventListener('submit', function(){ ING.revisar(); ING.componer(); var sm=ING.g('sms'); if(sm) sm.value = sm.checked ? '1' : '0'; }, true);\n    var reloj = root.querySelector('[data-g-reloj]');\n    var tic = function(){ if(!reloj) return; var d=new Date(), p=function(x){return (x<10?'0':'')+x;}; reloj.textContent = 'Se registra autom\u00e1ticamente al guardar (ahora: '+p(d.getDate())+'-'+p(d.getMonth()+1)+'-'+d.getFullYear()+' '+p(d.getHours())+':'+p(d.getMinutes())+').'; };\n    tic(); setInterval(tic, 30000);\n    setInterval(function(){ if(ING) ING.revisar(); }, 800);\n    return true;\n  }\n  (function vigilarIngreso(n){ if(montarIngreso()) return; if(n<240) setTimeout(function(){ vigilarIngreso(n+1); }, 250); })(0);\n})();\n<\/script>\n\n<!-- jkb-gsx: open=0 base=0 -->\n<div style=\"max-width:420px;margin:60px auto;padding:32px 28px;background:#fff;border:1px solid #e2e8f0;border-radius:16px;text-align:center;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;box-shadow:0 1px 3px rgba(0,0,0,.06);\"><h2 style=\"margin:0 0 10px;color:#0f172a;font-size:18px;\">Acceso restringido<\/h2><p style=\"color:#475569;margin:0 0 22px;font-size:14px;line-height:1.5;\">Esta secci\u00f3n es solo para personal autorizado de Jobstore. Inicia sesi\u00f3n con tu cuenta de WordPress para continuar.<\/p><a href=\"https:\/\/jobstore.cl\/wp-login.php?redirect_to=https%3A%2F%2Fjobstore.cl%2Findex.php%2Fbitak%2F\" style=\"display:inline-block;background:#0f172a;color:#fff;padding:12px 26px;border-radius:10px;font-weight:bold;text-decoration:none;font-size:14px;\">Iniciar sesi\u00f3n<\/a><\/div><script id=\"jkbConfirmarBasurero\">\n(function(){\n  if(window.__jkbConfirmarBasurero) return; window.__jkbConfirmarBasurero = true;\n  var REGLAS = [\n    ['[data-eqdocquitar]', function(b){\n      var fila = b.closest('div,li,tr'); var a = fila ? fila.querySelector('a') : null;\n      var nom = a ? (a.textContent||'').replace(\/^\\s*\ud83d\udcce?\\s*\/,'').trim() : '';\n      return '\u00bfQuitar este documento de la ficha?' + (nom ? '\\n\\n' + nom : '') +\n             '\\n\\n(Se quita al presionar \"Guardar\". Si fue un error, cierra la ficha SIN guardar.)';\n    }],\n    ['[data-procdel]',          function(){ return '\u00bfEliminar este procedimiento?'; }],\n    ['[data-pf-quitar-pieza]',  function(){ return '\u00bfQuitar esta pieza del presupuesto?'; }],\n    ['[data-pfs-quitar]',       function(){ return '\u00bfQuitar esta pieza de servicio (KBB\/KGB)?'; }],\n    ['[data-pf-quitar-evento]', function(){ return '\u00bfEliminar este evento del registro?'; }],\n    ['[data-sii-quitar]',       function(){ return '\u00bfQuitar esta factura de la lista?'; }],\n    ['[data-bib-del]',          function(){ return '\u00bfQuitar este texto de la biblioteca?'; }],\n    ['[data-cat-del]',          function(){ return '\u00bfEliminar este listado?'; }]\n  ];\n  document.addEventListener('click', function(e){\n    if(!e.target || !e.target.closest) return;\n    for(var i=0;i<REGLAS.length;i++){\n      var b = e.target.closest(REGLAS[i][0]);\n      if(!b) continue;\n      var msg = 'Confirmar eliminaci\u00f3n'; try{ msg = REGLAS[i][1](b); }catch(_){}\n      if(!window.confirm(msg)){ e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation(); }\n      return;\n    }\n  }, true);\n})();\n<\/script><style id=\"jkb-vmi-css\">\n#jkbPfPiezasBody select.jkbVmiSel{min-width:250px;font-size:12.5px;border-radius:6px;border:1px solid var(--line,#ccc);padding:3px 4px}\n#jkbPfPiezasBody select.jkbVmiSel[data-vmi=\"\"]{border-color:#d97706;color:#92400e}\n#jkbPfPiezasBody select.jkbVmiSel[data-vmi=\"amarillo\"]{background:#fef9c3;border-color:#eab308;color:#713f12}\n#jkbPfPiezasBody select.jkbVmiSel[data-vmi=\"rojo\"]{background:#fee2e2;border-color:#ef4444;color:#7f1d1d}\n#jkbPfPiezasBody select.jkbVmiSel[data-vmi=\"verde\"]{background:#dcfce7;border-color:#22c55e;color:#14532d}\n<\/style>\n<script id=\"jkb-vmi-js\">\n(function(){\n  if (window.jkbVmi) return; window.jkbVmi = true;\n  function sync(e){ var s = e.target; if (s && s.classList && s.classList.contains('jkbVmiSel')) s.setAttribute('data-vmi', s.value); }\n  document.addEventListener('change', sync, true);\n  document.addEventListener('input', sync, true);\n})();\n<\/script><!-- jkb-vmi: 0 0 0 0 0 --><style id=\"jkb-kbb1st-css\">div:has(> #jkbEqPiezasAsociadas){display:none !important;}<\/style><!-- jkb-kbb1st: r1=0 r2=0 r3=0 r4=0 --><style id=\"jkb-fl-css\">\n#jkbEqPresEmbed .jkbFlOcultoEmb{display:none !important;}\n#jkbEqPresupuestoAsociado.jkbFlOculto{display:none !important;}\ndiv:has(> #jkbEqPresupuestoAsociado.jkbFlOculto){display:none !important;}\n#jkbEqPresEmbedEnviar2,#jkbEqPresEmbedNota{display:none !important;}\n#jkbFlCobRow{align-items:flex-start;}\ndiv:has(> #jkbPfChecklistCotizacion){display:none !important;}\n#jkbEqPresEmbed #jkbPfSeccionServicio.jkbFlSrv{display:block !important;}\n#jkbEqPresEmbed #jkbPfSeccionServicio.jkbFlSrv > div:not(:has(#jkbPfChecklistServicio)){display:none !important;}\n<\/style>\n<script id=\"jkb-fl-js\">\n(function(){\n  if (window.jkbFichaLimpia) return; window.jkbFichaLimpia = 2;\n  function $(i){ return document.getElementById(i); }\n  \/\/ El campo original (#jkbPfGarantiaDias) se queda dentro del presupuesto (lo usan la\n  \/\/ detecci\u00f3n de cambios sin guardar y el guardado). En \u00ab2 \u00b7 Equipo\u00bb va una copia sincronizada.\n  function proxy(row){\n    var f = $('jkbFlGarField');\n    if (!f) {\n      f = document.createElement('div'); f.id = 'jkbFlGarField'; f.className = 'jkb-field';\n      f.innerHTML = '<label for=\"jkbFlGarDias\">Garant\u00eda d\u00edas restantes <span class=\"jkb-hint\">(opcional)<\/span><\/label><input id=\"jkbFlGarDias\" inputmode=\"numeric\">';\n      var inp = f.querySelector('input');\n      inp.addEventListener('input', function(){\n        var o = $('jkbPfGarantiaDias'); if (!o) return;\n        o.value = inp.value; o.dispatchEvent(new Event('input', { bubbles: true })); o.dispatchEvent(new Event('change', { bubbles: true }));\n      });\n    }\n    if (row && f.parentNode !== row) row.appendChild(f);\n    return f;\n  }\n  \/\/ Estado del presupuesto de la OT (aceptaci\u00f3n \/ garant\u00eda), para el checklist de servicio\n  var estOt = '', est = null;\n  function leerEstado(ot){\n    if (!ot || estOt === ot) return;\n    estOt = ot; est = null;\n    var n = (window.wpApiSettings && wpApiSettings.nonce) || '';\n    fetch('\/wp-json\/jobstore\/v1\/ot-opciones?ot=' + encodeURIComponent(ot), { credentials: 'same-origin', headers: n ? { 'X-WP-Nonce': n } : {} })\n      .then(function(r){ return r.json(); })\n      .then(function(j){ if (estOt === ot) { est = (j && j.presupuesto) || {}; pronto(); } })\n      .catch(function(){ if (estOt === ot) est = {}; });\n  }\n  function checklistServicio(emb){\n    var sec = $('jkbPfSeccionServicio');\n    if (!sec || !emb || !emb.contains(sec)) return;\n    leerEstado(((($('jkbEqOt') || {}).value) || '').trim());\n    var e = est || {}, ep = (($('jkbPfEstadoPago') || {}).value) || '';\n    var p5 = emb.querySelector('[data-pf-chk=\"p5\"]');\n    var ACEPT = ['aceptado_pendiente', 'por_validar', 'pagado'];\n    var rech = e.aceptacion === 'rechazado' || ep === 'rechazado' || e.estado_pago === 'rechazado';\n    var acept = !!(e.garantia || (p5 && p5.disabled) || (p5 && p5.value === 'si') || \/acept|aprob\/i.test(e.aceptacion || '')\n      || ACEPT.indexOf(ep) >= 0 || ACEPT.indexOf(e.estado_pago || '') >= 0);\n    var piezas = Array.prototype.some.call(emb.querySelectorAll('#jkbPfPiezasBody [data-pf-pieza=\"codigo\"]'), function(i){ return i.value.trim() !== ''; });\n    sec.classList.toggle('jkbFlSrv', !sec.hidden && acept && !rech && piezas);\n  }\n  function sincronizar(){\n    var o = $('jkbPfGarantiaDias'), p = $('jkbFlGarDias');\n    if (o && p && document.activeElement !== p && p.value !== o.value) p.value = o.value;\n    if (o && p) p.disabled = !!(o.disabled || o.readOnly);\n  }\n  function aplicar(){\n    try {\n      var dlg = $('jkbDlgEquipo'); if (!dlg || !dlg.open) return;\n      \/\/ 2 \u00b7 Equipo: fila con Cobertura (+ Garant\u00eda d\u00edas)\n      var cob = $('jkbEqCobertura'), cobF = cob && cob.closest('.jkb-field');\n      var row = $('jkbFlCobRow');\n      if (cobF && !row) {\n        row = document.createElement('div'); row.id = 'jkbFlCobRow'; row.className = 'jkb-field-row';\n        cobF.parentNode.insertBefore(row, cobF); row.appendChild(cobF);\n      }\n      var h3 = $('jkbEqH3');\n      if (h3 && row) {\n        if (row.nextElementSibling !== h3) row.parentNode.insertBefore(h3, row.nextSibling);\n        if (h3.textContent.trim() !== '3 \u00b7 Tipo de proceso') h3.textContent = '3 \u00b7 Tipo de proceso';\n      }\n      var emb = $('jkbEqPresEmbed'), wrap = $('jkbEqPresEmbedWrap'), o = $('jkbPfGarantiaDias');\n      var enEmb = !!(emb && o && emb.contains(o) && wrap && !wrap.hidden);\n      if (row) { var f = proxy(row); f.hidden = !enEmb; }\n      sincronizar();\n      if (emb) {\n        \/\/ ocultar el bloque \u00abEquipo\u00bb y el t\u00edtulo \u00abDiagn\u00f3stico\u00bb del presupuesto embebido\n        Array.prototype.forEach.call(emb.querySelectorAll('h3'), function(h){\n          var t = h.textContent.trim();\n          if (t === 'Equipo' && h.parentNode) h.parentNode.classList.add('jkbFlOcultoEmb');\n          if (t === 'Diagn\u00f3stico') h.classList.add('jkbFlOcultoEmb');\n        });\n      }\n      \/\/ checklist GSX de servicio (p6\u2013p9): en la ficha solo tras la aceptaci\u00f3n (o garant\u00eda) y con piezas\n      checklistServicio(emb);\n      \/\/ resumen \u00abPresupuesto de esta OT\u00bb solo cuando no hay presupuesto embebido\n      var asoc = $('jkbEqPresupuestoAsociado');\n      if (asoc) asoc.classList.toggle('jkbFlOculto', !!(wrap && !wrap.hidden && emb && emb.querySelector('#jkbPfPiezasBody')));\n    } catch (e) { if (window.console) console.warn('jkb-fl', e); }\n  }\n  var iv = null;\n  function pasadas(){\n    [0, 400, 1500, 3500, 6000].forEach(function(ms){ setTimeout(aplicar, ms); });\n    clearInterval(iv); iv = setInterval(function(){ var d = $('jkbDlgEquipo'); if (!d || !d.open) { clearInterval(iv); return; } sincronizar(); }, 1000);\n  }\n  var tm = null;\n  function pronto(){ clearTimeout(tm); tm = setTimeout(aplicar, 120); }\n  function enganchar(){\n    var dlg = $('jkbDlgEquipo');\n    if (!dlg) return setTimeout(enganchar, 800);\n    new MutationObserver(function(){ if (dlg.open) { estOt = ''; pasadas(); } }).observe(dlg, { attributes: true, attributeFilter: ['open'] });\n    var wrap = $('jkbEqPresEmbedWrap');\n    if (wrap) new MutationObserver(function(){ if (dlg.open) pronto(); }).observe(wrap, { attributes: true, childList: true, subtree: true, attributeFilter: ['hidden'] });\n    if (wrap) wrap.addEventListener('change', function(){ if (dlg.open) pronto(); });\n    if (dlg.open) pasadas();\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', enganchar); else enganchar();\n})();\n<\/script>\n<!-- jkb-fl: 4 chk=0 resto=0 --><style id=\"jkb-eta-css\">\n#jkbEtaPanel{border:1px solid #f0c36d;background:#fff8e6;border-radius:10px;padding:10px 12px;margin:0 0 12px;font-size:13px}\n#jkbEtaPanel summary{cursor:pointer;font-weight:700}\n#jkbEtaPanel table{width:100%;border-collapse:collapse;margin-top:8px}\n#jkbEtaPanel td,#jkbEtaPanel th{padding:5px 6px;border-top:1px solid #f3dca8;text-align:left;font-size:12.5px}\n#jkbEtaPanel .rojo{color:#b91c1c;font-weight:700}#jkbEtaPanel .verde{color:#166534;font-weight:700}\n#jkbEtaPanel a{cursor:pointer;text-decoration:underline}\n<\/style>\n<script id=\"jkb-eta-js\">\n(function(){\n  if (window.jkbEtaListo) return; window.jkbEtaListo = 1;\n  function $(i){ return document.getElementById(i); }\n  function esc(s){ return String(s == null ? '' : s).replace(\/[&<>\"']\/g, function(c){ return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]; }); }\n  function f(d){ return d ? String(d).slice(0, 10).split('-').reverse().join('-') : '\u2014'; }\n  \/\/ Campo \"Fecha ETA\" en el formulario de procesos de la ficha\n  function campoEta(){\n    var tipo = $('jkbEqpTipo'), fecha = $('jkbEqpFecha'); if (!tipo || !fecha) return;\n    var w = $('jkbEqpEtaWrap');\n    if (!w) {\n      w = document.createElement('div'); w.className = 'jkb-field'; w.id = 'jkbEqpEtaWrap'; w.hidden = true;\n      w.innerHTML = '<label>Fecha estimada de llegada de la pieza (ETA) <span style=\"color:#b91c1c\">*<\/span><\/label><input id=\"jkbEqpEta\" type=\"date\"><span class=\"jkb-hint\" style=\"font-size:11.5px\">La OT sigue abierta. El cliente la ve en su seguimiento y recibe un aviso cuando se registre \u00abPiezas recibidas desde Apple\u00bb.<\/span>';\n      var campoFecha = fecha.closest('.jkb-field'); campoFecha.parentNode.insertBefore(w, campoFecha.nextSibling);\n      tipo.addEventListener('change', sync);\n    }\n    sync();\n  }\n  function sync(){ var t = $('jkbEqpTipo'), w = $('jkbEqpEtaWrap'); if (t && w) { w.hidden = t.value !== 'entregado_eta'; if (w.hidden) { var i = $('jkbEqpEta'); if (i) i.value = ''; } } }\n  \/\/ Panel \"Equipos con el cliente esperando pieza\"\n  var cargando = false;\n  function panel(){\n    var b = $('jkbFBuscaEquipo'); if (!b || cargando) return;\n    var p = $('jkbEtaPanel');\n    if (!p) {\n      var barra = b.closest('.jkb-toolbar') || b.parentNode;\n      p = document.createElement('details'); p.id = 'jkbEtaPanel'; p.hidden = true;\n      barra.parentNode.insertBefore(p, barra);\n      p.addEventListener('click', function(e){\n        var a = e.target.closest('[data-eta-ot]'); if (!a) return; e.preventDefault();\n        b.value = a.getAttribute('data-eta-ot'); b.dispatchEvent(new Event('input', { bubbles: true }));\n      });\n    }\n    cargando = true;\n    var n = (window.wpApiSettings && wpApiSettings.nonce) || '';\n    fetch('\/wp-json\/jobstore\/v1\/eta-pendientes', { credentials: 'same-origin', headers: n ? { 'X-WP-Nonce': n } : {} })\n      .then(function(r){ return r.json(); })\n      .then(function(j){\n        var l = (j && j.lista) || []; p.hidden = !l.length; if (!l.length) return;\n        var venc = l.filter(function(x){ return x.vencida; }).length, lleg = l.filter(function(x){ return x.pieza_llego; }).length;\n        p.innerHTML = '<summary>\ud83d\udce6 Equipos con el cliente esperando pieza (ETA): ' + l.length\n          + (lleg ? ' \u00b7 <span class=\"verde\">' + lleg + ' con pieza recibida<\/span>' : '') + (venc ? ' \u00b7 <span class=\"rojo\">' + venc + ' con ETA vencida<\/span>' : '') + '<\/summary>'\n          + '<table><thead><tr><th>OT<\/th><th>Cliente<\/th><th>Equipo<\/th><th>Entregado<\/th><th>ETA<\/th><th>Estado<\/th><\/tr><\/thead><tbody>'\n          + l.map(function(x){\n              var st = x.pieza_llego ? '<span class=\"verde\">Pieza recibida ' + f(x.pieza_llego) + ' \u2014 cliente debe traer el equipo<\/span>'\n                : (x.vencida ? '<span class=\"rojo\">ETA vencida<\/span>' : 'Esperando pieza');\n              return '<tr><td><a data-eta-ot=\"' + esc(x.ot) + '\">' + esc(x.ot) + '<\/a><\/td><td>' + esc(x.cliente) + (x.telefono ? '<br><span class=\"jkb-hint\">' + esc(x.telefono) + '<\/span>' : '') + '<\/td><td>' + esc(x.modelo) + '<\/td><td>' + f(x.entregado) + '<\/td><td' + (x.vencida ? ' class=\"rojo\"' : '') + '>' + f(x.eta) + '<\/td><td>' + st + '<\/td><\/tr>';\n            }).join('') + '<\/tbody><\/table>';\n      })\n      .catch(function(){})\n      .then(function(){ cargando = false; });\n  }\n  function iniciar(){\n    campoEta(); panel();\n    var dlg = $('jkbDlgEquipo');\n    if (dlg) new MutationObserver(function(){ if (dlg.open) { campoEta(); } else { panel(); } }).observe(dlg, { attributes: true, attributeFilter: ['open'] });\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', iniciar); else iniciar();\n})();\n<\/script>\n<!-- jkb-eta: tipo=0 alta=0 edicion=0 --><style id=\"jkb-fmt-css\">\n#jkbFmtWrap{border:1px solid #93c5fd;background:#eff6ff;border-radius:10px;padding:10px 12px;font-size:13px}\n#jkbFmtWrap[hidden],#jkbFmtEstado[hidden]{display:none}\n#jkbFmtWrap h4{margin:0 0 6px;font-size:13.5px}\n#jkbFmtWrap textarea{width:100%;min-height:118px;font-size:13px;line-height:1.45}\n#jkbFmtWrap .fila{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:6px}\n#jkbFmtEstado{border:1px solid #d6d6dc;border-radius:10px;padding:8px 10px;margin:0 0 10px;font-size:12.5px;background:#fff}\n#jkbFmtEstado b.ok{color:#166534}#jkbFmtEstado b.no{color:#b91c1c}#jkbFmtEstado b.esp{color:#1d4ed8}\n#jkbEqpTipo option[value^=\"formato_\"]{color:#1d4ed8;font-weight:600}\n<\/style>\n<script id=\"jkb-fmt-js\">\n(function(){\n  if (window.jkbFmtListo) return; window.jkbFmtListo = 1;\n  var BASE = \"Estimado(a) [Nombre del Cliente], le escribimos del servicio t\\u00e9cnico para informarle que, como parte del proceso de diagn\\u00f3stico avanzado, requerimos su autorizaci\\u00f3n expresa para dar formato a la unidad de almacenamiento. Le recordamos que no realizamos copias de seguridad locales, por lo que solo podr\\u00e1 recuperar la informaci\\u00f3n que tenga respaldada en iCloud si completamos este proceso. Necesitamos su confirmaci\\u00f3n por este medio para poder continuar.\";\n  function $(i){ return document.getElementById(i); }\n  function esc(s){ return String(s == null ? '' : s).replace(\/[&<>\"']\/g, function(c){ return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]; }); }\n  function tc(s){ return String(s||'').trim().toLowerCase().replace(\/(^|[\\s'-])(\\S)\/g, function(m, a, b){ return a + b.toUpperCase(); }); }\n  function dlg(){ return $('jkbDlgEquipo'); }\n  function gval(k){ var d = dlg(); var el = d && d.querySelector('.jkbGsx [data-g=\"' + k + '\"]'); return el ? el.value : ''; }\n  function nombre(){\n    var n = (gval('nombre') + ' ' + gval('apellido')).trim();\n    if (!n) { var c = $('jkbEqCliente'); n = c ? c.value : ''; }\n    if (!n && window.jkbEqActual) n = window.jkbEqActual.cliente || '';\n    return tc(n);\n  }\n  function correo(){ var m = $('jkbEqEmail'); return ((m && m.value) || (window.jkbEqActual && window.jkbEqActual.email) || '').trim(); }\n  function otActual(){ var o = $('jkbEqOt'); return String((o && o.value) || (window.jkbEqActual && window.jkbEqActual.ot) || '').replace(\/[^0-9]\/g, ''); }\n  function mensaje(){ return BASE.replace('[Nombre del Cliente]', nombre() || 'cliente'); }\n  function f(d){ if (!d) return '\u2014'; var p = String(d).split(' '); return p[0].split('-').reverse().join('-') + (p[1] ? ' ' + p[1].slice(0, 5) : ''); }\n\n  window.jkbFmtDatos = function(){\n    var t = $('jkbFmtMsg'), en = $('jkbFmtEnviar');\n    var msg = t ? t.value.trim() : mensaje();\n    if (!msg) return { error: 'Escribe el mensaje para el cliente.' };\n    var enviar = !!(en && en.checked), mail = correo();\n    var tardio = $('jkbEqpTardio');\n    if (enviar && tardio && tardio.checked) return { error: 'Quita \u00abRegistro tard\u00edo\u00bb o desmarca \u00abEnviar por correo\u00bb: con registro tard\u00edo no se env\u00eda el correo.' };\n    if (enviar && !\/^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$\/.test(mail)) return { error: 'La ficha no tiene un correo v\u00e1lido del cliente. Compl\u00e9talo y guarda la ficha, o desmarca \u00abEnviar por correo\u00bb.' };\n    setTimeout(function(){ estado(3000); estado(15000); }, 50);\n    return { enviar: enviar, correo: mail, mensaje: msg };\n  };\n\n  function panel(){\n    var tipo = $('jkbEqpTipo'), notas = $('jkbEqpNotas'); if (!tipo || !notas) return;\n    var w = $('jkbFmtWrap');\n    if (!w) {\n      w = document.createElement('div'); w.id = 'jkbFmtWrap'; w.hidden = true;\n      w.innerHTML = '<h4>\u2709 Solicitud de aprobaci\u00f3n de formato al cliente<\/h4>'\n        + '<textarea id=\"jkbFmtMsg\"><\/textarea>'\n        + '<div class=\"fila\"><label style=\"display:flex;gap:6px;align-items:center\"><input type=\"checkbox\" id=\"jkbFmtEnviar\" checked> Enviar por correo a <b id=\"jkbFmtCorreo\"><\/b> con botones \u00abAutorizo \/ No autorizo\u00bb<\/label><\/div>'\n        + '<div class=\"fila\"><button type=\"button\" class=\"jkb-btn sm\" id=\"jkbFmtCopiar\">\ud83d\udccb Copiar mensaje (WhatsApp)<\/button><button type=\"button\" class=\"jkb-btn sm\" id=\"jkbFmtReset\">\u21ba Restablecer texto<\/button><\/div>'\n        + '<div class=\"jkb-hint\" style=\"font-size:11.5px;margin-top:6px\">Al pulsar \u00ab+ Agregar proceso\u00bb se registra la solicitud y se env\u00eda el correo desde service@. Si el cliente usa el enlace, su respuesta queda sola en el historial (\u00abFormato autorizado \/ NO autorizado por el cliente\u00bb) y llega un aviso a service@. Si responde el correo o por tel\u00e9fono, registra ese proceso a mano.<\/div>';\n      var campo = notas.closest('.jkb-field'); campo.parentNode.insertBefore(w, campo.nextSibling);\n      tipo.addEventListener('change', sync);\n      $('jkbFmtMsg').addEventListener('input', function(){ this.dataset.editado = '1'; });\n      $('jkbFmtEnviar').addEventListener('change', function(){ this.dataset.manual = '1'; });\n      $('jkbFmtReset').addEventListener('click', function(){ var t = $('jkbFmtMsg'); t.value = mensaje(); delete t.dataset.editado; });\n      $('jkbFmtCopiar').addEventListener('click', function(){\n        var t = $('jkbFmtMsg'), b = this;\n        (navigator.clipboard ? navigator.clipboard.writeText(t.value) : Promise.reject()).then(function(){ b.textContent = '\u2713 Copiado'; }, function(){ t.select(); document.execCommand('copy'); b.textContent = '\u2713 Copiado'; })\n          .then(function(){ setTimeout(function(){ b.textContent = '\ud83d\udccb Copiar mensaje (WhatsApp)'; }, 1800); });\n      });\n    }\n    sync();\n  }\n  function sync(){\n    var t = $('jkbEqpTipo'), w = $('jkbFmtWrap'); if (!t || !w) return;\n    w.hidden = t.value !== 'formato_solicitado';\n    if (!w.hidden) {\n      var m = $('jkbFmtMsg'); if (!m.dataset.editado) m.value = mensaje();\n      var c = correo(); $('jkbFmtCorreo').textContent = c || '(sin correo en la ficha)';\n      var en = $('jkbFmtEnviar'); if (!en.dataset.manual) en.checked = !!c;\n    }\n  }\n  function cajaEstado(){\n    var x = $('jkbFmtEstado'); if (x) return x;\n    var form = $('jkbFormEqProceso'); if (!form) return null;\n    x = document.createElement('div'); x.id = 'jkbFmtEstado'; x.hidden = true;\n    form.parentNode.insertBefore(x, form);\n    return x;\n  }\n  function btnRe(s){ return ' <button type=\"button\" class=\"jkb-btn sm\" data-fmt-re=\"' + esc(s.proceso) + '\">\u21bb Reenviar correo<\/button>'; }\n  document.addEventListener('click', function(ev){\n    var b = ev.target.closest && ev.target.closest('[data-fmt-re]'); if (!b) return;\n    ev.preventDefault();\n    if (!confirm('\u00bfReenviar al cliente el correo de autorizaci\u00f3n de formato?')) return;\n    b.disabled = true; b.textContent = 'Enviando\u2026';\n    var n = (window.wpApiSettings && wpApiSettings.nonce) || '';\n    fetch('\/wp-json\/jobstore\/v1\/formato\/reenviar', { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': n }, body: JSON.stringify({ proceso: b.getAttribute('data-fmt-re') }) })\n      .then(function(r){ return r.json(); })\n      .then(function(j){ b.textContent = j && j.ok ? '\u2713 Reenviado' : ('\u2715 ' + ((j && j.message) || 'No se pudo enviar')); estado(800); })\n      .catch(function(){ b.textContent = '\u2715 Error'; });\n  });\n  var tEstado = [];\n  function estado(ms){\n    tEstado.push(setTimeout(function(){\n      var ot = otActual(), x = cajaEstado(); if (!ot || !x) return;\n      var n = (window.wpApiSettings && wpApiSettings.nonce) || '';\n      fetch('\/wp-json\/jobstore\/v1\/formato?ot=' + encodeURIComponent(ot), { credentials: 'same-origin', headers: n ? { 'X-WP-Nonce': n } : {} })\n        .then(function(r){ return r.json(); })\n        .then(function(j){\n          if (otActual() !== ot) return;\n          var l = (j && j.lista) || []; x.hidden = !l.length; if (!l.length) { x.innerHTML = ''; return; }\n          x.innerHTML = '<b>\u2709 Autorizaci\u00f3n de formato<\/b>' + l.map(function(s){\n            var st = s.respuesta === 'si' ? '<b class=\"ok\">\u2705 Autorizado por el cliente ' + f(s.respondido) + '<\/b>'\n              : s.respuesta === 'no' ? '<b class=\"no\">\u26d4 NO autorizado por el cliente ' + f(s.respondido) + '<\/b>'\n              : s.estado === 'enviado' ? '<b class=\"esp\">Esperando respuesta<\/b> \u00b7 correo ' + (s.reenvios ? 'reenviado (' + s.reenvios + ')' : 'enviado') + ' ' + f(s.enviado) + ' a ' + esc(s.correo) + ' (copia oculta a service@)' + btnRe(s)\n              : s.estado === 'error_envio' ? '<b class=\"no\">El correo no se pudo enviar<\/b>' + btnRe(s)\n              : s.estado === 'sin_correo' ? 'Sin correo v\u00e1lido: avisar al cliente por otro medio'\n              : 'Registrada sin correo autom\u00e1tico (' + f(s.creado) + ')';\n            return '<div style=\"margin-top:4px\">\u2022 ' + st + '<\/div>';\n          }).join('');\n        }).catch(function(){});\n    }, ms || 0));\n  }\n  function iniciar(){\n    var d = dlg(); if (!d) return;\n    new MutationObserver(function(){\n      if (d.open) { panel(); setTimeout(sync, 600); tEstado.forEach(clearTimeout); tEstado = []; estado(400); }\n      else { var m = $('jkbFmtMsg'); if (m) { delete m.dataset.editado; } var en = $('jkbFmtEnviar'); if (en) { delete en.dataset.manual; } tEstado.forEach(clearTimeout); tEstado = []; var x = $('jkbFmtEstado'); if (x) { x.hidden = true; x.innerHTML = ''; } }\n    }).observe(d, { attributes: true, attributeFilter: ['open'] });\n    panel();\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', iniciar); else iniciar();\n})();\n<\/script>\n<!-- jkb-fmt: tipos=0 alta=0 --><script id=\"jkb-bm-js\">\n(function(){\n  if (window.jkbBmListo) return; window.jkbBmListo = 1;\n  function hint(){\n    var t = document.getElementById('jkbEqpTipo'); if (!t) return;\n    var h = document.getElementById('jkbBmHint');\n    if (!h) {\n      h = document.createElement('div'); h.id = 'jkbBmHint'; h.className = 'jkb-hint'; h.hidden = true;\n      h.style.cssText = 'font-size:11.5px;color:#0a66c2;margin-top:4px;';\n      h.textContent = 'Al guardar, el cliente recibe autom\u00e1ticamente por correo las instrucciones para desactivar Buscar mi (Mac o iPhone\/iPad seg\u00fan el equipo). El texto se edita en Presupuestos \u203a Textos para clientes.';\n      t.parentNode.appendChild(h);\n      t.addEventListener('change', function(){ h.hidden = t.value !== 'solicitud_buscar_mi'; });\n    }\n    h.hidden = t.value !== 'solicitud_buscar_mi';\n  }\n  function iniciar(){\n    hint();\n    var dlg = document.getElementById('jkbDlgEquipo');\n    if (dlg) new MutationObserver(function(){ if (dlg.open) hint(); }).observe(dlg, { attributes: true, attributeFilter: ['open'] });\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', iniciar); else iniciar();\n})();\n<\/script>\n<!-- jkb-bm: tipo=0 --><style id=\"jkb-bod-css\">\n#jkbBodBar{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 8px;font-size:12.5px;align-items:center}\n#jkbBodBar span[data-g]{padding:4px 9px;border-radius:8px;cursor:pointer;border:1px solid #d1d5db;background:#fff}\n#jkbBodBar span.on{border-color:#111;font-weight:700}\n#jkbBodLista{margin:0 0 10px;border:1px solid #e5e7eb;border-radius:8px;max-height:340px;overflow:auto;font-size:12.5px;background:#fff}\n#jkbBodLista table{width:100%;border-collapse:collapse}#jkbBodLista td,#jkbBodLista th{padding:5px 8px;border-bottom:1px solid #f1f1f1;text-align:left;vertical-align:top}\n#jkbBodLista a{cursor:pointer;color:#1d4ed8;font-weight:700}\n#jkbBodHint{font-size:11.5px;margin-top:4px;padding:6px 8px;border-radius:6px;background:#f0f6ff;color:#0a3d78;line-height:1.45}\n#jkbBodHint.mal{background:#fdecec;color:#9b1c1c}\n<\/style>\n<script id=\"jkb-bod-js\">\n(function(){\n  if (window.jkbBodListo) return; window.jkbBodListo = 1;\n  var CFG = {\"rest\":\"https:\\\/\\\/jobstore.cl\\\/index.php\\\/wp-json\\\/jobstore\\\/v1\\\/\",\"nonce\":\"6ba66b218a\"};\n  var TIPOS = {solicitud_pago:'Solicitud de pago', solicitud_retiro:'Solicitud de retiro', aviso_reciclaje:'Aviso de reciclaje (365 d)', aviso_final_reciclaje:'Aviso final de reciclaje', reciclaje:'Equipo reciclado'};\n  var GR = [['solicitud_pago','\ud83d\udcb3 Solicitud de pago'],['solicitud_retiro','\ud83d\udce6 Solicitud de retiro'],['aviso_reciclaje','\u267b\ufe0f Aviso de reciclaje'],['aviso_final_reciclaje','\u26d4 Aviso final'],['reciclaje','\ud83d\uddd1 Reciclaje habilitado']];\n  var DATA = null, filtro = '';\n  function $(id){ return document.getElementById(id); }\n  function esc(s){ return String(s==null?'':s).replace(\/[&<>\"']\/g,function(c){return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c];}); }\n  function api(q){ return fetch(CFG.rest + 'plazos-bodega' + (q||''), {headers:{'X-WP-Nonce':CFG.nonce}, credentials:'same-origin'}).then(function(r){ return r.json(); }); }\n\n  \/* Barra \u00abAvisos por plazo\u00bb *\/\n  function lista(){\n    var l = $('jkbBodLista'); if(!l) return;\n    if(!filtro || !DATA){ l.style.display='none'; return; }\n    if(filtro === '__aut'){ listaAut(l); return; }\n    var f = DATA.filter(function(s){ return s.sugerido === filtro; }).sort(function(a,b){ return (b.dias||0)-(a.dias||0); });\n    var h = '<table><tr><th>OT<\/th><th>Cliente<\/th><th>Modelo<\/th><th>D\u00edas desde ingreso<\/th><th>\u00daltimo aviso<\/th><th>Por qu\u00e9<\/th><\/tr>';\n    f.forEach(function(s){ h += '<tr><td><a data-ot=\"'+esc(s.ot)+'\">'+esc(s.ot)+'<\/a>'+(s.tiene_correo?'':' <span title=\"Sin correo en la ficha\">\u2709\ufe0e\u2717<\/span>')+'<\/td><td>'+esc(s.cliente)+'<\/td><td>'+esc(s.modelo)+'<\/td><td>'+esc(s.dias)+' (ing. '+esc(s.fecha_ingreso)+')<\/td><td>'+(s.ultimo_aviso?esc(TIPOS[s.ultimo_aviso.tipo]+' '+s.ultimo_aviso.fecha):'\u2014')+'<\/td><td>'+esc(s.motivo)+'<\/td><\/tr>'; });\n    l.innerHTML = h + '<\/table>'; l.style.display = '';\n  }\n  function barra(){\n    var body = $('jkbEquiposBody'); if(!body || !DATA) return;\n    var r = $('jkbBodBar');\n    if(!r){\n      var ancla = $('jkbCvResumen') || $('jkbSlaResumen'); if(!ancla){ var t = body.closest('table'); if(!t) return; ancla = t.parentNode.classList.contains('jkb-table-wrap') ? t.parentNode : t; }\n      r = document.createElement('div'); r.id = 'jkbBodBar';\n      var l = document.createElement('div'); l.id = 'jkbBodLista'; l.style.display = 'none';\n      ancla.insertAdjacentElement('beforebegin', r); r.insertAdjacentElement('afterend', l);\n      r.addEventListener('click', function(e){ var s = e.target.closest('[data-g]'); if(!s) return; var g = s.getAttribute('data-g'); filtro = filtro === g ? '' : g; barra(); lista(); });\n      l.addEventListener('click', function(e){ var a = e.target.closest('[data-ot]'); if(!a) return; var q = $('jkbFBuscaEquipo'); if(q){ q.value = a.getAttribute('data-ot'); q.dispatchEvent(new Event('input',{bubbles:true})); q.dispatchEvent(new Event('change',{bubbles:true})); q.scrollIntoView({behavior:'smooth',block:'center'}); } });\n    }\n    var h = '<b>Avisos por plazo:<\/b>', tot = 0;\n    GR.forEach(function(g){ var n = DATA.filter(function(s){ return s.sugerido === g[0]; }).length; tot += n; if(!n) return; h += '<span data-g=\"'+g[0]+'\" class=\"'+(filtro===g[0]?'on':'')+'\">'+g[1]+': '+n+'<\/span>'; });\n    if(PEND.length){ tot += PEND.length; h += '<span data-g=\"__aut\" class=\"'+(filtro==='__aut'?'on':'')+'\" style=\"border-color:#c8102e;color:#c8102e;font-weight:700\">\u270b Correos de reciclaje por autorizar: '+PEND.length+'<\/span>'; }\n    if(!tot) h += ' <span style=\"color:#2f7d32\">al d\u00eda \u2713<\/span>';\n    r.innerHTML = h;\n  }\n  function cargar(){ cargarPend(); api('').then(function(j){ if(j && j.fichas){ DATA = j.fichas; barra(); lista(); } }).catch(function(){}); }\n\n  \/* Ayuda bajo el selector de tipo de proceso *\/\n  function hint(){\n    var t = $('jkbEqpTipo'); if(!t) return;\n    var h = $('jkbBodHint');\n    if(!h){ h = document.createElement('div'); h.id = 'jkbBodHint'; h.hidden = true; t.parentNode.appendChild(h); t.addEventListener('change', hint); t.addEventListener('change', prellenar); }\n    revisarMarca();\n    var v = t.value; if(!TIPOS[v]){ h.hidden = true; return; }\n    var ot = ($('jkbEqOt') && $('jkbEqOt').value || '').replace(\/-[A-Za-z]$\/,'').replace(\/\\D\/g,'');\n    h.hidden = false; h.className = ''; h.textContent = (REQ[v] ? 'Al guardar NO se env\u00eda el correo \u00ab' + TIPOS[v] + '\u00bb: queda por autorizar hasta que un t\u00e9cnico lo revise y autorice' : 'Al guardar se env\u00eda al cliente el correo \u00ab' + TIPOS[v] + '\u00bb') + ' (texto en Presupuestos \u203a Textos para clientes \u203a Bodega, pago y reciclaje). Revisando plazos\u2026';\n    if(!ot) return;\n    api('?ot=' + ot).then(function(j){\n      if($('jkbEqpTipo').value !== v) return;\n      var s = j && j.ficha; if(!s){ h.textContent = REQ[v] ? 'Al guardar NO se env\u00eda el correo \u00ab' + TIPOS[v] + '\u00bb: queda por autorizar por un t\u00e9cnico.' : 'Al guardar se env\u00eda al cliente el correo \u00ab' + TIPOS[v] + '\u00bb.'; return; }\n      var txt = 'OT ' + s.ot + ': ingres\u00f3 el ' + (s.fecha_ingreso||'\u2014') + ' \u00b7 ' + (s.dias!=null ? s.dias + ' d\u00edas' : '') + (s.ultimo_aviso ? ' \u00b7 \u00faltimo aviso: ' + TIPOS[s.ultimo_aviso.tipo] + ' (' + s.ultimo_aviso.fecha + ')' : '') + '.';\n      if (s.motivo) txt += ' ' + s.motivo;\n      var ok = s.sugerido === v, mal = '';\n      if (!ok) {\n        if (v === 'solicitud_pago' && s.grupo !== 'pago') mal = 'Esta OT no est\u00e1 en \u00abPresupuesto aprobado\u00bb pendiente de pago.';\n        else if (v !== 'solicitud_pago' && s.grupo !== 'retiro') mal = 'Esta OT no est\u00e1 pendiente de retiro (\u00faltimo hito: ' + (s.ultimo_hito||'\u2014') + ').';\n        else if (v === 'aviso_reciclaje' && s.dias < 365) mal = 'A\u00fan no se cumplen los 365 d\u00edas (faltan ' + (365 - s.dias) + ').';\n        else if (v === 'aviso_final_reciclaje' && !(s.ultimo_aviso && s.ultimo_aviso.tipo === 'aviso_reciclaje')) mal = 'Primero corresponde el \u00abAviso de reciclaje\u00bb (365 d\u00edas).';\n        else if (v === 'aviso_final_reciclaje') mal = 'El plazo del aviso de reciclaje a\u00fan no vence (' + s.fecha_limite + ').';\n        else if (v === 'reciclaje' && !s.vencido) mal = '\u26a0 No corresponde reciclar todav\u00eda: ' + (s.fecha_limite ? 'el plazo final vence el ' + s.fecha_limite : 'falta enviar el aviso final') + '.';\n        else if (s.sugerido) mal = 'Seg\u00fan los plazos, hoy corresponde: ' + TIPOS[s.sugerido] + '.';\n      }\n      if (!s.tiene_correo) mal = (mal ? mal + ' ' : '') + 'La ficha no tiene correo: el aviso no se podr\u00e1 enviar.';\n      h.className = mal ? 'mal' : '';\n      h.textContent = (mal ? '\u26a0 ' + mal + ' ' : (ok ? '\u2713 Corresponde seg\u00fan los plazos. ' : '')) + txt + (REQ[v] ? ' El correo NO se env\u00eda al guardar: queda \u00abpor autorizar\u00bb hasta que un t\u00e9cnico lo revise y pulse \u00abAutorizar y enviar\u00bb.' : ' Se env\u00eda autom\u00e1ticamente al guardar (marca \u00abno notificar\u00bb si no quieres enviarlo).');\n    }).catch(function(){});\n  }\n  var MARCA = '[FECHA: ej. lunes 14 de julio de 2025]';\n  var TXT_FINAL = 'De acuerdo con nuestras condiciones de servicio y lo establecido por el SERNAC, transcurridos 12 meses sin retiro, una unidad se considera abandonada, facultando al centro de servicio a disponer libremente del equipo, ya sea mediante reciclaje, eliminaci\u00f3n o traslado a bodegas externas con costo adicional.\\n\\nComo \u00faltimo aviso, se otorga un plazo final hasta el d\u00eda ' + MARCA + ' para retirar la unidad desde nuestro centro de servicio sin costo de almacenamiento adicional.';\n  function sugerida(){\n    var d = new Date(); d.setDate(d.getDate() + 7); while (d.getDay() === 0 || d.getDay() === 6) d.setDate(d.getDate() + 1);\n    var D = ['domingo','lunes','martes','mi\u00e9rcoles','jueves','viernes','s\u00e1bado'], M = ['enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'];\n    return D[d.getDay()] + ' ' + d.getDate() + ' de ' + M[d.getMonth()] + ' de ' + d.getFullYear();\n  }\n  function prellenar(){\n    var t = $('jkbEqpTipo'), n = $('jkbEqpNotas'); if(!t || !n) return;\n    if (t.value === 'aviso_final_reciclaje') {\n      if (!n.value.trim()) {\n        n.value = TXT_FINAL; n.dispatchEvent(new Event('input', {bubbles:true}));\n        var i = n.value.indexOf(MARCA); try { n.focus(); n.setSelectionRange(i, i + MARCA.length); } catch(e){}\n      }\n    } else if (n.value === TXT_FINAL) { n.value = ''; n.dispatchEvent(new Event('input', {bubbles:true})); }\n    revisarMarca();\n  }\n  function revisarMarca(){\n    var t = $('jkbEqpTipo'), n = $('jkbEqpNotas'), w = $('jkbBodFecha'); if(!t || !n) return;\n    if (!w) { w = document.createElement('div'); w.id = 'jkbBodFecha'; w.style.cssText = 'font-size:11.5px;margin-top:4px;padding:6px 8px;border-radius:6px;background:#fdecec;color:#9b1c1c;font-weight:600'; n.parentNode.appendChild(w); n.addEventListener('input', revisarMarca); }\n    var falta = t.value === 'aviso_final_reciclaje' && \/\\[\\s*FECHA\/i.test(n.value);\n    w.hidden = !falta;\n    if (falta) w.textContent = '\u270d Escribe en la nota la fecha del plazo final (reemplaza ' + MARCA + '). Sugerida (+7 d\u00edas, h\u00e1bil): ' + sugerida() + '. El correo no se podr\u00e1 autorizar ni enviar hasta que la fecha est\u00e9 escrita.';\n  }\n  \/* Correos de reciclaje: nunca autom\u00e1ticos, solo con autorizaci\u00f3n de un t\u00e9cnico *\/\n  var REQ = {aviso_reciclaje:1, aviso_final_reciclaje:1, reciclaje:1};\n  var PEND = [];\n  function apiR(path, opt){ opt = opt || {}; opt.headers = {'X-WP-Nonce':CFG.nonce, 'Content-Type':'application\/json'}; opt.credentials = 'same-origin'; return fetch(CFG.rest + path, opt).then(function(r){ return r.json(); }); }\n  function cargarPend(){ apiR('avisos-bodega\/reciclaje').then(function(j){ PEND = (j && j.correos) || []; barra(); lista(); }).catch(function(){}); }\n  function fh(s){ return String(s||'').replace('T',' ').slice(0,16); }\n  function listaAut(l){\n    var h = '<table><tr><th>OT<\/th><th>Cliente<\/th><th>Correo<\/th><th>Registrado<\/th><th><\/th><\/tr>';\n    PEND.forEach(function(s){ h += '<tr><td><a data-ot=\"'+esc(s.ot)+'\">'+esc(s.ot)+'<\/a><\/td><td>'+esc(s.cliente)+'<\/td><td>'+esc(TIPOS[s.tipo]||s.tipo)+(s.falta_fecha?' <span style=\"color:#9b1c1c\">(falta la fecha en la nota)<\/span>':'')+(s.correo?'':' <span style=\"color:#9b1c1c\">(ficha sin correo)<\/span>')+'<\/td><td>'+esc(fh(s.registrado))+'<\/td><td><button type=\"button\" data-aut=\"'+esc(s.id)+'\">Revisar y autorizar<\/button><\/td><\/tr>'; });\n    if (!PEND.length) h += '<tr><td colspan=\"5\">No hay correos de reciclaje pendientes de autorizaci\u00f3n.<\/td><\/tr>';\n    l.innerHTML = h + '<\/table>'; l.style.display = '';\n  }\n  function abrirAut(id){\n    var m = $('jkbBodAut'); if (m) m.remove();\n    m = document.createElement('div'); m.id = 'jkbBodAut';\n    m.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:100000;display:flex;align-items:center;justify-content:center;padding:16px';\n    m.innerHTML = '<div style=\"background:#fff;border-radius:10px;max-width:760px;width:100%;max-height:92vh;display:flex;flex-direction:column;font-size:13px;color:#111\">'\n      + '<div style=\"padding:12px 16px;border-bottom:1px solid #eee\"><b>Correo de reciclaje: requiere autorizaci\u00f3n de un t\u00e9cnico<\/b><div id=\"jkbBodAutInfo\" style=\"margin-top:4px;color:#444\">Preparando vista previa\u2026<\/div><\/div>'\n      + '<iframe id=\"jkbBodAutFrame\" sandbox=\"\" style=\"flex:1;min-height:360px;border:0;width:100%\"><\/iframe>'\n      + '<div style=\"padding:10px 16px;border-top:1px solid #eee;display:flex;gap:8px;justify-content:flex-end;align-items:center\"><span id=\"jkbBodAutMsg\" style=\"margin-right:auto\"><\/span><button type=\"button\" data-x>Cerrar<\/button><button type=\"button\" id=\"jkbBodAutOk\" disabled style=\"background:#c8102e;color:#fff;border:0;border-radius:6px;padding:7px 14px;font-weight:700;cursor:pointer\">Autorizar y enviar<\/button><\/div><\/div>';\n    document.body.appendChild(m);\n    m.addEventListener('click', function(e){ if (e.target === m || e.target.closest('[data-x]')) m.remove(); });\n    apiR('avisos-bodega\/autorizar', {method:'POST', body: JSON.stringify({id:id, modo:'ver'})}).then(function(j){\n      if (!j || !j.ok) { $('jkbBodAutInfo').innerHTML = '<span style=\"color:#9b1c1c\">\u26a0 ' + esc(j && (j.error || j.message) || 'No se pudo preparar el correo.') + '<\/span>'; return; }\n      $('jkbBodAutInfo').innerHTML = 'OT <b>' + esc(j.ot) + '<\/b> \u00b7 Para: <b>' + esc(j.para) + '<\/b><br>Asunto: <b>' + esc(j.asunto) + '<\/b>';\n      $('jkbBodAutFrame').srcdoc = '<!doctype html><meta charset=\"utf-8\"><body style=\"margin:0\">' + j.html + '<\/body>';\n      var b = $('jkbBodAutOk'); b.disabled = false;\n      b.onclick = function(){\n        b.disabled = true; $('jkbBodAutMsg').textContent = 'Enviando\u2026';\n        apiR('avisos-bodega\/autorizar', {method:'POST', body: JSON.stringify({id:id, modo:'enviar'})}).then(function(r){\n          if (r && r.ok) { $('jkbBodAutMsg').innerHTML = '<span style=\"color:#2f7d32\">\u2713 Enviado a ' + esc(r.para) + ' \u00b7 autorizado por ' + esc(r.autorizado_por) + '<\/span>'; b.remove(); cargarPend(); banner(); }\n          else { $('jkbBodAutMsg').innerHTML = '<span style=\"color:#9b1c1c\">\u26a0 ' + esc(r && (r.error || r.message) || 'No se pudo enviar.') + '<\/span>'; b.disabled = false; }\n        }).catch(function(){ $('jkbBodAutMsg').textContent = 'Error de conexi\u00f3n.'; b.disabled = false; });\n      };\n    }).catch(function(){ $('jkbBodAutInfo').textContent = 'Error de conexi\u00f3n.'; });\n  }\n  document.addEventListener('click', function(e){ var b = e.target.closest && e.target.closest('[data-aut]'); if (b) { e.preventDefault(); abrirAut(b.getAttribute('data-aut')); } });\n  function banner(){\n    var dlg = $('jkbDlgEquipo'); if (!dlg || !dlg.open) return;\n    var ot = ($('jkbEqOt') && $('jkbEqOt').value || '').replace(\/-[A-Za-z]$\/,'').replace(\/\\D\/g,'');\n    var b = $('jkbBodAutBanner');\n    if (!ot) { if (b) b.remove(); return; }\n    apiR('avisos-bodega\/reciclaje?ot=' + ot).then(function(j){\n      var l = (j && j.correos) || []; b = $('jkbBodAutBanner');\n      if (!l.length || !dlg.open) { if (b) b.remove(); return; }\n      if (!b) { b = document.createElement('div'); b.id = 'jkbBodAutBanner'; b.style.cssText = 'margin:0 0 10px;padding:8px 10px;border:1px solid #f3c2c2;border-radius:8px;background:#fff7f7;font-size:12.5px;line-height:1.6;color:#111'; (dlg.querySelector('form') || dlg).prepend(b); }\n      var h = '<b>\u267b\ufe0f Correos de reciclaje (solo se env\u00edan con autorizaci\u00f3n de un t\u00e9cnico)<\/b>';\n      l.forEach(function(s){\n        var t = esc(TIPOS[s.tipo] || s.tipo), pod = j.puede_autorizar && !s.no_notificar && ['por_autorizar','sin_correo','error','sin_revisar'].indexOf(s.estado) >= 0;\n        var st = s.estado === 'enviado' ? '<span style=\"color:#2f7d32\">\u2713 enviado ' + esc(fh(s.en)) + (s.autorizado_por ? ' \u00b7 autorizado por ' + esc(s.autorizado_por) : '') + '<\/span>'\n          : s.no_notificar ? '<span style=\"color:#6b7280\">marcado \u00abno notificar\u00bb: no se env\u00eda<\/span>'\n          : s.estado === 'omitido' ? '<span style=\"color:#6b7280\">no enviado (proceso antiguo)<\/span>'\n          : '<span style=\"color:#c8102e;font-weight:700\">\u270b por autorizar<\/span>' + (s.falta_fecha ? ' <span style=\"color:#9b1c1c\">(falta la fecha en la nota)<\/span>' : '') + (s.correo ? '' : ' <span style=\"color:#9b1c1c\">(ficha sin correo)<\/span>');\n        h += '<div>' + t + ' \u00b7 registrado ' + esc(fh(s.registrado)) + ' \u00b7 ' + st + (pod ? ' <button type=\"button\" data-aut=\"' + esc(s.id) + '\" style=\"margin-left:6px\">Revisar y autorizar<\/button>' : '') + '<\/div>';\n      });\n      b.innerHTML = h;\n    }).catch(function(){});\n  }\n  var obsDlg = false;\n  function iniciar(){\n    hint();\n    var dlg = $('jkbDlgEquipo');\n    if (dlg && !obsDlg) { obsDlg = true; new MutationObserver(function(){ if (dlg.open) { hint(); setTimeout(banner, 400); } else { var bb = $('jkbBodAutBanner'); if (bb) bb.remove(); } }).observe(dlg, {attributes:true, attributeFilter:['open']}); }\n    var body = $('jkbEquiposBody'); if(!body){ setTimeout(iniciar, 600); return; }\n    cargar();\n    var t = null; new MutationObserver(function(){ if(!$('jkbBodBar')) barra(); clearTimeout(t); t = setTimeout(cargar, 6000); }).observe(body, {childList:true});\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', iniciar); else iniciar();\n})();\n<\/script>\n<!-- jkb-bod: pago=0 bodega=0 --><script id=\"jkb-popr-js\">\n(function(){\n  if (window.jkbPoprListo) return; window.jkbPoprListo = 1;\n  var TXT = \"Junto con saludar desde Jobstore, Servicio T\\u00e9cnico Autorizado de Apple en La Serena, nos ponemos en contacto con usted en relaci\\u00f3n al estado de su equipo ingresado bajo la Orden de Servicio #[N\\u00famero de OT].\\n\\nLe informamos que, tras las gestiones t\\u00e9cnicas correspondientes, el fabricante (Apple) nos ha comunicado que la pieza necesaria para la reparaci\\u00f3n de su unidad no se encontrar\\u00e1 disponible a mediano ni corto plazo. Debido a esta situaci\\u00f3n y para velar por una soluci\\u00f3n oportuna, Apple ha autorizado la opci\\u00f3n de gestionar un reembolso para su caso.\\n\\nPara poder tramitar este reembolso de manera formal ante el fabricante, Apple nos exige presentar el comprobante de compra (POP: boleta o factura) original del equipo. Por ello, le solicitamos que por favor nos env\\u00ede una copia o fotograf\\u00eda legible del documento respondiendo a este correo.\";\n  function $(i){ return document.getElementById(i); }\n  function aplicar(cambio){\n    var t = $('jkbEqpTipo'), n = $('jkbEqpNotas'); if (!t) return;\n    var h = $('jkbPoprHint');\n    if (!h) {\n      h = document.createElement('div'); h.id = 'jkbPoprHint'; h.hidden = true;\n      h.style.cssText = 'font-size:11.5px;color:#0a66c2;margin-top:4px;';\n      h.textContent = 'Al guardar, el cliente recibe autom\u00e1ticamente por correo la solicitud de POP para el reembolso autorizado por Apple (texto de la nota, editable; [N\u00famero de OT] se reemplaza solo). Puede responder el correo adjuntando la boleta o factura.';\n      t.parentNode.appendChild(h);\n      t.addEventListener('change', function(){ aplicar(true); });\n    }\n    var es = t.value === 'solicitud_pop_reembolso';\n    h.hidden = !es;\n    if (!cambio || !n) return;\n    if (es && !n.value.trim()) { n.value = TXT; n.dispatchEvent(new Event('input', {bubbles:true})); }\n    else if (!es && n.value === TXT) { n.value = ''; n.dispatchEvent(new Event('input', {bubbles:true})); }\n  }\n  function iniciar(){\n    aplicar(false);\n    var dlg = $('jkbDlgEquipo');\n    if (dlg) new MutationObserver(function(){ if (dlg.open) aplicar(false); }).observe(dlg, { attributes: true, attributeFilter: ['open'] });\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', iniciar); else iniciar();\n})();\n<\/script>\n<!-- jkb-popr: tipo=0 -->\n<!-- jkb-ncman: 0 0 0 0 0 0 0 0 0 -->\n\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":7,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_joinchat":[],"footnotes":""},"class_list":["post-21104","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/jobstore.cl\/index.php\/wp-json\/wp\/v2\/pages\/21104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jobstore.cl\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/jobstore.cl\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/jobstore.cl\/index.php\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/jobstore.cl\/index.php\/wp-json\/wp\/v2\/comments?post=21104"}],"version-history":[{"count":1,"href":"https:\/\/jobstore.cl\/index.php\/wp-json\/wp\/v2\/pages\/21104\/revisions"}],"predecessor-version":[{"id":21108,"href":"https:\/\/jobstore.cl\/index.php\/wp-json\/wp\/v2\/pages\/21104\/revisions\/21108"}],"wp:attachment":[{"href":"https:\/\/jobstore.cl\/index.php\/wp-json\/wp\/v2\/media?parent=21104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}