from datetime import datetime from typing import List, Optional from uuid import UUID from pydantic import Field from src.models import CommonParams, DefaultBase, Pagination MAX_PRICE = 1_000_000_000_000_000 # thousands of trillion class EquipmentBase(DefaultBase): assetnum: Optional[str] = Field(None) acquisition_year: Optional[int] = Field(None) acquisition_cost: Optional[float] = Field(None, le=MAX_PRICE) capital_cost_record_time: Optional[int] = Field(None) design_life: Optional[int] = Field(None) forecasting_start_year: Optional[int] = Field(None) forecasting_target_year: Optional[int] = Field(None) manhours_rate: Optional[float] = Field(None) harga_saat_ini: Optional[float] = Field(None, le=MAX_PRICE) minimum_eac_seq: Optional[int] = Field(None) minimum_eac_year: Optional[int] = Field(None) minimum_eac: Optional[float] = Field(None, le=MAX_PRICE) minimum_npv: Optional[float] = Field(None, le=MAX_PRICE) minimum_pmt: Optional[float] = Field(None, le=MAX_PRICE) minimum_pmt_aq_cost: Optional[float] = Field(None, le=MAX_PRICE) minimum_is_actual: Optional[int] = Field(None) efdh_equivalent_forced_derated_hours: Optional[float] = Field(None) foh_forced_outage_hours: Optional[float] = Field(None) category_no: Optional[str] = Field(None) proportion: Optional[float] = Field(None) created_at: Optional[datetime] = Field(None) updated_at: Optional[datetime] = Field(None) created_by: Optional[str] = Field(None) updated_by: Optional[str] = Field(None) class EquipmentMasterBase(DefaultBase): location_tag: Optional[str] = Field(None) assetnum: Optional[str] = Field(None) name: Optional[str] = Field(None) class MasterBase(DefaultBase): assetnum: Optional[str] = Field(None) tahun: Optional[int] = Field(None) seq: Optional[int] = Field(None) is_actual: Optional[float] = Field(None) raw_cm_interval: Optional[float] = Field(None) raw_cm_material_cost: Optional[float] = Field(None, le=MAX_PRICE) raw_cm_labor_time: Optional[float] = Field(None) raw_cm_labor_human: Optional[float] = Field(None) raw_pm_interval: Optional[float] = Field(None) raw_pm_material_cost: Optional[float] = Field(None, le=MAX_PRICE) raw_pm_labor_time: Optional[float] = Field(None) raw_pm_labor_human: Optional[float] = Field(None) raw_predictive_interval: Optional[float] = Field(None) raw_predictive_material_cost: Optional[float] = Field(None, le=MAX_PRICE) raw_predictive_labor_time: Optional[float] = Field(None) raw_predictive_labor_human: Optional[float] = Field(None) raw_oh_interval: Optional[float] = Field(None) raw_oh_material_cost: Optional[float] = Field(None, le=MAX_PRICE) raw_oh_labor_time: Optional[float] = Field(None) raw_oh_labor_human: Optional[float] = Field(None) raw_project_task_material_cost: Optional[float] = Field(None, le=MAX_PRICE) raw_loss_output_MW: Optional[float] = Field(None) raw_loss_output_price: Optional[float] = Field(None, le=MAX_PRICE) raw_operational_cost: Optional[float] = Field(None, le=MAX_PRICE) raw_maintenance_cost: Optional[float] = Field(None, le=MAX_PRICE) rc_cm_material_cost: Optional[float] = Field(None, le=MAX_PRICE) rc_cm_labor_cost: Optional[float] = Field(None, le=MAX_PRICE) rc_pm_material_cost: Optional[float] = Field(None, le=MAX_PRICE) rc_pm_labor_cost: Optional[float] = Field(None, le=MAX_PRICE) rc_predictive_labor_cost: Optional[float] = Field(None, le=MAX_PRICE) rc_oh_material_cost: Optional[float] = Field(None, le=MAX_PRICE) rc_oh_labor_cost: Optional[float] = Field(None, le=MAX_PRICE) rc_project_material_cost: Optional[float] = Field(None, le=MAX_PRICE) rc_lost_cost: Optional[float] = Field(None, le=MAX_PRICE) rc_operation_cost: Optional[float] = Field(None, le=MAX_PRICE) rc_maintenance_cost: Optional[float] = Field(None, le=MAX_PRICE) asset_criticality: Optional[float] = Field(None) rc_total_cost: Optional[float] = Field(None, le=MAX_PRICE) eac_npv: Optional[float] = Field(None, le=MAX_PRICE) eac_annual_mnt_cost: Optional[float] = Field(None, le=MAX_PRICE) eac_annual_acq_cost: Optional[float] = Field(None, le=MAX_PRICE) eac_disposal_cost: Optional[float] = Field(None, le=MAX_PRICE) eac_eac: Optional[float] = Field(None, le=MAX_PRICE) efdh_equivalent_forced_derated_hours: Optional[float] = Field(None) foh_forced_outage_hours: Optional[float] = Field(None) category_no: Optional[str] = Field(None) proportion: Optional[float] = Field(None) class HistoricalBase(MasterBase): acquisition_year_ref: Optional[str] = Field(None) class EquipmentCreate(EquipmentBase): pass class EquipmentUpdate(EquipmentBase): pass class ReplacementBase(DefaultBase): """Schema for replacement history (from lcc_ms_equipment_historical_data).""" acquisition_year: Optional[int] = Field(None, ge=1900, le=9999) acquisition_cost: Optional[float] = Field(None, le=MAX_PRICE) acquisition_year_ref: Optional[str] = Field(None) created_at: Optional[datetime] = Field(None) class EquipmentRead(DefaultBase): equipment_master_record: EquipmentMasterBase equipment_data: EquipmentBase chart_data: List[MasterBase] min_eac_value: Optional[float] = Field(None, le=MAX_PRICE) min_seq: Optional[float] = Field(None) min_eac_year: Optional[float] = Field(None) last_actual_year: Optional[int] = Field(None, ge=1900, le=9999) maximo_data: Optional[List[dict]] = Field(None) joined_maximo: Optional[List[dict]] = Field(None) min_eac_disposal_cost: Optional[float] = Field(None, le=MAX_PRICE) historical_data: Optional[List[HistoricalBase]] = Field(None) replacement_data: Optional[List[ReplacementBase]] = Field(None) class EquipmentTop10(EquipmentBase): id: UUID equipment_master: EquipmentMasterBase forecasting_target_year: Optional[int] = Field(None, ge=1900, le=9999) minimum_eac_seq: Optional[int] = Field(None) minimum_eac_year: Optional[int] = Field(None) minimum_eac: Optional[float] = Field(None, le=MAX_PRICE) minimum_npv: Optional[float] = Field(None, le=MAX_PRICE) minimum_pmt: Optional[float] = Field(None, le=MAX_PRICE) minimum_pmt_aq_cost: Optional[float] = Field(None, le=MAX_PRICE) minimum_is_actual: Optional[int] = Field(None) harga_saat_ini: Optional[float] = Field(None, le=MAX_PRICE) remaining_life: Optional[int] = Field(None) class EquipmentTop10Pagination(Pagination): items: List[EquipmentTop10] = [] class EquipmentDataMaster(EquipmentBase): id: UUID equipment_master: Optional[EquipmentMasterBase] = Field(None) forecasting_target_year: Optional[int] = Field(None, ge=1900, le=9999) minimum_eac_seq: Optional[int] = Field(None, ge=0) minimum_eac_year: Optional[int] = Field(None, ge=1900, le=9999) minimum_eac: Optional[float] = Field(None, le=MAX_PRICE) minimum_npv: Optional[float] = Field(None, le=MAX_PRICE) minimum_pmt: Optional[float] = Field(None, le=MAX_PRICE) minimum_pmt_aq_cost: Optional[float] = Field(None, le=MAX_PRICE) minimum_is_actual: Optional[int] = Field(None) harga_saat_ini: Optional[float] = Field(None, le=MAX_PRICE) # class EquipmentTop10EconomicLife(DefaultBase): # equipment: EquipmentDataMaster # economic_life: int class EquipmentPagination(Pagination): items: List[EquipmentDataMaster] = [] class CountRemainingLifeResponse(DefaultBase): safe: int warning: int critical: int class ListQueryParams(CommonParams): items_per_page: Optional[int] = Field( default=5, ge=1, le=1000, description="Number of items per page", alias="itemsPerPage" ) search: Optional[str] = Field( default=None, description="Search keyword" )