Grupo
MAKING OF
Sistema de Cotizaciones
Cargando...
Conectando con Google Sheets...
Nueva cotización
Historial
Making Of SpA
ACME SpA
Talk Productora
Responsable de cuenta
Cliente
Razón social
RUT
Moneda y servicios
Total neto (CLP) $ 0
Observaciones
`; } async function generarYGuardar(){ const cliIdx=document.getElementById('cli-sel').value; const rcIdx=document.getElementById('rc-sel').value; if(rcIdx===''||cliIdx===''||srvs.length===0){alert('Completa responsable de cuenta, cliente y al menos un servicio.');return;} const cli=CLIENTES[cliIdx];const rc=getRCData(); const mon=document.getElementById('mon-sel').value; const total=srvs.reduce((s,x)=>s+(x.precio*x.qty),0); const fecha=new Date().toLocaleDateString('es-CL',{day:'2-digit',month:'long',year:'numeric'}); const obs=document.getElementById('obs').value; const btn=document.getElementById('btn-pdf'); btn.textContent='Obteniendo número...';btn.disabled=true; try{ const numRes=await gasGet('getSiguienteNum','&empresa='+emp); if(!numRes.ok)throw new Error('No se pudo obtener número de cotización'); const num=numRes.num; document.getElementById('num-cot').textContent=num; btn.textContent='Generando PDF...'; toast('Generando PDF y guardando en Drive...',12000); const pdfResult=await gasPost({action:'generarPDF',html:buildHTML(rc,cli,mon,num,fecha,obs),nombre:num}); if(pdfResult.error)throw new Error(pdfResult.mensaje||'Error generando PDF'); const saveResult=await gasPost({action:'guardarCotizacion',num,fecha,empresa:EMPRESAS[emp].nombre,rc:rc.nombre,correoRC:rc.correo,cliente:cli.fantasia,rutCliente:cli.rut,servicios:srvs.map(s=>s.nombre+' x'+s.qty).join(', '),monto:MFMT[mon](total),observaciones:obs,linkPDF:pdfResult.url}); if(saveResult.error)throw new Error(saveResult.mensaje); await cargarNumCorrelativo(); limpiar(); toast('PDF guardado en Drive y cotización registrada ✓',5000); showView('historial');cargarHistorial(); }catch(err){toast('Error: '+err.message,5000);console.error(err);} btn.textContent='Generar PDF y Guardar';btn.disabled=false; } async function cambiarEstado(num,estado,btn){ btn.disabled=true; try{ const result=await gasPost({action:'cambiarEstado',num,estado}); if(result.error)throw new Error(result.mensaje); toast('Estado actualizado a '+estado+' ✓'); cargarHistorial(); }catch(err){toast('Error: '+err.message,4000);btn.disabled=false;} } async function cargarHistorial(){ const cont=document.getElementById('hist-cont'); cont.innerHTML='
Cargando...
'; try{ const result=await gasGet('getRegistro'); if(!result.registros||result.registros.length===0){cont.innerHTML='
Aún no hay cotizaciones registradas.
';return;} let h=''; result.registros.forEach(x=>{ const bc=x.estado==='Aprobada'?'b-apro':x.estado==='Rechazada'?'b-rech':'b-pend'; const pdfBtn=x.linkPDF?`Ver PDF`:``; h+=``; }); h+='
N° CotizaciónFechaEmpresaResponsableClienteMontoEstadoCambiar estadoPDF
${x.num} ${formatFecha(x.fecha)} ${x.empresa} ${x.rc} ${x.cliente} ${x.monto} ${x.estado}
${x.estado!=='Aprobada'?``:''} ${x.estado!=='Rechazada'?``:''}
${pdfBtn}
';cont.innerHTML=h; }catch(err){cont.innerHTML='
Error cargando historial.
';} } function limpiar(){ document.getElementById('rc-sel').value='';document.getElementById('rc-e').value='';document.getElementById('rc-t').value=''; document.getElementById('cli-sel').value='';document.getElementById('cli-info').style.display='none'; document.getElementById('obs').value='';srvs=[];renderSrvs(); } function showView(v){ document.getElementById('view-nueva').style.display=v==='nueva'?'block':'none'; document.getElementById('view-historial').style.display=v==='historial'?'block':'none'; document.querySelectorAll('.vtab').forEach((t,i)=>t.classList.toggle('active',(i===0&&v==='nueva')||(i===1&&v==='historial'))); } init();