You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.4 KiB
Python
113 lines
3.4 KiB
Python
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
|