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

$bcvForceRefresh = isset($_GET['refresh_bcv']) && (int)$_GET['refresh_bcv'] === 1;
$bcvInfo = nomina_bcv_auto_refresh($conexion, $bcvForceRefresh);
$bcvLatest = $bcvInfo['latest'] ?? null;
$bcvPrefill = $bcvLatest && isset($bcvLatest['rate_value']) ? number_format((float)$bcvLatest['rate_value'], 4, '.', '') : '';
$bcvUpdatedText = '';
if ($bcvLatest) {
    $updatedAtTs = !empty($bcvLatest['updated_at']) ? strtotime($bcvLatest['updated_at']) : 0;
    $rateDate = !empty($bcvLatest['rate_date']) ? strtotime($bcvLatest['rate_date']) : 0;
    $bcvUpdatedText = 'Última actualización BCV: ' . ($updatedAtTs ? date('d/m/Y h:i a', $updatedAtTs) : 'sin hora registrada');
    if ($rateDate) {
        $bcvUpdatedText .= ' · tasa correspondiente al ' . date('d/m/Y', $rateDate);
        $bcvUpdatedText .= (date('Y-m-d', $rateDate) === date('Y-m-d')) ? ' · vigente de hoy' : ' · última tasa disponible';
    }
}

$flash = nomina_flash_get();
nomina_ensure_novedades_horas_schema($conexion);
if (function_exists('nomina_ensure_calendario_laboral_schema')) { nomina_ensure_calendario_laboral_schema($conexion); }
$schema = nomina_detect_novedades_schema($conexion);
$errors = [];

$periodos = nomina_get_periodos_with_stats($conexion);
$periodoId = isset($_REQUEST['periodo_id']) ? (int)$_REQUEST['periodo_id'] : 0;
if (!$periodoId && $periodos) { $periodoId = (int)$periodos[0]['id']; }
$origen = strtoupper((string)($_REQUEST['origen_cantidades'] ?? 'CALENDARIO'));
if (!in_array($origen, ['CALENDARIO','ASISTENCIA','MANUAL'], true)) { $origen = 'CALENDARIO'; }

$periodo = $periodoId ? nomina_get_periodo($conexion, $periodoId) : null;
$personas = nomina_fetch_active_people($conexion);
$novedades = $periodoId ? nomina_fetch_novedades_by_period($conexion, $periodoId, $schema) : [];
$precargas = $periodo ? nomina_build_preloads($conexion, $personas, $periodo, $origen) : [];
$feriadosPeriodo = ($periodo && function_exists('nomina_get_calendario_feriados')) ? nomina_get_calendario_feriados($conexion, $periodo['fecha_desde'], $periodo['fecha_hasta'], true, true) : [];

// Conceptos activos
$conceptos = [];
$resC = mysqli_query($conexion, "SELECT id, codigo, nombre, tipo, incide_salario_normal, incide_base_cotizacion, modo_calculo, tasa, monto_fijo, moneda_monto_fijo, aplica_global FROM conceptos_nomina WHERE activo = 1");
if ($resC) {
    while ($row = mysqli_fetch_assoc($resC)) {
        $conceptos[$row['codigo']] = $row;
    }
}
function cid($conceptos, $codigo) { return isset($conceptos[$codigo]) ? (int)$conceptos[$codigo]['id'] : 0; }
function tasaConcepto($conceptos, $codigo, $default) { return isset($conceptos[$codigo]) && $conceptos[$codigo]['tasa'] !== null ? (float)$conceptos[$codigo]['tasa'] : (float)$default; }
$conceptosFijosGlobales = nomina_get_active_global_fixed_concepts($conexion, true);
$conceptosManualesExtra = nomina_get_manual_fixed_concepts($conexion, true);
$manualAssignments = $periodoId ? nomina_fetch_manual_concept_assignments($conexion, $periodoId) : [];
$conceptosById = [];
foreach ($conceptos as $tmpCodigo => $tmpConcepto) { $conceptosById[(int)$tmpConcepto['id']] = $tmpConcepto; }
function insMov($conexion, $corrida, $persona, $concepto, $cantidad, $base, $tasa, $monto, $meta = null) {
    $cantidadSql = ($cantidad === null) ? 'NULL' : (string)(float)$cantidad;
    $baseSql = ($base === null) ? 'NULL' : (string)(float)$base;
    $tasaSql = ($tasa === null) ? 'NULL' : (string)(float)$tasa;
    $metaSql = 'NULL';
    if ($meta !== null) {
        $metaSql = "'" . mysqli_real_escape_string($conexion, json_encode($meta, JSON_UNESCAPED_UNICODE)) . "'";
    }
    $sql = "INSERT INTO nomina_movimientos (corrida_id, persona_id, concepto_id, cantidad, base, tasa, monto, meta)
            VALUES (" . (int)$corrida . ', ' . (int)$persona . ', ' . (int)$concepto . ', ' . $cantidadSql . ', ' . $baseSql . ', ' . $tasaSql . ', ' . (float)$monto . ', ' . $metaSql . ')';
    mysqli_query($conexion, $sql);
}

$summary = [
    'trabajadores' => count($personas),
    'sin_salario' => 0,
    'sin_cargo' => 0,
    'sin_turno' => 0,
    'con_novedades' => count(array_unique(array_merge(array_map('intval', array_keys($novedades)), array_map('intval', array_keys($manualAssignments))))),
    'conceptos_faltantes' => [],
    'conceptos_globales' => count($conceptosFijosGlobales),
    'conceptos_manuales_extra' => count($conceptosManualesExtra),
];
foreach ($personas as $persona) {
    if (!nomina_get_effective_salary_bs($persona, 1)) { $summary['sin_salario']++; }
    if (empty($persona['id_cargo'])) { $summary['sin_cargo']++; }
    if (empty($persona['id_turno'])) { $summary['sin_turno']++; }
}
foreach (['A-001','A-002','A-003','A-004','A-005','A-007','A-008','A-009','A-010','A-011','B-001','B-002','B-003','B-004','B-005','B-006','B-007','P-001','P-002','P-003','P-004','P-005'] as $codigo) {
    if (!isset($conceptos[$codigo])) { $summary['conceptos_faltantes'][] = $codigo; }
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['calcular'])) {
    $periodoId = (int)($_POST['periodo_id'] ?? 0);
    $origen = strtoupper((string)($_POST['origen_cantidades'] ?? 'CALENDARIO'));
    if (!in_array($origen, ['CALENDARIO','ASISTENCIA','MANUAL'], true)) { $origen = 'CALENDARIO'; }
    $periodo = $periodoId ? nomina_get_periodo($conexion, $periodoId) : null;
    $novedades = $periodoId ? nomina_fetch_novedades_by_period($conexion, $periodoId, $schema) : [];
    $manualAssignments = $periodoId ? nomina_fetch_manual_concept_assignments($conexion, $periodoId) : [];
    $precargas = $periodo ? nomina_build_preloads($conexion, $personas, $periodo, $origen) : [];
    $feriadosPeriodo = ($periodo && function_exists('nomina_get_calendario_feriados')) ? nomina_get_calendario_feriados($conexion, $periodo['fecha_desde'], $periodo['fecha_hasta'], true, true) : [];

    $fechaPago = nomina_date_to_iso($_POST['fecha_pago'] ?? '');
    $tasaBcv = nomina_normalize_decimal($_POST['tasa_bcv_usd'] ?? 0);
    $cestaticketUsd = nomina_normalize_decimal($_POST['cestaticket_usd_mensual'] ?? 0);

    if (!$periodo) { $errors[] = 'Debes seleccionar un período válido.'; }
    if ($periodo && strtoupper((string)$periodo['estado']) === 'CERRADO') { $errors[] = 'El período está cerrado. No se permite calcular una nueva corrida.'; }
    if ($periodo && function_exists('nlm_periodo_has_locked_corrida') && nlm_periodo_has_locked_corrida($conexion, $periodoId)) { $errors[] = 'Este período ya tiene una corrida revisada/aprobada/pagada/cerrada. No se permite recalcular sin anular/reabrir por procedimiento formal.'; }
    if ($fechaPago === '') { $errors[] = 'Debes indicar la fecha de pago.'; }
    if ($tasaBcv <= 0) { $errors[] = 'La tasa BCV debe ser mayor a 0.'; }
    if ($cestaticketUsd < 0) { $errors[] = 'El cestaticket mensual no puede ser negativo.'; }
    if ($summary['conceptos_faltantes']) { $errors[] = 'Faltan conceptos activos requeridos para el cálculo: ' . implode(', ', $summary['conceptos_faltantes']) . '.'; }

    $resPaid = $periodoId ? mysqli_query($conexion, "SELECT COUNT(*) AS total FROM nomina_corridas WHERE periodo_id = {$periodoId} AND estado = 'PAGADA'") : false;
    $paidInfo = $resPaid ? mysqli_fetch_assoc($resPaid) : ['total' => 0];
    if ((int)($paidInfo['total'] ?? 0) > 0) {
        $errors[] = 'Este período ya tiene corridas pagadas. Evita recalcularlo para no perder trazabilidad.';
    }

    // v6.9: control auditor A-004. Si RRHH carga feriado trabajado por encima de lo sugerido
    // por asistencia/calendario, debe existir soporte en Observaciones de novedades.
    if (!$errors && $periodo) {
        $manualFeriadosSinSoporte = [];
        foreach ($personas as $personaCheck) {
            $pidCheck = (int)($personaCheck['id'] ?? 0);
            if ($pidCheck <= 0) { continue; }
            $preCheck = $precargas[$pidCheck] ?? ['dias_feriado' => 0];
            $novCheck = $novedades[$pidCheck] ?? [];
            $feriadoSugerido = nomina_normalize_decimal($preCheck['dias_feriado'] ?? 0);
            $feriadoCapturado = nomina_normalize_decimal($_POST['dias_fer_trab'][$pidCheck] ?? $feriadoSugerido);
            $obsCheck = trim((string)($novCheck['observaciones'] ?? ''));
            $obsLen = function_exists('mb_strlen') ? mb_strlen($obsCheck, 'UTF-8') : strlen($obsCheck);
            if ($feriadoCapturado > ($feriadoSugerido + 0.000001) && $obsLen < 15) {
                $manualFeriadosSinSoporte[] = trim(($personaCheck['apellido'] ?? '') . ', ' . ($personaCheck['nombre'] ?? '')) . ' (A-004 manual: ' . $feriadoCapturado . ' día(s), sugerido por asistencia/calendario: ' . $feriadoSugerido . ')';
            }
        }
        if ($manualFeriadosSinSoporte) {
            $errors[] = 'A-004 Feriado trabajado cargado manualmente requiere soporte en Novedades → Observaciones: fecha feriada, motivo y autorización. Pendiente: ' . implode(' | ', array_slice($manualFeriadosSinSoporte, 0, 8)) . (count($manualFeriadosSinSoporte) > 8 ? ' | ...' : '');
        }
    }

    if (!$errors) {
        $idA001 = cid($conceptos,'A-001'); $idA002 = cid($conceptos,'A-002'); $idA003 = cid($conceptos,'A-003'); $idA004 = cid($conceptos,'A-004');
        $idA005 = cid($conceptos,'A-005'); $idA007 = cid($conceptos,'A-007'); $idA008 = cid($conceptos,'A-008'); $idA009 = cid($conceptos,'A-009'); $idA010 = cid($conceptos,'A-010'); $idA011 = cid($conceptos,'A-011');
        $idB001 = cid($conceptos,'B-001'); $idB002 = cid($conceptos,'B-002'); $idB003 = cid($conceptos,'B-003');
        $idB004 = cid($conceptos,'B-004'); $idB005 = cid($conceptos,'B-005'); $idB006 = cid($conceptos,'B-006'); $idB007 = cid($conceptos,'B-007');
        $idP001 = cid($conceptos,'P-001'); $idP002 = cid($conceptos,'P-002'); $idP003 = cid($conceptos,'P-003'); $idP004 = cid($conceptos,'P-004'); $idP005 = cid($conceptos,'P-005');
        $fDescTrab = 1.5; $fFer = 2.0; $fHeD = 1.5; $fHeN = 2.0; $fNocturno = function_exists('nlm_param') ? nlm_param($conexion, 'BONO_NOCTURNO_TASA', $fechaPago, 0.30) : 0.30;

        mysqli_begin_transaction($conexion);
        try {
            $sqlCorrida = "INSERT INTO nomina_corridas (periodo_id, fecha_pago, tasa_bcv_usd, cestaticket_usd_mensual, estado)
                           VALUES ({$periodoId}, '" . mysqli_real_escape_string($conexion, $fechaPago) . "', {$tasaBcv}, {$cestaticketUsd}, 'BORRADOR')";
            if (!mysqli_query($conexion, $sqlCorrida)) {
                throw new Exception(mysqli_error($conexion));
            }
            $corridaId = (int)mysqli_insert_id($conexion);
            if (function_exists('nlm_snapshot_concepts_for_corrida')) {
                nlm_snapshot_concepts_for_corrida($conexion, $corridaId);
            }
            if (function_exists('nomina_snapshot_calendar_for_corrida')) {
                nomina_snapshot_calendar_for_corrida($conexion, $corridaId, $periodo);
            }

            foreach ($personas as $persona) {
                $pid = (int)$persona['id'];
                $nov = $novedades[$pid] ?? [];
                $pre = $precargas[$pid] ?? ['dias_laborados' => 0, 'dias_descanso' => 0, 'dias_descanso_trab' => 0, 'dias_feriado' => 0, 'he_diurna' => 0, 'he_nocturna' => 0, 'horas_nocturnas' => 0];

                $diasAusPer = nomina_normalize_decimal($nov['dias_ausencia_periodo'] ?? 0);
                $horasRet = nomina_normalize_decimal($nov['horas_retardo_periodo'] ?? 0);
                $diasAusMes = array_key_exists('dias_ausencia_mes', $nov) && $nov['dias_ausencia_mes'] !== null && $nov['dias_ausencia_mes'] !== ''
                    ? nomina_normalize_decimal($nov['dias_ausencia_mes'])
                    : null;
                $bonoManual = nomina_normalize_decimal($nov['bono_manual_bs'] ?? 0);
                $otrosDesc = nomina_normalize_decimal($nov['otros_descuentos_bs'] ?? 0);
                $prestamo = nomina_normalize_decimal($nov['prestamo_bs'] ?? 0);
                $vacacionesBs = nomina_normalize_decimal($nov['pago_vacaciones_bs'] ?? 0);
                $preHeDiurna = array_key_exists('he_diurna', $nov) ? nomina_normalize_decimal($nov['he_diurna']) : nomina_normalize_decimal($pre['he_diurna'] ?? 0);
                $preHeNocturna = array_key_exists('he_nocturna', $nov) ? nomina_normalize_decimal($nov['he_nocturna']) : nomina_normalize_decimal($pre['he_nocturna'] ?? 0);
                $preHorasNocturnas = array_key_exists('horas_nocturnas_ordinarias', $nov) ? nomina_normalize_decimal($nov['horas_nocturnas_ordinarias']) : nomina_normalize_decimal($pre['horas_nocturnas'] ?? 0);

                $dl = nomina_normalize_decimal($_POST['dias_laborados'][$pid] ?? $pre['dias_laborados']);
                $dd = nomina_normalize_decimal($_POST['dias_descanso'][$pid] ?? $pre['dias_descanso']);
                $dct = nomina_normalize_decimal($_POST['dias_desc_trab'][$pid] ?? $pre['dias_descanso_trab']);
                $dft = nomina_normalize_decimal($_POST['dias_fer_trab'][$pid] ?? $pre['dias_feriado']);
                $hed = nomina_normalize_decimal($_POST['he_diurna'][$pid] ?? $preHeDiurna);
                $hen = nomina_normalize_decimal($_POST['he_noct'][$pid] ?? $preHeNocturna);
                $hnoct = nomina_normalize_decimal($_POST['horas_nocturnas'][$pid] ?? $preHorasNocturnas);

                if (function_exists('nlm_snapshot_worker_for_corrida')) {
                    nlm_snapshot_worker_for_corrida($conexion, $corridaId, $persona, $tasaBcv);
                }
                if (function_exists('nlm_salary_snapshot_context')) {
                    $salarySnapshot = nlm_salary_snapshot_context($persona, $tasaBcv);
                    $salMensBs = (float)$salarySnapshot['salario_mensual_bs'];
                    $salDia = (float)$salarySnapshot['salario_diario_bs'];
                    $salHora = (float)$salarySnapshot['salario_hora_bs'];
                } else {
                    $salMensBs = nomina_get_effective_salary_bs($persona, $tasaBcv);
                    $salDia = $salMensBs / 30.0;
                    $salHora = $salDia / 8.0;
                }

                $a001 = $dl * $salDia;
                $a002 = $dd * $salDia;
                $a003 = $dct * $salDia * $fDescTrab;
                $a004 = $dft * $salDia * $fFer;
                $a007 = $hed * $salHora * $fHeD;
                $a008 = $hen * $salHora * $fHeN;
                $a011 = $hnoct * $salHora * $fNocturno;
                $bonoUsdMes = nomina_normalize_decimal($persona['bono_extra_usd_mensual'] ?? 0);
                $a009Auto = ($bonoUsdMes * $tasaBcv) / 2.0;
                $a009 = $a009Auto + $bonoManual;
                $a010 = $vacacionesBs;
                $a005 = 0;
                $diasElegibles = null;
                if ((int)($periodo['es_ultima_quincena'] ?? 0) === 1) {
                    $ausMesUse = $diasAusMes === null ? $diasAusPer : $diasAusMes;
                    $diasElegibles = max(0, 30 - $ausMesUse);
                    $a005 = ($cestaticketUsd * $tasaBcv) * ($diasElegibles / 30.0);
                }

                if ($idA001 && $a001 != 0) insMov($conexion,$corridaId,$pid,$idA001,$dl,$salDia,null,$a001,['fuente'=>$origen,'sal_dia'=>$salDia]);
                if ($idA002 && $a002 != 0) insMov($conexion,$corridaId,$pid,$idA002,$dd,$salDia,null,$a002,['fuente'=>$origen,'sal_dia'=>$salDia]);
                if ($idA003 && $a003 != 0) insMov($conexion,$corridaId,$pid,$idA003,$dct,$salDia,$fDescTrab,$a003,['factor'=>$fDescTrab]);
                if ($idA004 && $a004 != 0) insMov($conexion,$corridaId,$pid,$idA004,$dft,$salDia,$fFer,$a004,['factor'=>$fFer]);
                if ($idA007 && $a007 != 0) insMov($conexion,$corridaId,$pid,$idA007,$hed,$salHora,$fHeD,$a007,['factor'=>$fHeD,'sal_hora'=>$salHora]);
                if ($idA008 && $a008 != 0) insMov($conexion,$corridaId,$pid,$idA008,$hen,$salHora,$fHeN,$a008,['factor'=>$fHeN,'sal_hora'=>$salHora]);
                if ($idA011 && $a011 != 0) insMov($conexion,$corridaId,$pid,$idA011,$hnoct,$salHora,$fNocturno,$a011,['factor'=>$fNocturno,'sal_hora'=>$salHora,'legal'=>'Bono nocturno ordinario Art. 117 LOTTT']);
                if ($idA009 && $a009 != 0) insMov($conexion,$corridaId,$pid,$idA009,null,null,null,$a009,['bono_usd_mes'=>$bonoUsdMes,'tasa_bcv'=>$tasaBcv,'auto_bs'=>$a009Auto,'manual_bs'=>$bonoManual]);
                if ($idA010 && $a010 != 0) insMov($conexion,$corridaId,$pid,$idA010,null,null,null,$a010,['origen'=>'novedades_periodo']);
                if ((int)($periodo['es_ultima_quincena'] ?? 0) === 1 && $idA005 && $a005 != 0) {
                    insMov($conexion,$corridaId,$pid,$idA005,$diasElegibles,null,null,$a005,['cesta_usd_mes'=>$cestaticketUsd,'tasa_bcv'=>$tasaBcv,'dias_elegibles'=>$diasElegibles]);
                }

                foreach ($conceptosFijosGlobales as $conceptoGlobal) {
                    $conceptoId = (int)($conceptoGlobal['id'] ?? 0);
                    if ($conceptoId <= 0) { continue; }
                    $montoBase = nomina_normalize_decimal($conceptoGlobal['monto_fijo'] ?? 0);
                    if ($montoBase == 0) { continue; }
                    $monedaConcepto = strtoupper((string)($conceptoGlobal['moneda_monto_fijo'] ?? 'VES'));
                    $montoAplicadoBs = nomina_fixed_amount_to_bs($conceptoGlobal, $tasaBcv);
                    if ($montoAplicadoBs == 0) { continue; }
                    insMov($conexion, $corridaId, $pid, $conceptoId, null, null, $monedaConcepto === 'USD' ? $tasaBcv : null, $montoAplicadoBs, [
                        'origen' => 'concepto_fijo_global',
                        'monto_base' => $montoBase,
                        'moneda_base' => $monedaConcepto,
                        'tasa_bcv' => $monedaConcepto === 'USD' ? $tasaBcv : null,
                        'codigo' => $conceptoGlobal['codigo'] ?? '',
                        'nombre' => $conceptoGlobal['nombre'] ?? '',
                    ]);
                }

                $manualRows = isset($manualAssignments[$pid]) ? $manualAssignments[$pid] : [];
                foreach ($manualRows as $manualConceptId => $manualRow) {
                    $manualConceptId = (int)$manualConceptId;
                    if ($manualConceptId <= 0 || !isset($conceptosById[$manualConceptId])) { continue; }
                    $conceptoManual = $conceptosById[$manualConceptId];
                    if (strtoupper((string)($conceptoManual['modo_calculo'] ?? '')) !== 'FIJO') { continue; }
                    if ((int)($conceptoManual['aplica_global'] ?? 0) === 1) { continue; }
                    $valorEntrada = nomina_normalize_decimal($manualRow['valor_manual'] ?? 0);
                    if ($valorEntrada == 0) { continue; }
                    $monedaManual = strtoupper((string)($conceptoManual['moneda_monto_fijo'] ?? 'VES'));
                    $montoManualBs = ($monedaManual === 'USD') ? ($valorEntrada * $tasaBcv) : $valorEntrada;
                    if ($montoManualBs == 0) { continue; }
                    insMov($conexion, $corridaId, $pid, $manualConceptId, null, null, $monedaManual === 'USD' ? $tasaBcv : null, $montoManualBs, [
                        'origen' => 'concepto_manual_extra',
                        'manual_extra' => 1,
                        'valor_entrada' => $valorEntrada,
                        'monto_base' => $valorEntrada,
                        'moneda_base' => $monedaManual,
                        'tasa_bcv' => $monedaManual === 'USD' ? $tasaBcv : null,
                        'codigo' => $conceptoManual['codigo'] ?? '',
                        'nombre' => $conceptoManual['nombre'] ?? '',
                    ]);
                }

                $b004 = $diasAusPer * $salDia;
                $b005 = $horasRet * $salHora;

                if ($idB004 && $b004 != 0) insMov($conexion,$corridaId,$pid,$idB004,$diasAusPer,$salDia,null,$b004,['sal_dia'=>$salDia]);
                if ($idB005 && $b005 != 0) insMov($conexion,$corridaId,$pid,$idB005,$horasRet,$salHora,null,$b005,['sal_hora'=>$salHora]);

                // Bases legales después de registrar asignaciones salariales/no salariales.
                $resBases = mysqli_query($conexion, "SELECT
                        COALESCE(SUM(CASE WHEN c.tipo='ASIG' AND c.incide_salario_normal=1 THEN m.monto ELSE 0 END),0) AS base_normal,
                        COALESCE(SUM(CASE WHEN c.tipo='ASIG' AND c.incide_base_cotizacion=1 THEN m.monto ELSE 0 END),0) AS base_integral,
                        COALESCE(SUM(CASE WHEN c.tipo='ASIG' THEN m.monto ELSE 0 END),0) AS total_asignaciones_base
                    FROM nomina_movimientos m
                    JOIN conceptos_nomina c ON c.id = m.concepto_id
                    WHERE m.corrida_id = {$corridaId} AND m.persona_id = {$pid}");
                $basesRow = $resBases ? mysqli_fetch_assoc($resBases) : ['base_normal'=>0,'base_integral'=>0,'total_asignaciones_base'=>0];
                $baseNormalLegal = (float)($basesRow['base_normal'] ?? 0);
                $baseIntegralLegal = (float)($basesRow['base_integral'] ?? 0);
                if ($baseIntegralLegal <= 0) { $baseIntegralLegal = $baseNormalLegal; }
                $totalAsignacionesBase = (float)($basesRow['total_asignaciones_base'] ?? 0);

                $legalItems = nlm_calc_legal_amounts($conexion, $periodo, [
                    'fecha_pago' => $fechaPago,
                    'base_normal_periodo' => $baseNormalLegal,
                    'base_integral_periodo' => $baseIntegralLegal,
                    'total_asignaciones' => $totalAsignacionesBase,
                    'salario_mensual_normal_bs' => $salMensBs,
                ], $tasaBcv);
                $legalConceptIds = ['B-001'=>$idB001, 'B-002'=>$idB002, 'B-003'=>$idB003, 'P-001'=>$idP001, 'P-002'=>$idP002, 'P-003'=>$idP003, 'P-004'=>$idP004, 'P-005'=>$idP005];
                foreach ($legalItems as $legalCode => $legal) {
                    $legalConceptId = $legalConceptIds[$legalCode] ?? 0;
                    $legalMonto = (float)($legal['monto'] ?? 0);
                    if ($legalConceptId && $legalMonto != 0) {
                        insMov($conexion, $corridaId, $pid, $legalConceptId, null, $legal['base'] ?? null, $legal['tasa'] ?? null, $legalMonto, $legal['meta'] ?? null);
                    }
                }

                if ($idB006 && $otrosDesc != 0) insMov($conexion,$corridaId,$pid,$idB006,null,null,null,$otrosDesc,['origen'=>'novedades_periodo']);
                if ($idB007 && $prestamo != 0) insMov($conexion,$corridaId,$pid,$idB007,null,null,null,$prestamo,['origen'=>'novedades_periodo']);

                $rtot = mysqli_query($conexion, "SELECT
                        COALESCE(SUM(CASE WHEN c.tipo='ASIG' THEN m.monto ELSE 0 END),0) AS total_asig,
                        COALESCE(SUM(CASE WHEN c.tipo='DED' THEN m.monto ELSE 0 END),0) AS total_ded,
                        COALESCE(SUM(CASE WHEN c.tipo='PATR' THEN m.monto ELSE 0 END),0) AS total_patr
                    FROM nomina_movimientos m
                    JOIN conceptos_nomina c ON c.id = m.concepto_id
                    WHERE m.corrida_id = {$corridaId} AND m.persona_id = {$pid}");
                $totRow = $rtot ? mysqli_fetch_assoc($rtot) : ['total_asig'=>0,'total_ded'=>0,'total_patr'=>0];
                $tas = (float)($totRow['total_asig'] ?? 0);
                $tde = (float)($totRow['total_ded'] ?? 0);
                $tpat = (float)($totRow['total_patr'] ?? 0);
                $neto = $tas - $tde;

                // Compatible MariaDB/MySQL: guardar detalle sin INSERT ... alias de inserción con actualización automática.
                $resDetalleExistente = mysqli_query($conexion, "SELECT id FROM nomina_detalle WHERE corrida_id = {$corridaId} AND persona_id = {$pid} LIMIT 1");
                if ($resDetalleExistente && mysqli_num_rows($resDetalleExistente) > 0) {
                    $rowDetalleExistente = mysqli_fetch_assoc($resDetalleExistente);
                    $detalleId = (int)($rowDetalleExistente['id'] ?? 0);
                    $sqlDetalle = "UPDATE nomina_detalle SET total_asignaciones={$tas}, total_deducciones={$tde}, neto_pagar={$neto}, base_salario_normal={$baseNormalLegal}, base_salario_integral={$baseIntegralLegal}, total_patronal={$tpat} WHERE id={$detalleId} LIMIT 1";
                } else {
                    $sqlDetalle = "INSERT INTO nomina_detalle (corrida_id, persona_id, total_asignaciones, total_deducciones, neto_pagar, base_salario_normal, base_salario_integral, total_patronal)
                                   VALUES ({$corridaId}, {$pid}, {$tas}, {$tde}, {$neto}, {$baseNormalLegal}, {$baseIntegralLegal}, {$tpat})";
                }
                if (!mysqli_query($conexion, $sqlDetalle)) {
                    throw new Exception(mysqli_error($conexion));
                }
            }

            $snapshot = mysqli_real_escape_string($conexion, json_encode(nlm_snapshot_params($conexion, $fechaPago), JSON_UNESCAPED_UNICODE));
            mysqli_query($conexion, "UPDATE nomina_corridas SET estado='CALCULADA', legal_snapshot='{$snapshot}' WHERE id={$corridaId}");
            nlm_audit($conexion, 'nomina_corridas', $corridaId, 'CALCULADA', ['periodo_id'=>$periodoId, 'fecha_pago'=>$fechaPago]);
            mysqli_commit($conexion);
            nomina_flash_set('success', 'Corrida calculada correctamente.');
            header('Location: nomina_recibo.php?corrida_id=' . $corridaId);
            exit;
        } catch (Throwable $e) {
            mysqli_rollback($conexion);
            $errors[] = 'No se pudo calcular la nómina: ' . $e->getMessage();
        }
    }
}
?>
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Cálculo de Nómina v6.9</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&display=swap" rel="stylesheet">
<style>
:root{--primary:#1a3c8b;--accent:#ff9800;--success:#166534;--danger:#be123c;--gray:#6b7280;--bg:#f5f7fa;--card:#fff;--line:#e5e7eb;--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:#24364b}a{color:var(--primary);text-decoration:none}.container{max-width:1450px;margin:24px auto;padding:0 16px}.topbar,.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}.topbar{display:flex;justify-content:space-between;align-items:center;padding:16px 18px;gap:16px}.title{font-size:20px;font-weight:700}.subtitle{font-size:13px;color:var(--gray);margin-top:4px}.card{padding:18px;margin-top:16px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 14px;border-radius:12px;border:1px solid transparent;background:var(--primary);color:#fff;font-weight:600;cursor:pointer}.btn.secondary{background:#fff;color:var(--primary);border-color:rgba(26,60,139,.22)}.btn.ghost{background:rgba(26,60,139,.08);color:var(--primary)}
.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:14px}.col-3{grid-column:span 3}.col-4{grid-column:span 4}.col-6{grid-column:span 6}.col-12{grid-column:span 12}@media(max-width:1100px){.col-3,.col-4,.col-6{grid-column:span 12}.topbar{flex-direction:column;align-items:flex-start}}
label{display:block;font-size:12px;font-weight:600;margin:0 0 6px 2px;color:#334155}select,input{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:12px;background:#fff;font:inherit}select:focus,input:focus{outline:none;border-color:rgba(26,60,139,.55);box-shadow:0 0 0 3px rgba(26,60,139,.12)}
.help{border-left:4px solid var(--accent);background:rgba(255,152,0,.10);padding:14px;border-radius:14px;font-size:13px}.help ul{margin:8px 0 0 18px}.alert{padding:12px 14px;border-radius:12px;margin:12px 0;font-size:13px;border:1px solid}.alert.error{background:rgba(190,18,60,.08);border-color:rgba(190,18,60,.24);color:var(--danger)}.alert.success{background:rgba(22,101,52,.08);border-color:rgba(22,101,52,.22);color:var(--success)}.alert.info{background:rgba(26,60,139,.08);border-color:rgba(26,60,139,.22);color:var(--primary)}.stats{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:12px;margin-top:14px}.stat{padding:14px;border:1px solid var(--line);border-radius:14px;background:#fff}.stat b{display:block;font-size:22px;margin-bottom:4px}.muted{color:var(--gray);font-size:12px}.tabs{display:flex;gap:8px;flex-wrap:wrap}.tab{padding:8px 12px;border-radius:999px;border:1px solid rgba(26,60,139,.18);font-size:13px;color:var(--primary);background:#fff}.tab.active{background:rgba(26,60,139,.10);font-weight:700}.table-wrap{overflow:auto;border:1px solid var(--line);border-radius:14px;margin-top:14px}.table{width:100%;border-collapse:collapse;min-width:1620px}.table th,.table td{padding:10px 12px;border-bottom:1px solid #eef2f7;font-size:13px;vertical-align:top;text-align:left}.table th{background:#fafafa;font-weight:700}.mini{font-size:11px;color:#64748b}.employee{min-width:260px}.num{max-width:90px}.summary-line{padding:12px;border:1px dashed rgba(26,60,139,.25);background:#fbfdff;border-radius:12px}.chip{display:inline-block;padding:4px 8px;border-radius:999px;background:rgba(26,60,139,.10);color:var(--primary);font-size:11px;font-weight:700;margin-right:6px}
</style>
<link rel="stylesheet" href="nomina_ui_patch.css?v=20260415">
</head>
<body data-nomina-page="calculo">
<div class="container">
    <div class="topbar">
        <div>
            <div class="title">Cálculo de Nómina</div>
            <div class="subtitle">Revisa parámetros legales, valida datos pendientes y genera la corrida del período.</div>
        </div>
        <div style="display:flex;gap:10px;flex-wrap:wrap;">
            <a class="btn secondary" href="nomina_parametros_legales.php">Parámetros legales</a>
            <a class="btn secondary" href="index.php">Volver al dashboard</a>
            <a class="btn secondary" href="nomina_calendario_laboral.php?anio=<?php echo $periodo ? (int)substr($periodo['fecha_desde'], 0, 4) : (int)date('Y'); ?>">Calendario laboral VE</a>
        </div>
    </div>

    <div class="card">
        <div class="help">
            <strong>Flujo recomendado</strong>
            <ul>
                <li><b>1.</b> Crea el período y déjalo abierto.</li>
                <li><b>2.</b> Carga novedades: ausencias, retardos, descuentos, préstamos, conceptos manuales y pago manual de vacaciones.</li>
                <li><b>3.</b> Elige el origen de cantidades: <b>calendario</b>, <b>asistencia</b> o <b>manual</b>. En calendario se toman feriados laborales Venezuela y domingos según LOTTT.</li>
                <li><b>4.</b> Revisa las sugerencias por trabajador y corrige solo excepciones. Usa <b>A-011 bono nocturno</b> para horas nocturnas ordinarias y <b>A-008</b> solo para horas extraordinarias nocturnas.</li>
                <li><b>5.</b> Calcula la corrida. La tasa BCV, cestaticket y parámetros legales quedan congelados en ese momento.</li>
            </ul>
            <?php if (!empty($conceptosFijosGlobales)): ?>
                <div style="margin-top:10px;font-size:13px;"><b>Conceptos fijos globales activos:</b> <?php foreach($conceptosFijosGlobales as $idx => $cf): ?><?php echo $idx ? ' · ' : ''; ?><span><?php echo h($cf['codigo']); ?> (<?php echo number_format((float)$cf['monto_fijo'], 2, ',', '.'); ?> <?php echo h(strtoupper((string)$cf['moneda_monto_fijo'])); ?>)</span><?php endforeach; ?></div>
            <?php endif; ?>
        </div>

        <?php if ($flash): ?><div class="alert <?php echo h($flash['type']); ?>"><?php echo h($flash['message']); ?></div><?php endif; ?>
        <?php if ($errors): ?><div class="alert error"><strong>Revisa estos puntos:</strong><ul style="margin:8px 0 0 18px;"><?php foreach ($errors as $error): ?><li><?php echo $error; ?></li><?php endforeach; ?></ul></div><?php endif; ?>

        <div class="grid" style="margin-top:12px;align-items:end;">
            <div class="col-6">
                <label for="periodo_id">Período</label>
                <form method="get">
                    <div style="display:flex;gap:10px;flex-wrap:wrap;align-items:end;">
                        <select id="periodo_id" name="periodo_id" onchange="this.form.submit()" style="min-width:420px;flex:1 1 420px;">
                            <?php foreach ($periodos as $p): ?>
                                <option value="<?php echo (int)$p['id']; ?>" <?php echo (int)$p['id'] === (int)$periodoId ? 'selected' : ''; ?>>
                                    <?php echo h($p['codigo'] . ' (' . $p['tipo'] . ') ' . $p['fecha_desde'] . ' a ' . $p['fecha_hasta'] . ((int)$p['es_ultima_quincena'] === 1 ? ' [Última quincena]' : '')); ?>
                                </option>
                            <?php endforeach; ?>
                        </select>
                        <input type="hidden" name="origen_cantidades" value="<?php echo h($origen); ?>">
                    </div>
                </form>
            </div>
            <div class="col-6">
                <label>Origen de días y cantidades</label>
                <div class="tabs">
                    <a class="tab <?php echo $origen === 'CALENDARIO' ? 'active' : ''; ?>" href="nomina_calcular_actualizado.php?periodo_id=<?php echo (int)$periodoId; ?>&origen_cantidades=CALENDARIO">Calendario</a>
                    <a class="tab <?php echo $origen === 'ASISTENCIA' ? 'active' : ''; ?>" href="nomina_calcular_actualizado.php?periodo_id=<?php echo (int)$periodoId; ?>&origen_cantidades=ASISTENCIA">Asistencia</a>
                    <a class="tab <?php echo $origen === 'MANUAL' ? 'active' : ''; ?>" href="nomina_calcular_actualizado.php?periodo_id=<?php echo (int)$periodoId; ?>&origen_cantidades=MANUAL">Manual</a>
                </div>
                <div class="muted" style="margin-top:8px;">Calendario recomienda días según turno. Asistencia toma los días con entrada registrada. Manual deja todo en cero para captura libre.</div>
            </div>
        </div>

        <?php if ($periodo): ?>
            <div class="summary-line" style="margin-top:14px;">
                <span class="chip"><?php echo h($periodo['codigo']); ?></span>
                Estado: <b><?php echo h($periodo['estado']); ?></b> · Desde <?php echo h($periodo['fecha_desde']); ?> hasta <?php echo h($periodo['fecha_hasta']); ?> · Corridas previas: <b><?php echo (int)$periodo['total_corridas']; ?></b>
                <?php if ((int)$periodo['es_ultima_quincena'] === 1): ?> · <b>Última quincena</b>: aquí se paga el cestaticket mensual.<?php endif; ?>
            </div>
        <?php endif; ?>

        <div class="stats">
            <div class="stat"><b><?php echo $summary['trabajadores']; ?></b><span class="muted">Trabajadores activos</span></div>
            <div class="stat"><b><?php echo $summary['con_novedades']; ?></b><span class="muted">Trabajadores con novedades</span></div>
            <div class="stat"><b><?php echo $summary['sin_salario']; ?></b><span class="muted">Con datos salariales incompletos</span></div>
            <div class="stat"><b><?php echo $summary['sin_cargo']; ?></b><span class="muted">Sin cargo</span></div>
            <div class="stat"><b><?php echo $summary['sin_turno']; ?></b><span class="muted">Sin turno</span></div>
        </div>

        <?php if ($origen === 'CALENDARIO' && $periodo): ?>
            <div class="alert info" style="margin-top:14px;">
                <b>Calendario laboral Venezuela activo.</b>
                El sistema toma domingos y feriados laborales configurados para el período. Si hay asistencia registrada en feriado/domingo, sugiere <b>A-004 Feriado trabajado</b>; RRHH puede ajustar antes de calcular.
                <a href="nomina_calendario_laboral.php?anio=<?php echo (int)substr($periodo['fecha_desde'], 0, 4); ?>" style="font-weight:700;">Revisar calendario</a>.
                <?php if (!empty($feriadosPeriodo)): ?>
                    <div class="mini" style="margin-top:8px; line-height:1.5;">
                        <b>Detectados:</b>
                        <?php $shown=0; foreach ($feriadosPeriodo as $fdate => $items): foreach ($items as $it): if ($shown >= 8) { continue 2; } $shown++; ?>
                            <span class="chip"><?php echo h(date('d/m', strtotime($fdate)) . ' ' . ($it['nombre'] ?? 'Feriado')); ?></span>
                        <?php endforeach; endforeach; ?>
                        <?php if (count($feriadosPeriodo) > 8): ?> <span class="muted">y otros domingos/feriados del período.</span><?php endif; ?>
                    </div>
                <?php else: ?>
                    <div class="mini" style="margin-top:8px;">No hay feriados laborales configurados para este rango, salvo domingos calculados automáticamente si corresponden.</div>
                <?php endif; ?>
            </div>
        <?php endif; ?>

    </div>

    <div class="card">
        <form method="post">
            <input type="hidden" name="periodo_id" value="<?php echo (int)$periodoId; ?>">
            <input type="hidden" name="origen_cantidades" value="<?php echo h($origen); ?>">

            <div class="grid">
                <div class="col-3">
                    <label for="fecha_pago">Fecha de pago</label>
                    <input id="fecha_pago" type="date" name="fecha_pago" required value="<?php echo h($_POST['fecha_pago'] ?? date('Y-m-d')); ?>">
                </div>
                <div class="col-3">
                    <label for="tasa_bcv_usd">Tasa BCV del día</label>
                    <input id="tasa_bcv_usd" name="tasa_bcv_usd" required inputmode="decimal" value="<?php echo h($_POST['tasa_bcv_usd'] ?? $bcvPrefill); ?>" placeholder="Ej: 39.1495">
                    <div class="muted">Se guarda dentro de la corrida. También congela alícuotas/topes legales vigentes.</div>
                    <?php if ($bcvUpdatedText): ?>
                        <div class="muted" style="margin-top:4px;"><?php echo h($bcvUpdatedText); ?></div>
                    <?php endif; ?>
                    <?php if (!empty($bcvInfo['message'])): ?>
                        <div class="muted" style="margin-top:4px;"><?php echo h($bcvInfo['message']); ?></div>
                    <?php endif; ?>
                    <div class="muted" style="margin-top:4px;"><a href="?periodo_id=<?php echo (int)$periodoId; ?>&origen_cantidades=<?php echo h(urlencode($origen)); ?>&refresh_bcv=1">Actualizar BCV ahora</a></div>
                </div>
                <div class="col-3">
                    <label for="cestaticket_usd_mensual">Cestaticket mensual (USD)</label>
                    <input id="cestaticket_usd_mensual" name="cestaticket_usd_mensual" required inputmode="decimal" value="<?php echo h($_POST['cestaticket_usd_mensual'] ?? '40'); ?>">
                    <div class="muted">Solo se liquida en la última quincena del mes.</div>
                </div>
                <div class="col-3" style="display:flex;align-items:end;">
                    <button class="btn" type="submit" name="calcular">Calcular nómina</button>
                </div>
            </div>

            <?php if ($summary['conceptos_faltantes']): ?>
                <div class="alert info" style="margin-top:14px;">Activa o crea estos conceptos antes de calcular: <b><?php echo h(implode(', ', $summary['conceptos_faltantes'])); ?></b>.</div>
            <?php endif; ?>
            <?php if ($conceptosManualesExtra): ?>
                <div class="alert info" style="margin-top:14px;">Los <b>conceptos manuales adicionales</b> se capturan en <b>Novedades del período → Modo avanzado</b>. Activos hoy: <?php foreach($conceptosManualesExtra as $idx => $cm): ?><?php echo $idx ? ' · ' : ''; ?><span><?php echo h($cm['codigo']); ?> (<?php echo h(strtoupper((string)$cm['moneda_monto_fijo'])); ?>)</span><?php endforeach; ?>.</div>
            <?php endif; ?>
            <?php if ($origen === 'ASISTENCIA'): ?>
                <div class="alert info" style="margin-top:14px;">Modo asistencia: se precargan los <b>días laborados</b> a partir de registros de entrada. Revisa ausencias en novedades para no duplicar descuentos.</div>
            <?php endif; ?>

            <div class="table-wrap">
                <table class="table">
                    <thead>
                        <tr>
                            <th class="employee">Trabajador</th>
                            <th>Desglose auditor calendario / feriados</th>
                            <th>A-001<br>Días laborados</th>
                            <th>A-002<br>Días de descanso</th>
                            <th>A-003<br>Descanso trabajado</th>
                            <th>A-004<br>Feriado trabajado</th>
                            <th>A-007<br>HE diurna</th>
                            <th>A-008<br>HE nocturna</th>
                            <th>A-011<br>Bono nocturno 30%</th>
                        </tr>
                    </thead>
                    <tbody>
                    <?php foreach ($personas as $persona): ?>
                        <?php
                            $pid = (int)$persona['id'];
                            $pre = $precargas[$pid] ?? ['dias_laborados' => 0, 'dias_descanso' => 0, 'dias_descanso_trab' => 0, 'dias_feriado' => 0, 'he_diurna' => 0, 'he_nocturna' => 0, 'horas_nocturnas' => 0, 'observacion' => ''];
                            $nov = $novedades[$pid] ?? [];
                            $preHeDiurna = array_key_exists('he_diurna', $nov) ? nomina_normalize_decimal($nov['he_diurna']) : nomina_normalize_decimal($pre['he_diurna'] ?? 0);
                            $preHeNocturna = array_key_exists('he_nocturna', $nov) ? nomina_normalize_decimal($nov['he_nocturna']) : nomina_normalize_decimal($pre['he_nocturna'] ?? 0);
                            $preHorasNocturnas = array_key_exists('horas_nocturnas_ordinarias', $nov) ? nomina_normalize_decimal($nov['horas_nocturnas_ordinarias']) : nomina_normalize_decimal($pre['horas_nocturnas'] ?? 0);
                            $defaultSalario = nomina_get_effective_salary_bs($persona, nomina_normalize_decimal($_POST['tasa_bcv_usd'] ?? 1, 1));
                        ?>
                        <tr>
                            <td class="employee">
                                <strong><?php echo h($persona['apellido'] . ', ' . $persona['nombre']); ?></strong><br>
                                <span class="mini">Cargo: <?php echo h($persona['cargo'] ?: 'Sin cargo'); ?> · Turno: <?php echo h($persona['turno_nombre'] ?: 'Sin turno'); ?></span><br>
                                <span class="mini">CI: <?php echo h($persona['cedula']); ?> · Salario base referencia: <?php echo number_format($defaultSalario, 2, ',', '.'); ?> Bs</span><br>
                                <?php if (isset($nov['dias_ausencia_periodo']) || isset($nov['horas_retardo_periodo'])): ?>
                                    <span class="mini">Novedades: Ausencias <?php echo h($nov['dias_ausencia_periodo'] ?? '0'); ?> · Retardos <?php echo h($nov['horas_retardo_periodo'] ?? '0'); ?>h</span>
                                <?php endif; ?>
                            </td>
                            <td>
                                <?php
                                    $dg = isset($pre['desglose_auditor']) && is_array($pre['desglose_auditor']) ? $pre['desglose_auditor'] : [];
                                    $baseCalendario = nomina_normalize_decimal($pre['dias_laborados'] ?? 0) + nomina_normalize_decimal($pre['dias_descanso'] ?? 0);
                                    $ausPeriodo = nomina_normalize_decimal($nov['dias_ausencia_periodo'] ?? 0);
                                    $equivalentePagado = max(0, $baseCalendario - $ausPeriodo);
                                    $feriadoSugeridoAud = nomina_normalize_decimal($pre['dias_feriado'] ?? 0);
                                    $feriadoActualAud = nomina_normalize_decimal($_POST['dias_fer_trab'][$pid] ?? $pre['dias_feriado']);
                                ?>
                                <span class="mini"><b>Base calendario:</b> <?php echo h($baseCalendario); ?> días · Laborables: <?php echo h($pre['dias_laborados']); ?> · No laborables: <?php echo h($pre['dias_descanso']); ?></span><br>
                                <span class="mini">Turno laborable: <?php echo h($dg['laborables_por_turno'] ?? '-'); ?> · Descanso turno puro: <?php echo h($dg['descansos_por_turno_puros'] ?? '-'); ?> · Domingos LOTTT: <?php echo h($dg['domingos_lottt'] ?? '-'); ?> · Feriados: <?php echo h($dg['feriados_nomina_no_domingo'] ?? '-'); ?></span><br>
                                <?php if ($ausPeriodo > 0): ?>
                                    <span class="chip-warning">Ausencias no remuneradas: -<?php echo h($ausPeriodo); ?> · Equivalente pagado: <?php echo h($equivalentePagado); ?> días</span><br>
                                <?php endif; ?>
                                <?php if ($feriadoActualAud > ($feriadoSugeridoAud + 0.000001)): ?>
                                    <span class="chip-warning">A-004 manual: requiere soporte en Observaciones de novedades</span><br>
                                <?php endif; ?>
                                <span class="mini"><?php echo h($pre['observacion'] ?? ''); ?></span>
                            </td>
                            <td><input class="num" name="dias_laborados[<?php echo $pid; ?>]" value="<?php echo h($_POST['dias_laborados'][$pid] ?? $pre['dias_laborados']); ?>"></td>
                            <td><input class="num" name="dias_descanso[<?php echo $pid; ?>]" value="<?php echo h($_POST['dias_descanso'][$pid] ?? $pre['dias_descanso']); ?>"></td>
                            <td><input class="num" name="dias_desc_trab[<?php echo $pid; ?>]" value="<?php echo h($_POST['dias_desc_trab'][$pid] ?? $pre['dias_descanso_trab']); ?>"></td>
                            <td><input class="num" name="dias_fer_trab[<?php echo $pid; ?>]" value="<?php echo h($_POST['dias_fer_trab'][$pid] ?? $pre['dias_feriado']); ?>"></td>
                            <td><input class="num" name="he_diurna[<?php echo $pid; ?>]" value="<?php echo h($_POST['he_diurna'][$pid] ?? $preHeDiurna); ?>" title="Tomado de novedades si fue cargado allí."></td>
                            <td><input class="num" name="he_noct[<?php echo $pid; ?>]" value="<?php echo h($_POST['he_noct'][$pid] ?? $preHeNocturna); ?>" title="Tomado de novedades si fue cargado allí."></td>
                            <td><input class="num" name="horas_nocturnas[<?php echo $pid; ?>]" value="<?php echo h($_POST['horas_nocturnas'][$pid] ?? $preHorasNocturnas); ?>" title="Horas ordinarias nocturnas: recargo 30% sobre salario hora normal. Tomado de novedades si fue cargado allí."></td>
                        </tr>
                    <?php endforeach; ?>
                    </tbody>
                </table>
            </div>
        </form>
    </div>
</div>
<script src="nomina_ui_patch.js?v=20260415"></script>
</body>
</html>
