<?php
declare(strict_types=1);
require_once __DIR__.'/auth.php';
require_once __DIR__.'/inventario_helpers.php';
tiPermExigir($mysqli,'inventario_geral','visualizar');
$mysqli->set_charset('utf8mb4');
if(!invTabelaExiste($mysqli,'ti_inventario_campanhas'))header('Location: instalar_governanca_ti.php');
$flash=invConsumirFlash();$erro='';$pronto=invProntidao($mysqli);$csrf=invCsrf();

if($_SERVER['REQUEST_METHOD']==='POST'){
 try{
  tiPermExigir($mysqli,'inventario_geral','cadastrar');invValidarCsrf();
  if(!$pronto['liberado'])throw new RuntimeException('O inventário será liberado quando a Central alcançar o percentual mínimo configurado.');
  $nome=invTexto($_POST['nome']??'',180);$descricao=invNulo($_POST['descricao']??'',5000);$tipo=invNulo($_POST['filtro_tipo_ativo']??'',30);$secretaria=invNulo($_POST['filtro_secretaria']??'',180);$setor=invNulo($_POST['filtro_setor']??'',180);$predio=invNulo($_POST['filtro_predio']??'',180);$ambiente=invNulo($_POST['filtro_ambiente']??'',180);$responsavel=invNulo($_POST['responsavel_campanha']??'',150);$inicio=invNulo($_POST['inicio_previsto']??'',10);$prazo=invNulo($_POST['prazo_final']??'',10);$usuario=tiPermUsuario();
  if($nome==='')throw new RuntimeException('Informe o nome da campanha.');
  $ativos=invFiltrarAtivos(invAtivos($mysqli),['tipo'=>$tipo,'secretaria'=>$secretaria,'setor'=>$setor,'predio'=>$predio,'ambiente'=>$ambiente]);
  if(!$ativos)throw new RuntimeException('Nenhum ativo foi encontrado para os filtros informados.');
  $escopo=$setor?'SETOR':($secretaria?'SECRETARIA':($predio?'PREDIO':($ambiente?'AMBIENTE':($tipo?'TIPO':'GERAL'))));
  $mysqli->begin_transaction();
  $stmt=$mysqli->prepare("INSERT INTO ti_inventario_campanhas(nome,descricao,escopo_tipo,filtro_tipo_ativo,filtro_secretaria,filtro_setor,filtro_predio,filtro_ambiente,status,responsavel_campanha,inicio_previsto,prazo_final,total_esperado,criado_por,atualizado_por) VALUES(?,?,?,?,?,?,?,?,'EM_ANDAMENTO',?,?,?,?,?,?,?)");
  $total=count($ativos);$stmt->bind_param('sssssssssssiss',$nome,$descricao,$escopo,$tipo,$secretaria,$setor,$predio,$ambiente,$responsavel,$inicio,$prazo,$total,$usuario,$usuario);$stmt->execute();$id=(int)$stmt->insert_id;$stmt->close();
  $codigo=invCodigoCampanha($id);$stmt=$mysqli->prepare('UPDATE ti_inventario_campanhas SET codigo=?,iniciado_em=NOW() WHERE id=?');$stmt->bind_param('si',$codigo,$id);$stmt->execute();$stmt->close();
  $stmt=$mysqli->prepare('INSERT INTO ti_inventario_itens(campanha_id,ativo_id,esperado,codigo_ativo_snapshot,tipo_ativo_snapshot,nome_snapshot,patrimonio_snapshot,serie_snapshot,identificador_snapshot,responsavel_esperado,setor_esperado,ambiente_esperado,local_esperado) VALUES(?,?,1,?,?,?,?,?,?,?,?,?,?)');
  foreach($ativos as $a){$aid=(int)$a['id'];$stmt->bind_param('iisssssssssss',$id,$aid,$a['codigo_ativo'],$a['tipo_ativo'],$a['nome'],$a['patrimonio'],$a['serie'],$a['identificador'],$a['responsavel'],$a['setor'],$a['ambiente'],$a['local']);$stmt->execute();}
  $stmt->close();invRegistrarEvento($mysqli,$id,null,'CAMPANHA_CRIADA','Campanha iniciada',$total.' ativo(s) adicionados ao escopo.');$mysqli->commit();tiPermRegistrarAuditoria($mysqli,'INVENTARIO_CRIADO','inventario_geral',null,$codigo.' • '.$nome);invRedirecionar('inventario_campanha.php?id='.$id);
 }catch(Throwable $e){try{$mysqli->rollback();}catch(Throwable){}$erro=$e->getMessage();}
}

$campanhas=[];$r=$mysqli->query("SELECT c.*,(SELECT COUNT(*) FROM ti_inventario_itens i WHERE i.campanha_id=c.id AND i.resultado<>'PENDENTE') conferidos,(SELECT COUNT(*) FROM ti_inventario_itens i WHERE i.campanha_id=c.id AND i.resultado IN ('LOCAL_DIVERGENTE','RESPONSAVEL_DIVERGENTE','DANIFICADO','NAO_LOCALIZADO','FORA_LISTA')) divergencias FROM ti_inventario_campanhas c ORDER BY FIELD(c.status,'EM_ANDAMENTO','RASCUNHO','ENCERRADA','CANCELADA'),c.id DESC");if($r)while($l=$r->fetch_assoc())$campanhas[]=$l;
$k=['campanhas'=>count($campanhas),'andamento'=>0,'ativos'=>0,'conferidos'=>0,'divergencias'=>0,'encerradas'=>0];foreach($campanhas as $c){$k['ativos']+=(int)$c['total_esperado'];$k['conferidos']+=(int)$c['conferidos'];$k['divergencias']+=(int)$c['divergencias'];if($c['status']==='EM_ANDAMENTO')$k['andamento']++;if($c['status']==='ENCERRADA')$k['encerradas']++;}
$ativos=invAtivos($mysqli);$valores=['tipo'=>[],'secretaria'=>[],'setor'=>[],'predio'=>[],'ambiente'=>[]];foreach($ativos as $a){foreach(['tipo'=>'tipo_ativo','secretaria'=>'secretaria','setor'=>'setor','predio'=>'predio','ambiente'=>'ambiente'] as $k2=>$f){$v=trim((string)($a[$f]??''));if($v!=='')$valores[$k2][$v]=true;}}foreach($valores as &$v){$v=array_keys($v);sort($v,SORT_NATURAL|SORT_FLAG_CASE);}unset($v);
?>
<!doctype html><html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Inventário Geral de TI</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="governanca_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-clipboard2-check-fill"></i>Conferência física institucional</span><h1>Inventário Geral de TI</h1><p>Campanhas por setor, pesquisa rápida, conferência de ativos e tratamento completo de divergências.</p></div></div><nav class="head-actions"><?php if(tiPermPode($mysqli,'inventario_geral','administrar')):?><a class="head-btn" href="inventario_configuracoes.php"><i class="bi bi-sliders"></i>Configurações</a><?php endif;?><a class="head-btn" href="governanca_ti.php"><i class="bi bi-shield-check"></i>Governança</a><a class="head-btn primary" href="central_ativos.php"><i class="bi bi-boxes"></i>Ativos</a></nav></div></header><main class="main"><?php if($flash):?><div class="flash <?=$flash['tipo']==='sucesso'?'success':'error'?>"><i class="bi bi-check-circle-fill"></i><?=invE($flash['mensagem'])?></div><?php endif;?><?php if($erro):?><div class="flash error"><i class="bi bi-exclamation-triangle-fill"></i><?=invE($erro)?></div><?php endif;?>
<section class="hero"><div><h2>O inventário começa com uma base <span>mínima e confiável.</span></h2><p>O módulo somente libera novas campanhas quando a Central de Ativos possuir pelo menos <?=number_format((float)$pronto['minimo'],0,',','.')?>% do total estimado de equipamentos. Isso evita uma conferência baseada em dados incompletos.</p><div class="tags"><span class="tag"><i class="bi bi-search"></i>Pesquisa por ATI, patrimônio, série, IMEI ou linha</span><span class="tag"><i class="bi bi-building"></i>Campanhas por setor</span><span class="tag"><i class="bi bi-exclamation-diamond"></i>Divergências rastreadas</span></div></div><aside class="hero-side"><small>Prontidão do cadastro</small><strong><?=number_format((float)$pronto['percentual'],1,',','.')?>%</strong><span><?=$pronto['cadastrados']?> de <?=$pronto['estimado']?> ativos estimados. <?=$pronto['liberado']?'Inventário liberado.':'Faltam '.$pronto['faltam'].' cadastros para liberar.'?></span><div class="progress" style="margin-top:13px;background:rgba(255,255,255,.18)"><i style="width:<?=min(100,(float)$pronto['percentual'])?>%;background:#fff"></i></div></aside></section>
<section class="steps" style="margin-top:14px"><article class="step"><strong><i class="bi bi-1-circle-fill"></i>Preparar base</strong><span>Cadastre e sincronize ao menos o percentual mínimo dos ativos.</span></article><article class="step"><strong><i class="bi bi-2-circle-fill"></i>Criar campanha</strong><span>Escolha setor, secretaria, prédio, ambiente ou tipo de ativo.</span></article><article class="step"><strong><i class="bi bi-3-circle-fill"></i>Conferir</strong><span>Digite o identificador e confirme local, pessoa e condição.</span></article><article class="step"><strong><i class="bi bi-4-circle-fill"></i>Regularizar</strong><span>Trate divergências, encerre e emita o relatório da campanha.</span></article></section>
<section class="kpis"><article class="kpi"><i class="bi bi-collection-fill"></i><strong><?=$k['campanhas']?></strong><span>Campanhas</span></article><article class="kpi"><i class="bi bi-play-circle-fill"></i><strong><?=$k['andamento']?></strong><span>Em andamento</span></article><article class="kpi"><i class="bi bi-boxes"></i><strong><?=$k['ativos']?></strong><span>Itens esperados</span></article><article class="kpi"><i class="bi bi-check2-circle"></i><strong><?=$k['conferidos']?></strong><span>Conferidos</span></article><article class="kpi"><i class="bi bi-exclamation-diamond-fill"></i><strong><?=$k['divergencias']?></strong><span>Divergências</span></article><article class="kpi"><i class="bi bi-archive-fill"></i><strong><?=$k['encerradas']?></strong><span>Encerradas</span></article></section>
<?php if(tiPermPode($mysqli,'inventario_geral','cadastrar')):?><section class="form-card"><h3><i class="bi bi-plus-circle-fill"></i> Nova campanha de inventário</h3><p style="color:var(--muted);font-size:8px;line-height:1.6">A campanha cria uma fotografia dos ativos esperados no local. Alterações posteriores não apagam o que era esperado no início.</p><?php if(!$pronto['liberado']):?><div class="alert warn"><strong>Criação bloqueada:</strong> faltam <?=$pronto['faltam']?> ativos para atingir o mínimo de <?=number_format((float)$pronto['minimo'],0,',','.')?>%.</div><?php else:?><form method="post"><input type="hidden" name="csrf_token" value="<?=invE($csrf)?>"><div class="form-grid"><div class="form-group two"><label>Nome da campanha *</label><input class="control" name="nome" required placeholder="Ex.: Inventário 2026 — Secretaria de Educação"></div><div class="form-group"><label>Responsável pela campanha</label><input class="control" name="responsavel_campanha" value="<?=invE(tiPermUsuario())?>"></div><div class="form-group"><label>Tipo de ativo</label><select class="control" name="filtro_tipo_ativo"><option value="">Todos</option><?php foreach($valores['tipo'] as $v):?><option><?=invE($v)?></option><?php endforeach;?></select></div><div class="form-group"><label>Secretaria</label><select class="control" name="filtro_secretaria"><option value="">Todas</option><?php foreach($valores['secretaria'] as $v):?><option><?=invE($v)?></option><?php endforeach;?></select></div><div class="form-group"><label>Setor</label><select class="control" name="filtro_setor"><option value="">Todos</option><?php foreach($valores['setor'] as $v):?><option><?=invE($v)?></option><?php endforeach;?></select></div><div class="form-group"><label>Prédio</label><select class="control" name="filtro_predio"><option value="">Todos</option><?php foreach($valores['predio'] as $v):?><option><?=invE($v)?></option><?php endforeach;?></select></div><div class="form-group"><label>Ambiente / sala</label><select class="control" name="filtro_ambiente"><option value="">Todos</option><?php foreach($valores['ambiente'] as $v):?><option><?=invE($v)?></option><?php endforeach;?></select></div><div class="form-group"><label>Início previsto</label><input class="control" type="date" name="inicio_previsto" value="<?=date('Y-m-d')?>"></div><div class="form-group"><label>Prazo final</label><input class="control" type="date" name="prazo_final"></div><div class="form-group full"><label>Descrição e orientações</label><textarea class="control" name="descricao" placeholder="Explique o objetivo, equipe e observações importantes..."></textarea></div></div><div class="actions"><button class="button green"><i class="bi bi-play-circle-fill"></i>Criar e iniciar campanha</button></div></form><?php endif;?></section><?php endif;?>
<section class="panel"><div class="panel-head"><div class="panel-title"><span class="panel-icon"><i class="bi bi-collection-fill"></i></span><div><h3>Campanhas cadastradas</h3><p>Acompanhe andamento, prazo e divergências.</p></div></div></div><div class="table-wrap"><table class="table"><thead><tr><th>Campanha</th><th>Escopo</th><th>Progresso</th><th>Divergências</th><th>Prazo</th><th>Status</th><th>Ações</th></tr></thead><tbody><?php foreach($campanhas as $c):?><?php $pct=(int)$c['total_esperado']>0?(int)round(((int)$c['conferidos']/(int)$c['total_esperado'])*100):0;?><tr><td><span class="cell-main"><?=invE($c['nome'])?></span><span class="cell-sub"><?=invE($c['codigo']?:'Sem código')?> • <?=invE($c['responsavel_campanha']?:'Sem responsável')?></span></td><td><span class="cell-main"><?=invE($c['escopo_tipo'])?></span><span class="cell-sub"><?=invE($c['filtro_setor']?:($c['filtro_secretaria']?:($c['filtro_predio']?:'Geral')))?></span></td><td><span class="cell-main"><?=$c['conferidos']?> / <?=$c['total_esperado']?></span><div class="progress" style="margin-top:7px"><i style="width:<?=$pct?>%"></i></div></td><td><span class="badge <?=$c['divergencias']>0?'b-orange':'b-green'?>"><?=(int)$c['divergencias']?> ocorrência(s)</span></td><td><?=invE($c['prazo_final']?date('d/m/Y',strtotime($c['prazo_final'])):'Sem prazo')?></td><td><span class="badge <?=$c['status']==='EM_ANDAMENTO'?'b-blue':($c['status']==='ENCERRADA'?'b-green':'b-muted')?>"><?=invE(str_replace('_',' ',$c['status']))?></span></td><td><a class="button primary" href="inventario_campanha.php?id=<?=(int)$c['id']?>">Abrir</a></td></tr><?php endforeach;?><?php if(!$campanhas):?><tr><td colspan="7"><div class="empty"><i class="bi bi-clipboard2"></i><strong>Nenhuma campanha criada</strong><span>Quando a base atingir o mínimo, inicie a primeira conferência.</span></div></td></tr><?php endif;?></tbody></table></div></section><footer class="footer"><span>Prefeitura de Extrema • Gerência de Tecnologia</span><span>Sem QR Code: pesquisa por código, patrimônio, série, IMEI ou linha.</span></footer></main></div></body></html>
