<?php
include('conexion.php');
include('nomina_reportes_common.php');
include_once('nomina_helpers.php');
if (function_exists('nlm_ensure_master_schema')) { nlm_ensure_master_schema($conexion); }
if (function_exists('nomina_ensure_calendario_laboral_schema')) { nomina_ensure_calendario_laboral_schema($conexion); }
if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); }
if (!isset($_SESSION['usuario'])) { header('Location: login.php'); exit; }

$corridaId = isset($_GET['corrida_id']) ? (int)$_GET['corrida_id'] : 0;
$info = $corridaId ? nr_corrida_info($conexion, $corridaId) : null;
$workers = $corridaId ? nr_workers_for_corrida($conexion, $corridaId) : [];
$movByPersona = $corridaId ? nr_movements_for_corrida($conexion, $corridaId) : [];
$schema = nomina_detect_novedades_schema($conexion);
$novedades = ($info && !empty($info['periodo_id'])) ? nomina_fetch_novedades_by_period($conexion, (int)$info['periodo_id'], $schema) : [];
$snapshot = [];
if ($info && !empty($info['legal_snapshot'])) {
    $tmp = json_decode((string)$info['legal_snapshot'], true);
    if (is_array($tmp)) { $snapshot = $tmp; }
}
$hist = [];
$ajustes = [];
$calendarSnapshot = [];
if ($corridaId) {
    $rcal = mysqli_query($conexion, "SELECT * FROM nomina_corrida_calendario_snapshot WHERE corrida_id={$corridaId} ORDER BY fecha ASC, tipo ASC, nombre ASC");
    if ($rcal) { while($r=mysqli_fetch_assoc($rcal)) $calendarSnapshot[]=$r; }
    $rh = mysqli_query($conexion, "SELECT * FROM nomina_corrida_estado_historial WHERE corrida_id={$corridaId} ORDER BY id ASC");
    if ($rh) { while($r=mysqli_fetch_assoc($rh)) $hist[]=$r; }
    if (function_exists('nlm_corrida_ajustes')) { $ajustes = nlm_corrida_ajustes($conexion, $corridaId); }
}
$tot = ['trab'=>count($workers),'asig'=>0,'ded'=>0,'neto'=>0,'pat'=>0,'mov'=>0,'nov'=>0];
foreach ($workers as $w) {
    $tot['asig'] += (float)$w['total_asignaciones'];
    $tot['ded'] += (float)$w['total_deducciones'];
    $tot['neto'] += (float)$w['neto_pagar'];
    $tot['pat'] += (float)($w['total_patronal'] ?? 0);
    $pid = (int)$w['persona_id'];
    $tot['mov'] += count($movByPersona[$pid] ?? []);
    if (!empty($novedades[$pid])) {
        $n = $novedades[$pid];
        $has = false;
        foreach (['dias_ausencia_periodo','horas_retardo_periodo','he_diurna','he_nocturna','horas_nocturnas_ordinarias','bono_manual_bs','otros_descuentos_bs','prestamo_bs','pago_vacaciones_bs'] as $k) {
            if (isset($n[$k]) && abs((float)$n[$k]) > 0.000001) { $has = true; break; }
        }
        if ($has) $tot['nov']++;
    }
}
function aud_money($n){ return number_format((float)$n, 2, ',', '.'); }
function aud_h($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); }
?>
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Hoja de Auditoría de Corrida</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<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&display=swap" rel="stylesheet">
<style>
:root{--primary:#1a3c8b;--bg:#f5f7fa;--card:#fff;--border:#e5e7eb;--text:#24364b;--muted:#6b7280;--ok:#166534;--warn:#b45309;--danger:#be123c;--shadow:0 8px 24px rgba(16,24,40,.08);--radius:16px}*{box-sizing:border-box}body{margin:0;font-family:'Inter',sans-serif;background:var(--bg);color:var(--text)}.container{max-width:1400px;margin:24px auto;padding:0 16px}.topbar,.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow)}.topbar{display:flex;justify-content:space-between;gap:12px;align-items:center;padding:16px;flex-wrap:wrap}.card{padding:16px;margin-top:16px}.title{font-weight:800;font-size:20px}.subtitle,.muted{font-size:12px;color:var(--muted)}.btn{display:inline-flex;align-items:center;justify-content:center;padding:10px 14px;border-radius:12px;border:1px solid rgba(26,60,139,.25);background:#fff;color:var(--primary);font-weight:700;text-decoration:none}.btn.primary{background:var(--primary);color:#fff}.stats{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:12px}.stat{padding:14px;border:1px solid var(--border);border-radius:14px}.stat b{display:block;font-size:22px}.table-wrap{overflow:auto;border:1px solid var(--border);border-radius:14px;margin-top:12px}.table{width:100%;border-collapse:collapse;min-width:900px}.table th,.table td{padding:9px 10px;border-bottom:1px solid #eef2f7;font-size:12px;text-align:left;vertical-align:top}.table th{background:#fafafa;font-weight:800}.chip{display:inline-flex;padding:4px 8px;border-radius:999px;background:rgba(26,60,139,.09);color:var(--primary);font-size:11px;font-weight:800}.warn{color:var(--warn)}.ok{color:var(--ok)}@media print{.no-print{display:none!important}.container{margin:0;max-width:none}.card{box-shadow:none}}
</style>
</head>
<body>
<div class="container">
  <div class="topbar no-print">
    <div><div class="title">Hoja de Auditoría de Corrida</div><div class="subtitle">Resumen legal/técnico para revisión de RRHH, gerencia y auditoría laboral.</div></div>
    <div style="display:flex;gap:8px;flex-wrap:wrap">
      <?php if($corridaId): ?><a class="btn" href="nomina_corrida_resumen.php?corrida_id=<?php echo (int)$corridaId; ?>">Volver al resumen</a><?php endif; ?>
      <?php if($corridaId): ?><a class="btn" href="nomina_reversos_ajustes.php?corrida_id=<?php echo (int)$corridaId; ?>">Reversos/Ajustes</a><?php endif; ?>
      <button class="btn primary" onclick="window.print()">Imprimir / PDF</button>
      <a class="btn" href="index.php">Inicio</a>
    </div>
  </div>
  <?php if(!$info): ?>
    <div class="card">No se encontró la corrida indicada.</div>
  <?php else: ?>
    <div class="card">
      <div class="title" style="font-size:17px;">Corrida #<?php echo (int)$info['id']; ?> · <?php echo aud_h($info['estado']); ?></div>
      <div class="subtitle">Período <?php echo aud_h($info['periodo_codigo']); ?> · <?php echo aud_h($info['fecha_desde']); ?> a <?php echo aud_h($info['fecha_hasta']); ?> · Fecha de pago <?php echo aud_h($info['fecha_pago']); ?> · Tasa BCV <?php echo aud_h($info['tasa_bcv_usd']); ?></div>
      <div class="stats" style="margin-top:14px;">
        <div class="stat"><b><?php echo (int)$tot['trab']; ?></b><span class="muted">Trabajadores</span></div>
        <div class="stat"><b><?php echo aud_money($tot['asig']); ?></b><span class="muted">Asignaciones</span></div>
        <div class="stat"><b><?php echo aud_money($tot['ded']); ?></b><span class="muted">Deducciones</span></div>
        <div class="stat"><b><?php echo aud_money($tot['neto']); ?></b><span class="muted">Neto</span></div>
        <div class="stat"><b><?php echo aud_money($tot['pat']); ?></b><span class="muted">Aportes patronales</span></div>
        <div class="stat"><b><?php echo (int)$tot['nov']; ?></b><span class="muted">Con novedades</span></div>
      </div>
    </div>

    <div class="card">
      <div class="title" style="font-size:16px;">Parámetros legales congelados</div>
      <div class="subtitle">Estos valores provienen del snapshot guardado al calcular la corrida.</div>
      <div class="table-wrap"><table class="table"><thead><tr><th>Código</th><th>Nombre</th><th>Categoría</th><th>Valor</th><th>Unidad</th><th>Desde</th><th>Hasta</th></tr></thead><tbody>
        <?php foreach($snapshot as $codigo=>$p): ?><tr><td><span class="chip"><?php echo aud_h($codigo); ?></span></td><td><?php echo aud_h($p['nombre'] ?? ''); ?></td><td><?php echo aud_h($p['categoria'] ?? ''); ?></td><td><?php echo aud_h($p['valor_decimal'] ?? ''); ?></td><td><?php echo aud_h($p['unidad'] ?? ''); ?></td><td><?php echo aud_h($p['vigencia_desde'] ?? ''); ?></td><td><?php echo aud_h($p['vigencia_hasta'] ?? ''); ?></td></tr><?php endforeach; ?>
        <?php if(!$snapshot): ?><tr><td colspan="7" class="warn">Esta corrida no tiene snapshot legal. Recalcula con el motor master antes de cerrar.</td></tr><?php endif; ?>
      </tbody></table></div>
    </div>

    <div class="card">
      <div class="title" style="font-size:16px;">Calendario laboral congelado</div>
      <div class="subtitle">Feriados laborales y domingos usados por el modo calendario al momento de calcular la corrida.</div>
      <div class="table-wrap"><table class="table"><thead><tr><th>Fecha</th><th>Nombre</th><th>Tipo</th><th>Aplica</th><th>Base legal / fuente</th></tr></thead><tbody>
        <?php foreach($calendarSnapshot as $c): ?>
          <tr><td><?php echo aud_h(date('d/m/Y', strtotime($c['fecha']))); ?></td><td><?php echo aud_h($c['nombre']); ?></td><td><span class="chip"><?php echo aud_h($c['tipo']); ?></span></td><td><?php echo ((int)$c['aplica_nomina']===1?'Nómina':''); ?> <?php echo ((int)$c['aplica_banco']===1?'Banco':''); ?></td><td><span class="muted"><b><?php echo aud_h($c['base_legal']); ?></b><br><?php echo aud_h($c['fuente']); ?></span></td></tr>
        <?php endforeach; ?>
        <?php if(!$calendarSnapshot): ?><tr><td colspan="5" class="warn">Esta corrida no tiene snapshot de calendario. Las corridas nuevas lo guardarán automáticamente desde v6.8.</td></tr><?php endif; ?>
      </tbody></table></div>
    </div>

    <div class="card">
      <div class="title" style="font-size:16px;">Novedades sensibles del período</div>
      <div class="subtitle">La observación debe explicar el motivo, fecha o autorización de la novedad.</div>
      <div class="table-wrap"><table class="table"><thead><tr><th>Trabajador</th><th>Aus.</th><th>Ret.</th><th>HE D</th><th>HE N</th><th>Noct. ord.</th><th>Bono manual</th><th>Desc.</th><th>Préstamo</th><th>Obs.</th><th>Evaluación</th></tr></thead><tbody>
        <?php $printed=false; foreach($workers as $w): $pid=(int)$w['persona_id']; $n=$novedades[$pid] ?? []; $has=false; foreach(['dias_ausencia_periodo','horas_retardo_periodo','he_diurna','he_nocturna','horas_nocturnas_ordinarias','bono_manual_bs','otros_descuentos_bs','prestamo_bs','pago_vacaciones_bs'] as $k){ if(isset($n[$k]) && abs((float)$n[$k])>0.000001){$has=true;break;}} if(!$has) continue; $printed=true; $obs=trim((string)($n['observaciones'] ?? '')); ?>
        <tr><td><strong><?php echo aud_h(trim($w['apellido'].' '.$w['nombre'])); ?></strong><br><span class="muted">CI <?php echo aud_h($w['cedula']); ?></span></td><td><?php echo aud_h($n['dias_ausencia_periodo'] ?? 0); ?></td><td><?php echo aud_h($n['horas_retardo_periodo'] ?? 0); ?></td><td><?php echo aud_h($n['he_diurna'] ?? 0); ?></td><td><?php echo aud_h($n['he_nocturna'] ?? 0); ?></td><td><?php echo aud_h($n['horas_nocturnas_ordinarias'] ?? 0); ?></td><td><?php echo aud_h($n['bono_manual_bs'] ?? 0); ?></td><td><?php echo aud_h($n['otros_descuentos_bs'] ?? 0); ?></td><td><?php echo aud_h($n['prestamo_bs'] ?? 0); ?></td><td><?php echo aud_h($obs); ?></td><td><?php echo strlen($obs)>=10 ? '<span class="ok">Soportada</span>' : '<span class="warn">Falta soporte</span>'; ?></td></tr>
        <?php endforeach; if(!$printed): ?><tr><td colspan="11">No hay novedades sensibles registradas.</td></tr><?php endif; ?>
      </tbody></table></div>
    </div>

    <div class="card">
      <div class="title" style="font-size:16px;">Snapshots de trabajador y conceptos</div>
      <div class="subtitle">La hoja usa datos congelados cuando existen: salario, cargo, tasa BCV, nombre de conceptos y configuración de incidencia.</div>
      <div class="table-wrap"><table class="table"><thead><tr><th>Trabajador</th><th>Cargo congelado</th><th>Origen salario</th><th>Moneda</th><th>Salario ref.</th><th>Salario Bs</th><th>Día Bs</th><th>Hora Bs</th></tr></thead><tbody>
      <?php foreach($workers as $w): ?>
        <tr><td><strong><?php echo aud_h(trim($w['apellido'].' '.$w['nombre'])); ?></strong><br><span class="muted">CI <?php echo aud_h($w['cedula']); ?></span></td><td><?php echo aud_h($w['cargo']); ?></td><td><?php echo aud_h($w['snapshot_salario_origen'] ?? 'actual'); ?></td><td><?php echo aud_h($w['snapshot_salario_moneda'] ?? ''); ?></td><td><?php echo aud_money($w['snapshot_salario_monto_original'] ?? $w['salario_base'] ?? 0); ?></td><td><?php echo aud_money($w['snapshot_salario_mensual_bs'] ?? 0); ?></td><td><?php echo aud_money($w['snapshot_salario_diario_bs'] ?? 0); ?></td><td><?php echo aud_money($w['snapshot_salario_hora_bs'] ?? 0); ?></td></tr>
      <?php endforeach; ?>
      </tbody></table></div>
    </div>

    <?php if (!empty($ajustes)): ?>
    <div class="card">
      <div class="title" style="font-size:16px;">Ajustes/reversos posteriores</div>
      <div class="subtitle">Registros separados que no alteran los movimientos originales.</div>
      <div class="table-wrap"><table class="table"><thead><tr><th>Fecha</th><th>Tipo</th><th>Trabajador</th><th>Concepto</th><th>Monto</th><th>Motivo</th><th>Usuario</th></tr></thead><tbody>
      <?php foreach($ajustes as $a): ?>
        <tr><td><?php echo aud_h($a['created_at']); ?></td><td><?php echo aud_h($a['tipo']); ?></td><td><?php echo aud_h(trim(($a['apellido'] ?? '').' '.($a['nombre'] ?? '')).' '.($a['cedula'] ?? '')); ?></td><td><?php echo aud_h(trim(($a['codigo'] ?? '').' '.($a['concepto_nombre'] ?? ''))); ?></td><td><?php echo aud_money($a['monto']); ?></td><td><?php echo aud_h($a['motivo']); ?></td><td><?php echo aud_h($a['usuario']); ?></td></tr>
      <?php endforeach; ?>
      </tbody></table></div>
    </div>
    <?php endif; ?>

    <div class="card">
      <div class="title" style="font-size:16px;">Historial de estado</div>
      <div class="table-wrap"><table class="table"><thead><tr><th>Fecha</th><th>Estado anterior</th><th>Estado nuevo</th><th>Usuario</th><th>Motivo</th></tr></thead><tbody>
        <?php foreach($hist as $h): ?><tr><td><?php echo aud_h($h['created_at']); ?></td><td><?php echo aud_h($h['estado_anterior']); ?></td><td><?php echo aud_h($h['estado_nuevo']); ?></td><td><?php echo aud_h($h['usuario']); ?></td><td><?php echo aud_h($h['motivo']); ?></td></tr><?php endforeach; ?>
        <?php if(!$hist): ?><tr><td colspan="5">Aún no hay cambios de estado registrados para esta corrida.</td></tr><?php endif; ?>
      </tbody></table></div>
    </div>
  <?php endif; ?>
</div>
</body>
</html>
