|
|
|
|
@ -1,7 +1,7 @@
|
|
|
|
|
import random
|
|
|
|
|
from typing import Optional
|
|
|
|
|
|
|
|
|
|
from sqlalchemy import Delete, Select, and_, text
|
|
|
|
|
from sqlalchemy import Delete, Select, and_
|
|
|
|
|
from sqlalchemy.orm import selectinload
|
|
|
|
|
|
|
|
|
|
from src.auth.service import CurrentUser
|
|
|
|
|
@ -37,87 +37,12 @@ def create_dummy_parts(assetnum: str, count: int = 5):
|
|
|
|
|
return parts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def get_all(db_session: DbSession, assetnum: Optional[str] = None):
|
|
|
|
|
"""
|
|
|
|
|
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 get_all(db_session: DbSession, assetnum: Optional[str]):
|
|
|
|
|
# Example usage
|
|
|
|
|
dummy_parts = create_dummy_parts(assetnum, count=10)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return dummy_parts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# async def create(*, db_session: DbSession, scope_equipment_activty_in: ScopeEquipmentActivityCreate):
|
|
|
|
|
|