diff --git a/pyproject.toml b/pyproject.toml index 02e436f..14d4dd7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "fuj-management" -version = "0.05" +version = "0.06" description = "Management tools for FUJ (Frisbee Ultimate Jablonec)" dependencies = [ "flask>=3.1.3", diff --git a/scripts/attendance.py b/scripts/attendance.py index cc46c2b..df0e5f9 100644 --- a/scripts/attendance.py +++ b/scripts/attendance.py @@ -58,14 +58,31 @@ def calculate_fee(attendance_count: int) -> int: def get_members(rows: list[list[str]]) -> list[tuple[str, str, list[str]]]: - """Parse member rows. Returns list of (name, tier, row).""" + """Parse member rows. Returns list of (name, tier, row). + + Stopped at row where first column contains '# last line'. + Skips rows starting with '#'. + """ members = [] for row in rows[1:]: - name = row[COL_NAME].strip() if len(row) > COL_NAME else "" - if not name or name.lower() in ("jméno", "name", "jmeno"): + if not row or len(row) <= COL_NAME: continue + + first_col = row[COL_NAME].strip() + + # Terminator for rows to process + if "# last line" in first_col.lower(): + break + + # Ignore comments + if first_col.startswith("#"): + continue + + if not first_col or first_col.lower() in ("jméno", "name", "jmeno"): + continue + tier = row[COL_TIER].strip().upper() if len(row) > COL_TIER else "" - members.append((name, tier, row)) + members.append((first_col, tier, row)) return members diff --git a/scripts/match_payments.py b/scripts/match_payments.py index 0d37dcf..e7fba02 100644 --- a/scripts/match_payments.py +++ b/scripts/match_payments.py @@ -159,6 +159,27 @@ def infer_transaction_details(tx: dict, member_names: list[str]) -> dict: } +def format_date(val) -> str: + """Normalize date from Google Sheet (handles serial numbers and strings).""" + if val is None or val == "": + return "" + + # Handle Google Sheets serial dates (number of days since 1899-12-30) + if isinstance(val, (int, float)): + base_date = datetime(1899, 12, 30) + dt = base_date + timedelta(days=val) + return dt.strftime("%Y-%m-%d") + + val_str = str(val).strip() + if not val_str: + return "" + + # If already YYYY-MM-DD, return as is + if len(val_str) == 10 and val_str[4] == "-" and val_str[7] == "-": + return val_str + + return val_str + def fetch_sheet_data(spreadsheet_id: str, credentials_path: str) -> list[dict]: """Fetch all rows from the Google Sheet and convert to a list of dicts.""" service = get_sheets_service(credentials_path) @@ -197,7 +218,7 @@ def fetch_sheet_data(spreadsheet_id: str, credentials_path: str) -> list[dict]: return row[idx] if idx != -1 and idx < len(row) else "" tx = { - "date": get_val(idx_date), + "date": format_date(get_val(idx_date)), "amount": get_val(idx_amount), "manual_fix": get_val(idx_manual), "person": get_val(idx_person), diff --git a/uv.lock b/uv.lock index 2814ab4..f019006 100644 --- a/uv.lock +++ b/uv.lock @@ -199,7 +199,7 @@ wheels = [ [[package]] name = "fuj-management" -version = "0.2" +version = "0.5" source = { virtual = "." } dependencies = [ { name = "flask" },