from typing import Optional from fastapi import HTTPException, status from sqlalchemy import Delete, Select, func from sqlalchemy.orm import selectinload # from .model import OverhaulSchedule # from .schema import OverhaulScheduleCreate, OverhaulScheduleUpdate from .utils import fetch_all_sections, get_google_creds, get_spreatsheed_service, process_spreadsheet_data # async def get_all(*, common): # """Returns all documents.""" # query = Select(OverhaulSchedule).order_by(OverhaulSchedule.start.desc()) # results = await search_filter_sort_paginate(model=query, **common) # return results # async def create( # *, db_session: DbSession, overhaul_job_in: OverhaulScheduleCreate # ): # schedule = OverhaulSchedule(**overhaul_job_in.model_dump()) # db_session.add(schedule) # await db_session.commit() # return schedule # async def update(*, db_session: DbSession, overhaul_schedule_id: str, overhaul_job_in: OverhaulScheduleUpdate): # """Updates a document.""" # data = overhaul_job_in.model_dump() # overhaul_schedule = await db_session.get(OverhaulSchedule, overhaul_schedule_id) # update_data = overhaul_job_in.model_dump(exclude_defaults=True) # for field in data: # if field in update_data: # setattr(overhaul_schedule, field, update_data[field]) # await db_session.commit() # return overhaul_schedule # async def delete(*, db_session: DbSession, overhaul_schedule_id: str): # """Deletes a document.""" # query = Delete(OverhaulSchedule).where(OverhaulSchedule.id == overhaul_schedule_id) # await db_session.execute(query) # await db_session.commit() async def get_gantt_performance_chart(*, spreadsheet_id = "1gZXuwA97zU1v4QBv56wKeiqadc6skHUucGKYG8qVFRk"): creds = get_google_creds() RANGE_NAME = "'SUMMARY'!I28:AZ32" # Or just "2024 schedule" GANTT_DATA_NAME = "ACTUAL PROGRESS" try: service = get_spreatsheed_service(creds) sheet = service.spreadsheets() response = sheet.values().get( spreadsheetId=spreadsheet_id, range=RANGE_NAME ).execute() values = response.get("values", []) if len(values) < 4: raise Exception("Spreadsheet format invalid: need 4 rows (DAY, DATE, PLAN, ACTUAL).") # Extract rows day_row = values[0][1:] date_row = values[1][1:] plan_row = values[3][1:] actual_row = values[4][1:] total_days = len(day_row) # PAD rows so lengths match day count date_row += [""] * (total_days - len(date_row)) plan_row += [""] * (total_days - len(plan_row)) actual_row += [""] * (total_days - len(actual_row)) results = [] for i in range(total_days): day = day_row[i] date = date_row[i] plan = plan_row[i] actual = actual_row[i] if actual_row[i] else "0%" # <-- FIX HERE results.append({ "day": day, "time": date, "plan": plan, "actual": actual }) except Exception as e: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) processed_data = process_spreadsheet_data(results) gantt_data = fetch_all_sections(service=service, spreadsheet_id=spreadsheet_id, sheet_name=GANTT_DATA_NAME) return processed_data, gantt_data