feat: plant admin data APIs

main
MrWaradana 1 year ago
parent b5919a79df
commit aed6a5cffd

@ -8,6 +8,8 @@ from src.auth.service import JWTBearer
from src.masterdata.router import router as masterdata_router
from src.plant_masterdata.router import router as plant_masterdata
from src.plant_transaction_data.router import router as plant_transaction_data
from src.equipment.router import router as equipment_router
from src.yeardata.router import router as yeardata_router
from src.equipment_master.router import router as equipment_master_router
@ -48,7 +50,16 @@ authenticated_api_router.include_router(
)
authenticated_api_router.include_router(
equipment_router, prefix="/equipment", tags=["equipment"]
plant_masterdata, prefix="/plant-masterdata", tags=["plant_masterdata"]
)
authenticated_api_router.include_router(
plant_transaction_data,
prefix="/plant-transaction-data",
tags=["plant_transaction_data"],
)
authenticated_api_router.include_router(
equipment_router, prefix="/equipment", tags=["equipment"]
)
authenticated_api_router.include_router(

@ -0,0 +1,37 @@
from sqlalchemy import Column, Float, String, UUID
from src.database.core import Base
from src.models import DefaultMixin, IdentityMixin
class PlantMasterData(Base, DefaultMixin, IdentityMixin):
__tablename__ = "lcc_plant_ms_data"
id = Column(UUID(as_uuid=True), primary_key=True, index=True)
discount_rate = Column(Float, nullable=True)
total_project_cost = Column(Float, nullable=True)
umur_teknis = Column(Float, nullable=True)
interest_rate = Column(Float, nullable=True)
loan_portion = Column(Float, nullable=True)
equity_portion = Column(Float, nullable=True)
loan = Column(Float, nullable=True)
loan_tenor = Column(Float, nullable=True)
principal_interest_payment = Column(Float, nullable=True)
corporate_tax_rate = Column(Float, nullable=True)
wacc_on_project = Column(Float, nullable=True)
wacc_on_equity = Column(Float, nullable=True)
equity = Column(Float, nullable=True)
daya_mampu_netto = Column(Float, nullable=True)
auxiliary = Column(Float, nullable=True)
susut_trafo = Column(Float, nullable=True)
sfc = Column(Float, nullable=True)
electricity_price_a = Column(Float, nullable=True)
electricity_price_b = Column(Float, nullable=True)
electricity_price_c = Column(Float, nullable=True)
electricity_price_d = Column(Float, nullable=True)
harga_bahan_bakar = Column(Float, nullable=True)
calc_on_project_irr = Column(Float, nullable=True)
calc_on_project_npv = Column(Float, nullable=True)
calc_on_equity_irr = Column(Float, nullable=True)
calc_on_equity_npv = Column(Float, nullable=True)
calc_roa_all = Column(Float, nullable=True)
calc_roa_current = Column(Float, nullable=True)

@ -0,0 +1,100 @@
from typing import Optional
from fastapi import APIRouter, HTTPException, status, Query
from .model import PlantMasterData
from .schema import (
PlantMasterDataPagination,
PlantMasterDataRead,
PlantMasterDataCreate,
PlantMasterDataUpdate,
)
from .service import get, get_all, create, update, delete
from src.database.service import CommonParameters, search_filter_sort_paginate
from src.database.core import DbSession
from src.auth.service import CurrentUser
from src.models import StandardResponse
router = APIRouter()
@router.get("", response_model=StandardResponse[PlantMasterDataPagination])
async def get_masterdatas(
db_session: DbSession,
common: CommonParameters,
items_per_page: Optional[int] = Query(5),
search: Optional[str] = Query(None),
):
"""Get all documents."""
# return
master_datas = await get_all(
db_session=db_session,
items_per_page=items_per_page,
search=search,
common=common,
)
return StandardResponse(
data=master_datas,
message="Data retrieved successfully",
)
@router.get("/{masterdata_id}", response_model=StandardResponse[PlantMasterDataRead])
async def get_masterdata(db_session: DbSession, masterdata_id: str):
masterdata = await get(db_session=db_session, masterdata_id=masterdata_id)
if not masterdata:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="A data with this id does not exist.",
)
return StandardResponse(data=masterdata, message="Data retrieved successfully")
@router.post("", response_model=StandardResponse[PlantMasterDataRead])
async def create_masterdata(
db_session: DbSession, masterdata_in: PlantMasterDataCreate, current_user: CurrentUser
):
masterdata_in.created_by = current_user.name
masterdata = await create(db_session=db_session, masterdata_in=masterdata_in)
return StandardResponse(data=masterdata, message="Data created successfully")
@router.put("/{masterdata_id}", response_model=StandardResponse[PlantMasterDataRead])
async def update_masterdata(
db_session: DbSession,
masterdata_id: str,
masterdata_in: PlantMasterDataUpdate,
current_user: CurrentUser,
):
masterdata = await get(db_session=db_session, masterdata_id=masterdata_id)
if not masterdata:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="A data with this id does not exist.",
)
masterdata_in.updated_by = current_user.name
return StandardResponse(
data=await update(
db_session=db_session, masterdata=masterdata, masterdata_in=masterdata_in
),
message="Data updated successfully",
)
@router.delete("/{masterdata_id}", response_model=StandardResponse[PlantMasterDataRead])
async def delete_masterdata(db_session: DbSession, masterdata_id: str):
masterdata = await get(db_session=db_session, masterdata_id=masterdata_id)
if not masterdata:
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, masterdata_id=masterdata_id)
return StandardResponse(message="Data deleted successfully", data=masterdata)

@ -0,0 +1,85 @@
from datetime import datetime
from typing import List, Optional
from uuid import UUID
from pydantic import Field
from src.models import DefaultBase, Pagination
from src.auth.service import CurrentUser
class PlantMasterdataBase(DefaultBase):
discount_rate: Optional[float] = Field(None, nullable=True)
total_project_cost: Optional[float] = Field(None, nullable=True)
umur_teknis: Optional[float] = Field(None, nullable=True)
interest_rate: Optional[float] = Field(None, nullable=True)
loan_portion: Optional[float] = Field(None, nullable=True)
equity_portion: Optional[float] = Field(None, nullable=True)
loan: Optional[float] = Field(None, nullable=True)
loan_tenor: Optional[float] = Field(None, nullable=True)
principal_interest_payment: Optional[float] = Field(None, nullable=True)
corporate_tax_rate: Optional[float] = Field(None, nullable=True)
wacc_on_project: Optional[float] = Field(None, nullable=True)
wacc_on_equity: Optional[float] = Field(None, nullable=True)
equity: Optional[float] = Field(None, nullable=True)
daya_mampu_netto: Optional[float] = Field(None, nullable=True)
auxiliary: Optional[float] = Field(None, nullable=True)
susut_trafo: Optional[float] = Field(None, nullable=True)
sfc: Optional[float] = Field(None, nullable=True)
electricity_price_a: Optional[float] = Field(None, nullable=True)
electricity_price_b: Optional[float] = Field(None, nullable=True)
electricity_price_c: Optional[float] = Field(None, nullable=True)
electricity_price_d: Optional[float] = Field(None, nullable=True)
harga_bahan_bakar: Optional[float] = Field(None, nullable=True)
calc_on_project_irr: Optional[float] = Field(None, nullable=True)
calc_on_project_npv: Optional[float] = Field(None, nullable=True)
calc_on_equity_irr: Optional[float] = Field(None, nullable=True)
calc_on_equity_npv: Optional[float] = Field(None, nullable=True)
calc_roa_all: Optional[float] = Field(None, nullable=True)
calc_roa_current: Optional[float] = Field(None, nullable=True)
created_at: Optional[datetime] = Field(None, nullable=True)
updated_at: Optional[datetime] = Field(None, nullable=True)
created_by: Optional[str] = Field(None, nullable=True)
updated_by: Optional[str] = Field(None, nullable=True)
class PlantMasterDataCreate(PlantMasterdataBase):
discount_rate: float = Field(..., nullable=True)
total_project_cost: float = Field(..., nullable=True)
umur_teknis: float = Field(..., nullable=True)
interest_rate: float = Field(..., nullable=True)
loan_portion: float = Field(..., nullable=True)
equity_portion: float = Field(..., nullable=True)
loan: float = Field(..., nullable=True)
loan_tenor: float = Field(..., nullable=True)
principal_interest_payment: float = Field(..., nullable=True)
corporate_tax_rate: float = Field(..., nullable=True)
wacc_on_project: float = Field(..., nullable=True)
wacc_on_equity: float = Field(..., nullable=True)
equity: float = Field(..., nullable=True)
daya_mampu_netto: float = Field(..., nullable=True)
auxiliary: float = Field(..., nullable=True)
susut_trafo: float = Field(..., nullable=True)
sfc: float = Field(..., nullable=True)
electricity_price_a: float = Field(..., nullable=True)
electricity_price_b: float = Field(..., nullable=True)
electricity_price_c: float = Field(..., nullable=True)
electricity_price_d: float = Field(..., nullable=True)
harga_bahan_bakar: float = Field(..., nullable=True)
calc_on_project_irr: float = Field(..., nullable=True)
calc_on_project_npv: float = Field(..., nullable=True)
calc_on_equity_irr: float = Field(..., nullable=True)
calc_on_equity_npv: float = Field(..., nullable=True)
calc_roa_all: float = Field(..., nullable=True)
calc_roa_current: float = Field(..., nullable=True)
class PlantMasterDataUpdate(PlantMasterdataBase):
pass
class PlantMasterDataRead(PlantMasterdataBase):
id: UUID
class PlantMasterDataPagination(Pagination):
items: List[PlantMasterDataRead] = []

@ -0,0 +1,68 @@
from sqlalchemy import Select, Delete
from src.database.service import search_filter_sort_paginate
from .model import PlantMasterData
from .schema import PlantMasterDataCreate, PlantMasterDataUpdate
from typing import Optional
from src.database.core import DbSession
from src.auth.service import CurrentUser
async def get(
*, db_session: DbSession, masterdata_id: str
) -> Optional[PlantMasterData]:
"""Returns a document based on the given document id."""
query = Select(PlantMasterData).filter(PlantMasterData.id == masterdata_id)
result = await db_session.execute(query)
return result.scalars().one_or_none()
async def get_all(
*, db_session: DbSession, items_per_page: int, search: str = None, common
) -> list[PlantMasterData]:
"""Returns all documents."""
query = Select(PlantMasterData)
if search:
query = query.filter(PlantMasterData.total_project_cost.ilike(f"%{search}%"))
common["page"] = 1
common["items_per_page"] = items_per_page
result = await search_filter_sort_paginate(model=query, **common)
return result
async def create(*, db_session: DbSession, masterdata_in: PlantMasterDataCreate):
"""Creates a new document."""
masterdata = PlantMasterData(**masterdata_in.model_dump())
db_session.add(masterdata)
await db_session.commit()
return masterdata
async def update(
*,
db_session: DbSession,
masterdata: PlantMasterData,
masterdata_in: PlantMasterDataUpdate,
):
"""Updates a document."""
data = masterdata_in.model_dump()
update_data = masterdata_in.model_dump(exclude_defaults=True)
for field in data:
if field in update_data:
setattr(masterdata, field, update_data[field])
await db_session.commit()
return masterdata
async def delete(*, db_session: DbSession, masterdata_id: str):
"""Deletes a document."""
query = Delete(PlantMasterData).where(PlantMasterData.id == masterdata_id)
await db_session.execute(query)
await db_session.commit()

@ -0,0 +1,61 @@
from sqlalchemy import Column, Float, Integer, String, UUID
from src.database.core import Base
from src.models import DefaultMixin, IdentityMixin
class PlantTransactionData(Base, DefaultMixin, IdentityMixin):
__tablename__ = "lcc_plant_tr_data"
id = Column(UUID(as_uuid=True), primary_key=True, index=True)
tahun = Column(Integer, nullable=False)
is_actual = Column(Integer, nullable=False)
seq = Column(Integer, nullable=False)
net_capacity_factor = Column(Float, nullable=True)
eaf = Column(Float, nullable=True)
production_bruto = Column(Float, nullable=True)
production_netto = Column(Float, nullable=True)
energy_sales = Column(Float, nullable=True)
fuel_consumption = Column(Float, nullable=True)
revenue_a = Column(Float, nullable=True)
revenue_b = Column(Float, nullable=True)
revenue_c = Column(Float, nullable=True)
revenue_d = Column(Float, nullable=True)
revenue_total = Column(Float, nullable=True)
revenue_pv = Column(Float, nullable=True)
revenue_annualized = Column(Float, nullable=True)
cost_a_replacement = Column(Float, nullable=True)
cost_a_pm = Column(Float, nullable=True)
cost_a_acquisition = Column(Float, nullable=True)
cost_a_pinjaman = Column(Float, nullable=True)
cost_a_depreciation = Column(Float, nullable=True)
cost_a_total = Column(Float, nullable=True)
cost_a_pv = Column(Float, nullable=True)
cost_a_annualized = Column(Float, nullable=True)
cost_c_fuel = Column(Float, nullable=True)
cost_c_pv = Column(Float, nullable=True)
cost_c_annualized = Column(Float, nullable=True)
cost_bd_om = Column(Float, nullable=True)
cost_bd_pm_nonmi = Column(Float, nullable=True)
cost_bd_bd = Column(Float, nullable=True)
cost_bd_total = Column(Float, nullable=True)
cost_bd_pv = Column(Float, nullable=True)
cost_bd_annualized = Column(Float, nullable=True)
total_expense = Column(Float, nullable=True)
total_cost_eac = Column(Float, nullable=True)
total_profit_loss = Column(Float, nullable=True)
total_residual_value = Column(Float, nullable=True)
calc_depreciation = Column(Float, nullable=True)
calc_interest_payment = Column(Float, nullable=True)
calc_principal_payment = Column(Float, nullable=True)
calc_dept_amount = Column(Float, nullable=True)
calc2_ebitda = Column(Float, nullable=True)
calc2_earning_before_tax = Column(Float, nullable=True)
calc2_tax = Column(Float, nullable=True)
calc2_earning_after_tax = Column(Float, nullable=True)
calc2_nopat = Column(Float, nullable=True)
calc3_interest_after_tax = Column(Float, nullable=True)
calc3_free_cash_flow_on_project = Column(Float, nullable=True)
calc3_discounted_fcf_on_project = Column(Float, nullable=True)
calc4_principal_repayment = Column(Float, nullable=True)
calc4_free_cash_flow_on_equity = Column(Float, nullable=True)
calc4_discounted_fcf_on_equity = Column(Float, nullable=True)

@ -0,0 +1,120 @@
from typing import Optional
from fastapi import APIRouter, HTTPException, status, Query
from .model import PlantTransactionData
from .schema import (
PlantTransactionDataPagination,
PlantTransactionDataRead,
PlantTransactionDataCreate,
PlantTransactionDataUpdate,
)
from .service import get, get_all, create, update, delete
from src.database.service import CommonParameters, search_filter_sort_paginate
from src.database.core import DbSession
from src.auth.service import CurrentUser
from src.models import StandardResponse
router = APIRouter()
@router.get("", response_model=StandardResponse[PlantTransactionDataPagination])
async def get_transaction_datas(
db_session: DbSession,
common: CommonParameters,
items_per_page: Optional[int] = Query(5),
search: Optional[str] = Query(None),
):
"""Get all transaction_data pagination."""
year_data = await get_all(
db_session=db_session,
items_per_page=items_per_page,
search=search,
common=common,
)
# return
return StandardResponse(
data=year_data,
message="Data retrieved successfully",
)
@router.get(
"/{transaction_data_id}", response_model=StandardResponse[PlantTransactionDataRead]
)
async def get_transaction_data(db_session: DbSession, transaction_data_id: str):
transaction_data = await get(
db_session=db_session, transaction_data_id=transaction_data_id
)
if not transaction_data:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="A data with this id does not exist.",
)
return StandardResponse(
data=transaction_data, message="Data retrieved successfully"
)
@router.post("", response_model=StandardResponse[PlantTransactionDataRead])
async def create_transaction_data(
db_session: DbSession,
transaction_data_in: PlantTransactionDataCreate,
current_user: CurrentUser,
):
transaction_data_in.created_by = current_user.name
transaction_data = await create(
db_session=db_session, transaction_data_in=transaction_data_in
)
return StandardResponse(data=transaction_data, message="Data created successfully")
@router.put(
"/{transaction_data_id}", response_model=StandardResponse[PlantTransactionDataRead]
)
async def update_transaction_data(
db_session: DbSession,
transaction_data_id: str,
transaction_data_in: PlantTransactionDataUpdate,
current_user: CurrentUser,
):
transaction_data = await get(
db_session=db_session, transaction_data_id=transaction_data_id
)
if not transaction_data:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="A data with this id does not exist.",
)
transaction_data_in.updated_by = current_user.name
return StandardResponse(
data=await update(
db_session=db_session,
transaction_data=transaction_data,
transaction_data_in=transaction_data_in,
),
message="Data updated successfully",
)
@router.delete(
"/{transaction_data_id}", response_model=StandardResponse[PlantTransactionDataRead]
)
async def delete_transaction_data(db_session: DbSession, transaction_data_id: str):
transaction_data = await get(
db_session=db_session, transaction_data_id=transaction_data_id
)
if not transaction_data:
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, transaction_data_id=transaction_data_id)
return StandardResponse(message="Data deleted successfully", data=transaction_data)

@ -0,0 +1,83 @@
from datetime import datetime
from typing import List, Optional
from uuid import UUID
from pydantic import Field
from src.models import DefaultBase, Pagination
class PlantTransactionDataBase(DefaultBase):
year: Optional[int] = Field(None, nullable=True)
rp_per_kwh: Optional[float] = Field(None, nullable=True)
tahun: Optional[int] = Field(None, nullable=True)
is_actual: Optional[int] = Field(None, nullable=True)
seq: Optional[int] = Field(None, nullable=True)
net_capacity_factor: Optional[float] = Field(None, nullable=True)
eaf: Optional[float] = Field(None, nullable=True)
production_bruto: Optional[float] = Field(None, nullable=True)
production_netto: Optional[float] = Field(None, nullable=True)
energy_sales: Optional[float] = Field(None, nullable=True)
fuel_consumption: Optional[float] = Field(None, nullable=True)
revenue_a: Optional[float] = Field(None, nullable=True)
revenue_b: Optional[float] = Field(None, nullable=True)
revenue_c: Optional[float] = Field(None, nullable=True)
revenue_d: Optional[float] = Field(None, nullable=True)
revenue_total: Optional[float] = Field(None, nullable=True)
revenue_pv: Optional[float] = Field(None, nullable=True)
revenue_annualized: Optional[float] = Field(None, nullable=True)
cost_a_replacement: Optional[float] = Field(None, nullable=True)
cost_a_pm: Optional[float] = Field(None, nullable=True)
cost_a_acquisition: Optional[float] = Field(None, nullable=True)
cost_a_pinjaman: Optional[float] = Field(None, nullable=True)
cost_a_depreciation: Optional[float] = Field(None, nullable=True)
cost_a_total: Optional[float] = Field(None, nullable=True)
cost_a_pv: Optional[float] = Field(None, nullable=True)
cost_a_annualized: Optional[float] = Field(None, nullable=True)
cost_c_fuel: Optional[float] = Field(None, nullable=True)
cost_c_pv: Optional[float] = Field(None, nullable=True)
cost_c_annualized: Optional[float] = Field(None, nullable=True)
cost_bd_om: Optional[float] = Field(None, nullable=True)
cost_bd_pm_nonmi: Optional[float] = Field(None, nullable=True)
cost_bd_bd: Optional[float] = Field(None, nullable=True)
cost_bd_total: Optional[float] = Field(None, nullable=True)
cost_bd_pv: Optional[float] = Field(None, nullable=True)
cost_bd_annualized: Optional[float] = Field(None, nullable=True)
total_expense: Optional[float] = Field(None, nullable=True)
total_cost_eac: Optional[float] = Field(None, nullable=True)
total_profit_loss: Optional[float] = Field(None, nullable=True)
total_residual_value: Optional[float] = Field(None, nullable=True)
calc_depreciation: Optional[float] = Field(None, nullable=True)
calc_interest_payment: Optional[float] = Field(None, nullable=True)
calc_principal_payment: Optional[float] = Field(None, nullable=True)
calc_dept_amount: Optional[float] = Field(None, nullable=True)
calc2_ebitda: Optional[float] = Field(None, nullable=True)
calc2_earning_before_tax: Optional[float] = Field(None, nullable=True)
calc2_tax: Optional[float] = Field(None, nullable=True)
calc2_earning_after_tax: Optional[float] = Field(None, nullable=True)
calc2_nopat: Optional[float] = Field(None, nullable=True)
calc3_interest_after_tax: Optional[float] = Field(None, nullable=True)
calc3_free_cash_flow_on_project: Optional[float] = Field(None, nullable=True)
calc3_discounted_fcf_on_project: Optional[float] = Field(None, nullable=True)
calc4_principal_repayment: Optional[float] = Field(None, nullable=True)
calc4_free_cash_flow_on_equity: Optional[float] = Field(None, nullable=True)
calc4_discounted_fcf_on_equity: Optional[float] = Field(None, nullable=True)
created_at: Optional[datetime] = Field(None, nullable=True)
updated_at: Optional[datetime] = Field(None, nullable=True)
created_by: Optional[str] = Field(None, nullable=True)
updated_by: Optional[str] = Field(None, nullable=True)
class PlantTransactionDataCreate(PlantTransactionDataBase):
pass
class PlantTransactionDataUpdate(PlantTransactionDataBase):
pass
class PlantTransactionDataRead(PlantTransactionDataBase):
id: UUID
class PlantTransactionDataPagination(Pagination):
items: List[PlantTransactionDataRead] = []

@ -0,0 +1,74 @@
from sqlalchemy import Select, Delete, cast, String
from .model import PlantTransactionData
from .schema import PlantTransactionDataCreate, PlantTransactionDataUpdate
from src.database.service import search_filter_sort_paginate
from typing import Optional
from src.database.core import DbSession
from src.auth.service import CurrentUser
async def get(
*, db_session: DbSession, transaction_data_id: str
) -> Optional[PlantTransactionData]:
"""Returns a document based on the given document id."""
query = Select(PlantTransactionData).filter(PlantTransactionData.id == transaction_data_id)
result = await db_session.execute(query)
return result.scalars().one_or_none()
async def get_all(
*,
db_session: DbSession,
items_per_page: Optional[int],
search: Optional[str] = None,
common,
):
"""Returns all documents."""
query = Select(PlantTransactionData).order_by(PlantTransactionData.tahun.desc())
if search:
query = query.filter(
cast(PlantTransactionData.tahun, String).ilike(f"%{search}%")
)
common["page"] = 1
common["items_per_page"] = items_per_page
results = await search_filter_sort_paginate(model=query, **common)
# return results.scalars().all()
return results
async def create(*, db_session: DbSession, yeardata_in: PlantTransactionDataCreate):
"""Creates a new document."""
yeardata = PlantTransactionData(**yeardata_in.model_dump())
db_session.add(yeardata)
await db_session.commit()
return yeardata
async def update(
*,
db_session: DbSession,
yeardata: PlantTransactionData,
yeardata_in: PlantTransactionDataUpdate,
):
"""Updates a document."""
data = yeardata_in.model_dump()
update_data = yeardata_in.model_dump(exclude_defaults=True)
for field in data:
if field in update_data:
setattr(yeardata, field, update_data[field])
await db_session.commit()
return yeardata
async def delete(*, db_session: DbSession, transaction_data_id: str):
"""Deletes a document."""
query = Delete(PlantTransactionData).where(PlantTransactionData.id == transaction_data_id)
await db_session.execute(query)
await db_session.commit()
Loading…
Cancel
Save