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.
95 lines
3.1 KiB
Python
95 lines
3.1 KiB
Python
from sqlalchemy import Select, Delete, cast, String
|
|
from src.manpower_cost.model import ManpowerCost
|
|
from src.manpower_cost.schema import ManpowerCostCreate, ManpowerCostUpdate
|
|
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
|
|
from src.equipment.model import Equipment
|
|
|
|
|
|
def _calculate_cost_unit_3(cost_unit_3_n_4: Optional[float]) -> Optional[float]:
|
|
"""Derive cost_unit_3 by splitting the combined unit 3&4 cost evenly."""
|
|
if cost_unit_3_n_4 is None:
|
|
return None
|
|
return cost_unit_3_n_4 / 2
|
|
|
|
|
|
async def _sync_equipment_acquisition_costs(
|
|
*, db_session: DbSession, category_no: Optional[str], cost_unit_3: Optional[float]
|
|
):
|
|
"""Keep equipment manpower cost in sync for the affected category."""
|
|
if not category_no or cost_unit_3 is None:
|
|
return
|
|
|
|
equipment_query = Select(Equipment).filter(Equipment.category_no == category_no)
|
|
equipment_result = await db_session.execute(equipment_query)
|
|
equipments = equipment_result.scalars().all()
|
|
|
|
for equipment in equipments:
|
|
if equipment.proportion is None:
|
|
continue
|
|
equipment.acquisition_cost = (equipment.proportion * 0.01) * cost_unit_3
|
|
|
|
|
|
async def get(*, db_session: DbSession, manpower_cost_id: str) -> Optional[ManpowerCost]:
|
|
"""Returns a document based on the given document id."""
|
|
query = Select(ManpowerCost).filter(ManpowerCost.id == manpower_cost_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(ManpowerCost).order_by(ManpowerCost.salary_per_month_idr.asc())
|
|
if search:
|
|
query = query.filter(
|
|
(cast(ManpowerCost.staff_job_level, String).ilike(f"%{search}%"))
|
|
| (cast(ManpowerCost.salary_per_month_idr, String).ilike(f"%{search}%"))
|
|
)
|
|
|
|
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, manpower_cost_in: ManpowerCostCreate):
|
|
"""Creates a new document."""
|
|
data = manpower_cost_in.model_dump()
|
|
|
|
manpower_cost = ManpowerCost(**data)
|
|
db_session.add(manpower_cost)
|
|
|
|
await db_session.commit()
|
|
return manpower_cost
|
|
|
|
async def update(
|
|
*, db_session: DbSession, manpower_cost: ManpowerCost, manpower_cost_in: ManpowerCostUpdate
|
|
):
|
|
"""Updates a document."""
|
|
data = manpower_cost_in.model_dump()
|
|
update_data = manpower_cost_in.model_dump(exclude_defaults=True)
|
|
for field in data:
|
|
if field in update_data:
|
|
setattr(manpower_cost, field, update_data[field])
|
|
|
|
await db_session.commit()
|
|
|
|
return manpower_cost
|
|
|
|
|
|
async def delete(*, db_session: DbSession, manpower_cost_id: str):
|
|
"""Deletes a document."""
|
|
query = Delete(ManpowerCost).where(ManpowerCost.id == manpower_cost_id)
|
|
await db_session.execute(query)
|
|
await db_session.commit()
|