147 lines
5.0 KiB
PHP
Executable File
147 lines
5.0 KiB
PHP
Executable File
<?php
|
|
// Script de conversion CSV Google Agenda vers format GitLab pour importation de tickets
|
|
// Usage: php convert-google-calendar-to-gitlab.php planninggeo2025googleagenda.csv gitlab-issues.csv
|
|
|
|
// Vérifier les arguments
|
|
if ($argc < 3) {
|
|
echo "Usage: php convert-google-calendar-to-gitlab.php [fichier_source] [fichier_destination]\n";
|
|
exit(1);
|
|
}
|
|
|
|
$source_file = $argv[1];
|
|
$dest_file = $argv[2];
|
|
|
|
// Vérifier l'existence du fichier source
|
|
if (!file_exists($source_file)) {
|
|
echo "Erreur: Le fichier source '{$source_file}' n'existe pas.\n";
|
|
exit(1);
|
|
}
|
|
|
|
// Ouvrir le fichier source
|
|
$input = fopen($source_file, 'r');
|
|
if ($input === false) {
|
|
echo "Erreur: Impossible d'ouvrir le fichier source '{$source_file}'.\n";
|
|
exit(1);
|
|
}
|
|
|
|
// Créer le fichier de destination
|
|
$output = fopen($dest_file, 'w');
|
|
if ($output === false) {
|
|
echo "Erreur: Impossible de créer le fichier destination '{$dest_file}'.\n";
|
|
fclose($input);
|
|
exit(1);
|
|
}
|
|
|
|
// Lire l'en-tête pour identifier les colonnes
|
|
$header = fgetcsv($input);
|
|
|
|
// Vérifier que l'en-tête contient les colonnes attendues
|
|
$required_columns = ['Subject', 'Start Date', 'End Date', 'Description', 'Location'];
|
|
$missing_columns = [];
|
|
|
|
foreach ($required_columns as $col) {
|
|
if (array_search($col, $header) === false) {
|
|
$missing_columns[] = $col;
|
|
}
|
|
}
|
|
|
|
if (!empty($missing_columns)) {
|
|
echo "Attention: Les colonnes suivantes sont manquantes dans le fichier source: " .
|
|
implode(', ', $missing_columns) . "\n";
|
|
echo "Le script continuera avec les colonnes disponibles.\n";
|
|
}
|
|
|
|
// Trouver les indices des colonnes dans l'en-tête
|
|
$column_indices = [
|
|
'subject' => array_search('Subject', $header),
|
|
'start_date' => array_search('Start Date', $header),
|
|
'start_time' => array_search('Start Time', $header),
|
|
'end_date' => array_search('End Date', $header),
|
|
'end_time' => array_search('End Time', $header),
|
|
'all_day' => array_search('All Day Event', $header),
|
|
'description' => array_search('Description', $header),
|
|
'location' => array_search('Location', $header),
|
|
'private' => array_search('Private', $header)
|
|
];
|
|
|
|
// Écrire l'en-tête GitLab
|
|
fputcsv($output, ['title', 'description', 'labels', 'due_date']);
|
|
|
|
// Compteur d'événements traités
|
|
$event_count = 0;
|
|
|
|
// Traiter chaque ligne du fichier source
|
|
while (($data = fgetcsv($input)) !== false) {
|
|
// S'assurer que la ligne contient au moins un sujet
|
|
if (!isset($data[$column_indices['subject']]) || empty(trim($data[$column_indices['subject']]))) {
|
|
continue; // Ignorer les lignes sans sujet
|
|
}
|
|
|
|
// Extraire les données
|
|
$title = $data[$column_indices['subject']];
|
|
|
|
// Préparer la description
|
|
$description_parts = [];
|
|
|
|
// Ajouter les dates
|
|
$start_date = $column_indices['start_date'] !== false ? $data[$column_indices['start_date']] : '';
|
|
$start_time = $column_indices['start_time'] !== false ? $data[$column_indices['start_time']] : '';
|
|
$end_date = $column_indices['end_date'] !== false ? $data[$column_indices['end_date']] : '';
|
|
$end_time = $column_indices['end_time'] !== false ? $data[$column_indices['end_time']] : '';
|
|
$all_day = $column_indices['all_day'] !== false ? ($data[$column_indices['all_day']] === 'TRUE') : false;
|
|
|
|
// Formater la date et l'heure
|
|
$date_info = "Date: " . $start_date;
|
|
if (!$all_day && !empty($start_time)) {
|
|
$date_info .= " " . $start_time;
|
|
}
|
|
|
|
if (!empty($end_date) && $end_date !== $start_date) {
|
|
$date_info .= " - " . $end_date;
|
|
if (!$all_day && !empty($end_time)) {
|
|
$date_info .= " " . $end_time;
|
|
}
|
|
} elseif (!$all_day && !empty($end_time) && $end_time !== $start_time) {
|
|
$date_info .= " - " . $end_time;
|
|
}
|
|
|
|
$description_parts[] = $date_info;
|
|
|
|
// Ajouter le lieu
|
|
if ($column_indices['location'] !== false && !empty($data[$column_indices['location']])) {
|
|
$description_parts[] = "Lieu: " . $data[$column_indices['location']];
|
|
}
|
|
|
|
// Ajouter la description
|
|
if ($column_indices['description'] !== false && !empty($data[$column_indices['description']])) {
|
|
$description_parts[] = $data[$column_indices['description']];
|
|
}
|
|
|
|
// Joindre toutes les parties de la description
|
|
$description = implode("\n\n", $description_parts);
|
|
|
|
// Définir les étiquettes (labels)
|
|
$labels = "agenda,planning";
|
|
|
|
// Si c'est un événement privé, ajouter l'étiquette "privé"
|
|
if ($column_indices['private'] !== false && $data[$column_indices['private']] === 'TRUE') {
|
|
$labels .= ",privé";
|
|
}
|
|
|
|
// Déterminer la date d'échéance (due_date)
|
|
$due_date = !empty($end_date) ? $end_date : $start_date;
|
|
|
|
// Écrire la ligne dans le fichier de destination
|
|
fputcsv($output, [$title, $description, $labels, $due_date]);
|
|
|
|
$event_count++;
|
|
}
|
|
|
|
// Fermer les fichiers
|
|
fclose($input);
|
|
fclose($output);
|
|
|
|
echo "Conversion terminée avec succès!\n";
|
|
echo "Nombre d'événements convertis: {$event_count}\n";
|
|
echo "Le fichier '{$dest_file}' est prêt à être importé dans GitLab.\n";
|
|
?>
|