HEX
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/8.0.30
System: Linux multiplicar 3.10.0-1160.102.1.el7.x86_64 #1 SMP Tue Oct 17 15:42:21 UTC 2023 x86_64
User: root (0)
PHP: 8.0.30
Disabled: NONE
Upload Files
File: /var/www/html/test_moodle_sync.php
<?php
// ==========================================
// SINCRONIZACIÓN DE EMPLEADOS - PRODUCCIÓN
// ==========================================

define('CLI_SCRIPT', true);

// URL de la API de empleados
$apiUrl = "https://secureapi.grupochacomer.com.py:5443/api_rrhh/empleados.php";

// Configuración de Moodle
require_once('/var/www/html/demo.sumar.com.py/config.php');
require_once($CFG->libdir . '/datalib.php');
require_once($CFG->libdir . '/moodlelib.php');

// Credenciales de la API
$username = "summar_api";
$password = "Ch4com3r632145*";

// ==========================================
// FUNCION PARA GUARDAR CAMPOS PERSONALIZADOS
// ==========================================
function set_custom_profile_field($userid, $shortname, $value) {
    global $DB;

    if ($value === null || $value === '') {
        return; // no grabar valores vacíos
    }

    // Buscar el campo por shortname
    $field = $DB->get_record('user_info_field', ['shortname' => $shortname], '*', MUST_EXIST);

    // Ver si ya existe un valor para este usuario y campo
    $data = $DB->get_record('user_info_data', ['userid' => $userid, 'fieldid' => $field->id]);

    if ($data) {
        $data->data = $value;
        $DB->update_record('user_info_data', $data);
    } else {
        $newdata = new stdClass();
        $newdata->userid  = $userid;
        $newdata->fieldid = $field->id;
        $newdata->data    = $value;
        $DB->insert_record('user_info_data', $newdata);
    }
}

// ==========================================
// 1. OBTENER EMPLEADOS DE API
// ==========================================
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");

$apiResponse = curl_exec($ch);

if ($apiResponse === false) {
    die("❌ Error al conectar con la API: " . curl_error($ch) . "\n");
}
curl_close($ch);

// ==========================================
// 2. DECODIFICAR JSON
// ==========================================
$empleados = json_decode($apiResponse, true);
if ($empleados === null) {
    echo "❌ Error: JSON inválido. " . json_last_error_msg() . "\n";
    echo "=== Respuesta cruda de la API (primeros 1000 caracteres) ===\n";
    echo substr($apiResponse, 0, 1000) . "\n";
    echo "============================================================\n";
    exit;
}

if (isset($empleados['data'])) {
    $empleados = $empleados['data'];
} elseif (!is_array($empleados)) {
    die("❌ Error: estructura de JSON no compatible.\n");
}

if (empty($empleados)) {
    die("ℹ️ No hay empleados para sincronizar.\n");
}

// ==========================================
// 3. CREAR/ACTUALIZAR USUARIOS EN MOODLE
// ==========================================
$apiusernames = []; // guardamos todos los usernames que trae la API

foreach ($empleados as $emp) {
    $username = strtolower($emp['cedula']);
    $apiusernames[] = $username;

    $user = $DB->get_record('user', ['username' => $username]);

    if ($user) {
        // Actualizar usuario existente
        $user->firstname = $emp['nombre'];
        $user->lastname  = $emp['apellido'];
        $user->email     = $emp['correo'] ?: $username . '@mail.local';

        // Reactivar si estaba suspendido y vuelve a la API
        if ($user->suspended == 1) {
            $user->suspended = 0;
            echo "🔓 Usuario reactivado: {$emp['nombre']} {$emp['apellido']}\n";
        }

        $DB->update_record('user', $user);
        $userid = $user->id;

        echo "✔ Usuario actualizado: {$emp['nombre']} {$emp['apellido']}\n";
    } else {
        // Crear usuario nuevo
        $newuser = new stdClass();
        $newuser->username  = $username;
        $newuser->firstname = $emp['nombre'];
        $newuser->lastname  = $emp['apellido'];
        $newuser->email     = $emp['correo'] ?: $username . '@mail.local';
        $newuser->password  = hash_internal_user_password($username); // contraseña = username
        $newuser->auth      = 'manual';
        $newuser->confirmed = 1;
        $newuser->suspended = 0; // activo desde el inicio

        $userid = $DB->insert_record('user', $newuser);

        echo "➕ Usuario creado: {$emp['nombre']} {$emp['apellido']}\n";
    }

    // ========================
    // Guardar campos personalizados
    // ========================
    set_custom_profile_field($userid, 'profile_field_ingreso',  $emp['ingreso']);
    set_custom_profile_field($userid, 'profile_field_baja',     $emp['baja']);
    set_custom_profile_field($userid, 'profile_field_sector',   $emp['sector']);
    set_custom_profile_field($userid, 'profile_field_puesto',   $emp['puesto']);
    // NUEVO: empresa
    set_custom_profile_field($userid, 'profile_field_empresa',  $emp['empresa']);
}

// ==========================================
// 4. SUSPENDER USUARIOS QUE YA NO ESTÁN EN LA API
//   (sin tocar a usuarios administradores)
// ==========================================
list($notinsql, $params) = $DB->get_in_or_equal($apiusernames, SQL_PARAMS_QM, 'param', false);
$users_to_suspend = $DB->get_records_select(
    'user',
    "username $notinsql AND deleted = 0 AND id <> 1",
    $params
);

foreach ($users_to_suspend as $u) {
    $isadmin = is_siteadmin($u); // <- NO suspender admins
    if ($u->suspended != 1 && !$isadmin) {
        $u->suspended = 1;
        $DB->update_record('user', $u);
        echo "⏸ Usuario suspendido: {$u->username}\n";
    } elseif ($isadmin) {
        echo "🔒 Se omite (admin): {$u->username}\n";
    }
}

echo "✅ Sincronización completada. Total empleados procesados: " . count($empleados) . "\n";