ldapsaisie/resources/supann/convert_supann_population_from_csv.php

170 lines
6.1 KiB
PHP
Raw Permalink Normal View History

<?php
/*******************************************************************************
* Copyright (C) 2021 Easter-eggs
* https://ldapsaisie.org
*
* Script de convertion d'un export CSV des catégories de populations fournies
* par SUPANN au format XLSX vers un fichier PHP utilisé comme source d'infor-
* mations par LdapSaisie.
*
* Le fichier des catégories de populations fourni par SUPANN est récupérable à
* l'adressse suivante :
*
* https://services.renater.fr/documentation/supann/supann2020/recommandations2020/tables_references/population
*
* Un exemple de fichier CSV a été stocké avec ce script pour afin d'avoir un
* modèle, en plus du fichier XLSX d'origine.
*
* Author: See AUTHORS file in top-level directory.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/
/*
*/
require(realpath(dirname($argv['0']))."/convert_common.php");
$csv_file = realpath(dirname(__FILE__)).'/supann_population.csv';
$output = null;
if (count($argv) >= 2)
$csv_file = $argv[1];
if (count($argv) >= 3)
$output = $argv[2];
if (!is_file($csv_file))
die("CSV file '$csv_file' not found.\n");
if ($output) {
if(is_file($output)) die("Output file '$output' already exists.\n");
}
else
echo "No output file specified: export on STDOUT\n";
$rows = load_csv_file($csv_file);
$affectations_mapping = array(
'Stu' => 'student',
'Fac' => 'faculty',
'Emp' => 'employee',
'Aff' => 'affiliate',
'Alum' => 'alum',
'Res' => 'researcher',
'Ret' => 'retired',
'Eme' => 'emeritus',
'Mem' => 'member',
'Staff' => 'staff',
'Tea' => 'teacher',
'RR' => 'registered-reader',
'LWI' => 'librery-walk-in',
);
echo "Handle CVS file rows... ";
$populations = array();
$population_found = 0;
foreach($rows as $row) {
if (!$row['ID1'] || !$row['Libellé']) continue;
$ID1 = trim($row['ID1']);
$ID2 = trim($row['ID2']);
$ID3 = trim($row['ID3']);
$ID4 = trim($row['ID4']);
$ID5 = trim($row['ID5']);
$infos = array(
'label' => $row['Libellé'],
'affiliations' => array(),
'definition' => $row['Définition'],
'poids' => ($row['Poids']?intval($row['Poids']):null),
);
if ($infos['label'])
$population_found++;
foreach ($affectations_mapping as $key => $aff)
if ($row[$key])
$infos['affiliations'][] = $aff;
if (!array_key_exists($ID1, $populations))
$populations[$ID1] = array('subpopulations' => array());
if ($ID2) {
if (!array_key_exists($ID2, $populations[$ID1]['subpopulations']))
$populations[$ID1]['subpopulations'][$ID2] = array('subpopulations' => array());
if ($ID3) {
if (!array_key_exists($ID3, $populations[$ID1]['subpopulations'][$ID2]['subpopulations']))
$populations[$ID1]['subpopulations'][$ID2]['subpopulations'][$ID3] = array('subpopulations' => array());
if ($ID4) {
if (!array_key_exists($ID4, $populations[$ID1]['subpopulations'][$ID2]['subpopulations'][$ID3]['subpopulations']))
$populations[$ID1]['subpopulations'][$ID2]['subpopulations'][$ID3]['subpopulations'][$ID4] = array('subpopulations' => array());
if ($ID5) {
// Pas de sous-niveaux: on ajoute la clé subpopulations pour l'uniformité
$infos['subpopulations'] = array();
if (array_key_exists($ID5, $populations[$ID1]['subpopulations'][$ID2]['subpopulations'][$ID3]['subpopulations'][$ID4]['subpopulations']))
echo "WARNING: Duplicate key $ID1$ID2$ID3$ID4$ID5: ".print_r($populations[$ID1]['subpopulations'][$ID2]['subpopulations'][$ID3]['subpopulations'][$ID4]['subpopulations'][$ID5], 1). " / ".print_r($infos, 1)."\n\n";
$populations[$ID1]['subpopulations'][$ID2]['subpopulations'][$ID3]['subpopulations'][$ID4]['subpopulations'][$ID5] = $infos;
}
else {
$populations[$ID1]['subpopulations'][$ID2]['subpopulations'][$ID3]['subpopulations'][$ID4] = array_merge(
$populations[$ID1]['subpopulations'][$ID2]['subpopulations'][$ID3]['subpopulations'][$ID4],
$infos
);
}
}
else {
$populations[$ID1]['subpopulations'][$ID2]['subpopulations'][$ID3] = array_merge(
$populations[$ID1]['subpopulations'][$ID2]['subpopulations'][$ID3],
$infos
);
}
}
else {
$populations[$ID1]['subpopulations'][$ID2] = array_merge(
$populations[$ID1]['subpopulations'][$row['ID2']],
$infos
);
}
}
else {
$populations[$ID1] = array_merge($populations[$ID1], $infos);
}
}
echo "done.\n$population_found population(s) found.\n";
if ($output) {
$ofd = fopen($output, 'w') or die("Fail to open output file '$output'.\n");
}
else {
$ofd = STDOUT;
}
$stats = stat($csv_file);
fwrite($ofd, "<?php
/*
*******************************************************************************************************************
* Ce fichier a été généré le ".date('Y-m-d à H:i:s')." en utilisant le script ".basename($argv[0]).".
* Son contenu est basé sur un export CSV des catégories de populations fournies par SUPANN au format XLSX
* et datant du ".date('Y-m-d à H:i:s', $stats['mtime']).".
*
* Note : Le script ".basename($argv[0])." est fourni avec les sources du projet LdapSaisie dans
* le dossier resources/supann.
*******************************************************************************************************************
*/
\$GLOBALS['supannPopulations'] = ");
fwrite($ofd, var_export($populations, true).';');
if ($output) {
fclose($ofd);
echo "Populations exported in '$output' file.\n";
}