MANUTECH

Acesso ao sistema de manutenção

Primeiro acesso: usuário admin e senha admin123. Altere a senha após entrar.

ManuTech

Instalações • Controle de Manutenção e Ordens de Serviço

Visão geral

OS abertas
0
Em andamento
0
Concluídas
0
Faturamento
R$ 0,00
Preventivas pendentes
0
Itens abaixo do mínimo
0

Últimas ordens de serviço

Ordens de Serviço

NºDataClienteServiçoTécnicoStatusValorAções

Clientes

NomeTelefoneE-mailEndereçoAções

Equipamentos / Ativos

EquipamentoClientePatrimônioLocalÚltima manutençãoAções

Agenda de Manutenção Preventiva

DataEquipamentoClienteServiçoResponsávelStatusAções

Estoque de Peças e Materiais

ItemCódigoCategoriaEstoqueMínimoUn.FornecedorAções

Fornecedores

EmpresaContatoTelefoneE-mailAções

Usuários e Acessos

Perfis: Administrador, Supervisor, Técnico e Visualizador
NomeUsuárioPerfilTelefoneStatusAções

Relatórios

`);w.document.close()} function renderUsers(){ userTable.innerHTML=db.users.map(x=>`${esc(x.name)}${esc(x.username)}${esc(x.role)}${esc(x.phone||'-')}${x.active?'Ativo':'Inativo'}`).join('')||'Nenhum usuário cadastrado.' } function openUser(id){ let x=db.users.find(a=>a.id===id)||{}; openModal(id?'Editar usuário':'Novo usuário',`

`) } function saveUser(e,id){ e.preventDefault(); let login=ulogin.value.trim(); if(db.users.some(x=>x.username.toLowerCase()===login.toLowerCase() && x.id!==id)){alert('Este nome de usuário já existe.');return} let old=db.users.find(x=>x.id===id); let password=upass.value || (old?old.password:''); if(!password){alert('Informe uma senha.');return} let x={id:id||Date.now(),name:uname.value.trim(),username:login,password,role:urole.value,phone:uphone.value.trim(),active:uactive.value==='1'}; let i=db.users.findIndex(a=>a.id===id);i>=0?db.users[i]=x:db.users.push(x); closeModal();save() } function toggleUser(id){ let x=db.users.find(a=>a.id===id);if(!x)return; if(x.username==='admin'){alert('O administrador principal não pode ser desativado.');return} x.active=!x.active;save() } function deleteUser(id){ let x=db.users.find(a=>a.id===id);if(!x)return; if(x.username==='admin'){alert('O administrador principal não pode ser excluído.');return} if(confirm('Excluir este usuário?')){db.users=db.users.filter(a=>a.id!==id);save()} } function backupData(){let blob=new Blob([JSON.stringify(db,null,2)],{type:'application/json'});let a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='manutech_backup_'+new Date().toISOString().slice(0,10)+'.json';a.click();URL.revokeObjectURL(a.href)} function restoreData(e){let f=e.target.files[0];if(!f)return;let r=new FileReader();r.onload=()=>{try{let d=JSON.parse(r.result);if(!d.clients||!d.orders)throw 0;db=d;save();alert('Backup restaurado com sucesso.')}catch(_){alert('Arquivo de backup inválido.')}};r.readAsText(f)} function generateReport(){ let type=reportType.value,o=db.orders; if(type==='os') report.innerHTML=`

Relatório de Ordens de Serviço

Total de OS: ${o.length} | Abertas: ${o.filter(x=>x.status==='Aberta').length} | Em andamento: ${o.filter(x=>x.status==='Em andamento').length} | Concluídas: ${o.filter(x=>x.status==='Concluída').length}

${o.map(x=>``).join('')}
NºDataClienteServiçoStatusTotal
${x.number}${x.date}${esc(x.clientName)}${esc(x.service)}${esc(x.status)}${money(x.total)}
`; if(type==='finance') {let total=o.reduce((a,x)=>a+Number(x.total||0),0),lab=o.reduce((a,x)=>a+Number(x.labor||0),0),mat=o.reduce((a,x)=>a+Number(x.material||0),0);report.innerHTML=`

Relatório Financeiro

Faturamento
${money(total)}
Mão de obra
${money(lab)}
Materiais
${money(mat)}

Considera todas as ordens cadastradas.

`} if(type==='equipment') report.innerHTML=`

Manutenções por equipamento

${db.equipments.map(e=>{let a=o.filter(x=>x.equipment===e.name);return ``}).join('')}
EquipamentoClienteOSValor
${esc(e.name)}${esc(e.clientName)}${a.length}${money(a.reduce((s,x)=>s+x.total,0))}
`; } function renderAgenda(){ let f=agendaFilter?.value||'', a=db.agenda.filter(x=>!f||x.status===f).sort((x,y)=>x.date.localeCompare(y.date)); agendaTable.innerHTML=a.map(x=>`${esc(x.date)}${esc(x.equipment)}${esc(x.client)}${esc(x.service)}${esc(x.tech||'-')}${esc(x.status)}`).join('')||'Nenhuma manutenção agendada.' } function openAgenda(id){ let x=db.agenda.find(a=>a.id===id)||{}; openModal(id?'Editar preventiva':'Nova manutenção preventiva',`

`) } function saveAgenda(e,id){e.preventDefault();let x={id:id||Date.now(),date:adate.value,equipment:aequip.value,client:aclient.value,service:aservice.value,tech:atech.value,status:astatus.value,notes:anotes.value};let i=db.agenda.findIndex(a=>a.id===id);i>=0?db.agenda[i]=x:db.agenda.push(x);closeModal();save()} function markAgenda(id){let x=db.agenda.find(a=>a.id===id);if(x){x.status='Realizada';save()}} function renderStock(){ stockTable.innerHTML=db.stock.map(x=>`${esc(x.name)}${esc(x.code)}${esc(x.category)}${esc(x.qty)}${esc(x.min)}${esc(x.unit)}${esc(x.supplier||'-')}`).join('')||'Nenhum item cadastrado.' } function openStock(id){ let x=db.stock.find(a=>a.id===id)||{}; openModal(id?'Editar item':'Novo item de estoque',`

`) } function saveStock(e,id){e.preventDefault();let x={id:id||Date.now(),name:sname.value,code:scode.value,category:scategory.value,qty:+sqty.value,min:+smin.value,unit:sunit.value,supplier:ssupplier.value};let i=db.stock.findIndex(a=>a.id===id);i>=0?db.stock[i]=x:db.stock.push(x);closeModal();save()} function moveStock(id,n){let x=db.stock.find(a=>a.id===id);if(x){x.qty=Math.max(0,Number(x.qty)+n);save()}} function renderSuppliers(){supplierTable.innerHTML=db.suppliers.map(x=>`${esc(x.name)}${esc(x.contact||'-')}${esc(x.phone||'-')}${esc(x.email||'-')}`).join('')||'Nenhum fornecedor cadastrado.'} function openSupplier(id){ let x=db.suppliers.find(a=>a.id===id)||{}; openModal(id?'Editar fornecedor':'Novo fornecedor',`

`) } function saveSupplier(e,id){e.preventDefault();let x={id:id||Date.now(),name:fname.value,contact:fcontact.value,phone:fphone.value,email:femail.value,notes:fnotes.value};let i=db.suppliers.findIndex(a=>a.id===id);i>=0?db.suppliers[i]=x:db.suppliers.push(x);closeModal();save()} refresh();generateReport();restoreSession();