Restructuration majeure du projet: migration de flutt vers app, ajout de l'API et mise à jour du site web

This commit is contained in:
d6soft
2025-05-16 09:19:03 +02:00
parent b5aafc424b
commit 5c2620de30
391 changed files with 19780 additions and 7233 deletions

View File

@@ -0,0 +1,147 @@
<?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";
?>