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";