<?php
declare(strict_types=1);
require_once __DIR__.'/../conexao.php';require_once __DIR__.'/ativos_helpers.php';atiExigirLogin();$mysqli->set_charset('utf8mb4');
$id=(int)($_GET['id']??0);$ativo=atiCarregarCentral($mysqli,$id);if(!$ativo){http_response_code(404);exit('Ativo não encontrado.');}atiExigirAcesso((string)$ativo['tipo_ativo']);$fonte=atiCarregarFonte($mysqli,$ativo);if(!$fonte){http_response_code(404);exit('Cadastro de origem não encontrado.');}$r=atiResumoFonte((string)$ativo['tipo_ativo'],$fonte);$os=atiOsDoAtivo($mysqli,$fonte,(string)$ativo['tipo_ativo']);$mov=atiMovimentacoesFonte($mysqli,$ativo);$termos=atiTermosFonte($mysqli,$ativo,$os);$docs=atiCentralDocumentos($mysqli,$id);$manut=atiManutencoesFonte($mysqli,$ativo);$consumos=atiConsumosFonte($mysqli,$ativo);$confs=atiConferencias($mysqli,$id);$custos=atiCustos($mysqli,$id);$rels=atiRelacionamentos($mysqli,$id);$eventos=atiEventos($mysqli,$id);$dups=atiDuplicidades($mysqli,$ativo);$flash=atiConsumirFlash();$totalCustos=array_sum(array_map(static fn($x)=>(float)$x['valor'],$custos));$ultimaOs=$os[0]??null;$tipo=(string)$ativo['tipo_ativo'];
$mobile=null;if(atiTabelaExiste($mysqli,'ti_mobile_dispositivos')){$stmt=$mysqli->prepare('SELECT COUNT(*) total FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name=\'ti_mobile_dispositivos\' AND column_name=\'vinculo_ativo_id\'');$stmt->execute();$hasLink=(int)($stmt->get_result()->fetch_assoc()['total']??0)>0;$stmt->close();if($hasLink){$stmt=$mysqli->prepare('SELECT * FROM ti_mobile_dispositivos WHERE vinculo_ativo_id=? ORDER BY ultima_comunicacao DESC LIMIT 1');$stmt->bind_param('i',$id);$stmt->execute();$mobile=$stmt->get_result()->fetch_assoc()?:null;$stmt->close();}}
$pcAgent=null;if($tipo==='COMPUTADOR'&&atiTabelaExiste($mysqli,'ti_pc_agentes')){$computerId=(int)$ativo['origem_id'];$stmt=$mysqli->prepare('SELECT * FROM ti_pc_agentes WHERE computador_id=? ORDER BY ultima_comunicacao DESC LIMIT 1');$stmt->bind_param('i',$computerId);$stmt->execute();$pcAgent=$stmt->get_result()->fetch_assoc()?:null;$stmt->close();}
function atiIconeDetalhe(string $t):string{return match($t){'COMPUTADOR'=>'bi-pc-display','IMPRESSORA'=>'bi-printer-fill','SMARTPHONE'=>'bi-phone-fill','CHIP'=>'bi-sim-fill',default=>'bi-box-seam-fill'};}
?>
<!doctype html><html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><title><?=atiE($ativo['codigo_ativo'])?> | Central de Ativos</title><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet"><link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" rel="stylesheet"><link href="ativos_style.css?v=1" rel="stylesheet"></head><body><div class="top"></div><div class="grid-bg"></div><div class="app"><header class="header"><div class="header-inner"><div class="brand"><div class="logo"><img src="../assets/logo_pref.jpg" alt=""></div><div><span class="eyebrow"><i class="bi bi-box-seam-fill"></i><?=atiE($ativo['codigo_ativo'])?></span><h1>Ficha Única do Ativo</h1><p>Informações consolidadas sem alterar o cadastro original.</p></div></div><nav class="header-actions"><a class="head-btn primary" href="index.php"><i class="bi bi-arrow-left"></i>Central</a><a class="head-btn" href="<?=atiE($r['modulo_url'])?>"><i class="bi bi-box-arrow-up-right"></i>Módulo original</a><a class="head-btn" href="../listar_os.php?buscar=<?=rawurlencode((string)($r['patrimonio']?:$r['serie']))?>"><i class="bi bi-tools"></i>Ordens</a></nav></div></header><main class="main"><?php if($flash):?><div class="flash <?=$flash['tipo']==='sucesso'?'success':'error'?>"><?=atiE($flash['mensagem'])?></div><?php endif;?>
<?php foreach($dups as $d):?><div class="flash error"><i class="bi bi-files"></i>Possível duplicidade com <a href="ativo.php?id=<?=(int)$d['id']?>"><strong><?=atiE($d['codigo_ativo'])?></strong></a> — confira patrimônio e série.</div><?php endforeach;?>
<?php if($pcAgent):?><div class="alert-box" style="margin:0 0 14px"><i class="bi bi-windows"></i><div><strong>Inventário automático Windows</strong><br>Última comunicação: <?=atiE(atiData($pcAgent['ultima_comunicacao']))?> • <?=atiE($pcAgent['sistema_operacional']?:'Windows N/I')?> build <?=atiE($pcAgent['os_build']?:'N/I')?> • RAM <?=number_format((int)$pcAgent['ram_total_mb']/1024,1,',','.')?> GB • armazenamento <?=number_format((int)$pcAgent['armazenamento_total_mb']/1024,1,',','.')?> GB • IP <?=atiE($pcAgent['ipv4']?:'N/I')?> • <a href="../inventario_computador.php?id=<?=(int)$pcAgent['id']?>">abrir inventário</a></div></div><?php endif;?>
<section class="detail-hero"><article class="identity"><div class="identity-top"><span class="identity-icon"><i class="bi <?=atiIconeDetalhe($tipo)?>"></i></span><div><h2><?=atiE($r['nome'])?></h2><p><?=atiE($tipo.' • '.$r['subtipo'].' • '.$ativo['codigo_ativo'])?></p><span class="status <?=atiStatusClasse($r['status'])?>" style="margin-top:9px"><?=atiE(atiStatusRotulo($r['status']))?></span></div></div><div class="detail-grid"><div class="detail"><span>Patrimônio</span><strong><?=atiE($r['patrimonio']?:'Não informado')?></strong></div><div class="detail"><span>Número de série</span><strong><?=atiE($r['serie']?:'Não informado')?></strong></div><div class="detail"><span>Responsável atual</span><strong><?=atiE($r['responsavel']?:'Sem responsável')?></strong></div><div class="detail"><span>Setor atual</span><strong><?=atiE($r['setor']?:'Sem setor')?></strong></div><div class="detail"><span>Ambiente</span><strong><?=atiE($r['ambiente']?:'Não informado')?></strong></div><div class="detail"><span>Posição</span><strong><?=atiE($r['local']?:'Não informada')?></strong></div><div class="detail"><span>Garantia</span><strong><?=atiE(atiData($ativo['garantia_ate']?:$r['garantia'],false))?></strong></div><div class="detail"><span>Última conferência</span><strong><?=atiE(atiData($ativo['ultima_conferencia_em']))?></strong></div></div></article><aside class="summary-side"><small>Qualidade do cadastro</small><strong><?=(int)$ativo['qualidade_cadastro']?>%</strong><p><?=count($os)?> OS • <?=count($mov)?> movimentações • <?=count($termos)+count($docs)?> documentos • <?=atiMoeda($totalCustos)?> em custos registrados.</p><div class="actions" style="justify-content:flex-start;flex-wrap:wrap"><a class="button green" href="conferencia.php?id=<?=$id?>">Conferir</a><a class="button" href="documento.php?id=<?=$id?>">Documento</a><a class="button" href="custo.php?id=<?=$id?>">Custo</a><a class="button" href="relacionamentos.php?id=<?=$id?>">Relacionar</a></div></aside></section>
<section class="panel"><div class="tabs"><button class="tab active" data-tab="visao">Visão geral</button><button class="tab" data-tab="os">OS (<?=count($os)?>)</button><button class="tab" data-tab="mov">Movimentações (<?=count($mov)?>)</button><button class="tab" data-tab="docs">Documentos (<?=count($termos)+count($docs)?>)</button><button class="tab" data-tab="man">Manutenções</button><button class="tab" data-tab="conf">Conferências (<?=count($confs)?>)</button><button class="tab" data-tab="custos">Custos</button><button class="tab" data-tab="rel">Relacionamentos</button></div>
<div class="tab-content active" id="tab-visao"><?php if($mobile):?><div class="alert-box" style="margin-bottom:14px"><i class="bi bi-android2"></i><div><strong>Inventário automático Android</strong><br>Última comunicação: <?=atiE(atiData($mobile['ultima_comunicacao']))?> • Android <?=atiE($mobile['android_version']?:'N/I')?> • RAM <?=number_format((int)$mobile['ram_total_mb']/1024,1,',','.')?> GB • armazenamento <?=number_format((int)$mobile['armazenamento_total_mb']/1024,1,',','.')?> GB • bateria <?=(int)$mobile['bateria_percentual']?>% • <a href="../inventario_dispositivo.php?id=<?=(int)$mobile['id']?>">abrir inventário</a></div></div><?php endif;?><div class="detail-grid"><div class="detail"><span>Identificador complementar</span><strong><?=atiE($r['identificador']?:'Não informado')?></strong></div><div class="detail"><span>Condição</span><strong><?=atiE($r['condicao']?:'Não avaliada')?></strong></div><div class="detail"><span>Atualizado no módulo</span><strong><?=atiE(atiData($r['atualizado']))?></strong></div><div class="detail"><span>Origem</span><strong><?=atiE($ativo['origem_tabela'].' #'.$ativo['origem_id'])?></strong></div></div><div style="margin-top:14px"><?php if(!atiValorValido($r['responsavel'])):?><div class="alert-box danger"><i class="bi bi-person-exclamation"></i>Ativo sem responsável atual.</div><?php endif;?><?php if(!atiValorValido($r['setor'])):?><div class="alert-box danger"><i class="bi bi-geo-alt-fill"></i>Ativo sem setor definido.</div><?php endif;?><?php if((int)$ativo['qualidade_cadastro']<60):?><div class="alert-box"><i class="bi bi-clipboard-x-fill"></i>Cadastro com menos de 60% de completude.</div><?php endif;?><?php if(!$ativo['ultima_conferencia_em']||time()-(strtotime($ativo['ultima_conferencia_em'])?:0)>365*86400):?><div class="alert-box"><i class="bi bi-calendar-x-fill"></i>Conferência física ausente ou realizada há mais de um ano.</div><?php endif;?><?php if($ultimaOs):?><div class="alert-box"><i class="bi bi-tools"></i>Última OS: <?=atiE($ultimaOs['numero_os'])?> — <?=atiE($ultimaOs['problema']?:'sem problema descrito')?>.</div><?php endif;?></div></div>
<div class="tab-content" id="tab-os"><?php if(!$os):?><div class="empty"><i class="bi bi-tools"></i><strong>Nenhuma OS vinculada</strong></div><?php else:?><div class="timeline"><?php foreach($os as $o):?><article class="timeline-item"><span class="timeline-icon"><i class="bi bi-tools"></i></span><span><strong><?=atiE($o['numero_os'])?> • <?=atiE($o['status'])?></strong><span><?=atiE($o['problema']?:'Sem problema descrito')?></span><span>Solução: <?=atiE($o['solucao']?:'Não informada')?> • Técnico: <?=atiE($o['tecnico']?:'Não informado')?></span><span><a href="../listar_os.php?abrir_os=<?=(int)$o['id']?>">Abrir OS</a></span></span><time><?=atiE(atiData($o['data_entrada']))?></time></article><?php endforeach;?></div><?php endif;?></div>
<div class="tab-content" id="tab-mov"><?php if(!$mov&&!$eventos):?><div class="empty"><i class="bi bi-arrow-left-right"></i><strong>Sem movimentações</strong></div><?php else:?><div class="timeline"><?php foreach($mov as $m):?><article class="timeline-item"><span class="timeline-icon"><i class="bi bi-arrow-left-right"></i></span><span><strong><?=atiE(str_replace('_',' ',$m['acao']))?></strong><span><?=atiE(($m['responsavel_anterior']?:'Sem responsável').' → '.($m['responsavel_novo']?:'Sem responsável'))?></span><span><?=atiE(($m['setor_anterior']?:'Sem setor').' → '.($m['setor_novo']?:'Sem setor'))?> • <?=atiE($m['detalhes']?:'')?></span><span>Por <?=atiE($m['usuario'])?></span></span><time><?=atiE(atiData($m['criado_em']))?></time></article><?php endforeach;?><?php foreach($eventos as $e):?><article class="timeline-item"><span class="timeline-icon"><i class="bi bi-shield-check"></i></span><span><strong><?=atiE($e['titulo'])?></strong><span><?=atiE($e['detalhes']?:'')?> • <?=atiE($e['usuario'])?></span></span><time><?=atiE(atiData($e['criado_em']))?></time></article><?php endforeach;?></div><?php endif;?></div>
<div class="tab-content" id="tab-docs"><div class="doc-grid"><?php foreach($termos as $t):?><article class="doc"><strong><?=atiE($t['numero_termo'])?></strong><span><?=atiE(str_replace('_',' ',$t['tipo']))?> • <?=atiE($t['status'])?></span><span><?=atiE(atiData($t['criado_em']))?></span><a target="_blank" href="<?=atiE($t['url'])?>">Abrir termo</a></article><?php endforeach;?><?php foreach($docs as $d):?><article class="doc"><strong><?=atiE($d['nome_original'])?></strong><span><?=atiE($d['tipo_documento'])?> • <?=atiE($d['descricao']?:'Sem descrição')?></span><span><?=atiE(atiData($d['enviado_em']))?> • <?=atiE($d['enviado_por'])?></span><a href="download_documento.php?id=<?=(int)$d['id']?>">Baixar documento</a></article><?php endforeach;?></div><?php if(!$termos&&!$docs):?><div class="empty"><i class="bi bi-folder2-open"></i><strong>Nenhum documento vinculado</strong></div><?php endif;?></div>
<div class="tab-content" id="tab-man"><?php if(!$manut&&!$consumos):?><div class="empty"><i class="bi bi-tools"></i><strong>Sem manutenção técnica específica</strong><span>As ordens de serviço continuam disponíveis na aba OS.</span></div><?php else:?><div class="timeline"><?php foreach($manut as $m):?><article class="timeline-item"><span class="timeline-icon"><i class="bi bi-printer-fill"></i></span><span><strong><?=atiE($m['numero_atendimento'])?> • <?=atiE(str_replace('_',' ',$m['status']))?></strong><span>Defeito: <?=atiE($m['defeito_relatado'])?></span><span>Diagnóstico: <?=atiE($m['diagnostico']?:'Não informado')?> • Solução: <?=atiE($m['solucao']?:'Não finalizada')?></span></span><time><?=atiE(atiData($m['data_entrada']))?></time></article><?php endforeach;?><?php foreach($consumos as $c):?><article class="timeline-item"><span class="timeline-icon"><i class="bi bi-box-seam-fill"></i></span><span><strong><?=atiE($c['item'])?> • <?=(int)$c['quantidade']?> unidade(s)</strong><span><?=atiE($c['observacao']?:'Material consumido')?> • <?=atiE($c['usuario'])?></span></span><time><?=atiE(atiData($c['criado_em']))?></time></article><?php endforeach;?></div><?php endif;?></div>
<div class="tab-content" id="tab-conf"><?php if(!$confs):?><div class="empty"><i class="bi bi-clipboard-check"></i><strong>Nunca conferido fisicamente</strong></div><?php else:?><div class="timeline"><?php foreach($confs as $c):?><article class="timeline-item"><span class="timeline-icon"><i class="bi bi-clipboard-check-fill"></i></span><span><strong><?=atiE(str_replace('_',' ',$c['resultado']))?></strong><span><?=atiE(($c['setor_encontrado']?:'Sem setor').' • '.($c['ambiente_encontrado']?:'Sem ambiente').' • '.($c['local_encontrado']?:'Sem posição'))?></span><span><?=atiE($c['observacoes']?:'')?> • por <?=atiE($c['conferido_por'])?></span></span><time><?=atiE(atiData($c['conferido_em']))?></time></article><?php endforeach;?></div><?php endif;?></div>
<div class="tab-content" id="tab-custos"><?php if(!$custos):?><div class="empty"><i class="bi bi-cash-coin"></i><strong>Nenhum custo registrado</strong></div><?php else:?><div class="timeline"><?php foreach($custos as $c):?><article class="timeline-item"><span class="timeline-icon"><i class="bi bi-cash-coin"></i></span><span><strong><?=atiE(str_replace('_',' ',$c['tipo_custo']))?> • <?=atiMoeda($c['valor'])?></strong><span><?=atiE($c['descricao'])?> • <?=atiE($c['fornecedor']?:'Fornecedor não informado')?></span></span><time><?=atiE(atiData($c['data_custo'],false))?></time></article><?php endforeach;?></div><div class="alert-box" style="margin-top:10px"><i class="bi bi-calculator-fill"></i>Custo total registrado: <strong><?=atiMoeda($totalCustos)?></strong></div><?php endif;?></div>
<div class="tab-content" id="tab-rel"><?php if(!$rels):?><div class="empty"><i class="bi bi-diagram-3"></i><strong>Nenhum ativo relacionado</strong></div><?php else:?><div class="doc-grid"><?php foreach($rels as $x):?><article class="doc"><strong><?=atiE($x['codigo_ativo'])?> • <?=atiE($x['resumo_outro']['nome']??$x['tipo_ativo'])?></strong><span><?=atiE(str_replace('_',' ',$x['tipo_relacao']))?></span><span><?=atiE($x['observacoes']?:'Sem observação')?></span><a href="ativo.php?id=<?=(int)$x['outro_ativo_id']?>">Abrir ativo relacionado</a></article><?php endforeach;?></div><?php endif;?></div></section><footer class="footer"><span><?=atiE($ativo['codigo_ativo'])?> • Ficha consolidada</span><span>Fonte original preservada: <?=atiE($ativo['origem_tabela'])?></span></footer></main></div><script>document.querySelectorAll('.tab').forEach(b=>b.addEventListener('click',()=>{document.querySelectorAll('.tab,.tab-content').forEach(x=>x.classList.remove('active'));b.classList.add('active');document.getElementById('tab-'+b.dataset.tab).classList.add('active')}));</script></body></html>
