<?php
include('conexion.php');
include_once('nomina_helpers.php');
include_once('nomina_legal_helpers.php');
include_once('nomina_prestaciones_helpers.php');
include_once('nomina_prestaciones_master_helpers.php');
if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); }
if (!isset($_SESSION['usuario'])) { header('Location: login.php'); exit; }
nomina_ensure_cargos_schema($conexion);
nomina_ensure_prestaciones_schema($conexion);
nomina_pm_ensure_schema($conexion);

$fechaCorte = nomina_date_to_iso($_GET['fecha_corte'] ?? date('Y-m-d')) ?: date('Y-m-d');
$utilidadesDiasRef = nomina_normalize_decimal($_GET['utilidades_dias_ref'] ?? 30, 30);
$tasaRef = nomina_normalize_decimal($_GET['tasa_bcv_ref'] ?? 0, 0);
$refreshBcv = isset($_GET['refresh_bcv']) && (int)$_GET['refresh_bcv'] === 1;
$bcvInfo = nomina_bcv_auto_refresh($conexion, $refreshBcv);
$bcvLatest = $bcvInfo['latest'] ?? null;
if ($tasaRef <= 0 && $bcvLatest && isset($bcvLatest['rate_value'])) {
    $tasaRef = (float)$bcvLatest['rate_value'];
}
if ($tasaRef <= 0) { $tasaRef = 1; }

$personas = nomina_fetch_active_people($conexion);
$invalidHireDatePeople = function_exists('nomina_pm_invalid_hire_date_people') ? nomina_pm_invalid_hire_date_people($conexion, $fechaCorte) : [];
$invalidHireDateIds = [];
foreach ($invalidHireDatePeople as $iw) { $invalidHireDateIds[(int)$iw['id']] = true; }
$selectedPersonaId = isset($_GET['persona_id']) ? (int)$_GET['persona_id'] : 0;
$balances = [];
foreach ($personas as $persona) {
    if (isset($invalidHireDateIds[(int)$persona['id']])) { continue; }
    $balances[(int)$persona['id']] = nomina_prestaciones_calculate_balance($conexion, $persona, $fechaCorte, $tasaRef, $utilidadesDiasRef);
}
$selectedBalance = $selectedPersonaId > 0 && isset($balances[$selectedPersonaId]) ? $balances[$selectedPersonaId] : null;
$selectedRecentEvents = $selectedBalance ? ($selectedBalance['recent_events'] ?? []) : [];
$prestacionesRatesCount = function_exists('nomina_pm_count_interest_rates') ? nomina_pm_count_interest_rates($conexion) : 0;
$prestacionesSalaryHistoryCount = function_exists('nomina_pm_recent_salary_history_count') ? nomina_pm_recent_salary_history_count($conexion) : 0;
$prestacionesRegisteredEventsCount = function_exists('nomina_pm_count_registered_events') ? nomina_pm_count_registered_events($conexion) : 0;
$prestacionesEventosSinBcvCount = function_exists('nomina_pm_v732_count_events_without_bcv') ? nomina_pm_v732_count_events_without_bcv($conexion) : 0;
$prestacionesInteresesCount = function_exists('nomina_pm_v732_count_interests') ? nomina_pm_v732_count_interests($conexion) : 0;
$prestacionesWorkersPendingBase = 0;
foreach ($balances as $btmp) { if (function_exists('nomina_prestaciones_has_pending_base') && nomina_prestaciones_has_pending_base($btmp)) { $prestacionesWorkersPendingBase++; } }
$prestacionesMissingRateMonths = function_exists('nomina_pm_missing_rate_months_from_events') ? nomina_pm_missing_rate_months_from_events($conexion, $fechaCorte) : [];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $action = trim((string)($_POST['action'] ?? ''));
    $personaId = (int)($_POST['persona_id'] ?? 0);
    $fechaDocumento = nomina_date_to_iso($_POST['fecha_documento'] ?? $fechaCorte) ?: $fechaCorte;
    $redirect = [
        'fecha_corte=' . urlencode($fechaCorte),
        'tasa_bcv_ref=' . urlencode((string)$tasaRef),
        'utilidades_dias_ref=' . urlencode((string)$utilidadesDiasRef),
        'persona_id=' . $personaId,
    ];
    if ($action === 'sync_salary_history') {
        $sync = nomina_pm_sync_salary_history_from_closed_runs($conexion);
        nomina_flash_set($sync['ok'] ? 'success' : 'error', $sync['message']);
        header('Location: nomina_prestaciones.php?' . implode('&', $redirect));
        exit;
    }
    if ($action === 'clean_orphan_snapshots') {
        $clean = nomina_pm_clean_orphan_snapshots($conexion);
        nomina_flash_set($clean['ok'] ? 'success' : 'error', $clean['message']);
        header('Location: nomina_prestaciones.php?' . implode('&', $redirect));
        exit;
    }
    if ($action === 'repair_mojibake') {
        $repair = nomina_pm_repair_mojibake_data($conexion);
        nomina_flash_set($repair['ok'] ? 'success' : 'error', $repair['message']);
        header('Location: nomina_prestaciones.php?' . implode('&', $redirect));
        exit;
    }
    if ($action === 'rebuild_v732') {
        $metodoReconstruccion = trim((string)($_POST['metodo_reconstruccion'] ?? 'PROMEDIO_ACTIVA_PASIVA'));
        $permitirOmitir = !empty($_POST['permitir_omitir_ingreso']);
        $res = function_exists('nomina_pm_v732_rebuild_all') ? nomina_pm_v732_rebuild_all($conexion, $fechaDocumento, $tasaRef, $utilidadesDiasRef, $metodoReconstruccion, $permitirOmitir) : ['ok'=>false,'message'=>'No está disponible la función de reconstrucción v7.3.2.'];
        nomina_flash_set($res['ok'] ? 'success' : 'error', $res['message']);
        header('Location: nomina_prestaciones.php?' . implode('&', $redirect));
        exit;
    }
    if ($action === 'generate_base_all') {
        $obsLote = trim((string)($_POST['observacion_lote'] ?? 'Generación base por lote de prestaciones sociales v7.3'));
        $res = nomina_pm_generate_base_for_many($conexion, $balances, $fechaDocumento, $obsLote);
        nomina_flash_set($res['ok'] ? 'success' : 'error', $res['message']);
        header('Location: nomina_prestaciones.php?' . implode('&', $redirect));
        exit;
    }
    if ($action === 'generate_interests_all') {
        $metodoLote = trim((string)($_POST['metodo_interes_lote'] ?? 'PROMEDIO_ACTIVA_PASIVA'));
        $obsLote = trim((string)($_POST['observacion_interes_lote'] ?? 'Intereses por lote de prestaciones con tasas BCV v7.3'));
        $res = nomina_pm_generate_interests_for_many($conexion, $personas, $fechaDocumento, $metodoLote, $obsLote);
        nomina_flash_set($res['ok'] ? 'success' : 'error', $res['message']);
        header('Location: nomina_prestaciones.php?' . implode('&', $redirect));
        exit;
    }

    $balance = $personaId > 0 && isset($balances[$personaId]) ? $balances[$personaId] : null;
    if (!$balance) {
        nomina_flash_set('error', 'Selecciona un trabajador válido.');
        header('Location: nomina_prestaciones.php?' . implode('&', $redirect));
        exit;
    }

    if ($action === 'generate_base') {
        if (!nomina_prestaciones_has_pending_base($balance)) {
            nomina_flash_set('success', 'Este trabajador ya no tiene movimientos base pendientes por generar.');
            header('Location: nomina_prestaciones.php?' . implode('&', $redirect));
            exit;
        }
        $obs = trim((string)($_POST['observacion'] ?? 'Generación base referencial de prestaciones sociales v7.3'));
        $res = nomina_pm_generate_base_for_balance($conexion, $balance, $fechaDocumento, $obs);
        nomina_flash_set($res['ok'] ? 'success' : 'error', $res['message']);
    } elseif ($action === 'history_opening') {
        $monto = nomina_normalize_decimal($_POST['monto_bs'] ?? 0);
        $obs = trim((string)($_POST['observacion_hist'] ?? 'Saldo inicial histórico de prestaciones sociales'));
        if ($monto <= 0) {
            nomina_flash_set('error', 'Indica un monto histórico mayor a cero.');
        } else {
            $periodRef = 'HIST-' . date('YmdHis');
            $stmt = mysqli_prepare($conexion, "INSERT INTO nomina_prestaciones_eventos (persona_id, fecha_documento, fecha_evento, tipo, periodo_ref, anio_servicio, trimestre_nro, es_historico, dias, salario_normal_mensual_bs, salario_diario_bs, salario_integral_diario_bs, monto_bs, observacion, estado) VALUES (?, ?, ?, 'AJUSTE_HISTORICO', ?, 0, 0, 1, 0, 0, 0, 0, ?, ?, 'REGISTRADO')");
            if ($stmt) {
                mysqli_stmt_bind_param($stmt, 'isssds', $personaId, $fechaDocumento, $fechaDocumento, $periodRef, $monto, $obs);
                $ok = mysqli_stmt_execute($stmt);
                $err = mysqli_stmt_error($stmt);
                mysqli_stmt_close($stmt);
                if ($ok) {
                    nomina_flash_set('success', 'Saldo inicial histórico de prestaciones registrado.');
                } else {
                    nomina_flash_set('error', 'No se pudo registrar el ajuste histórico: ' . ($err ?: 'error desconocido'));
                }
            } else {
                nomina_flash_set('error', 'No se pudo preparar el registro histórico: ' . mysqli_error($conexion));
            }
        }
    } elseif ($action === 'generate_interests') {
        $metodo = trim((string)($_POST['metodo_interes'] ?? 'PROMEDIO_ACTIVA_PASIVA'));
        $obs = trim((string)($_POST['observacion_interes'] ?? 'Interés mensual de prestaciones con tasa BCV'));
        $res = nomina_pm_generate_interests($conexion, $personaId, $fechaDocumento, $metodo, $obs);
        nomina_flash_set($res['ok'] ? 'success' : 'error', $res['message']);
    } elseif ($action === 'register_advance') {
        $montoAnticipo = nomina_normalize_decimal($_POST['monto_anticipo_bs'] ?? 0);
        $obsAnticipo = trim((string)($_POST['observacion_anticipo'] ?? ''));
        $res = nomina_pm_register_advance($conexion, $personaId, $fechaDocumento, $montoAnticipo, $obsAnticipo);
        nomina_flash_set($res['ok'] ? 'success' : 'error', $res['message']);
    }
    header('Location: nomina_prestaciones.php?' . implode('&', $redirect));
    exit;
}

$flash = nomina_flash_get();
$recentEvents = nomina_prestaciones_fetch_recent_events($conexion, 25);
?>
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Prestaciones sociales</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
body{font-family:Arial,Helvetica,sans-serif;background:#f2f5f9;color:#243b53;margin:0}.wrap{max-width:1480px;margin:0 auto;padding:24px}.card{background:#fff;border:1px solid #d9e2ec;border-radius:18px;padding:20px;margin-bottom:18px;box-shadow:0 8px 24px rgba(15,23,42,.05)}.top{display:flex;justify-content:space-between;gap:14px;align-items:flex-start;flex-wrap:wrap}.top h1{margin:0 0 4px;font-size:22px}.muted{color:#6b7c93;font-size:14px}.btn{display:inline-block;background:#1f4aa8;color:#fff;text-decoration:none;border:none;border-radius:14px;padding:12px 18px;font-weight:700;cursor:pointer}.btn.secondary{background:#fff;color:#1f4aa8;border:1px solid #b7c6e3}.btn.ghost{background:#eef3ff;color:#1f4aa8}.btn.small{padding:8px 12px;border-radius:12px;font-size:13px}.filters,.grid,.stats{display:grid;gap:14px}.filters{grid-template-columns:1fr 1fr .8fr auto auto}.grid{grid-template-columns:1.35fr 1fr}.stats{grid-template-columns:repeat(4,1fr)}.field label{display:block;font-weight:700;margin-bottom:6px}.field input,.field select,.field textarea{width:100%;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:12px;padding:11px 12px;font-size:15px;background:#fff}.field textarea{min-height:84px}.badge{display:inline-block;padding:4px 10px;border-radius:999px;background:#eef2ff;color:#1e3a8a;font-weight:700;font-size:12px}.flash{padding:14px 16px;border-radius:14px;margin-bottom:14px}.flash.success{background:#ecfdf3;color:#166534;border:1px solid #86efac}.flash.error{background:#fef2f2;color:#991b1b;border:1px solid #fecaca}.table-wrap{overflow:auto}.table{width:100%;border-collapse:separate;border-spacing:0}.table th,.table td{padding:11px 10px;border-bottom:1px solid #e5edf5;vertical-align:top;text-align:left}.table th{font-size:13px;color:#334e68;background:#f8fafc;position:sticky;top:0}.table tbody tr:hover{background:#fafcff}.mini{font-size:12px;color:#6b7c93}.tot{font-weight:800}.actions{display:flex;gap:10px;flex-wrap:wrap}.subcard{border:1px solid #d9e2ec;border-radius:14px;padding:14px;background:#fbfdff}.note{padding:12px 14px;border-radius:12px;background:#f8fafc;border:1px dashed #cbd5e1;color:#486581}.stat{border:1px solid #d9e2ec;border-radius:14px;padding:14px}.stat .v{font-size:28px;font-weight:800;margin-bottom:6px}.warn{color:#92400e}.good{color:#166534}.danger{color:#991b1b}.disabled{opacity:.6;cursor:not-allowed}
@media (max-width:1100px){.filters,.grid,.stats{grid-template-columns:1fr}}
</style>
</head>
<body>
<div class="wrap">
  <div class="card top">
    <div>
      <h1>Prestaciones sociales v7.3</h1>
      <div class="muted">Control base de la garantía, historial salarial e intereses sobre prestaciones. La fase v7.3 consolida historial salarial, movimientos base por lote, intereses BCV mensuales y reporte legal por trabajador.</div>
    </div>
    <div class="actions">
      <a class="btn secondary" href="index.php">Volver al dashboard</a>
      <a class="btn ghost" href="nomina_tasas_interes_bcv.php">Tasas interés BCV</a>
      <a class="btn ghost" href="nomina_reporte_legal_trabajador.php">Reporte legal trabajador</a>
      <a class="btn ghost" href="nomina_prestaciones_auditoria.php">Auditoría prestaciones</a>
    </div>
  </div>

  <?php if ($flash): ?><div class="flash <?php echo h($flash['type']); ?>"><?php echo h($flash['message']); ?></div><?php endif; ?>
  <?php if (!empty($invalidHireDatePeople)): ?>
    <div class="card" style="border-color:#fecaca;background:#fff7f7;">
      <h2 style="margin-top:0;color:#991b1b;">Bloqueo auditor: trabajadores activos sin fecha de ingreso válida</h2>
      <div class="muted">Prestaciones sociales no se generarán para estos trabajadores hasta corregir la ficha. La fecha de ingreso define antigüedad, trimestres, días adicionales e intereses.</div>
      <div class="table-wrap" style="margin-top:12px;"><table class="table"><thead><tr><th>Trabajador</th><th>Cédula</th><th>Cargo</th><th>Fecha ingreso actual</th><th>Acción</th></tr></thead><tbody>
        <?php foreach ($invalidHireDatePeople as $iw): ?>
          <tr><td><b><?php echo h(trim(($iw['apellido']??'').' '.($iw['nombre']??''))); ?></b></td><td><?php echo h($iw['cedula']??''); ?></td><td><?php echo h($iw['cargo']??''); ?></td><td class="danger"><?php echo h($iw['fecha_ingreso']??''); ?></td><td><a class="btn secondary small" href="editar.php?id=<?php echo (int)$iw['id']; ?>">Corregir ficha</a></td></tr>
        <?php endforeach; ?>
      </tbody></table></div>
    </div>
  <?php endif; ?>

  <div class="card">
    <h2 style="margin-top:0;">Estado Fase 3 · Prestaciones v7.3.2.2</h2>
    <div class="stats">
      <div class="stat"><div class="v"><?php echo (int)$prestacionesSalaryHistoryCount; ?></div><div class="mini">Registros de historial salarial</div></div>
      <div class="stat"><div class="v"><?php echo (int)$prestacionesRegisteredEventsCount; ?></div><div class="mini">Eventos de prestaciones registrados</div></div>
      <div class="stat"><div class="v"><?php echo (int)$prestacionesRatesCount; ?></div><div class="mini">Meses con tasas BCV de interés</div></div>
      <div class="stat"><div class="v <?php echo $prestacionesWorkersPendingBase > 0 ? 'warn' : 'good'; ?>"><?php echo (int)$prestacionesWorkersPendingBase; ?></div><div class="mini">Trabajadores con base pendiente</div></div>
    </div>
    <?php if (!empty($prestacionesMissingRateMonths)): ?>
      <div class="note" style="margin-top:14px;background:#fffaf2;border-color:#fde68a;">Faltan tasas BCV de interés para estos meses con capital de prestaciones: <b><?php echo h(implode(', ', array_slice($prestacionesMissingRateMonths, 0, 18))); ?><?php echo count($prestacionesMissingRateMonths) > 18 ? '...' : ''; ?></b>. Cárgalas antes de generar intereses completos.</div>
    <?php else: ?>
      <div class="note" style="margin-top:14px;background:#eefaf5;border-color:#86efac;">No se detectan meses pendientes de tasa BCV para el capital actualmente registrado.</div>
    <?php endif; ?>
    <div class="note" style="margin-top:14px;<?php echo $prestacionesEventosSinBcvCount > 0 ? 'background:#fffaf2;border-color:#fde68a;' : 'background:#eefaf5;border-color:#86efac;'; ?>">
      Eventos automáticos sin tasa BCV congelada: <b><?php echo (int)$prestacionesEventosSinBcvCount; ?></b>. Intereses registrados: <b><?php echo (int)$prestacionesInteresesCount; ?></b>.
      <?php if ($prestacionesEventosSinBcvCount > 0): ?>Usa la reconstrucción segura v7.3.2 para respaldar, limpiar y regenerar prestaciones con historial salarial real.<?php endif; ?>
    </div>
  </div>

  <div class="card">
    <form method="get" class="filters">
      <div class="field"><label>Fecha de corte</label><input type="date" name="fecha_corte" value="<?php echo h($fechaCorte); ?>"></div>
      <div class="field"><label>Tasa BCV de referencia</label><input type="text" name="tasa_bcv_ref" value="<?php echo h(number_format($tasaRef, 4, '.', '')); ?>"><div class="mini">Se usa para salarios referenciados en USD.</div></div>
      <div class="field"><label>Días de utilidades ref.</label><input type="number" min="0" step="1" name="utilidades_dias_ref" value="<?php echo h((string)$utilidadesDiasRef); ?>"><div class="mini">Por defecto 30 días para alícuota referencial.</div></div>
      <div class="field"><label>&nbsp;</label><button class="btn" type="submit">Actualizar vista</button></div>
      <div class="field"><label>&nbsp;</label><a class="btn ghost" href="nomina_prestaciones.php?fecha_corte=<?php echo h(urlencode($fechaCorte)); ?>&utilidades_dias_ref=<?php echo h(urlencode((string)$utilidadesDiasRef)); ?>&refresh_bcv=1">Actualizar BCV</a></div>
    </form>
    <div class="note" style="margin-top:14px;">
      <?php if ($bcvLatest): ?>BCV disponible: <b><?php echo h(number_format((float)$bcvLatest['rate_value'], 4, ',', '.')); ?></b> · tasa del <b><?php echo h($bcvLatest['rate_date']); ?></b>. <?php echo h($bcvInfo['message'] ?? ''); ?><?php else: ?>No se encontró una tasa BCV almacenada. Puedes actualizarla desde esta pantalla o escribir una tasa manual temporal.<?php endif; ?>
    </div>
    <form method="post" style="margin-top:14px;display:flex;gap:10px;flex-wrap:wrap;align-items:center;">
      <input type="hidden" name="action" value="sync_salary_history">
      <input type="hidden" name="persona_id" value="<?php echo (int)$selectedPersonaId; ?>">
      <input type="hidden" name="fecha_documento" value="<?php echo h($fechaCorte); ?>">
      <button class="btn secondary" type="submit">Sincronizar historial salarial desde corridas cerradas</button>
      <span class="mini">Registros actuales en historial salarial: <b><?php echo (int)nomina_pm_recent_salary_history_count($conexion); ?></b>. No duplica corridas ya sincronizadas.</span>
    </form>
    <div style="margin-top:10px;display:flex;gap:10px;flex-wrap:wrap;align-items:center;">
      <form method="post" onsubmit="return confirm('Esto eliminará snapshots huérfanos de corridas que ya no existen. No modifica corridas vigentes. ¿Continuar?');">
        <input type="hidden" name="action" value="clean_orphan_snapshots">
        <input type="hidden" name="persona_id" value="<?php echo (int)$selectedPersonaId; ?>">
        <input type="hidden" name="fecha_documento" value="<?php echo h($fechaCorte); ?>">
        <button class="btn ghost" type="submit">Limpiar snapshots huérfanos</button>
      </form>
      <form method="post" onsubmit="return confirm('Aplicará reparación básica de textos mojibake tipo AtenciÃ³n → Atención en personas, cargos y snapshots. ¿Continuar?');">
        <input type="hidden" name="action" value="repair_mojibake">
        <input type="hidden" name="persona_id" value="<?php echo (int)$selectedPersonaId; ?>">
        <input type="hidden" name="fecha_documento" value="<?php echo h($fechaCorte); ?>">
        <button class="btn ghost" type="submit">Reparar textos UTF-8</button>
      </form>
    </div>
    <div class="subcard" style="margin-top:14px;background:#fffaf2;border-color:#fde68a;">
      <div style="font-weight:800;margin-bottom:8px;">Reconstrucción segura v7.3.2</div>
      <div class="mini" style="margin-bottom:10px;">Respalda eventos e intereses actuales, limpia solo bases automáticas de prestaciones, sincroniza historial salarial desde corridas cerradas, regenera base e intereses y conserva anticipos/saldos históricos/manuales.</div>
      <form method="post" onsubmit="return confirm('Se respaldarán y reconstruirán eventos automáticos de prestaciones e intereses. No toca corridas cerradas ni datos maestros. ¿Continuar?');" style="display:flex;gap:10px;flex-wrap:wrap;align-items:end;">
        <input type="hidden" name="action" value="rebuild_v732">
        <input type="hidden" name="persona_id" value="<?php echo (int)$selectedPersonaId; ?>">
        <input type="hidden" name="fecha_documento" value="<?php echo h($fechaCorte); ?>">
        <div class="field"><label>Método intereses</label><select name="metodo_reconstruccion"><option value="PROMEDIO_ACTIVA_PASIVA">Promedio activa/pasiva BCV</option><option value="PASIVA">Pasiva BCV</option><option value="ACTIVA">Activa BCV / mora</option></select></div>
        <label class="mini" style="display:flex;gap:8px;align-items:center;margin-bottom:12px;"><input type="checkbox" name="permitir_omitir_ingreso" value="1" checked> Omitir trabajadores sin fecha de ingreso válida durante la reconstrucción</label>
        <button class="btn" type="submit">Reconstruir prestaciones v7.3.2</button>
      </form>
    </div>

    <div class="subcard" style="margin-top:14px;background:#fbfdff;">
      <div style="font-weight:800;margin-bottom:8px;">Operaciones por lote de prestaciones</div>
      <form method="post" style="display:flex;gap:10px;flex-wrap:wrap;align-items:end;margin-bottom:10px;">
        <input type="hidden" name="action" value="generate_base_all">
        <input type="hidden" name="persona_id" value="<?php echo (int)$selectedPersonaId; ?>">
        <input type="hidden" name="fecha_documento" value="<?php echo h($fechaCorte); ?>">
        <div class="field" style="min-width:420px;flex:1;"><label>Observación lote base</label><input name="observacion_lote" value="Generación base por lote de prestaciones sociales v7.3 al <?php echo h($fechaCorte); ?>"></div>
        <button class="btn ghost" type="submit">Generar base pendiente para todos</button>
      </form>
      <form method="post" style="display:flex;gap:10px;flex-wrap:wrap;align-items:end;">
        <input type="hidden" name="action" value="generate_interests_all">
        <input type="hidden" name="persona_id" value="<?php echo (int)$selectedPersonaId; ?>">
        <input type="hidden" name="fecha_documento" value="<?php echo h($fechaCorte); ?>">
        <div class="field"><label>Método intereses lote</label><select name="metodo_interes_lote"><option value="PROMEDIO_ACTIVA_PASIVA">Promedio activa/pasiva BCV</option><option value="PASIVA">Pasiva BCV</option><option value="ACTIVA">Activa BCV / mora</option></select></div>
        <div class="field" style="min-width:420px;flex:1;"><label>Observación intereses lote</label><input name="observacion_interes_lote" value="Intereses por lote de prestaciones con tasas BCV v7.3"></div>
        <button class="btn ghost" type="submit">Generar intereses pendientes para todos</button>
      </form>
      <div class="mini" style="margin-top:8px;">Las operaciones por lote no modifican corridas cerradas; registran eventos y/o intereses pendientes, omitiendo duplicados.</div>
    </div>
  </div>

  <div class="grid">
    <div class="card">
      <h2 style="margin-top:0;">Saldo base por trabajador</h2>
      <div class="mini" style="margin-bottom:10px;">Garantía estimada = depósitos trimestrales de 15 días + adicionales anuales referenciales. Comparativo = 30 días por año o fracción superior a 6 meses. Los intereses se generan aparte con tasas BCV mensuales cargadas en el sistema.</div>
      <div class="table-wrap">
        <table class="table">
          <thead><tr><th>Trabajador</th><th>Ingreso</th><th>Servicio</th><th>Salario ref.</th><th>Salario normal Bs</th><th>Salario integral día Bs</th><th>Trimestres</th><th>Garantía est. Bs</th><th>Art. 142(c) Bs</th><th>Base favorable Bs</th><th></th></tr></thead>
          <tbody>
            <?php foreach ($balances as $pid => $bal): $p = $bal['persona']; $srv = $bal['service']; $ri = $bal['ref']; ?>
            <tr>
              <td><b><?php echo h(trim(($p['apellido'] ?? '') . ' ' . ($p['nombre'] ?? ''))); ?></b><div class="mini">CI: <?php echo h($p['cedula'] ?? ''); ?> · Cargo: <?php echo h($p['cargo'] ?? ''); ?></div></td>
              <td><?php echo h($p['fecha_ingreso'] ?? ''); ?></td>
              <td><?php echo (int)$srv['years']; ?>a <?php echo (int)$srv['months']; ?>m</td>
              <td><?php echo h(($ri['salary_currency'] ?? 'VES') . ' ' . number_format((float)($ri['salary_amount'] ?? 0), 2, ',', '.')); ?><div class="mini"><?php echo h(($ri['salary_source'] ?? '') === 'PERSONA' ? 'Ficha' : 'Cargo'); ?></div></td>
              <td class="tot"><?php echo h(number_format((float)$ri['monthly_normal_bs'], 2, ',', '.')); ?></td>
              <td><?php echo h(number_format((float)$ri['integral_daily_bs'], 2, ',', '.')); ?></td>
              <td><?php echo (int)$bal['quarter_count']; ?><div class="mini">anuales: <?php echo (int)$bal['annual_count']; ?></div></td>
              <td class="tot"><?php echo h(number_format((float)$bal['guarantee_estimated_bs'], 2, ',', '.')); ?></td>
              <td><?php echo h(number_format((float)$bal['retroactive_bs'], 2, ',', '.')); ?></td>
              <td class="tot"><?php echo h(number_format((float)$bal['favorable_base_bs'], 2, ',', '.')); ?><div class="mini">reg.: <?php echo h(number_format((float)$bal['guarantee_registered_bs'], 2, ',', '.')); ?></div></td>
              <td><a class="btn secondary small" href="nomina_prestaciones.php?fecha_corte=<?php echo h(urlencode($fechaCorte)); ?>&tasa_bcv_ref=<?php echo h(urlencode((string)$tasaRef)); ?>&utilidades_dias_ref=<?php echo h(urlencode((string)$utilidadesDiasRef)); ?>&persona_id=<?php echo (int)$pid; ?>">Preparar</a></td>
            </tr>
            <?php endforeach; ?>
          </tbody>
        </table>
      </div>
    </div>

    <div class="card">
      <h2 style="margin-top:0;">Registrar / controlar prestaciones</h2>
      <?php if ($selectedBalance): $p = $selectedBalance['persona']; $ri = $selectedBalance['ref']; ?>
        <div class="subcard" style="margin-bottom:14px;">
          <div style="font-size:28px;font-weight:800;margin-bottom:6px;"><?php echo h(trim(($p['nombre'] ?? '') . ' ' . ($p['apellido'] ?? ''))); ?></div>
          <div class="mini">CI: <?php echo h($p['cedula'] ?? ''); ?> · Cargo: <?php echo h($p['cargo'] ?? ''); ?> · Ingreso: <?php echo h($p['fecha_ingreso'] ?? ''); ?></div>
        </div>
        <div class="stats" style="margin-bottom:14px;">
          <div class="stat"><div class="v"><?php echo (int)$selectedBalance['quarter_count']; ?></div><div class="mini">Trimestres completos</div></div>
          <div class="stat"><div class="v"><?php echo h(number_format((float)$selectedBalance['guarantee_estimated_bs'], 2, ',', '.')); ?></div><div class="mini">Garantía estimada Bs</div></div>
          <div class="stat"><div class="v"><?php echo h(number_format((float)$selectedBalance['retroactive_bs'], 2, ',', '.')); ?></div><div class="mini">Art. 142(c) Bs</div></div>
          <div class="stat"><div class="v"><?php echo h(number_format((float)$selectedBalance['favorable_base_bs'], 2, ',', '.')); ?></div><div class="mini">Base más favorable Bs</div></div>
        </div>
        <div class="note" style="margin-bottom:14px;">Salario normal Bs: <b><?php echo h(number_format((float)$ri['monthly_normal_bs'], 2, ',', '.')); ?></b> · Diario normal: <b><?php echo h(number_format((float)$ri['daily_normal_bs'], 2, ',', '.')); ?></b> · Alícuota bono vacacional: <b><?php echo h(number_format((float)$ri['vac_alicuota_bs'], 2, ',', '.')); ?></b> · Alícuota utilidades: <b><?php echo h(number_format((float)$ri['util_alicuota_bs'], 2, ',', '.')); ?></b> · Integral diario ref.: <b><?php echo h(number_format((float)$ri['integral_daily_bs'], 2, ',', '.')); ?></b></div>
        <div class="stats" style="margin-bottom:14px;grid-template-columns:repeat(3,1fr);">
          <div class="stat"><div class="v"><?php echo (int)$selectedBalance['missing_quarters']; ?> / <?php echo (int)$selectedBalance['missing_annuals']; ?></div><div class="mini">Pendientes: trimestrales / anuales</div></div>
          <div class="stat"><div class="v"><?php echo h(number_format((float)$selectedBalance['guarantee_registered_bs'], 2, ',', '.')); ?></div><div class="mini">Capital base ya controlado Bs</div></div>
          <div class="stat"><div class="v <?php echo ((float)$selectedBalance['pending_control_bs'] > 0 ? 'warn' : 'good'); ?>"><?php echo h(number_format((float)$selectedBalance['pending_control_bs'], 2, ',', '.')); ?></div><div class="mini">Pendiente por controlar Bs</div></div>
        </div>
        <div class="note" style="margin-bottom:14px;">Eventos base pendientes: <b><?php echo (int)$selectedBalance['missing_quarters']; ?></b> trimestrales y <b><?php echo (int)$selectedBalance['missing_annuals']; ?></b> adicionales anuales. Capital histórico cargado: <b><?php echo h(number_format((float)$selectedBalance['historical_opening_bs'], 2, ',', '.')); ?></b>.</div>
        <?php
          $interestSum = nomina_pm_sum_interests($conexion, (int)$p['id']);
          $advanceSum = nomina_pm_sum_advances($conexion, (int)$p['id']);
          $interestRows = nomina_pm_fetch_interests($conexion, (int)$p['id'], 8);
          $salaryRows = nomina_pm_fetch_salary_history($conexion, (int)$p['id'], 6);
        ?>
        <div class="note" style="margin-bottom:14px;background:#eefaf5;border-color:#86efac;">
          Intereses registrados: <b><?php echo h(number_format((float)$interestSum, 2, ',', '.')); ?> Bs</b> · Anticipos registrados: <b><?php echo h(number_format((float)$advanceSum, 2, ',', '.')); ?> Bs</b> · Historial salarial: <b><?php echo count($salaryRows); ?></b> registros visibles.
        </div>

        <form method="post" class="subcard" style="margin-bottom:14px;background:#f8fbff;">
          <input type="hidden" name="action" value="generate_interests">
          <input type="hidden" name="persona_id" value="<?php echo (int)$p['id']; ?>">
          <div style="font-weight:800;font-size:20px;margin-bottom:6px;">Generar intereses de prestaciones</div>
          <div class="mini" style="margin-bottom:12px;">Calcula intereses mensuales sobre el capital registrado usando las tasas BCV cargadas en <a href="nomina_tasas_interes_bcv.php">Tasas interés BCV</a>. No modifica el capital base ni las corridas de nómina.</div>
          <div class="field"><label>Fecha de corte del cálculo</label><input type="date" name="fecha_documento" value="<?php echo h($fechaCorte); ?>"></div>
          <div class="field"><label>Método de tasa</label><select name="metodo_interes"><option value="PROMEDIO_ACTIVA_PASIVA">Promedio activa/pasiva BCV</option><option value="PASIVA">Pasiva BCV</option><option value="ACTIVA">Activa BCV / mora</option></select></div>
          <div class="field"><label>Observación del cálculo</label><textarea name="observacion_interes" placeholder="Ej: cálculo mensual de intereses sobre garantía de prestaciones con tasa BCV publicada.">Cálculo mensual de intereses sobre garantía de prestaciones con tasa BCV publicada.</textarea></div>
          <button class="btn" type="submit">Generar intereses pendientes</button>
          <a class="btn secondary" href="nomina_reporte_legal_trabajador.php?persona_id=<?php echo (int)$p['id']; ?>&fecha_corte=<?php echo h(urlencode($fechaCorte)); ?>&tasa_bcv_ref=<?php echo h(urlencode((string)$tasaRef)); ?>">Ver reporte legal</a>
        </form>

        <form method="post" class="subcard" style="margin-bottom:14px;background:#fffaf2;border-color:#fde68a;">
          <input type="hidden" name="action" value="register_advance">
          <input type="hidden" name="persona_id" value="<?php echo (int)$p['id']; ?>">
          <div style="font-weight:800;font-size:20px;margin-bottom:6px;">Anticipo de prestaciones</div>
          <div class="mini" style="margin-bottom:12px;">Registra anticipos con soporte. El anticipo disminuye el saldo estimado, pero no borra el capital histórico.</div>
          <div class="field"><label>Fecha del anticipo</label><input type="date" name="fecha_documento" value="<?php echo h($fechaCorte); ?>"></div>
          <div class="field"><label>Monto anticipo Bs</label><input type="number" step="0.01" min="0" name="monto_anticipo_bs" value="0.00"></div>
          <div class="field"><label>Observación / soporte del anticipo</label><textarea name="observacion_anticipo" placeholder="Ej: Anticipo solicitado para vivienda/salud/educación. Soporte recibido y autorizado por RRHH."></textarea></div>
          <button class="btn ghost" type="submit">Registrar anticipo</button>
        </form>

        <form method="post" class="subcard" style="margin-bottom:14px;">
          <input type="hidden" name="action" value="generate_base">
          <input type="hidden" name="persona_id" value="<?php echo (int)$p['id']; ?>">
          <div class="field"><label>Fecha del registro</label><input type="date" name="fecha_documento" value="<?php echo h($fechaCorte); ?>"></div>
          <div class="field"><label>Observación</label><textarea name="observacion" placeholder="Ej: generación base referencial hasta el corte actual">Generación base referencial de prestaciones sociales</textarea></div>
          <button class="btn <?php echo nomina_prestaciones_has_pending_base($selectedBalance) ? '' : 'disabled'; ?>" type="submit" <?php echo nomina_prestaciones_has_pending_base($selectedBalance) ? '' : 'disabled'; ?>><?php echo nomina_prestaciones_has_pending_base($selectedBalance) ? 'Generar movimientos base pendientes' : 'Sin movimientos base pendientes'; ?></button>
        </form>

        <form method="post" class="subcard" style="background:#fffaf2;border-color:#fde68a;margin-bottom:14px;">
          <input type="hidden" name="action" value="history_opening">
          <input type="hidden" name="persona_id" value="<?php echo (int)$p['id']; ?>">
          <div style="font-weight:800;font-size:20px;margin-bottom:6px;">Saldo inicial / ajuste histórico</div>
          <div class="mini" style="margin-bottom:12px;">Usa este bloque para incorporar capital histórico ya acumulado antes de arrancar este módulo. No genera pago de nómina.</div>
          <div class="field"><label>Fecha del ajuste</label><input type="date" name="fecha_documento" value="<?php echo h($fechaCorte); ?>"></div>
          <div class="field"><label>Monto histórico Bs</label><input type="number" step="0.01" min="0" name="monto_bs" value="0.00"></div>
          <div class="field"><label>Observación del ajuste</label><textarea name="observacion_hist" placeholder="Ej: saldo inicial histórico migrado desde control externo de prestaciones"></textarea></div>
          <button class="btn ghost" type="submit">Registrar saldo inicial histórico</button>
        </form>

        <div class="subcard" style="margin-bottom:14px;">
          <div style="font-weight:800;font-size:20px;margin-bottom:10px;">Historial visible del trabajador</div>
          <div class="mini" style="margin-bottom:12px;">Aquí ves los últimos movimientos ya controlados para este trabajador. Úsalo para confirmar que no volverás a generar el mismo trimestre o adicional.</div>
          <div class="stats" style="margin-bottom:14px;grid-template-columns:repeat(3,1fr);">
            <div class="stat"><div class="v"><?php echo count($selectedRecentEvents); ?></div><div class="mini">Eventos visibles</div></div>
            <div class="stat"><div class="v"><?php echo h(number_format((float)$selectedBalance['historical_opening_bs'], 2, ',', '.')); ?></div><div class="mini">Saldo histórico cargado Bs</div></div>
            <div class="stat"><div class="v"><?php echo h(number_format((float)$selectedBalance['guarantee_registered_bs'], 2, ',', '.')); ?></div><div class="mini">Total base controlada Bs</div></div>
          </div>
          <?php if (!empty($selectedRecentEvents)): ?>
            <div class="table-wrap"><table class="table"><thead><tr><th>Fecha</th><th>Tipo</th><th>Referencia</th><th>Días</th><th>Monto Bs</th><th>Observación</th></tr></thead><tbody>
              <?php foreach ($selectedRecentEvents as $ev): ?>
              <tr>
                <td><?php echo h($ev['fecha_documento']); ?></td>
                <td><?php echo h(nomina_prestaciones_event_type_label($ev['tipo'])); ?><?php if (!empty($ev['es_historico'])): ?> <span class="badge">Histórico</span><?php endif; ?></td>
                <td><?php echo h($ev['periodo_ref']); ?></td>
                <td><?php echo h(number_format((float)$ev['dias'], 2, ',', '.')); ?></td>
                <td class="tot"><?php echo h(number_format((float)$ev['monto_bs'], 2, ',', '.')); ?></td>
                <td><?php echo h($ev['observacion'] ?? ''); ?></td>
              </tr>
              <?php endforeach; ?>
            </tbody></table></div>
          <?php else: ?>
            <div class="note">Este trabajador todavía no tiene movimientos registrados en prestaciones. Puedes generar base pendiente o cargar un saldo histórico.</div>
          <?php endif; ?>
        </div>

        <div class="subcard" style="margin-bottom:14px;">
          <div style="font-weight:800;font-size:20px;margin-bottom:10px;">Historial salarial e intereses recientes</div>
          <div class="grid" style="grid-template-columns:1fr;">
            <div>
              <div class="mini" style="margin-bottom:8px;">Últimos registros salariales sincronizados desde corridas cerradas/pagadas.</div>
              <?php if (!empty($salaryRows)): ?>
                <div class="table-wrap"><table class="table"><thead><tr><th>Vigencia</th><th>Salario</th><th>Normal Bs</th><th>Integral Bs</th><th>Origen</th></tr></thead><tbody>
                  <?php foreach ($salaryRows as $sr): ?><tr><td><?php echo h($sr['fecha_desde']); ?> → <?php echo h($sr['fecha_hasta'] ?? ''); ?></td><td><?php echo h($sr['salario_moneda'] . ' ' . number_format((float)$sr['salario_monto_original'], 2, ',', '.')); ?></td><td><?php echo h(number_format((float)$sr['salario_normal_mensual_bs'], 2, ',', '.')); ?></td><td><?php echo h(number_format((float)$sr['salario_integral_mensual_bs'], 2, ',', '.')); ?></td><td><?php echo h($sr['origen']); ?> #<?php echo h($sr['referencia_corrida_id']); ?></td></tr><?php endforeach; ?>
                </tbody></table></div>
              <?php else: ?><div class="note">Sin historial salarial sincronizado para este trabajador.</div><?php endif; ?>
            </div>
            <div>
              <div class="mini" style="margin:12px 0 8px;">Últimos intereses registrados.</div>
              <?php if (!empty($interestRows)): ?>
                <div class="table-wrap"><table class="table"><thead><tr><th>Mes</th><th>Método</th><th>Capital Bs</th><th>Tasa anual %</th><th>Interés Bs</th></tr></thead><tbody>
                  <?php foreach ($interestRows as $ir): ?><tr><td><?php echo h($ir['periodo_ym']); ?></td><td><?php echo h($ir['metodo']); ?></td><td><?php echo h(number_format((float)$ir['capital_base_bs'], 2, ',', '.')); ?></td><td><?php echo h(number_format((float)$ir['tasa_anual'], 4, ',', '.')); ?></td><td class="tot"><?php echo h(number_format((float)$ir['interes_bs'], 2, ',', '.')); ?></td></tr><?php endforeach; ?>
                </tbody></table></div>
              <?php else: ?><div class="note">Sin intereses generados. Carga las tasas BCV mensuales y ejecuta “Generar intereses pendientes”.</div><?php endif; ?>
            </div>
          </div>
        </div>      <?php else: ?>
        <div class="note">Selecciona un trabajador desde la tabla para preparar su control base de prestaciones sociales.</div>
      <?php endif; ?>
    </div>
  </div>

  <div class="card">
    <h2 style="margin-top:0;">Registros recientes de prestaciones</h2>
    <div class="table-wrap"><table class="table"><thead><tr><th>Fecha</th><th>Trabajador</th><th>Tipo</th><th>Referencia</th><th>Días</th><th>Integral día Bs</th><th>Monto Bs</th><th>Observación</th></tr></thead><tbody>
      <?php foreach ($recentEvents as $row): ?>
      <tr>
        <td><?php echo h($row['fecha_documento']); ?></td>
        <td><b><?php echo h(trim(($row['nombre'] ?? '') . ' ' . ($row['apellido'] ?? ''))); ?></b><div class="mini"><?php echo h($row['cedula'] ?? ''); ?></div></td>
        <td><?php echo h(nomina_prestaciones_event_type_label($row['tipo'])); ?><?php if (!empty($row['es_historico'])): ?> <span class="badge">Histórico</span><?php endif; ?></td>
        <td><?php echo h($row['periodo_ref']); ?></td>
        <td><?php echo h(number_format((float)$row['dias'], 2, ',', '.')); ?></td>
        <td><?php echo h(number_format((float)$row['salario_integral_diario_bs'], 2, ',', '.')); ?></td>
        <td class="tot"><?php echo h(number_format((float)$row['monto_bs'], 2, ',', '.')); ?></td>
        <td><?php echo h($row['observacion'] ?? ''); ?></td>
      </tr>
      <?php endforeach; ?>
    </tbody></table></div>
  </div>
</div>
</body>
</html>
