<?php
require_once __DIR__ . "/../conexion/conexion.php";

// -------------------------------------------------------------------
// 1. FUNCIONES GENERALES Y UTILIDADES
// -------------------------------------------------------------------

function validarRut($rut)
{
    $rutLimpio = preg_replace('/[^kK0-9]/', '',$rut);
    if (strlen($rutLimpio) < 2) return false;

    $dv = strtoupper(substr($rutLimpio, -1));
    $numero = substr($rutLimpio, 0, -1);

    $i = 2;
    $suma = 0;
    foreach (array_reverse(str_split($numero)) as $d) {$suma += $d * $i;
        $i = ($i === 7) ? 2 :$i + 1;
    }
    $resto = 11 - ($suma % 11);
    $dvEsperado = ($resto === 11) ? '0' : (($resto === 10) ? 'K' : (string)$resto);

    return $dv ===$dvEsperado;
}

function getEstados($conn)
{
    $sql = "SELECT id_estado_vigencia_afiliado, nombre FROM estado_vigencia_afiliado ORDER BY nombre ASC";
    $resultado =$conn->query($sql);$estados = [];
    if ($resultado) {
        while ($row =$resultado->fetch_assoc()) {
            $estados[] =$row;
        }
    }
    return $estados;
}

// -------------------------------------------------------------------
// 2. FUNCIONES PRINCIPALES (CON FECHAS INDIVIDUALES Y ESTADO SECUNDARIO)
// -------------------------------------------------------------------

function getAfiliado($conn, $estadoId = '',$limite = 20, $offset = 0) {$sql = "SELECT 
                afiliado.id_afiliado, 
                afiliado.rut,
                afiliado.id_plan,
                afiliado.nombres AS titular, 
                afiliado.fecha_fua,
                estado_vigencia_afiliado.nombre AS estado_vigencia,
                
                -- ESTADO SECUNDARIO AGREGADO AQUÍ --
                nueva_estado.nombre AS estado_secundario,
                
                plan_empresa.nombre_plan,
                COALESCE(emp.nombre_legal, 'Individual') AS nombre_empresa,
                
                carga.id_carga, 
                carga.nombres AS carga, 
                carga.relacion_parentesco,
                parentesco.id_parentesco, 
                parentesco.nombre AS parentesco,
                estado_vigencia_carga.nombre AS estado_carga,
                
                -- Extraemos las fechas de la tabla individual
                temp_benef.fecha_ini_contrato,
                temp_benef.fecha_fin_contrato,
                temp_benef.fecha_creacion

            FROM afiliado 
            LEFT JOIN carga ON afiliado.id_afiliado = carga.id_afiliado 
            LEFT JOIN parentesco ON carga.relacion_parentesco = parentesco.id_parentesco
            LEFT JOIN estado_vigencia_afiliado AS estado_vigencia_carga ON carga.`estado` = estado_vigencia_carga.`id_estado_vigencia_afiliado`
            LEFT JOIN estado_vigencia_afiliado ON afiliado.estado_vigencia_afiliado = estado_vigencia_afiliado.id_estado_vigencia_afiliado 
            -- JOIN CON LA TABLA ESTADO --
            LEFT JOIN nueva.estado AS nueva_estado ON afiliado.id_estado = nueva_estado.id_estado
            LEFT JOIN nueva.plan AS plan_empresa ON afiliado.id_plan = plan_empresa.id_plan
            LEFT JOIN nueva.empresa AS emp ON afiliado.id_empresa = emp.id_empresa 
            LEFT JOIN plan_individual.temp_benef ON temp_benef.rut = REPLACE(SUBSTRING_INDEX(afiliado.rut, '-', 1), '.', '') ";

    if ($estadoId !== '') {$sql .= " WHERE afiliado.estado_vigencia_afiliado = ? ";
    }
    $sql .= " ORDER BY afiliado.fecha_fua DESC, afiliado.id_afiliado ASC, carga.id_carga ASC LIMIT ? OFFSET ?";

    $stmt = $conn->prepare($sql);
    if ($estadoId !== '') {
        $stmt->bind_param("iii", $estadoId, $limite,$offset);
    } else {
        $stmt->bind_param("ii", $limite,$offset);
    }

    $stmt->execute();$resultado = $stmt->get_result();$afiliado = [];
    while ($row =$resultado->fetch_assoc()) {
        $afiliado[] =$row;
    }
    $stmt->close();
    return $afiliado;
}

function buscarPorRut($conn,$rut, $estadoId = '',$limite = 20, $offset = 0) {$sql = "SELECT 
                afiliado.id_afiliado, 
                afiliado.rut,
                afiliado.id_plan,
                afiliado.nombres AS titular, 
                afiliado.fecha_fua,
                estado_vigencia_afiliado.nombre AS estado_vigencia,
                
                -- ESTADO SECUNDARIO AGREGADO AQUÍ --
                nueva_estado.nombre AS estado_secundario,
                
                plan_empresa.nombre_plan,
                COALESCE(emp.nombre_legal, 'Individual') AS nombre_empresa,
                
                carga.id_carga, 
                carga.nombres AS carga, 
                carga.relacion_parentesco,
                parentesco.id_parentesco, 
                parentesco.nombre AS parentesco,
                estado_vigencia_carga.nombre AS estado_carga,
                
                -- Extraemos las fechas de la tabla individual
                temp_benef.fecha_ini_contrato,
                temp_benef.fecha_fin_contrato,
                temp_benef.fecha_creacion

            FROM afiliado 
            LEFT JOIN carga ON afiliado.id_afiliado = carga.id_afiliado 
            LEFT JOIN parentesco ON carga.relacion_parentesco = parentesco.id_parentesco
            LEFT JOIN estado_vigencia_afiliado ON afiliado.estado_vigencia_afiliado = estado_vigencia_afiliado.id_estado_vigencia_afiliado
            LEFT JOIN estado_vigencia_afiliado AS estado_vigencia_carga ON carga.`estado` = estado_vigencia_carga.`id_estado_vigencia_afiliado`
            -- JOIN CON LA TABLA ESTADO --
            LEFT JOIN nueva.estado AS nueva_estado ON afiliado.id_estado = nueva_estado.id_estado
            LEFT JOIN nueva.plan AS plan_empresa ON afiliado.id_plan = plan_empresa.id_plan
            LEFT JOIN nueva.empresa AS emp ON afiliado.id_empresa = emp.id_empresa
            LEFT JOIN plan_individual.temp_benef ON temp_benef.rut = REPLACE(SUBSTRING_INDEX(afiliado.rut, '-', 1), '.', '') 
            WHERE afiliado.rut = ?";

    if ($estadoId !== '') {$sql .= " AND afiliado.estado_vigencia_afiliado = ?";
    }
    $sql .= " ORDER BY afiliado.fecha_fua DESC, afiliado.id_afiliado ASC, carga.id_carga ASC LIMIT ? OFFSET ?";

    $stmt = $conn->prepare($sql);
    if ($estadoId !== '') {$stmt->bind_param("siii", $rut,$estadoId, $limite,$offset);
    } else {
        $stmt->bind_param("sii", $rut, $limite,$offset);
    }

    $stmt->execute();$resultado = $stmt->get_result();$afiliado = [];
    while ($row =$resultado->fetch_assoc()) {
        $afiliado[] =$row;
    }
    $stmt->close();
    return $afiliado;
}

function contarAfiliados($conn,$estadoId = '')
{
    $sql = "SELECT COUNT(DISTINCT afiliado.id_afiliado) AS total 
            FROM afiliado 
            LEFT JOIN carga ON afiliado.id_afiliado = carga.id_afiliado 
            LEFT JOIN parentesco ON carga.relacion_parentesco = parentesco.id_parentesco";

    if ($estadoId !== '') {$sql .= " WHERE afiliado.estado_vigencia_afiliado = ?";
    }
    $stmt = $conn->prepare($sql);
    if ($estadoId !== '') $stmt->bind_param("i", $estadoId);
    $stmt->execute();$resultado = $stmt->get_result();$fila = $resultado->fetch_assoc();$stmt->close();
    return (int)$fila['total'];
}

function contarPorRut($conn, $rut,$estadoId = '')
{
    $sql = "SELECT COUNT(DISTINCT afiliado.id_afiliado) AS total 
            FROM afiliado 
            LEFT JOIN carga ON afiliado.id_afiliado = carga.id_afiliado 
            LEFT JOIN parentesco ON carga.relacion_parentesco = parentesco.id_parentesco 
            WHERE afiliado.rut = ?";

    if ($estadoId !== '') {$sql .= " AND afiliado.estado_vigencia_afiliado = ?";
    }
    $stmt = $conn->prepare($sql);
    if ($estadoId !== '') {$stmt->bind_param("si", $rut,$estadoId);
    } else {
        $stmt->bind_param("s", $rut);
    }
    $stmt->execute();$resultado = $stmt->get_result();$fila = $resultado->fetch_assoc();$stmt->close();
    return (int)$fila["total"];
}
?>

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: