|
|
@@ -3,9 +3,14 @@ from pathlib import Path
|
|
|
|
|
|
import typer
|
|
|
|
|
|
+from archive_logs import run as run_archive_logs
|
|
|
from clients import run
|
|
|
+from files import run as run_files
|
|
|
+from move_files import default_desktop, move_files
|
|
|
+from summary import run as run_summary
|
|
|
|
|
|
app = typer.Typer(help="PC-Visit Filetracker")
|
|
|
+DATA_DIRECTORY = Path("data")
|
|
|
|
|
|
|
|
|
def default_session_history() -> Path:
|
|
|
@@ -23,7 +28,7 @@ def app_callback(context: typer.Context) -> None:
|
|
|
@app.command()
|
|
|
def clients(
|
|
|
directory: Path | None = typer.Argument(None, help="Verzeichnis mit XML-Dateien"),
|
|
|
- output: Path = typer.Option(Path("clients.csv"), "--output", "-o", help="Zielpfad der CSV-Datei"),
|
|
|
+ output: Path = typer.Option(DATA_DIRECTORY / "clients.csv", "--output", "-o", help="Zielpfad der CSV-Datei"),
|
|
|
) -> None:
|
|
|
"""Importiert Client-Daten aus Session-XML-Dateien."""
|
|
|
directory = directory or default_session_history()
|
|
|
@@ -34,5 +39,71 @@ def clients(
|
|
|
typer.echo(f"{xml_count} XML-Dateien gelesen, {row_count} Einträge nach {output} geschrieben.")
|
|
|
|
|
|
|
|
|
+@app.command()
|
|
|
+def files(
|
|
|
+ directory: Path | None = typer.Argument(None, help="Verzeichnis mit XML-Dateien"),
|
|
|
+ output: Path = typer.Option(DATA_DIRECTORY / "files.csv", "--output", "-o", help="Zielpfad der CSV-Datei"),
|
|
|
+ ignore_timestamp: bool = typer.Option(
|
|
|
+ False,
|
|
|
+ "--ignore-timestamp",
|
|
|
+ help="Ignoriert den Abgleich des Erstellungsdatums mit der Session.",
|
|
|
+ ),
|
|
|
+) -> None:
|
|
|
+ """Importiert vorhandene Dateien aus ReceivedFile-Elementen."""
|
|
|
+ directory = directory or default_session_history()
|
|
|
+ try:
|
|
|
+ xml_count, row_count = run_files(directory, output, ignore_timestamp=ignore_timestamp)
|
|
|
+ except ValueError as error:
|
|
|
+ raise typer.BadParameter(str(error), param_hint="directory") from error
|
|
|
+ typer.echo(f"{xml_count} XML-Dateien gelesen, {row_count} vorhandene Dateien nach {output} geschrieben.")
|
|
|
+
|
|
|
+
|
|
|
+@app.command("move-files")
|
|
|
+def move_files_command(
|
|
|
+ files_csv: Path = typer.Option(
|
|
|
+ DATA_DIRECTORY / "files.csv", "--files-csv", help="CSV-Datei mit den gefundenen Dateien"
|
|
|
+ ),
|
|
|
+ clients_csv: Path = typer.Option(DATA_DIRECTORY / "clients.csv", "--clients-csv", help="CSV-Datei mit den Kunden"),
|
|
|
+ desktop: Path | None = typer.Option(None, "--desktop", help="Desktop-Verzeichnis als Zielbasis"),
|
|
|
+) -> None:
|
|
|
+ """Verschiebt gefundene Dateien in Desktop/PC-Visit/Kunde."""
|
|
|
+ try:
|
|
|
+ moved_count, skipped_count, missing_client_count = move_files(
|
|
|
+ files_csv, clients_csv, desktop or default_desktop()
|
|
|
+ )
|
|
|
+ except ValueError as error:
|
|
|
+ raise typer.BadParameter(str(error)) from error
|
|
|
+ typer.echo(
|
|
|
+ f"{moved_count} Dateien verschoben, {skipped_count} übersprungen, " f"{missing_client_count} ohne Kunde."
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
+@app.command("archive-logs")
|
|
|
+def archive_logs(
|
|
|
+ directory: Path | None = typer.Argument(None, help="Verzeichnis mit XML-Dateien"),
|
|
|
+) -> None:
|
|
|
+ """Archiviert Session-XML-Dateien nach Jahr."""
|
|
|
+ directory = directory or default_session_history()
|
|
|
+ try:
|
|
|
+ checked_count, archived_count, skipped_count = run_archive_logs(directory)
|
|
|
+ except ValueError as error:
|
|
|
+ raise typer.BadParameter(str(error), param_hint="directory") from error
|
|
|
+ typer.echo(f"{checked_count} XML-Dateien geprüft, {archived_count} archiviert, " f"{skipped_count} übersprungen.")
|
|
|
+
|
|
|
+
|
|
|
+@app.command()
|
|
|
+def summary(
|
|
|
+ directory: Path | None = typer.Argument(None, help="Verzeichnis mit XML-Dateien"),
|
|
|
+ output: Path = typer.Option(DATA_DIRECTORY / "summary.csv", "--output", "-o", help="Zielpfad der CSV-Datei"),
|
|
|
+) -> None:
|
|
|
+ """Erstellt eine Sitzungs- und Dauersumme pro Kunde."""
|
|
|
+ directory = directory or default_session_history()
|
|
|
+ try:
|
|
|
+ xml_count, customer_count = run_summary(directory, output)
|
|
|
+ except ValueError as error:
|
|
|
+ raise typer.BadParameter(str(error), param_hint="directory") from error
|
|
|
+ typer.echo(f"{xml_count} XML-Dateien geprüft, {customer_count} Kunden nach {output} geschrieben.")
|
|
|
+
|
|
|
+
|
|
|
if __name__ == "__main__":
|
|
|
app()
|