diff --git a/src/__pycache__/api.cpython-311.pyc b/src/__pycache__/api.cpython-311.pyc index bae70b2..60daeee 100644 Binary files a/src/__pycache__/api.cpython-311.pyc and b/src/__pycache__/api.cpython-311.pyc differ diff --git a/src/api.py b/src/api.py index 97c94ce..f49e7e4 100644 --- a/src/api.py +++ b/src/api.py @@ -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( diff --git a/src/plant_masterdata/__init__.py b/src/plant_masterdata/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/plant_masterdata/__pycache__/__init__.cpython-311.pyc b/src/plant_masterdata/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..4cf1c8e Binary files /dev/null and b/src/plant_masterdata/__pycache__/__init__.cpython-311.pyc differ diff --git a/src/plant_masterdata/__pycache__/model.cpython-311.pyc b/src/plant_masterdata/__pycache__/model.cpython-311.pyc new file mode 100644 index 0000000..4ef43f0 Binary files /dev/null and b/src/plant_masterdata/__pycache__/model.cpython-311.pyc differ diff --git a/src/plant_masterdata/__pycache__/router.cpython-311.pyc b/src/plant_masterdata/__pycache__/router.cpython-311.pyc new file mode 100644 index 0000000..b7d41e8 Binary files /dev/null and b/src/plant_masterdata/__pycache__/router.cpython-311.pyc differ diff --git a/src/plant_masterdata/__pycache__/schema.cpython-311.pyc b/src/plant_masterdata/__pycache__/schema.cpython-311.pyc new file mode 100644 index 0000000..72e0710 Binary files /dev/null and b/src/plant_masterdata/__pycache__/schema.cpython-311.pyc differ diff --git a/src/plant_masterdata/__pycache__/service.cpython-311.pyc b/src/plant_masterdata/__pycache__/service.cpython-311.pyc new file mode 100644 index 0000000..6dc83ec Binary files /dev/null and b/src/plant_masterdata/__pycache__/service.cpython-311.pyc differ diff --git a/src/plant_masterdata/model.py b/src/plant_masterdata/model.py new file mode 100644 index 0000000..9e809f1 --- /dev/null +++ b/src/plant_masterdata/model.py @@ -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) diff --git a/src/plant_masterdata/router.py b/src/plant_masterdata/router.py new file mode 100644 index 0000000..aa42c61 --- /dev/null +++ b/src/plant_masterdata/router.py @@ -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) diff --git a/src/plant_masterdata/schema.py b/src/plant_masterdata/schema.py new file mode 100644 index 0000000..c164e76 --- /dev/null +++ b/src/plant_masterdata/schema.py @@ -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] = [] diff --git a/src/plant_masterdata/service.py b/src/plant_masterdata/service.py new file mode 100644 index 0000000..ba7b671 --- /dev/null +++ b/src/plant_masterdata/service.py @@ -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() diff --git a/src/plant_transaction_data/__init__.py b/src/plant_transaction_data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/plant_transaction_data/__pycache__/__init__.cpython-311.pyc b/src/plant_transaction_data/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..45fd3a1 Binary files /dev/null and b/src/plant_transaction_data/__pycache__/__init__.cpython-311.pyc differ diff --git a/src/plant_transaction_data/__pycache__/model.cpython-311.pyc b/src/plant_transaction_data/__pycache__/model.cpython-311.pyc new file mode 100644 index 0000000..46923ac Binary files /dev/null and b/src/plant_transaction_data/__pycache__/model.cpython-311.pyc differ diff --git a/src/plant_transaction_data/__pycache__/router.cpython-311.pyc b/src/plant_transaction_data/__pycache__/router.cpython-311.pyc new file mode 100644 index 0000000..a713601 Binary files /dev/null and b/src/plant_transaction_data/__pycache__/router.cpython-311.pyc differ diff --git a/src/plant_transaction_data/__pycache__/schema.cpython-311.pyc b/src/plant_transaction_data/__pycache__/schema.cpython-311.pyc new file mode 100644 index 0000000..9401704 Binary files /dev/null and b/src/plant_transaction_data/__pycache__/schema.cpython-311.pyc differ diff --git a/src/plant_transaction_data/__pycache__/service.cpython-311.pyc b/src/plant_transaction_data/__pycache__/service.cpython-311.pyc new file mode 100644 index 0000000..3801315 Binary files /dev/null and b/src/plant_transaction_data/__pycache__/service.cpython-311.pyc differ diff --git a/src/plant_transaction_data/model.py b/src/plant_transaction_data/model.py new file mode 100644 index 0000000..f2d69d4 --- /dev/null +++ b/src/plant_transaction_data/model.py @@ -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) diff --git a/src/plant_transaction_data/router.py b/src/plant_transaction_data/router.py new file mode 100644 index 0000000..8d280f9 --- /dev/null +++ b/src/plant_transaction_data/router.py @@ -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) diff --git a/src/plant_transaction_data/schema.py b/src/plant_transaction_data/schema.py new file mode 100644 index 0000000..b3b9a97 --- /dev/null +++ b/src/plant_transaction_data/schema.py @@ -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] = [] diff --git a/src/plant_transaction_data/service.py b/src/plant_transaction_data/service.py new file mode 100644 index 0000000..a5c80c2 --- /dev/null +++ b/src/plant_transaction_data/service.py @@ -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()