{id:40,nombre:"Lima media luna",cant:1,estado:"OK",check:true}, {id:41,nombre:"Lima plana",cant:1,estado:"OK",check:true}, {id:42,nombre:"Lima redonda",cant:1,estado:"OK",check:true}, {id:43,nombre:"Linterna",cant:1,estado:"OK",check:true}, {id:44,nombre:"Llave ajustable de 12'",cant:1,estado:"OK",check:true}, {id:45,nombre:"Llave ajustable de 15'",cant:1,estado:"OK",check:true}, {id:46,nombre:"Llave de cadena a 6'",cant:1,estado:"OK",check:true}, {id:47,nombre:"Llave de golpe acero negro 1'",cant:1,estado:"OK",check:true}, {id:48,nombre:"Llave de golpe acero negro 1'-1/16",cant:1,estado:"OK",check:true}, {id:49,nombre:"Llave de golpe acero negro 1'-1/4",cant:1,estado:"OK",check:true}, {id:50,nombre:"Llave de golpe acero negro 1'-1/8",cant:1,estado:"OK",check:true}, {id:51,nombre:"Llave de golpe acero negro 1'-13/16",cant:1,estado:"OK",check:true}, {id:52,nombre:"Llave de golpe acero negro 1'-3/16",cant:1,estado:"OK",check:true}, {id:53,nombre:"Llave de golpe acero negro 1'-3/4",cant:1,estado:"OK",check:true}, {id:54,nombre:"Llave de golpe acero negro 1'-3/8",cant:1,estado:"OK",check:true}, {id:55,nombre:"Llave de golpe acero negro 1'-5/16",cant:1,estado:"OK",check:true}, {id:56,nombre:"Llave de golpe acero negro 1'-5/8",cant:1,estado:"OK",check:true}, {id:57,nombre:"Llave de golpe acero negro 1'-7/16",cant:1,estado:"OK",check:true}, {id:58,nombre:"Llave de golpe acero negro 2'",cant:1,estado:"OK",check:true}, {id:59,nombre:"Llave de golpe acero negro 2'-7/16",cant:1,estado:"OK",check:true}, {id:60,nombre:"Llave de golpe acero negro 2-1/2",cant:1,estado:"OK",check:true}, {id:61,nombre:"Llave de golpe acero negro 2-3/16",cant:1,estado:"OK",check:true}, {id:62,nombre:"Llave de golpe acero negro 30mm",cant:1,estado:"OK",check:true}, {id:63,nombre:"Llave de golpe acero negro 41mm",cant:1,estado:"OK",check:true}, {id:64,nombre:"Llave de golpe acero negro 45mm",cant:1,estado:"OK",check:true}, {id:65,nombre:"Llave de golpe acero negro 52mm",cant:1,estado:"OK",check:true}, {id:66,nombre:"Llave de golpe acero negro 55mm",cant:1,estado:"OK",check:true}, {id:67,nombre:"Llave de golpe acero negro 65mm",cant:1,estado:"OK",check:true}, {id:68,nombre:"Llave de tubo 12'",cant:1,estado:"OK",check:true}, {id:69,nombre:"Llave de tubo 18'",cant:1,estado:"OK",check:true}, {id:70,nombre:"Llave de tubo 24'",cant:1,estado:"OK",check:true}, {id:71,nombre:"Llave de tubo 36'",cant:1,estado:"OK",check:true}, {id:72,nombre:"Llave mixta 1'",cant:1,estado:"OK",check:true}, {id:73,nombre:"Llave mixta 1'-1/16",cant:1,estado:"OK",check:true}, {id:74,nombre:"Llave mixta 1'-1/2",cant:1,estado:"OK",check:true}, {id:75,nombre:"Llave mixta 1'-1/4",cant:1,estado:"OK",check:true}, {id:76,nombre:"Llave mixta 1'-1/8",cant:1,estado:"OK",check:true}, {id:77,nombre:"Llave mixta 1'-11/16",cant:1,estado:"OK",check:true}, {id:78,nombre:"Llave mixta 1'-3/4",cant:1,estado:"OK",check:true}, {id:79,nombre:"Llave mixta 1'-3/8",cant:1,estado:"OK",check:true}, {id:80,nombre:"Llave mixta 1'-5/16",cant:1,estado:"OK",check:true}, {id:81,nombre:"Llave mixta 1'-5/8",cant:1,estado:"OK",check:true}, {id:82,nombre:"Llave mixta 1'-7/16",cant:1,estado:"OK",check:true}, {id:83,nombre:"Llave mixta 1'-7/8",cant:1,estado:"OK",check:true}, {id:84,nombre:"Llave mixta 15/16",cant:1,estado:"OK",check:true}, {id:85,nombre:"Llave mixta 2'",cant:1,estado:"OK",check:true}, {id:86,nombre:"Llave mixta 2'-1/2",cant:1,estado:"OK",check:true}, {id:87,nombre:"Llave mixta 2'-1/4",cant:1,estado:"OK",check:true}, {id:88,nombre:"Llave mixta 2'-3/16",cant:1,estado:"OK",check:true}, {id:89,nombre:"Llave mixta 2'-3/8",cant:1,estado:"OK",check:true}, {id:90,nombre:"Llave mixta 30mm",cant:1,estado:"OK",check:true}, {id:91,nombre:"Llave mixta 32'",cant:1,estado:"OK",check:true}, {id:92,nombre:"Llave mixta 36 - 41 mm",cant:1,estado:"OK",check:true}, {id:93,nombre:"Llave mixta 7/8",cant:1,estado:"OK",check:true}, {id:94,nombre:"Martillo cincelador",cant:1,estado:"OK",check:true}, {id:95,nombre:"Mesa de corte trípode rígido",cant:1,estado:"OK",check:true}, {id:96,nombre:"Motor-tool",cant:1,estado:"OK",check:true}, {id:97,nombre:"Nivel de 24'",cant:1,estado:"OK",check:true}, {id:98,nombre:"Nivel de 48'",cant:1,estado:"OK",check:true}, {id:99,nombre:"Nivel torpedo",cant:1,estado:"OK",check:true}, {id:100,nombre:"Pala",cant:1,estado:"OK",check:true}, {id:101,nombre:"Parasol",cant:1,estado:"OK",check:true}, {id:102,nombre:"Pico",cant:1,estado:"OK",check:true}, {id:103,nombre:"Piola",cant:1,estado:"OK",check:true}, {id:104,nombre:"Playo común",cant:1,estado:"OK",check:true}, {id:105,nombre:"Playo de presión",cant:1,estado:"OK",check:true}, {id:106,nombre:"Plomada",cant:1,estado:"OK",check:true}, {id:107,nombre:"Prensa manual",cant:1,estado:"OK",check:true}, {id:108,nombre:"Punto centro",cant:1,estado:"OK",check:true}, {id:109,nombre:"Sacabocados",cant:8,estado:"OK",check:true}, {id:110,nombre:"Taladro + llave",cant:1,estado:"OK",check:true}, {id:111,nombre:"Tecle de cadena 2tn",cant:1,estado:"OK",check:true}, {id:112,nombre:"Tecle señorita",cant:1,estado:"OK",check:true}, {id:113,nombre:"Teflón",cant:5,estado:"CONSUMIBLES",check:true}, {id:114,nombre:"Termo para agua",cant:1,estado:"OK",check:true}, {id:115,nombre:"Termo porta electrodos",cant:1,estado:"OK",check:true}, {id:116,nombre:"Tijera para tool",cant:1,estado:"OK",check:true} ]; const LS_KEY='CAMION_FINAL_BUENO_V19_COMPLETO'; let saved=localStorage.getItem(LS_KEY); if(saved){try{let p=JSON.parse(saved);if(p.length>=100)herramientas=p;}catch(e){}} function calcJornada(){ let fStr=document.getElementById('fechaInput').value; if(!fStr)return null; let inicio=new Date(fStr+'T00:00:00'); let hoy=new Date();hoy.setHours(0,0,0,0); let diff=Math.floor((hoy-inicio)/86400000); if(diff<0)diff=0; let cicloPos=diff%21; let trabajando=cicloPos<14; let diaTrab=0,diaVac=0,faltan=0,texto="",clase=""; if(trabajando){diaTrab=cicloPos+1;faltan=14-diaTrab;texto=`TRABAJANDO DIA ${diaTrab}/14 - Faltan ${faltan} para vacaciones`;clase="banner-trab";} else{diaVac=cicloPos-14+1;faltan=7-diaVac;texto=`VACACIONES DIA ${diaVac}/7 - Faltan ${faltan} para trabajar`;clase="banner-vac";} return{trabajando,diaTrab,diaVac,faltan,texto,clase}; } function save(){localStorage.setItem(LS_KEY,JSON.stringify(herramientas));localStorage.setItem('camion3606_fecha',document.getElementById('fechaInput').value);} function render(){ let f=(document.getElementById('buscar').value||'').toLowerCase(); let cont=document.getElementById('lista');cont.innerHTML=''; let novedades=[]; herramientas.forEach((h,idx)=>{ if(h.estado!=='OK'&&h.estado!=='CONSUMIBLES')novedades.push(Object.assign({},h,{idx:idx})); if(f&&!h.nombre.toLowerCase().includes(f))return; let colorClass=h.estado==='OK'?'st-OK':'st-MAL'; let div=document.createElement('div');div.className='row'; div.innerHTML=`
${h.nombre}${h.estado} ${h.estado==='OK'?'👍':''}
`; cont.appendChild(div); }); let totalFilas=herramientas.length; let filasOk=herramientas.filter(x=>x.check).length; let totalUnid=herramientas.reduce((a,b)=>a+b.cant,0); let unidOk=herramientas.filter(x=>x.check).reduce((a,b)=>a+b.cant,0); document.getElementById('cFilas').innerText=filasOk; document.getElementById('cFilasDet').innerText=filasOk+'/'+totalFilas; document.getElementById('cUnid').innerText=unidOk; document.getElementById('cUnidDet').innerText=unidOk+'/'+totalUnid; let j=calcJornada(); if(j){let b=document.getElementById('vacBanner');b.className='banner '+j.clase;b.innerText=j.texto;document.getElementById('cCiclo').innerText=j.trabajando?j.diaTrab:j.diaVac;document.getElementById('cCicloDet').innerHTML=j.trabajando?`Trab ${j.diaTrab}/14
Faltan ${j.faltan}`:`Vac ${j.diaVac}/7
Faltan ${j.faltan}`;} document.getElementById('novCount').innerText=novedades.length; let nl=document.getElementById('novList'); if(novedades.length===0)nl.innerHTML='
✅ Sin novedades - todo OK 👍
'; else nl.innerHTML=novedades.map(h=>`
🔸 ${h.nombre} x${h.cant} → ${h.estado}
`).join(''); } function solucionar(idx){if(confirm('¿Solucionado? '+herramientas[idx].nombre+' a OK?')){herramientas[idx].estado='OK';herramientas[idx].check=true;save();render();}} function toggleTodo(){let all=herramientas.some(h=>!h.check);herramientas.forEach(h=>h.check=all);save();render();} function marcarIngreso(){herramientas.forEach(h=>h.check=true);save();render();} function marcarSalida(){let faltan=herramientas.filter(h=>!h.check||(h.estado!=='OK'&&h.estado!=='CONSUMIBLES'));alert('Faltantes: '+faltan.length+'\n'+faltan.map(f=>f.nombre+' -> '+f.estado).join('\n'));} function nuevaJornada(){if(confirm('¿INICIAR NUEVA JORNADA DIA 1?')){let hoy=new Date().toISOString().split('T')[0];document.getElementById('fechaInput').value=hoy;herramientas.forEach(h=>{h.check=true;});save();render();}} function guardarFecha(){save();render();} function buildPDF(){ const {jsPDF}=window.jspdf; const pdf=new jsPDF('p','mm','a4'); let lista=herramientas; let left=8,right=202,width=right-left; let top=16; let primeraHoja=true; let colDescW=150; let colCantW=width-colDescW; let xDesc=left,xCant=left+colDescW; function dibujarCabecera(y){ pdf.setFillColor(0,0,0);pdf.setTextColor(255,255,255); pdf.rect(left,y,width,13,'F');pdf.setDrawColor(0); pdf.setFont('helvetica','bold');pdf.setFontSize(16); pdf.text('DESCRIPCION',xDesc+5,y+9); pdf.text('CANT',xCant+7,y+9); pdf.setTextColor(0,0,0); return y+13; } if(primeraHoja){ pdf.setFont('helvetica','bold');pdf.setFontSize(20); pdf.text('HERRAMIENTAS CAMION SUELDA',105,top,{align:'center'}); top+=14; } top=dibujarCabecera(top); lista.forEach((h,i)=>{ let rowH=12; if(top+rowH>285){pdf.addPage();top=10;primeraHoja=false;top=dibujarCabecera(top);} if(i%2==0){pdf.setFillColor(232,232,232);pdf.rect(left,top,width,rowH,'F');} pdf.setDrawColor(160,160,160);pdf.rect(left,top,width,rowH);pdf.line(xCant,top,xCant,top+rowH); pdf.setFont('helvetica','bold');pdf.setFontSize(16); pdf.text(h.nombre.substring(0,42),xDesc+5,top+8.5); pdf.setFontSize(18);pdf.text(String(h.cant),xCant+10,top+8.5,{align:'center'}); top+=rowH; }); return pdf; } function guardarPDF(){let pdf=buildPDF();pdf.save('HERRAMIENTAS_CAMION_SUELDA.pdf');} async function enviarListadoPDF(){ let pdf=buildPDF(); let blob=pdf.output('blob'); let file=new File([blob],'HERRAMIENTAS_CAMION_SUELDA.pdf',{type:'application/pdf'}); if(navigator.canShare&&navigator.canShare({files:[file]})){ try{await navigator.share({files:[file],title:'HERRAMIENTAS CAMION SUELDA',text:'HERRAMIENTAS CAMION SUELDA'});return;}catch(e){} } window.open(URL.createObjectURL(blob),'_blank'); } async function enviarNovedadesImagen(){ let novedades=herramientas.filter(h=>h.estado!=='OK'&&h.estado!=='CONSUMIBLES'); if(novedades.length===0){alert('Sin novedades - todo OK 👍');return;} let canvas=document.getElementById('canvasNov'); let ctx=canvas.getContext('2d'); let ancho=1000; let altoCab=120; let altoFila=70; let alto=altoCab+novedades.length*altoFila+20; canvas.width=ancho;canvas.height=alto; ctx.fillStyle='#ffffff';ctx.fillRect(0,0,ancho,alto); ctx.fillStyle='#000000'; ctx.font='bold 48px Arial'; ctx.textAlign='center'; ctx.fillText('HERRAMIENTAS CAMION SUELDA',ancho/2,70); let y=altoCab; ctx.fillStyle='#000000';ctx.fillRect(20,y-50,ancho-40,50); ctx.fillStyle='#ffffff';ctx.font='bold 32px Arial';ctx.textAlign='left'; ctx.fillText('DESCRIPCION',40,y-15); ctx.textAlign='center'; ctx.fillText('CANT',750,y-15); ctx.fillText('ESTADO',900,y-15); novedades.forEach((h,i)=>{ let yy=y+i*altoFila; if(i%2==0){ctx.fillStyle='#e8e8e8';ctx.fillRect(20,yy,ancho-40,altoFila);} ctx.strokeStyle='#cccccc';ctx.strokeRect(20,yy,ancho-40,altoFila); ctx.beginPath();ctx.moveTo(680,yy);ctx.lineTo(680,yy+altoFila);ctx.stroke(); ctx.beginPath();ctx.moveTo(820,yy);ctx.lineTo(820,yy+altoFila);ctx.stroke(); ctx.fillStyle='#000000'; ctx.font='bold 30px Arial';ctx.textAlign='left'; ctx.fillText((h.nombre.length>30?h.nombre.substring(0,30):h.nombre),35,yy+45); ctx.font='bold 36px Arial';ctx.textAlign='center'; ctx.fillText(String(h.cant),750,yy+47); ctx.font='bold 26px Arial'; ctx.fillStyle=h.estado=='NO HAY'?'#d32f2f':'#ff6f00'; ctx.fillText(h.estado,900,yy+47); }); canvas.toBlob(async(blob)=>{ let file=new File([blob],'NOVEDADES_'+novedades.length+'.png',{type:'image/png'}); if(navigator.canShare&&navigator.canShare({files:[file]})){ try{await navigator.share({files:[file],title:'HERRAMIENTAS CAMION SUELDA',text:'HERRAMIENTAS CAMION SUELDA - '+novedades.length+' NOVEDADES'});return;}catch(e){} } window.open(URL.createObjectURL(blob),'_blank'); },'image/png'); } let fGuardada=localStorage.getItem('camion3606_fecha'); if(fGuardada)document.getElementById('fechaInput').value=fGuardada; render(); {id:40,nombre:"Lima media luna",cant:1,estado:"OK",check:true}, {id:41,nombre:"Lima plana",cant:1,estado:"OK",check:true}, {id:42,nombre:"Lima redonda",cant:1,estado:"OK",check:true}, {id:43,nombre:"Linterna",cant:1,estado:"OK",check:true}, {id:44,nombre:"Llave ajustable de 12'",cant:1,estado:"OK",check:true}, {id:45,nombre:"Llave ajustable de 15'",cant:1,estado:"OK",check:true}, {id:46,nombre:"Llave de cadena a 6'",cant:1,estado:"OK",check:true}, {id:47,nombre:"Llave de golpe acero negro 1'",cant:1,estado:"OK",check:true}, {id:48,nombre:"Llave de golpe acero negro 1'-1/16",cant:1,estado:"OK",check:true}, {id:49,nombre:"Llave de golpe acero negro 1'-1/4",cant:1,estado:"OK",check:true}, {id:50,nombre:"Llave de golpe acero negro 1'-1/8",cant:1,estado:"OK",check:true}, {id:51,nombre:"Llave de golpe acero negro 1'-13/16",cant:1,estado:"OK",check:true}, {id:52,nombre:"Llave de golpe acero negro 1'-3/16",cant:1,estado:"OK",check:true}, {id:53,nombre:"Llave de golpe acero negro 1'-3/4",cant:1,estado:"OK",check:true}, {id:54,nombre:"Llave de golpe acero negro 1'-3/8",cant:1,estado:"OK",check:true}, {id:55,nombre:"Llave de golpe acero negro 1'-5/16",cant:1,estado:"OK",check:true}, {id:56,nombre:"Llave de golpe acero negro 1'-5/8",cant:1,estado:"OK",check:true}, {id:57,nombre:"Llave de golpe acero negro 1'-7/16",cant:1,estado:"OK",check:true}, {id:58,nombre:"Llave de golpe acero negro 2'",cant:1,estado:"OK",check:true}, {id:59,nombre:"Llave de golpe acero negro 2'-7/16",cant:1,estado:"OK",check:true}, {id:60,nombre:"Llave de golpe acero negro 2-1/2",cant:1,estado:"OK",check:true}, {id:61,nombre:"Llave de golpe acero negro 2-3/16",cant:1,estado:"OK",check:true}, {id:62,nombre:"Llave de golpe acero negro 30mm",cant:1,estado:"OK",check:true}, {id:63,nombre:"Llave de golpe acero negro 41mm",cant:1,estado:"OK",check:true}, {id:64,nombre:"Llave de golpe acero negro 45mm",cant:1,estado:"OK",check:true}, {id:65,nombre:"Llave de golpe acero negro 52mm",cant:1,estado:"OK",check:true}, {id:66,nombre:"Llave de golpe acero negro 55mm",cant:1,estado:"OK",check:true}, {id:67,nombre:"Llave de golpe acero negro 65mm",cant:1,estado:"OK",check:true}, {id:68,nombre:"Llave de tubo 12'",cant:1,estado:"OK",check:true}, {id:69,nombre:"Llave de tubo 18'",cant:1,estado:"OK",check:true}, {id:70,nombre:"Llave de tubo 24'",cant:1,estado:"OK",check:true}, {id:71,nombre:"Llave de tubo 36'",cant:1,estado:"OK",check:true}, {id:72,nombre:"Llave mixta 1'",cant:1,estado:"OK",check:true}, {id:73,nombre:"Llave mixta 1'-1/16",cant:1,estado:"OK",check:true}, {id:74,nombre:"Llave mixta 1'-1/2",cant:1,estado:"OK",check:true}, {id:75,nombre:"Llave mixta 1'-1/4",cant:1,estado:"OK",check:true}, {id:76,nombre:"Llave mixta 1'-1/8",cant:1,estado:"OK",check:true}, {id:77,nombre:"Llave mixta 1'-11/16",cant:1,estado:"OK",check:true}, {id:78,nombre:"Llave mixta 1'-3/4",cant:1,estado:"OK",check:true}, {id:79,nombre:"Llave mixta 1'-3/8",cant:1,estado:"OK",check:true}, {id:80,nombre:"Llave mixta 1'-5/16",cant:1,estado:"OK",check:true}, {id:81,nombre:"Llave mixta 1'-5/8",cant:1,estado:"OK",check:true}, {id:82,nombre:"Llave mixta 1'-7/16",cant:1,estado:"OK",check:true}, {id:83,nombre:"Llave mixta 1'-7/8",cant:1,estado:"OK",check:true}, {id:84,nombre:"Llave mixta 15/16",cant:1,estado:"OK",check:true}, {id:85,nombre:"Llave mixta 2'",cant:1,estado:"OK",check:true}, {id:86,nombre:"Llave mixta 2'-1/2",cant:1,estado:"OK",check:true}, {id:87,nombre:"Llave mixta 2'-1/4",cant:1,estado:"OK",check:true}, {id:88,nombre:"Llave mixta 2'-3/16",cant:1,estado:"OK",check:true}, {id:89,nombre:"Llave mixta 2'-3/8",cant:1,estado:"OK",check:true}, {id:90,nombre:"Llave mixta 30mm",cant:1,estado:"OK",check:true}, {id:91,nombre:"Llave mixta 32'",cant:1,estado:"OK",check:true}, {id:92,nombre:"Llave mixta 36 - 41 mm",cant:1,estado:"OK",check:true}, {id:93,nombre:"Llave mixta 7/8",cant:1,estado:"OK",check:true}, {id:94,nombre:"Martillo cincelador",cant:1,estado:"OK",check:true}, {id:95,nombre:"Mesa de corte trípode rígido",cant:1,estado:"OK",check:true}, {id:96,nombre:"Motor-tool",cant:1,estado:"OK",check:true}, {id:97,nombre:"Nivel de 24'",cant:1,estado:"OK",check:true}, {id:98,nombre:"Nivel de 48'",cant:1,estado:"OK",check:true}, {id:99,nombre:"Nivel torpedo",cant:1,estado:"OK",check:true}, {id:100,nombre:"Pala",cant:1,estado:"OK",check:true}, {id:101,nombre:"Parasol",cant:1,estado:"OK",check:true}, {id:102,nombre:"Pico",cant:1,estado:"OK",check:true}, {id:103,nombre:"Piola",cant:1,estado:"OK",check:true}, {id:104,nombre:"Playo común",cant:1,estado:"OK",check:true}, {id:105,nombre:"Playo de presión",cant:1,estado:"OK",check:true}, {id:106,nombre:"Plomada",cant:1,estado:"OK",check:true}, {id:107,nombre:"Prensa manual",cant:1,estado:"OK",check:true}, {id:108,nombre:"Punto centro",cant:1,estado:"OK",check:true}, {id:109,nombre:"Sacabocados",cant:8,estado:"OK",check:true}, {id:110,nombre:"Taladro + llave",cant:1,estado:"OK",check:true}, {id:111,nombre:"Tecle de cadena 2tn",cant:1,estado:"OK",check:true}, {id:112,nombre:"Tecle señorita",cant:1,estado:"OK",check:true}, {id:113,nombre:"Teflón",cant:5,estado:"CONSUMIBLES",check:true}, {id:114,nombre:"Termo para agua",cant:1,estado:"OK",check:true}, {id:115,nombre:"Termo porta electrodos",cant:1,estado:"OK",check:true}, {id:116,nombre:"Tijera para tool",cant:1,estado:"OK",check:true} ]; const LS_KEY='CAMION_FINAL_V20_ARREGLADO_1000'; let saved=localStorage.getItem(LS_KEY);if(saved){try{let p=JSON.parse(saved);if(p.length>=100)herramientas=p;}catch(e){}} function calcJornada(){let fStr=document.getElementById('fechaInput').value;if(!fStr)return null;let inicio=new Date(fStr+'T00:00:00');let hoy=new Date();hoy.setHours(0,0,0,0);let diff=Math.floor((hoy-inicio)/86400000);if(diff<0)diff=0;let cicloPos=diff%21;let trabajando=cicloPos<14;let diaTrab=0,diaVac=0,faltan=0,texto="",clase="";if(trabajando){diaTrab=cicloPos+1;faltan=14-diaTrab;texto=`TRABAJANDO DIA ${diaTrab}/14 - Faltan ${faltan} para vacaciones`;clase="banner-trab";}else{diaVac=cicloPos-14+1;faltan=7-diaVac;texto=`VACACIONES DIA ${diaVac}/7 - Faltan ${faltan} para trabajar`;clase="banner-vac";}return{trabajando,diaTrab,diaVac,faltan,texto,clase};} function save(){localStorage.setItem(LS_KEY,JSON.stringify(herramientas));localStorage.setItem('camion3606_fecha',document.getElementById('fechaInput').value);} function render(){let f=(document.getElementById('buscar').value||'').toLowerCase();let cont=document.getElementById('lista');cont.innerHTML='';let novedades=[];herramientas.forEach((h,idx)=>{if(h.estado!=='OK'&&h.estado!=='CONSUMIBLES')novedades.push(Object.assign({},h,{idx:idx}));if(f&&!h.nombre.toLowerCase().includes(f))return;let colorClass=h.estado==='OK'?'st-OK':'st-MAL';let div=document.createElement('div');div.className='row';div.innerHTML=`
${h.nombre}${h.estado} ${h.estado==='OK'?'👍':''}
`;cont.appendChild(div);});let totalFilas=herramientas.length;let filasOk=herramientas.filter(x=>x.check).length;let totalUnid=herramientas.reduce((a,b)=>a+b.cant,0);let unidOk=herramientas.filter(x=>x.check).reduce((a,b)=>a+b.cant,0);document.getElementById('cFilas').innerText=filasOk;document.getElementById('cFilasDet').innerText=filasOk+'/'+totalFilas;document.getElementById('cUnid').innerText=unidOk;document.getElementById('cUnidDet').innerText=unidOk+'/'+totalUnid;let j=calcJornada();if(j){let b=document.getElementById('vacBanner');b.className='banner '+j.clase;b.innerText=j.texto;document.getElementById('cCiclo').innerText=j.trabajando?j.diaTrab:j.diaVac;document.getElementById('cCicloDet').innerHTML=j.trabajando?`Trab ${j.diaTrab}/14
Faltan ${j.faltan}`:`Vac ${j.diaVac}/7
Faltan ${j.faltan}`;}document.getElementById('novCount').innerText=novedades.length;let nl=document.getElementById('novList');if(novedades.length===0)nl.innerHTML='
✅ Sin novedades - todo OK 👍
';else nl.innerHTML=novedades.map(h=>`
🔸 ${h.nombre} x${h.cant} → ${h.estado}
`).join('');} function solucionar(idx){if(confirm('¿Solucionado? '+herramientas[idx].nombre+' a OK?')){herramientas[idx].estado='OK';herramientas[idx].check=true;save();render();}} function toggleTodo(){let all=herramientas.some(h=>!h.check);herramientas.forEach(h=>h.check=all);save();render();} function marcarIngreso(){herramientas.forEach(h=>h.check=true);save();render();} function marcarSalida(){let faltan=herramientas.filter(h=>!h.check||(h.estado!=='OK'&&h.estado!=='CONSUMIBLES'));alert('Faltantes: '+faltan.length+'\n'+faltan.map(f=>f.nombre+' -> '+f.estado).join('\n'));} function nuevaJornada(){if(confirm('¿INICIAR NUEVA JORNADA DIA 1?')){let hoy=new Date().toISOString().split('T')[0];document.getElementById('fechaInput').value=hoy;herramientas.forEach(h=>{h.check=true;});save();render();}} function guardarFecha(){save();render();} function buildPDF(){ const {jsPDF}=window.jspdf; const pdf=new jsPDF('p','mm','a4'); let lista=herramientas; let left=8,right=202,width=right-left; let top=16; let primeraHoja=true; let colDescW=150; let xDesc=left,xCant=left+colDescW; function dibujarCabecera(y){ pdf.setFillColor(0,0,0);pdf.setTextColor(255,255,255); pdf.rect(left,y,width,13,'F');pdf.setDrawColor(0); pdf.setFont('helvetica','bold');pdf.setFontSize(16); pdf.text('DESCRIPCION',xDesc+5,y+9); pdf.text('CANT',xCant+7,y+9); pdf.setTextColor(0,0,0); return y+13; } if(primeraHoja){ pdf.setFont('helvetica','bold');pdf.setFontSize(20); pdf.text('HERRAMIENTAS CAMION SUELDA',105,top,{align:'center'}); top+=14; } top=dibujarCabecera(top); lista.forEach((h,i)=>{ let rowH=12; if(top+rowH>285){pdf.addPage();top=10;primeraHoja=false;top=dibujarCabecera(top);} if(i%2==0){pdf.setFillColor(232,232,232);pdf.rect(left,top,width,rowH,'F');} pdf.setDrawColor(160,160,160);pdf.rect(left,top,width,rowH);pdf.line(xCant,top,xCant,top+rowH); pdf.setFont('helvetica','bold');pdf.setFontSize(16); pdf.text(h.nombre.substring(0,42),xDesc+5,top+8.5); pdf.setFontSize(18);pdf.text(String(h.cant),xCant+10,top+8.5,{align:'center'}); top+=rowH; }); return pdf; } function guardarPDF(){let pdf=buildPDF();pdf.save('HERRAMIENTAS_CAMION_SUELDA.pdf');} async function enviarListadoPDF(){ let pdf=buildPDF(); let blob=pdf.output('blob'); let file=new File([blob],'HERRAMIENTAS_CAMION_SUELDA.pdf',{type:'application/pdf'}); if(navigator.canShare&&navigator.canShare({files:[file]})){ try{await navigator.share({files:[file],title:'HERRAMIENTAS CAMION SUELDA',text:'HERRAMIENTAS CAMION SUELDA'});return;}catch(e){} } window.open(URL.createObjectURL(blob),'_blank'); } async function enviarNovedadesImagen(){ let novedades=herramientas.filter(h=>h.estado!=='OK'&&h.estado!=='CONSUMIBLES'); if(novedades.length===0){alert('Sin novedades - todo OK 👍');return;} let canvas=document.getElementById('canvasNov'); let ctx=canvas.getContext('2d'); let ancho=1000; let altoCab=200; let altoFila=75; let alto=altoCab+novedades.length*altoFila+40; canvas.width=ancho;canvas.height=alto; ctx.fillStyle='#ffffff';ctx.fillRect(0,0,ancho,alto); ctx.fillStyle='#000000'; ctx.font='bold 52px Arial'; ctx.textAlign='center'; ctx.fillText('HERRAMIENTAS CAMION SUELDA',ancho/2,90); let y=altoCab; ctx.fillStyle='#000000';ctx.fillRect(20,y-55,ancho-40,55); ctx.fillStyle='#ffffff';ctx.font='bold 34px Arial';ctx.textAlign='left'; ctx.fillText('DESCRIPCION',40,y-15); ctx.textAlign='center'; ctx.fillText('CANT',750,y-15); ctx.fillText('ESTADO',900,y-15); novedades.forEach((h,i)=>{ let yy=y+i*altoFila; if(i%2==0){ctx.fillStyle='#e8e8e8';ctx.fillRect(20,yy,ancho-40,altoFila);} ctx.strokeStyle='#cccccc';ctx.lineWidth=2;ctx.strokeRect(20,yy,ancho-40,altoFila); ctx.beginPath();ctx.moveTo(680,yy);ctx.lineTo(680,yy+altoFila);ctx.stroke(); ctx.beginPath();ctx.moveTo(820,yy);ctx.lineTo(820,yy+altoFila);ctx.stroke(); ctx.fillStyle='#000000'; ctx.font='bold 32px Arial';ctx.textAlign='left'; ctx.fillText((h.nombre.length>30?h.nombre.substring(0,30):h.nombre),35,yy+48); ctx.font='bold 38px Arial';ctx.textAlign='center'; ctx.fillText(String(h.cant),750,yy+50); ctx.font='bold 28px Arial'; ctx.fillStyle=h.estado=='NO HAY'?'#d32f2f':'#ff6f00'; ctx.fillText(h.estado,900,yy+50); }); canvas.toBlob(async(blob)=>{ let file=new File([blob],'NOVEDADES_'+novedades.length+'.png',{type:'image/png'}); if(navigator.canShare&&navigator.canShare({files:[file]})){ try{await navigator.share({files:[file],title:'HERRAMIENTAS CAMION SUELDA',text:'HERRAMIENTAS CAMION SUELDA - '+novedades.length+' NOVEDADES'});return;}catch(e){} } window.open(URL.createObjectURL(blob),'_blank'); },'image/png'); } let fGuardada=localStorage.getItem('camion3606_fecha'); if(fGuardada)document.getElementById('fechaInput').value=fGuardada; render();