input validierung für Qualifikationsfeld. Wenn keine Daten -> Platzhalter im template löschen

This commit is contained in:
Rob committed 2026-06-23 11:49:54 +02:00
1 parent ef219e00ba
commit e50f423304
2 files changed
+56 -1

No files matched your search

+13 -1
View File
@@ -22,7 +22,7 @@ from src.config import (
get_available_templates, get_available_templates,
) )
from src.parser import parse_input_file, group_by_employee, get_unique_employees from src.parser import parse_input_file, group_by_employee, get_unique_employees
from src.validator import validate_template from src.validator import validate_input_file, validate_template
from src.writer import generate_activity_reports from src.writer import generate_activity_reports
@@ -70,6 +70,18 @@ def main():
total = tpl_result.info.get("total_fields", "?") total = tpl_result.info.get("total_fields", "?")
print(f"[OK] {found}/{total} Platzhalter im Template gefunden.") print(f"[OK] {found}/{total} Platzhalter im Template gefunden.")
# ── Input validieren ──────────────────────────────────────────────
print()
print("[INFO] Validiere Input-Datei…")
inp_result = validate_input_file(input_path, config.input_schema, config.month_sheet_pattern)
if not inp_result.is_valid:
for err in inp_result.errors:
print(f"[FEHLER] {err}")
return 1
if inp_result.warnings:
for warn in inp_result.warnings:
print(f"[WARN] {warn}")
# ── Input parsen ────────────────────────────────────────────────── # ── Input parsen ──────────────────────────────────────────────────
print() print()
print("[INFO] Parse Input-Datei…") print("[INFO] Parse Input-Datei…")
+43
View File
@@ -81,6 +81,49 @@ def validate_input_file(
info["sheets_with_data"] = sheets_with_data info["sheets_with_data"] = sheets_with_data
wb.close() wb.close()
# ── Dateninhalts-Prüfung: leere Pflichtfelder ───────────────────
required_fields = [f for f in schema if f.required]
if required_fields and sheets_with_data > 0:
# Mapping field_name → column index
field_col_map: dict[str, int] = {}
for f in required_fields:
field_col_map[f.field_name] = column_index_from_string(f.column) - 1
max_col = max(field_col_map.values()) + 1
# {field_name: {name1, name2, ...}} für leere Pflichtwerte
empty_by_field: dict[str, set[str]] = {f.field_name: set() for f in required_fields}
wb2 = load_workbook(filepath, data_only=True)
for sheet_name in wb2.sheetnames:
if not is_month_sheet(sheet_name, month_sheet_pattern):
continue
ws = wb2[sheet_name]
if ws.max_row < 2:
continue
for row in ws.iter_rows(min_row=2, max_row=ws.max_row, min_col=1, max_col=max_col, values_only=True):
name_val = str(row[field_col_map.get("Name", 0)] or "").strip() if len(row) > field_col_map.get("Name", 0) else ""
if not name_val:
continue
for f in required_fields:
col_idx = field_col_map[f.field_name]
if col_idx < len(row):
cell_val = str(row[col_idx] or "").strip() if row[col_idx] is not None else ""
if not cell_val:
empty_by_field[f.field_name].add(name_val)
wb2.close()
for field_name, names in empty_by_field.items():
if names:
sorted_names = sorted(names)
total = len(sorted_names)
preview = sorted_names[:5]
suffix = " …" if total > 5 else ""
warnings.append(
f"Feld '{field_name}' ist leer bei {total} Person(en): "
f"{', '.join(preview)}{suffix}"
)
# ──────────────────────────────────────────────────────────────────
if sheets_with_data == 0: if sheets_with_data == 0:
errors.append("Kein Sheet mit den erwarteten Spalten gefunden.") errors.append("Kein Sheet mit den erwarteten Spalten gefunden.")