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.
169 lines
4.5 KiB
Python
169 lines
4.5 KiB
Python
from typing import Annotated, List, Optional
|
|
from uuid import UUID
|
|
|
|
from fastapi import APIRouter, HTTPException, Query, status
|
|
|
|
from src.auth.service import CurrentUser
|
|
from src.database.core import DbSession
|
|
from src.database.service import CommonParameters
|
|
from src.models import StandardResponse
|
|
|
|
from .schema import (
|
|
PlantFSTransactionDataCreate,
|
|
PlantFSTransactionDataImport,
|
|
PlantFSTransactionDataPagination,
|
|
|
|
PlantFSTransactionDataRead,
|
|
PlantFSTransactionDataUpdate,
|
|
PlantFSChartData,
|
|
ListQueryParams,
|
|
)
|
|
from .service import create, delete, get, get_all, update, update_fs_charts_from_matrix, get_charts
|
|
|
|
from typing import List
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("", response_model=StandardResponse[PlantFSTransactionDataPagination])
|
|
async def list_fs_transactions(
|
|
db_session: DbSession,
|
|
common: CommonParameters,
|
|
params: Annotated[ListQueryParams, Query()],
|
|
):
|
|
"""Return paginated financial statement transaction data."""
|
|
|
|
records = await get_all(
|
|
db_session=db_session,
|
|
items_per_page=params.items_per_page,
|
|
search=params.search,
|
|
common=common,
|
|
)
|
|
|
|
return StandardResponse(
|
|
data=records,
|
|
message="Data retrieved successfully",
|
|
)
|
|
|
|
|
|
@router.post(
|
|
"/import/charts",
|
|
response_model=StandardResponse[List[PlantFSTransactionDataRead]],
|
|
)
|
|
async def import_fs_charts(
|
|
db_session: DbSession,
|
|
payload: PlantFSTransactionDataImport,
|
|
current_user: CurrentUser,
|
|
):
|
|
updated, missing = await update_fs_charts_from_matrix(
|
|
db_session=db_session,
|
|
payload=payload,
|
|
updated_by=current_user.user_id if current_user else None,
|
|
)
|
|
|
|
msg = "Data imported successfully."
|
|
if missing:
|
|
msg += f" Note: Years {missing} were not found."
|
|
|
|
return StandardResponse(data=updated, message=msg)
|
|
|
|
|
|
@router.get("/charts", response_model=StandardResponse[PlantFSChartData])
|
|
async def get_chart_data(db_session: DbSession, common: CommonParameters):
|
|
chart_data, bep_year, bep_total_lcc = await get_charts(
|
|
db_session=db_session, common=common
|
|
)
|
|
if not chart_data:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail="No chart data found.",
|
|
)
|
|
return StandardResponse(
|
|
data={
|
|
"items": chart_data,
|
|
"bep_year": bep_year,
|
|
"bep_total_lcc": bep_total_lcc,
|
|
},
|
|
message="Data retrieved successfully",
|
|
)
|
|
|
|
|
|
@router.get(
|
|
"/{fs_transaction_id}",
|
|
response_model=StandardResponse[PlantFSTransactionDataRead],
|
|
)
|
|
async def retrieve_fs_transaction(
|
|
db_session: DbSession,
|
|
fs_transaction_id: UUID,
|
|
):
|
|
record = await get(db_session=db_session, fs_transaction_id=str(fs_transaction_id))
|
|
if not record:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail="A data with this id does not exist.",
|
|
)
|
|
|
|
return StandardResponse(data=record, message="Data retrieved successfully")
|
|
|
|
|
|
@router.post("", response_model=StandardResponse[PlantFSTransactionDataRead])
|
|
async def create_fs_transaction(
|
|
db_session: DbSession,
|
|
payload: PlantFSTransactionDataCreate,
|
|
current_user: CurrentUser,
|
|
):
|
|
record = await create(
|
|
db_session=db_session,
|
|
fs_transaction_in=payload,
|
|
current_user=current_user,
|
|
)
|
|
|
|
return StandardResponse(data=record, message="Data created successfully")
|
|
|
|
|
|
@router.post(
|
|
"/update/{fs_transaction_id}",
|
|
response_model=StandardResponse[PlantFSTransactionDataRead],
|
|
)
|
|
async def update_fs_transaction(
|
|
db_session: DbSession,
|
|
fs_transaction_id: UUID,
|
|
payload: PlantFSTransactionDataUpdate,
|
|
current_user: CurrentUser,
|
|
):
|
|
record = await get(db_session=db_session, fs_transaction_id=str(fs_transaction_id))
|
|
if not record:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail="A data with this id does not exist.",
|
|
)
|
|
|
|
updated = await update(
|
|
db_session=db_session,
|
|
fs_transaction=record,
|
|
fs_transaction_in=payload,
|
|
current_user=current_user,
|
|
)
|
|
|
|
return StandardResponse(data=updated, message="Data updated successfully")
|
|
|
|
|
|
@router.post(
|
|
"/delete/{fs_transaction_id}",
|
|
response_model=StandardResponse[PlantFSTransactionDataRead],
|
|
)
|
|
async def delete_fs_transaction(
|
|
db_session: DbSession,
|
|
fs_transaction_id: UUID,
|
|
):
|
|
record = await get(db_session=db_session, fs_transaction_id=str(fs_transaction_id))
|
|
if not record:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail=[{"msg": "A data with this id does not exist."}],
|
|
)
|
|
|
|
await delete(db_session=db_session, fs_transaction_id=str(fs_transaction_id))
|
|
|
|
return StandardResponse(data=record, message="Data deleted successfully")
|