<?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');
$id=(int)($_GET['id']??$_POST['campanha_id']??0);$camp=invCampanha($mysqli,$id);if(!$camp){http_response_code(404);exit('Campanha não encontrada.');}$flash=invConsumirFlash();$erro='';$csrf=invCsrf();
if($_SERVER['REQUEST_METHOD']==='POST'&&($_POST['acao']??'')==='encerrar'){
 try{tiPermExigir($mysqli,'inventario_geral','finalizar');invValidarCsrf();$mysqli->begin_transaction();$stmt=$mysqli->prepare("UPDATE ti_inventario_itens SET resultado='NAO_LOCALIZADO',observacoes=CONCAT(COALESCE(observacoes,''),CASE WHEN COALESCE(observacoes,'')='' THEN '' ELSE '\n' END,'Marcado automaticamente no encerramento.'),conferido_por=?,conferido_em=NOW() WHERE campanha_id=? AND resultado='PENDENTE'");$u=tiPermUsuario();$stmt->bind_param('si',$u,$id);$stmt->execute();$nao=$stmt->affected_rows;$stmt->close();$stmt=$mysqli->prepare("UPDATE ti_inventario_campanhas SET status='ENCERRADA',encerrado_em=NOW(),atualizado_por=? WHERE id=?");$stmt->bind_param('si',$u,$id);$stmt->execute();$stmt->close();invRegistrarEvento($mysqli,$id,null,'CAMPANHA_ENCERRADA','Campanha encerrada',$nao.' pendência(s) marcada(s) como não localizada(s).');$mysqli->commit();invFlash('sucesso','Campanha encerrada. Pendências restantes foram marcadas como não localizadas.');invRedirecionar('inventario_campanha.php?id='.$id);}catch(Throwable $e){try{$mysqli->rollback();}catch(Throwable){}$erro=$e->getMessage();}
}
$busca=invTexto($_GET['busca']??'',180);$achados=$busca!==''?invBuscar($mysqli,$id,$busca):['itens'=>[],'externos'=>[]];$resumo=invResumoCampanha($mysqli,$id);$filtro=invTexto($_GET['resultado']??'',40);$pagina=max(1,(int)($_GET['pagina']??1));$porPagina=100;$offset=($pagina-1)*$porPagina;$stmt=$mysqli->prepare('SELECT COUNT(*) total FROM ti_inventario_itens WHERE campanha_id=?'.($filtro!==''?' AND resultado=?':''));if($filtro!=='')$stmt->bind_param('is',$id,$filtro);else$stmt->bind_param('i',$id);$stmt->execute();$totalLista=(int)($stmt->get_result()->fetch_assoc()['total']??0);$stmt->close();$totalPaginas=max(1,(int)ceil($totalLista/$porPagina));$pagina=min($pagina,$totalPaginas);$offset=($pagina-1)*$porPagina;$itens=[];$sql='SELECT * FROM ti_inventario_itens WHERE campanha_id=?'.($filtro!==''?' AND resultado=?':'').' ORDER BY resultado="PENDENTE" DESC, nome_snapshot LIMIT ? OFFSET ?';$stmt=$mysqli->prepare($sql);if($filtro!=='')$stmt->bind_param('isii',$id,$filtro,$porPagina,$offset);else$stmt->bind_param('iii',$id,$porPagina,$offset);$stmt->execute();$r=$stmt->get_result();while($l=$r->fetch_assoc())$itens[]=$l;$stmt->close();
?>
<!doctype html><html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title><?=invE($camp['nome'])?></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><?=invE($camp['codigo'])?></span><h1><?=invE($camp['nome'])?></h1><p><?=invE($camp['descricao']?:'Conferência física dos ativos definidos no escopo da campanha.')?></p></div></div><nav class="head-actions"><a class="head-btn" href="inventario_relatorio.php?id=<?=$id?>" target="_blank"><i class="bi bi-file-earmark-text-fill"></i>Relatório</a><a class="head-btn primary" href="inventario_geral.php"><i class="bi bi-arrow-left"></i>Campanhas</a></nav></div></header><main class="main"><?php if($flash):?><div class="flash <?=$flash['tipo']==='sucesso'?'success':'error'?>"><?=invE($flash['mensagem'])?></div><?php endif;?><?php if($erro):?><div class="flash error"><?=invE($erro)?></div><?php endif;?>
<section class="hero"><div><h2>Digite o identificador e <span>confira em poucos segundos.</span></h2><p>Use código ATI, patrimônio, série, IMEI ou linha. O sistema prioriza os itens esperados nesta campanha e também identifica equipamentos encontrados fora da lista.</p><div class="tags"><span class="tag"><i class="bi bi-person-check"></i>Responsável: <?=invE($camp['responsavel_campanha']?:'não definido')?></span><span class="tag"><i class="bi bi-calendar-event"></i>Prazo: <?=invE($camp['prazo_final']?date('d/m/Y',strtotime($camp['prazo_final'])):'sem prazo')?></span><span class="tag"><i class="bi bi-building"></i><?=invE($camp['filtro_setor']?:($camp['filtro_secretaria']?:'Escopo geral'))?></span></div></div><aside class="hero-side"><small>Progresso da campanha</small><strong><?=$resumo['percentual']?>%</strong><span><?=$resumo['conferidos']?> de <?=$resumo['total']?> itens conferidos.</span><div class="progress" style="margin-top:13px;background:rgba(255,255,255,.18)"><i style="width:<?=$resumo['percentual']?>%;background:#fff"></i></div></aside></section>
<section class="kpis"><article class="kpi"><i class="bi bi-boxes"></i><strong><?=$resumo['total']?></strong><span>Total</span></article><article class="kpi"><i class="bi bi-hourglass-split"></i><strong><?=$resumo['pendentes']?></strong><span>Pendentes</span></article><article class="kpi"><i class="bi bi-check-circle-fill"></i><strong><?=$resumo['corretos']?></strong><span>Corretos</span></article><article class="kpi"><i class="bi bi-arrow-left-right"></i><strong><?=$resumo['divergentes']?></strong><span>Divergentes</span></article><article class="kpi"><i class="bi bi-exclamation-triangle-fill"></i><strong><?=$resumo['danificados']?></strong><span>Danificados</span></article><article class="kpi"><i class="bi bi-search"></i><strong><?=$resumo['nao_localizados']?></strong><span>Não localizados</span></article></section>
<?php if($camp['status']==='EM_ANDAMENTO'):?><section class="form-card"><h3><i class="bi bi-search"></i> Localizar ativo para conferência</h3><form method="get" class="quick-search" style="margin-top:12px"><input type="hidden" name="id" value="<?=$id?>"><input autofocus autocomplete="off" class="control" name="busca" value="<?=invE($busca)?>" placeholder="Digite ATI, patrimônio, série, IMEI ou linha..."><button class="button primary"><i class="bi bi-search"></i>Pesquisar</button></form><?php if($busca!==''):?><div class="result-list" style="margin-top:14px"><?php foreach($achados['itens'] as $i):?><article class="result-card"><span class="result-icon"><i class="bi <?=invTipoIcone($i['tipo_ativo_snapshot'])?>"></i></span><div><h4><?=invE($i['nome_snapshot'])?> • <?=invE($i['codigo_ativo_snapshot'])?></h4><p>Patrimônio: <?=invE($i['patrimonio_snapshot']?:'não informado')?> • Esperado em <?=invE(trim(($i['setor_esperado']?:'').' • '.($i['ambiente_esperado']?:'').' • '.($i['local_esperado']?:''),' •')?:'local não informado')?></p><span class="badge <?=invResultadoClasse($i['resultado'])?>"><?=invE(invResultadoRotulo($i['resultado']))?></span></div><div class="actions" style="margin:0"><form method="post" action="inventario_conferir.php"><input type="hidden" name="csrf_token" value="<?=invE($csrf)?>"><input type="hidden" name="campanha_id" value="<?=$id?>"><input type="hidden" name="item_id" value="<?=(int)$i['id']?>"><input type="hidden" name="resultado" value="CORRETO"><button class="button green"><i class="bi bi-check-circle-fill"></i>Confirmar correto</button></form><a class="button primary" href="inventario_conferir.php?campanha_id=<?=$id?>&item_id=<?=(int)$i['id']?>"><i class="bi bi-clipboard2-pulse"></i>Conferência detalhada</a></div></article><?php endforeach;?><?php foreach($achados['externos'] as $a):?><article class="result-card"><span class="result-icon"><i class="bi <?=invTipoIcone($a['tipo_ativo'])?>"></i></span><div><h4><?=invE($a['nome'])?> • <?=invE($a['codigo_ativo'])?></h4><p>Ativo cadastrado, mas não era esperado nesta campanha. Setor atual: <?=invE($a['setor']?:'não informado')?>.</p><span class="badge b-purple">Encontrado fora da lista</span></div><div class="actions" style="margin:0"><a class="button purple" href="inventario_conferir.php?campanha_id=<?=$id?>&ativo_id=<?=(int)$a['id']?>"><i class="bi bi-plus-circle-fill"></i>Registrar na campanha</a></div></article><?php endforeach;?><?php if(!$achados['itens']&&!$achados['externos']):?><div class="alert warn"><strong>Nenhum ativo cadastrado foi encontrado.</strong> Registre abaixo como item sem cadastro para posterior regularização.<form method="post" action="inventario_conferir.php" style="margin-top:10px"><input type="hidden" name="csrf_token" value="<?=invE($csrf)?>"><input type="hidden" name="campanha_id" value="<?=$id?>"><input type="hidden" name="acao" value="avulso"><div class="form-grid"><div class="form-group"><label>Identificador informado</label><input class="control" name="identificador_informado" value="<?=invE($busca)?>" required></div><div class="form-group two"><label>Descrição do equipamento</label><input class="control" name="descricao" placeholder="Marca, modelo e características visíveis"></div><div class="form-group"><label>Setor encontrado</label><input class="control" name="setor_encontrado"></div><div class="form-group"><label>Ambiente</label><input class="control" name="ambiente_encontrado"></div><div class="form-group"><label>Condição</label><select class="control" name="condicao"><option>BOM</option><option>REGULAR</option><option>DANIFICADO</option></select></div></div><div class="actions"><button class="button purple">Registrar sem cadastro</button></div></form></div><?php endif;?></div><?php endif;?></section><?php endif;?>
<section class="panel"><div class="panel-head"><div class="panel-title"><span class="panel-icon"><i class="bi bi-list-check"></i></span><div><h3>Itens da campanha</h3><p>Filtre pendências e divergências para organizar o trabalho.</p></div></div><?php if($camp['status']==='EM_ANDAMENTO'&&tiPermPode($mysqli,'inventario_geral','finalizar')):?><form method="post" onsubmit="return confirm('Encerrar a campanha? Todos os itens pendentes serão marcados como NÃO LOCALIZADOS.')"><input type="hidden" name="csrf_token" value="<?=invE($csrf)?>"><input type="hidden" name="campanha_id" value="<?=$id?>"><input type="hidden" name="acao" value="encerrar"><button class="button red"><i class="bi bi-lock-fill"></i>Encerrar campanha</button></form><?php endif;?></div><form class="filters" method="get"><input type="hidden" name="id" value="<?=$id?>"><select class="control" name="resultado"><option value="">Todos os resultados</option><?php foreach(['PENDENTE','CORRETO','LOCAL_DIVERGENTE','RESPONSAVEL_DIVERGENTE','DANIFICADO','NAO_LOCALIZADO','FORA_LISTA'] as $r):?><option value="<?=$r?>" <?=$filtro===$r?'selected':''?>><?=invE(invResultadoRotulo($r))?></option><?php endforeach;?></select><button class="button primary">Filtrar</button></form><div class="table-wrap"><table class="table"><thead><tr><th>Ativo</th><th>Identificação</th><th>Local esperado</th><th>Resultado</th><th>Conferência</th><th>Ações</th></tr></thead><tbody><?php foreach($itens as $i):?><tr><td><span class="cell-main"><?=invE($i['nome_snapshot'])?></span><span class="cell-sub"><?=invE($i['codigo_ativo_snapshot'])?> • <?=invE($i['tipo_ativo_snapshot'])?></span></td><td><span class="cell-main"><?=invE($i['patrimonio_snapshot']?:($i['serie_snapshot']?:$i['identificador_snapshot']))?></span><span class="cell-sub"><?=invE($i['responsavel_esperado']?:'Sem responsável')?></span></td><td><?=invE(trim(($i['setor_esperado']?:'').' • '.($i['ambiente_esperado']?:'').' • '.($i['local_esperado']?:''),' •')?:'Não informado')?></td><td><span class="badge <?=invResultadoClasse($i['resultado'])?>"><?=invE(invResultadoRotulo($i['resultado']))?></span></td><td><span class="cell-main"><?=invE($i['conferido_por']?:'Pendente')?></span><span class="cell-sub"><?=invE($i['conferido_em']?date('d/m/Y H:i',strtotime($i['conferido_em'])):'')?></span></td><td><div class="actions" style="margin:0;justify-content:flex-start"><a class="button primary" href="inventario_conferir.php?campanha_id=<?=$id?>&item_id=<?=(int)$i['id']?>">Abrir</a><?php if($i['resultado']!=='PENDENTE'&&$i['resultado']!=='CORRETO'&&(int)$i['regularizado']!==1):?><form method="post" action="inventario_conferir.php"><input type="hidden" name="csrf_token" value="<?=invE($csrf)?>"><input type="hidden" name="acao" value="regularizar"><input type="hidden" name="campanha_id" value="<?=$id?>"><input type="hidden" name="item_id" value="<?=(int)$i['id']?>"><button class="button green">Regularizar</button></form><?php elseif((int)$i['regularizado']===1):?><span class="badge b-green">Regularizado</span><?php endif;?></div></td></tr><?php endforeach;?></tbody></table></div><?php if($totalPaginas>1):?><div class="actions" style="justify-content:center;padding:0 18px 18px"><?php if($pagina>1):?><a class="button" href="?id=<?=$id?>&resultado=<?=urlencode($filtro)?>&pagina=<?=$pagina-1?>">Anterior</a><?php endif;?><span class="badge b-blue">Página <?=$pagina?> de <?=$totalPaginas?></span><?php if($pagina<$totalPaginas):?><a class="button" href="?id=<?=$id?>&resultado=<?=urlencode($filtro)?>&pagina=<?=$pagina+1?>">Próxima</a><?php endif;?></div><?php endif;?></section></main></div></body></html>
