Publier Globinours 1.0.0-rc.3

This commit is contained in:
Alexandre NOEL 2026-09-03 12:39:15 +02:00
commit 9a2b4068da
325 changed files with 38230 additions and 20 deletions

90
scripts/asm3-analyze.php Normal file
View file

@ -0,0 +1,90 @@
#!/usr/bin/env php
<?php
declare(strict_types=1);
require dirname(__DIR__) . '/app/Services/Asm3Analyzer.php';
$args = array_values(array_slice($argv, 1));
$json = false;
$output = null;
$source = null;
for ($i = 0; $i < count($args); $i++) {
if ($args[$i] === '--json') {
$json = true;
continue;
}
if ($args[$i] === '--output') {
$output = $args[++$i] ?? null;
continue;
}
if (str_starts_with($args[$i], '--')) {
fwrite(STDERR, "Option inconnue : {$args[$i]}\n");
exit(2);
}
$source = $args[$i];
}
if (!$source) {
fwrite(STDERR, "Usage : php scripts/asm3-analyze.php <dump.sql> [--json] [--output rapport.md]\n");
exit(2);
}
try {
$report = Asm3Analyzer::analyze($source);
} catch (Throwable $e) {
fwrite(STDERR, "Erreur : {$e->getMessage()}\n");
exit(1);
}
if ($json) {
$content = json_encode($report, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n";
} else {
$a = $report['animals'];
$content = "# Rapport de migration ASM3 → Globinours\n\n";
$content .=
"Analyse en lecture seule de `{$report['source']}` (" .
number_format($report['size_bytes'] / 1048576, 2, ',', ' ') .
" Mio). Aucune donnée Globinours na été modifiée.\n\n";
$content .= "## Synthèse animale\n\n| Indicateur | Nombre |\n|---|---:|\n";
$content .= '| Total des animaux | ' . ($a['active'] + $a['archived']) . " |\n";
foreach (
[
'Dossiers actifs dans ASM3' => 'active',
'Dossiers archivés dans ASM3' => 'archived',
'Déclarés adoptables' => 'adoptable',
'Non adoptables' => 'not_adoptable',
'Décédés' => 'deceased',
'Pucés' => 'microchip',
'Tatoués' => 'tattoo',
'Stérilisés' => 'neutered',
'Sans nom' => 'missing_name',
'Sans naissance' => 'missing_birth_date',
]
as $label => $key
) {
$content .= "| {$label} | {$a[$key]} |\n";
}
$content .=
"\n## Périmètre de migration\n\n| Domaine ASM3 | Table | Lignes | Cible Globinours | État |\n|---|---|---:|---|---|\n";
foreach ($report['domains'] as $d) {
$state =
['ready' => 'Prêt à mapper', 'planned' => 'À implémenter', 'review' => 'À étudier'][$d['status']] ??
$d['status'];
$content .= "| {$d['label']} | `{$d['table']}` | {$d['rows']} | `{$d['target']}` | {$state} |\n";
}
$content .=
"\n## Alertes\n\n" .
($report['warnings']
? implode("\n", array_map(static fn($w) => '- ' . $w, $report['warnings']))
: '- Aucune anomalie bloquante détectée.') .
"\n";
$content .= "\n## Tables non encore mappées\n\n";
foreach (array_slice($report['unmapped_tables'], 0, 30, true) as $table => $count) {
$content .= "- `{$table}` : {$count} ligne(s)\n";
}
}
if ($output) {
if (file_put_contents($output, $content) === false) {
fwrite(STDERR, "Impossible décrire {$output}\n");
exit(1);
}
fwrite(STDOUT, "Rapport écrit dans {$output}\n");
} else {
fwrite(STDOUT, $content);
}