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/script.php
<?php
// ================================
// Configuración
// ================================
$apiUrl = "http://192.168.10.96/rrhh/api_empleados/api/empleado.php";
$moodleUrl = "https://demo.sumar.com.py";
$token = "c8a53a72b6ec32ecf838872489acf998";

// ================================
// Función para llamar a la API de empleados
// ================================
function getEmployeesFromAPI($url) {
    $response = file_get_contents($url);
    if ($response === FALSE) {
        die("❌ Error al conectar con la API de empleados.");
    }
    $data = json_decode($response, true);
    return $data["data"] ?? [];
}

// ================================
// Función para llamar al API REST de Moodle
// ================================
function callMoodleAPI($function, $params, $moodleUrl, $token) {
    $url = $moodleUrl . "/webservice/rest/server.php?wstoken=" . $token .
           "&moodlewsrestformat=json&wsfunction=" . $function;

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    $response = curl_exec($ch);

    if ($response === FALSE) {
        die("❌ Error al conectar con Moodle: " . curl_error($ch));
    }
    curl_close($ch);

    return json_decode($response, true);
}

// ================================
// Obtener empleados de la API
// ================================
$empleados = getEmployeesFromAPI($apiUrl);

// Obtener usuarios existentes de Moodle
$moodleUsers = callMoodleAPI("core_user_get_users", [
    "criteria[0][key]" => "email",
    "criteria[0][value]" => "@"
], $moodleUrl, $token);

$moodleUsers = $moodleUsers["users"] ?? [];
$moodleUsersMap = [];
foreach ($moodleUsers as $u) {
    $moodleUsersMap[$u["username"]] = $u;
}

// ================================
// Procesar empleados
// ================================
foreach ($empleados as $emp) {
    $username = $emp["cedula"];
    $email = $emp["correo"] ?: strtolower($emp["cedula"])."@demo.com";

    // Datos obligatorios
    $userdata = [
        "username"  => $username,
        "firstname" => $emp["nombre"],
        "lastname"  => $emp["apellido"],
        "email"     => $email,
        "auth"      => "manual",
        "idnumber"  => $emp["cedula"],
    ];

    // Campos personalizados
    $userdata["customfields"] = [
        ["type" => "ingreso", "value" => $emp["ingreso"] ?? ""],
        ["type" => "baja", "value" => $emp["baja"] ?? ""],
        ["type" => "sector", "value" => $emp["sector"] ?? ""],
        ["type" => "puesto", "value" => $emp["puesto"] ?? ""],
        ["type" => "malla", "value" => $emp["malla"] ?? ""],
    ];

    if (!isset($moodleUsersMap[$username])) {
        // Crear usuario nuevo
        echo "➕ Creando usuario: {$username}\n";
        $params = ["users" => [$userdata]];
        $resp = callMoodleAPI("core_user_create_users", $params, $moodleUrl, $token);
    } else {
        // Actualizar usuario existente
        echo "🔄 Actualizando usuario: {$username}\n";
        $userdata["id"] = $moodleUsersMap[$username]["id"];
        $params = ["users" => [$userdata]];
        $resp = callMoodleAPI("core_user_update_users", $params, $moodleUrl, $token);
    }
}

// ================================
// Suspender usuarios que no estén en la API
// ================================
$apiUsernames = array_column($empleados, "cedula");
foreach ($moodleUsersMap as $username => $user) {
    if (!in_array($username, $apiUsernames)) {
        echo "⏸ Suspendiendo usuario: {$username}\n";
        $params = ["users" => [["id" => $user["id"], "suspended" => 1]]];
        $resp = callMoodleAPI("core_user_update_users", $params, $moodleUrl, $token);
    }
}

echo "✅ Sincronización finalizada.\n";