Aggiungi "Elimina CSV delle distinte" e allinea le guide alla cartella di installazione

Nuova voce "File → Elimina CSV delle distinte..." (EliminaCsv): elimina
i *.csv al primo livello della cartella di lavoro, che altrimenti si
accumulano uno per distinta importata. Chiede conferma mostrando
l'elenco dei file; gli .xls del gestionale e raw/step non sono toccati.

Guida utente e guida in-app: nuova sezione "Dove finiscono i file"
(DB sempre nella cartella di installazione, CSV/raw/step nella cartella
di lavoro, comandi di pulizia, come aprire la cartella nascosta in
AppData), fase 1 allineata al DB fisso e ad "Apri DB..." solo per la
sessione. Tolta dalla guida utente la sezione di installazione: chi la
legge ha già il programma installato (resta nel README).

Doc aggiornati nello stesso commit: CLAUDE.md, docs/architettura.md,
docs/guida-utente.md, CHANGELOG.md.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
davideandClaude Opus 5.5 committed 2026-09-23 08:39:58 +02:00
1 parent 64ff1d8770
commit 4ae3d0e087
6 files changed
+126 -31

No files matched your search

+45
View File
@@ -25,6 +25,7 @@ public partial class Form1 : Form
private readonly MenuStrip _menu = new();
private readonly ToolStripMenuItem _mnuNuovaEstrazione = new("Nuovo");
private readonly ToolStripMenuItem _mnuPulisci = new("Pulisci raw e step...");
private readonly ToolStripMenuItem _mnuEliminaCsv = new("Elimina CSV delle distinte...");
private readonly ToolStripMenuItem _mnuCambiaCartella = new("Scegli cartella di lavoro...");
// Wizard: una fase alla volta occupa tutta la finestra, si avanza solo quando quella
@@ -150,6 +151,9 @@ public partial class Form1 : Form
_mnuPulisci.Click += (_, _) => PulisciRawEStep();
mnuFile.DropDownItems.Add(_mnuPulisci);
_mnuEliminaCsv.Click += (_, _) => EliminaCsv();
mnuFile.DropDownItems.Add(_mnuEliminaCsv);
var mnuAiuto = new ToolStripMenuItem("Aiuto");
var mnuGuida = new ToolStripMenuItem("Guida") { ShortcutKeys = Keys.F1 };
mnuGuida.Click += (_, _) => new GuidaForm().ShowDialog(this);
@@ -770,6 +774,47 @@ public partial class Form1 : Form
"Pulisci raw e step", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/// <summary>Elimina i CSV generati dall'import delle distinte (fase 2), che altrimenti si
/// accumulano uno per distinta nella cartella di lavoro. Solo i *.csv direttamente nella
/// cartella di lavoro, non in sottocartelle; i file originali del gestionale (.xls) restano.</summary>
private void EliminaCsv()
{
string radice = _cartellaLavoro!;
var files = Directory.Exists(radice) ? Directory.GetFiles(radice, "*.csv") : [];
if (files.Length == 0)
{
MessageBox.Show(this, $"Nessun file CSV trovato in {radice}.",
"Elimina CSV", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
var nomi = files.Select(Path.GetFileName).Take(15).ToList();
if (files.Length > nomi.Count)
nomi.Add($"... e altri {files.Length - nomi.Count}");
var conferma = MessageBox.Show(this,
$"Eliminare {files.Length} file CSV da {radice}?\n\n{string.Join("\n", nomi)}\n\nL'operazione non è reversibile.",
"Elimina CSV", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (conferma != DialogResult.Yes)
return;
int eliminati = 0;
foreach (var file in files)
{
try
{
File.Delete(file);
eliminati++;
}
catch (Exception ex) when (ex is IOException or UnauthorizedAccessException)
{
// ponytail: file in uso (es. aperto in Excel) -> si salta, non blocca gli altri
}
}
MessageBox.Show(this, $"{eliminati} file CSV eliminati da {radice}.",
"Elimina CSV", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/// <summary>Tutti i codici prt/asm noti all'indice, con i relativi percorsi (ultima
/// versione, un solo file per tipo - stesso criterio di dedup per data_modifica DESC
/// usato ovunque in questa classe). Caricato in un'unica query invece che una per