fix
parent
3fa022f08f
commit
8c9f573230
@ -1,60 +1,132 @@
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy import Delete, Select
|
||||
from sqlalchemy import Delete, Select, text
|
||||
from sqlalchemy.orm import joinedload, selectinload
|
||||
|
||||
from src.auth.service import CurrentUser
|
||||
from src.database.core import DbSession
|
||||
from src.database.service import CommonParameters, search_filter_sort_paginate
|
||||
|
||||
from .model import MasterActivity
|
||||
from .schema import ActivityMaster, ActivityMasterCreate
|
||||
|
||||
|
||||
async def get(*, db_session: DbSession, activity_id: str) -> Optional[ActivityMaster]:
|
||||
"""Returns a document based on the given document id."""
|
||||
result = await db_session.get(MasterActivity, activity_id)
|
||||
return result
|
||||
|
||||
|
||||
async def get_all(common: CommonParameters):
|
||||
query = Select(MasterActivity)
|
||||
|
||||
results = await search_filter_sort_paginate(model=query, **common)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
|
||||
async def create(*, db_session: DbSession, activty_in: ActivityMasterCreate):
|
||||
activity = MasterActivity(**activty_in.model_dump())
|
||||
db_session.add(activity)
|
||||
await db_session.commit()
|
||||
return activity
|
||||
|
||||
|
||||
async def update(
|
||||
*,
|
||||
db_session: DbSession,
|
||||
activity: MasterActivity,
|
||||
activity_in: ActivityMasterCreate
|
||||
):
|
||||
"""Updates a document."""
|
||||
data = activity_in.model_dump()
|
||||
|
||||
update_data = activity_in.model_dump(exclude_defaults=True)
|
||||
|
||||
for field in data:
|
||||
if field in update_data:
|
||||
setattr(activity, field, update_data[field])
|
||||
|
||||
await db_session.commit()
|
||||
|
||||
return activity
|
||||
|
||||
|
||||
async def delete(*, db_session: DbSession, activity_id: str):
|
||||
"""Deletes a document."""
|
||||
activity = await db_session.get(MasterActivity, activity_id)
|
||||
await db_session.delete(activity)
|
||||
await db_session.commit()
|
||||
# async def get(*, db_session: DbSession, activity_id: str) -> Optional[ActivityMaster]:
|
||||
# """Returns a document based on the given document id."""
|
||||
# result = await db_session.get(MasterActivity, activity_id)
|
||||
# return result
|
||||
|
||||
|
||||
async def get_all(db_session: DbSession):
|
||||
"""
|
||||
Get all spare parts with their latest PR and PO information.
|
||||
|
||||
Args:
|
||||
db_session: SQLAlchemy database session
|
||||
assetnum: Optional asset number filter (not used in this query but kept for compatibility)
|
||||
|
||||
Returns:
|
||||
List of dictionaries containing spare part information
|
||||
"""
|
||||
# Define the SQL query
|
||||
query = text("""
|
||||
WITH latest_prs AS (
|
||||
SELECT DISTINCT ON (pl.item_num)
|
||||
pl.item_num,
|
||||
h.num as pr_number,
|
||||
h.issue_date as pr_issue_date,
|
||||
h.status as pr_status,
|
||||
pl.qty_ordered as pr_qty_ordered
|
||||
FROM public.maximo_sparepart_pr_po h
|
||||
JOIN public.maximo_sparepart_pr_po_line pl ON h.num = pl.num
|
||||
WHERE h.type = 'PR'
|
||||
AND h.issue_date IS NOT NULL
|
||||
AND h.num LIKE 'K%'
|
||||
ORDER BY pl.item_num, TO_DATE(h.issue_date, 'YYYY-MM-DD') DESC
|
||||
),
|
||||
po_details AS (
|
||||
SELECT
|
||||
h.num as po_number,
|
||||
pl.item_num,
|
||||
h.estimated_arrival_date,
|
||||
pl.qty_received,
|
||||
pl.qty_ordered
|
||||
FROM public.maximo_sparepart_pr_po h
|
||||
JOIN public.maximo_sparepart_pr_po_line pl ON h.num = pl.num
|
||||
WHERE h.type = 'PO'
|
||||
)
|
||||
SELECT
|
||||
pr.item_num,
|
||||
MAX(l.description) as description,
|
||||
COALESCE(MAX(i.curbaltotal), 0) as current_balance_total,
|
||||
pr.pr_number,
|
||||
pr.pr_issue_date,
|
||||
pr.pr_qty_ordered,
|
||||
CASE
|
||||
WHEN po.po_number IS NOT NULL THEN 'YES'
|
||||
ELSE 'NO'
|
||||
END as po_exists,
|
||||
COALESCE(po.qty_received, 0) as po_qty_received,
|
||||
COALESCE(po.qty_ordered, 0) as po_qty_ordered,
|
||||
COALESCE(po.estimated_arrival_date, '') as po_estimated_arrival_date
|
||||
FROM latest_prs pr
|
||||
LEFT JOIN public.maximo_sparepart_pr_po_line l ON pr.item_num = l.item_num
|
||||
LEFT JOIN public.maximo_inventory i ON pr.item_num = i.itemnum
|
||||
LEFT JOIN po_details po ON po.po_number = pr.pr_number AND po.item_num = pr.item_num
|
||||
GROUP BY pr.item_num, pr.pr_number, pr.pr_issue_date, pr.pr_qty_ordered,
|
||||
po.po_number, po.qty_received, po.qty_ordered, po.estimated_arrival_date
|
||||
ORDER BY pr.item_num
|
||||
""")
|
||||
|
||||
# Execute the query
|
||||
result = await db_session.execute(query)
|
||||
|
||||
# Fetch all results and convert to list of dictionaries
|
||||
spare_parts = []
|
||||
for row in result:
|
||||
spare_parts.append({
|
||||
"item_num": row.item_num,
|
||||
"description": row.description,
|
||||
"current_balance_total": float(row.current_balance_total) if row.current_balance_total is not None else 0.0,
|
||||
"pr_number": row.pr_number,
|
||||
"pr_issue_date": row.pr_issue_date,
|
||||
"pr_qty_ordered": float(row.pr_qty_ordered) if row.pr_qty_ordered is not None else 0.0,
|
||||
"po_exists": row.po_exists,
|
||||
"po_qty_received": float(row.po_qty_received) if row.po_qty_received is not None else 0.0,
|
||||
"po_qty_ordered": float(row.po_qty_ordered) if row.po_qty_ordered is not None else 0.0,
|
||||
"po_estimated_arrival_date": row.po_estimated_arrival_date
|
||||
})
|
||||
|
||||
return spare_parts
|
||||
|
||||
|
||||
|
||||
# async def create(*, db_session: DbSession, activty_in: ActivityMasterCreate):
|
||||
# activity = MasterActivity(**activty_in.model_dump())
|
||||
# db_session.add(activity)
|
||||
# await db_session.commit()
|
||||
# return activity
|
||||
|
||||
|
||||
# async def update(
|
||||
# *,
|
||||
# db_session: DbSession,
|
||||
# activity: MasterActivity,
|
||||
# activity_in: ActivityMasterCreate
|
||||
# ):
|
||||
# """Updates a document."""
|
||||
# data = activity_in.model_dump()
|
||||
|
||||
# update_data = activity_in.model_dump(exclude_defaults=True)
|
||||
|
||||
# for field in data:
|
||||
# if field in update_data:
|
||||
# setattr(activity, field, update_data[field])
|
||||
|
||||
# await db_session.commit()
|
||||
|
||||
# return activity
|
||||
|
||||
|
||||
# async def delete(*, db_session: DbSession, activity_id: str):
|
||||
# """Deletes a document."""
|
||||
# activity = await db_session.get(MasterActivity, activity_id)
|
||||
# await db_session.delete(activity)
|
||||
# await db_session.commit()
|
||||
|
||||
Loading…
Reference in New Issue