<?php
require_once __DIR__.'/../../config/auth.php';require_once __DIR__.'/_remisiones.php';
$accion=$_GET['accion']??'lista';$id=(int)($_GET['id']??0);$error='';$estados=['Cargada','En Proceso','Finalizada','Cancelada'];
$equiposOpc=['Servicio','PC','Notebook','Tablet','NUC','Impresora','Router','Switch','Disco Externo','DVR/NVR','Cámara','Otro'];$accesoriosOpc=['Cargador','Cable de alimentación','Monitor','Teclado','Mouse','Docking Station','Adaptador','Mochila / bolso'];$serviciosOpc=['Asistencia Técnica','Verificación de equipo','Mantenimiento preventivo','Mantenimiento correctivo','Instalación de software','Configuración de software','Configuración de red','Cambio/traslado de equipo','Préstamo de equipo','Otro'];
function remPost($n){$v=limpiar($_POST[$n]??'');return $v===''?null:$v;}
if(($_SERVER['REQUEST_METHOD']??'GET')==='POST'){
 $tipo=$_POST['tipo']??'';$id=(int)($_POST['remision_id']??0);
 if($tipo==='seguimiento'){$r=remision_buscar($conn,$id);if(!$r||in_array($r['estado'],['Finalizada','Cancelada'],true))$error='La remisión ya no admite modificaciones.';else{$detalle=limpiar($_POST['detalle']??'');$estado=in_array($_POST['estado']??'',$estados,true)?$_POST['estado']:$r['estado'];if($detalle==='')$error='El seguimiento es obligatorio.';else{$uid=(int)$_SESSION['user_id'];$conn->begin_transaction();try{$s=$conn->prepare('INSERT INTO remision_seguimientos(remision_id,detalle,estado,usuario_id) VALUES(?,?,?,?)');$s->bind_param('issi',$id,$detalle,$estado,$uid);$s->execute();$seg=$s->insert_id;$fechaInicio=remPost('fecha_inicio');$horaInicio=remPost('hora_inicio');$fechaFin=remPost('fecha_finalizacion');$horaFin=remPost('hora_finalizacion');$trabajo=remPost('trabajo_realizado');$obs=remPost('observaciones_tecnicas');$u=$conn->prepare('UPDATE remisiones SET estado=?,fecha_inicio=?,hora_inicio=?,fecha_finalizacion=?,hora_finalizacion=?,trabajo_realizado=?,observaciones_tecnicas=? WHERE id=?');$u->bind_param('sssssssi',$estado,$fechaInicio,$horaInicio,$fechaFin,$horaFin,$trabajo,$obs,$id);$u->execute();registrar_auditoria($conn,'UPDATE','remisiones',$id,'Seguimiento operativo');$conn->commit();header("Location: remisiones.php?accion=ver&id=$id&seguimiento=1");exit;}catch(Throwable $e){$conn->rollback();$error=$e->getMessage();}}}}
 elseif($tipo==='remision'){$cliente=(int)($_POST['cliente_id']??0);$fecha=remPost('fecha');$solicitante=remPost('solicitante_nombre');$motivo=remPost('motivo');if(!$cliente||!$fecha||!$solicitante||!$motivo)$error='Empresa, fecha, solicitante y motivo son obligatorios.';else{$equipos=array_values(array_intersect($equiposOpc,(array)($_POST['equipos']??[])));$accesorios=json_encode(array_values(array_intersect($accesoriosOpc,(array)($_POST['accesorios']??[]))),JSON_UNESCAPED_UNICODE);$servicios=json_encode(array_values(array_intersect($serviciosOpc,(array)($_POST['tipos_servicio']??[]))),JSON_UNESCAPED_UNICODE);$equiposJson=json_encode($equipos,JSON_UNESCAPED_UNICODE);$uid=(int)$_SESSION['user_id'];$campos=['departamento','fecha_inicio','hora_inicio','fecha_finalizacion','hora_finalizacion','solicitante_area','solicitante_cargo','solicitante_telefono','solicitante_correo','solicitante_ubicacion','equipos_observacion','accesorios_observacion','servicio_observacion','trabajo_realizado','observaciones_tecnicas'];$v=[];foreach($campos as $c)$v[$c]=remPost($c);$conn->begin_transaction();try{$s=$conn->prepare("INSERT INTO remisiones(cliente_id,departamento,fecha,fecha_inicio,hora_inicio,fecha_finalizacion,hora_finalizacion,solicitante_nombre,solicitante_area,solicitante_cargo,solicitante_telefono,solicitante_correo,solicitante_ubicacion,equipos,equipos_observacion,accesorios,accesorios_observacion,tipos_servicio,servicio_observacion,motivo,trabajo_realizado,observaciones_tecnicas,estado,usuario_id,tecnico_usuario_id) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,'Cargada',?,?)");$s->bind_param(str_repeat('s',24),$cliente,$v['departamento'],$fecha,$v['fecha_inicio'],$v['hora_inicio'],$v['fecha_finalizacion'],$v['hora_finalizacion'],$solicitante,$v['solicitante_area'],$v['solicitante_cargo'],$v['solicitante_telefono'],$v['solicitante_correo'],$v['solicitante_ubicacion'],$equiposJson,$v['equipos_observacion'],$accesorios,$v['accesorios_observacion'],$servicios,$v['servicio_observacion'],$motivo,$v['trabajo_realizado'],$v['observaciones_tecnicas'],$uid,$uid);$s->execute();$id=$s->insert_id;$numero='REM-'.date('Y',strtotime($fecha)).'-'.str_pad((string)$id,6,'0',STR_PAD_LEFT);$conn->query("UPDATE remisiones SET numero_servicio='".$conn->real_escape_string($numero)."' WHERE id=$id");$d=$conn->prepare('INSERT INTO remision_equipos_detalle(remision_id,tipo_equipo,marca,modelo,numero_serie,inventario,hostname,direccion_ip,direccion_mac,observacion) VALUES(?,?,?,?,?,?,?,?,?,?)');foreach($equipos as $i=>$eq){$marca=limpiar($_POST['eq_marca'][$i]??'');$modelo=limpiar($_POST['eq_modelo'][$i]??'');$serie=limpiar($_POST['eq_serie'][$i]??'');$inv=limpiar($_POST['eq_inventario'][$i]??'');$host=limpiar($_POST['eq_hostname'][$i]??'');$ip=limpiar($_POST['eq_ip'][$i]??'');$mac=limpiar($_POST['eq_mac'][$i]??'');$ob=limpiar($_POST['eq_observacion'][$i]??'');$d->bind_param('isssssssss',$id,$eq,$marca,$modelo,$serie,$inv,$host,$ip,$mac,$ob);$d->execute();}registrar_auditoria($conn,'INSERT','remisiones',$id,'Alta '.$numero);$conn->commit();header("Location: remisiones.php?accion=ver&id=$id&creada=1");exit;}catch(Throwable $e){$conn->rollback();$error=$e->getMessage();}}}
}
$clientes=$conn->query("SELECT id,nombre FROM clientes WHERE estado='Activo' ORDER BY nombre");include __DIR__.'/../../includes/header.php';include __DIR__.'/../../includes/sidebar.php';?>
<main class="main"><?php include __DIR__.'/../../includes/topbar.php';?><div class="content">
<?php if($accion==='lista'):$lista=$conn->query("SELECT r.id,r.numero_servicio,r.fecha,r.estado,r.solicitante_nombre,c.nombre empresa,COALESCE(u.nombre,u.usuario,'Sin asignar') tecnico FROM remisiones r JOIN clientes c ON c.id=r.cliente_id LEFT JOIN usuarios u ON u.id=r.tecnico_usuario_id ORDER BY r.fecha DESC,r.id DESC");?><div class="d-flex justify-content-between mb-3"><div><h3 class="page-title">Remisiones</h3><p class="text-muted">Servicios técnicos, equipos y seguimientos.</p></div><a class="btn btn-hm align-self-start" href="?accion=nuevo"><i class="fa fa-plus"></i> Nueva remisión</a></div><div class="card card-hm"><div class="card-body"><input id="buscar" class="form-control mb-3" placeholder="Buscar remisión"><div class="table-responsive"><table class="table table-hover" id="tabla"><thead><tr><th>N.º Servicio</th><th>Fecha</th><th>Empresa</th><th>Técnico</th><th>Estado</th><th></th></tr></thead><tbody><?php while($r=$lista->fetch_assoc()):?><tr><td><?=e($r['numero_servicio'])?></td><td><?=e(date('d/m/Y',strtotime($r['fecha'])))?></td><td><?=e($r['empresa'])?></td><td><?=e($r['tecnico'])?></td><td><?=e($r['estado'])?></td><td><a class="btn btn-sm btn-outline-primary" href="?accion=ver&id=<?=$r['id']?>">Abrir</a></td></tr><?php endwhile;?></tbody></table></div></div></div><script>buscar.oninput=()=>document.querySelectorAll('#tabla tbody tr').forEach(x=>x.style.display=x.innerText.toLowerCase().includes(buscar.value.toLowerCase())?'':'none')</script>
<?php elseif($accion==='ver'):$r=remision_buscar($conn,$id);if(!$r){http_response_code(404);exit('Remisión no encontrada.');}$segs=remision_seguimientos($conn,$id);$detalles=remision_equipos($conn,$id);$bloqueada=in_array($r['estado'],['Finalizada','Cancelada'],true);?><div class="d-flex justify-content-between flex-wrap mb-3"><div><a href="remisiones.php">← Volver</a><h3 class="page-title">Remisión <?=e($r['numero_servicio'])?></h3></div><div><a class="btn btn-outline-secondary" target="_blank" href="remision_imprimir.php?id=<?=$id?>"><i class="fa fa-print"></i> Imprimir</a></div></div><?php if($error):?><div class="alert alert-danger"><?=e($error)?></div><?php endif;?><div class="card card-hm mb-3"><div class="card-body"><div class="row g-2"><div class="col-md-4"><b>Empresa:</b> <?=e($r['empresa'])?></div><div class="col-md-4"><b>Estado:</b> <?=e($r['estado'])?></div><div class="col-md-4"><b>Técnico asignado:</b> <?=e($r['tecnico_asignado'])?></div><div class="col-md-4"><b>Inicio:</b> <?=e(trim(($r['fecha_inicio']?:'').' '.($r['hora_inicio']?:''))?:'—')?></div><div class="col-md-4"><b>Finalización:</b> <?=e(trim(($r['fecha_finalizacion']?:'').' '.($r['hora_finalizacion']?:''))?:'—')?></div><div class="col-md-4"><b>Tarea vinculada:</b> <?=$r['tarea_id']?'<a href="/HM/modules/gestion_tareas/tareas.php?accion=ver&id='.(int)$r['tarea_id'].'">#'.(int)$r['tarea_id'].'</a>':'—'?></div></div><hr><h5>Solicitante</h5><p><?=e($r['solicitante_nombre'])?> · <?=e($r['solicitante_area']?:'—')?> · <?=e($r['solicitante_telefono']?:'—')?></p><h5>Equipo / Servicio</h5><p><?=e(remision_texto_lista($r['equipos'])?:'—')?></p><?php while($d=$detalles->fetch_assoc()):?><div class="border rounded p-2 mb-2"><b><?=e($d['tipo_equipo'])?></b>: <?=e(trim($d['marca'].' '.$d['modelo'])?:'Sin detalle')?> · Serie <?=e($d['numero_serie']?:'—')?> · Inventario <?=e($d['inventario']?:'—')?> · Host <?=e($d['hostname']?:'—')?> · IP <?=e($d['direccion_ip']?:'—')?> · MAC <?=e($d['direccion_mac']?:'—')?><?php if($d['observacion']):?><br><?=e($d['observacion'])?><?php endif;?></div><?php endwhile;?><h5 class="mt-3">Trabajo</h5><p><b>Motivo:</b><br><?=nl2br(e($r['motivo']))?><br><b>Trabajo realizado:</b><br><?=nl2br(e($r['trabajo_realizado']?:'—'))?><br><b>Observaciones técnicas:</b><br><?=nl2br(e($r['observaciones_tecnicas']?:'—'))?></p></div></div><div class="card card-hm"><div class="card-body"><h5>Seguimiento y actualización</h5><?php if($bloqueada):?><div class="alert alert-warning">La remisión está <?=e(strtolower($r['estado']))?> y ya no puede editarse.</div><?php else:?><form method="post" class="row g-3 mb-4"><input type="hidden" name="tipo" value="seguimiento"><input type="hidden" name="remision_id" value="<?=$id?>"><div class="col-12"><label>Seguimiento *</label><textarea class="form-control" name="detalle" required></textarea></div><div class="col-md-3"><label>Estado</label><select class="form-select" name="estado"><?php foreach($estados as $o):?><option <?=$r['estado']===$o?'selected':''?>><?=$o?></option><?php endforeach;?></select></div><div class="col-md-3"><label>Fecha inicio</label><input class="form-control" type="date" name="fecha_inicio" value="<?=e($r['fecha_inicio'])?>"></div><div class="col-md-3"><label>Hora inicio</label><input class="form-control" type="time" name="hora_inicio" value="<?=e($r['hora_inicio'])?>"></div><div class="col-md-3"><label>Fecha finalización</label><input class="form-control" type="date" name="fecha_finalizacion" value="<?=e($r['fecha_finalizacion'])?>"></div><div class="col-md-3"><label>Hora finalización</label><input class="form-control" type="time" name="hora_finalizacion" value="<?=e($r['hora_finalizacion'])?>"></div><div class="col-md-9"><label>Trabajo realizado</label><textarea class="form-control" name="trabajo_realizado"><?=e($r['trabajo_realizado'])?></textarea></div><div class="col-md-9"><label>Observaciones técnicas</label><textarea class="form-control" name="observaciones_tecnicas"><?=e($r['observaciones_tecnicas'])?></textarea></div><div class="col-md-3 d-flex align-items-end"><button class="btn btn-hm w-100">Guardar actualización</button></div></form><?php endif;?><?php while($s=$segs->fetch_assoc()):?><div class="border-start border-3 ps-3 mb-3"><small><?=e(date('d/m/Y H:i',strtotime($s['creado_en'])))?> · <?=e($s['usuario'])?> · <?=e($s['estado'])?></small><div><?=nl2br(e($s['detalle']))?></div></div><?php endwhile;?></div></div>
<?php else:?><a href="remisiones.php">← Volver</a><h3 class="page-title">Nueva remisión</h3><?php if($error):?><div class="alert alert-danger"><?=e($error)?></div><?php endif;?><form method="post"><input type="hidden" name="tipo" value="remision"><input type="hidden" name="cliente_id" id="cliente_id"><div class="card card-hm mb-3"><div class="card-body"><div class="row g-3"><div class="col-md-6"><label>Empresa *</label><input class="form-control" list="clientesLista" id="empresa" required><datalist id="clientesLista"><?php while($c=$clientes->fetch_assoc()):?><option data-id="<?=$c['id']?>" value="<?=e($c['nombre'])?>"></option><?php endwhile;?></datalist></div><div class="col-md-3"><label>Departamento</label><input class="form-control" name="departamento"></div><div class="col-md-3"><label>Fecha *</label><input class="form-control" type="date" name="fecha" value="<?=date('Y-m-d')?>" required></div><div class="col-md-3"><label>Fecha inicio</label><input class="form-control" type="date" name="fecha_inicio"></div><div class="col-md-3"><label>Hora inicio</label><input class="form-control" type="time" name="hora_inicio"></div><div class="col-md-3"><label>Fecha finalización</label><input class="form-control" type="date" name="fecha_finalizacion"></div><div class="col-md-3"><label>Hora finalización</label><input class="form-control" type="time" name="hora_finalizacion"></div></div></div></div><div class="card card-hm mb-3"><div class="card-body"><h5>Datos del solicitante / usuario</h5><div class="row g-3"><?php foreach(['solicitante_nombre'=>'Nombre y apellido *','solicitante_area'=>'Departamento / Área','solicitante_cargo'=>'Cargo','solicitante_telefono'=>'Teléfono / Interno','solicitante_correo'=>'Correo','solicitante_ubicacion'=>'Ubicación / Sede / Local'] as $n=>$l):?><div class="col-md-4"><label><?=$l?></label><input class="form-control" name="<?=$n?>" <?=$n==='solicitante_nombre'?'required':''?>></div><?php endforeach;?></div></div></div><div class="card card-hm mb-3"><div class="card-body"><h5>Equipo / Servicio</h5><div class="row g-2"><?php foreach($equiposOpc as $o):?><div class="col-md-3"><label class="form-check"><input class="form-check-input equipo-check" type="checkbox" name="equipos[]" value="<?=e($o)?>"> <?=e($o)?></label></div><?php endforeach;?></div><label>Observación</label><textarea class="form-control" name="equipos_observacion"></textarea><div id="detallesEquipos" class="mt-3"></div><hr><h5>Accesorios</h5><div class="row g-2"><?php foreach($accesoriosOpc as $o):?><div class="col-md-3"><label class="form-check"><input class="form-check-input" type="checkbox" name="accesorios[]" value="<?=e($o)?>"> <?=e($o)?></label></div><?php endforeach;?></div><textarea class="form-control mt-2" name="accesorios_observacion" placeholder="Observación de accesorios"></textarea></div></div><div class="card card-hm mb-3"><div class="card-body"><h5>Tipo de servicio</h5><div class="row g-2"><?php foreach($serviciosOpc as $o):?><div class="col-md-4"><label class="form-check"><input class="form-check-input" type="checkbox" name="tipos_servicio[]" value="<?=e($o)?>"> <?=e($o)?></label></div><?php endforeach;?></div><textarea class="form-control mt-2" name="servicio_observacion" placeholder="Observación"></textarea></div></div><div class="card card-hm"><div class="card-body"><h5>Detalle del trabajo</h5><label>Motivo / solicitud *</label><textarea class="form-control mb-2" name="motivo" required></textarea><label>Trabajo realizado</label><textarea class="form-control mb-2" name="trabajo_realizado"></textarea><label>Observaciones técnicas</label><textarea class="form-control" name="observaciones_tecnicas"></textarea><button class="btn btn-hm mt-3">Guardar remisión</button></div></div></form><template id="tplEquipo"><div class="detalle-equipo border rounded p-3 mb-2"><h6></h6><div class="row g-2"><?php foreach(['marca'=>'Marca','modelo'=>'Modelo','serie'=>'N.º serie','inventario'=>'Inventario','hostname'=>'Hostname','ip'=>'IP','mac'=>'MAC','observacion'=>'Observación'] as $n=>$l):?><div class="col-md-3"><input class="form-control" data-campo="<?=$n?>" placeholder="<?=$l?>"></div><?php endforeach;?></div></div></template><script>const emp=document.getElementById('empresa'),cid=document.getElementById('cliente_id'),ops=[...document.querySelectorAll('#clientesLista option')];function cliente(){cid.value=(ops.find(x=>x.value===emp.value)||{}).dataset?.id||''}emp.oninput=cliente;document.querySelector('form').onsubmit=e=>{cliente();if(!cid.value){e.preventDefault();alert('Seleccione una empresa existente')}};function equipos(){const box=document.getElementById('detallesEquipos');box.innerHTML='';document.querySelectorAll('.equipo-check:checked').forEach((c,i)=>{const n=document.getElementById('tplEquipo').content.cloneNode(true);n.querySelector('h6').textContent='Detalle del equipo: '+c.value;n.querySelectorAll('[data-campo]').forEach(x=>x.name='eq_'+x.dataset.campo+'['+i+']');box.appendChild(n)})}document.querySelectorAll('.equipo-check').forEach(x=>x.onchange=equipos)</script><?php endif;?></div></main><?php include __DIR__.'/../../includes/footer.php';?>
