from datetime import datetime from sqlalchemy import select, func, cast, Numeric from sqlalchemy.orm import Session from sqlalchemy import and_ from sqlalchemy.sql import not_ from src.maximo.model import WorkOrderData # Assuming this is where your model is from src.database.core import CollectorDbSession async def get_cm_cost_summary(collector_db: CollectorDbSession, last_oh_date:datetime, upcoming_oh_date:datetime): query = select( WorkOrderData.location, (func.sum(WorkOrderData.total_cost_max).cast(Numeric) / func.count(WorkOrderData.wonum)).label('avg_cost') ).where( and_( # WorkOrderData.wo_start >= last_oh_date, # WorkOrderData.wo_start <= upcoming_oh_date, WorkOrderData.worktype.in_(['CM', 'EM', 'PROACTIVE']), WorkOrderData.system_tag.in_(['HPB', 'AH', 'APC', 'SCR', 'CL', 'DM', 'CRH', 'ASH', 'BAD', 'DS', 'WTP', 'MT', 'SUP', 'DCS', 'FF', 'EG', 'AI', 'SPS', 'EVM', 'SCW', 'KLH', 'CH', 'TUR', 'LOT', 'HRH', 'ESP', 'CAE', 'GMC', 'BFT', 'LSH', 'CHB', 'BSS', 'LOS', 'LPB', 'SAC', 'CP', 'EHS', 'RO', 'GG', 'MS', 'CW', 'SO', 'ATT', 'AFG', 'EHB', 'RP', 'FO', 'PC', 'APE', 'AF', 'DMW', 'BRS', 'GEN', 'ABS', 'CHA', 'TR', 'H2', 'BDW', 'LOM', 'ACR', 'AL', 'FW', 'COND', 'CCCW', 'IA', 'GSS', 'BOL', 'SSB', 'CO', 'OA', 'CTH-UPD', 'AS', 'DP']), WorkOrderData.reportdate.is_not(None), WorkOrderData.actstart.is_not(None), WorkOrderData.actfinish.is_not(None), WorkOrderData.unit.in_([3, 0]), WorkOrderData.reportdate >= datetime.strptime('2015-01-01', '%Y-%m-%d'), not_(WorkOrderData.wonum.like('T%')) ) ).group_by( WorkOrderData.location ).order_by( func.count(WorkOrderData.wonum).desc() ) result = await collector_db.execute(query) data = result.all() return { data.location: data.avg_cost for data in data } async def get_oh_cost_summary(collector_db: CollectorDbSession, last_oh_date:datetime, upcoming_oh_date:datetime): query = select( WorkOrderData.location, (func.sum(WorkOrderData.total_cost_max).cast(Numeric) / func.count(WorkOrderData.wonum)).label('avg_cost') ).where( and_( # WorkOrderData.wo_start >= last_oh_date, # WorkOrderData.wo_start <= upcoming_oh_date, WorkOrderData.worktype.in_(['OH']), WorkOrderData.system_tag.in_(['HPB', 'AH', 'APC', 'SCR', 'CL', 'DM', 'CRH', 'ASH', 'BAD', 'DS', 'WTP', 'MT', 'SUP', 'DCS', 'FF', 'EG', 'AI', 'SPS', 'EVM', 'SCW', 'KLH', 'CH', 'TUR', 'LOT', 'HRH', 'ESP', 'CAE', 'GMC', 'BFT', 'LSH', 'CHB', 'BSS', 'LOS', 'LPB', 'SAC', 'CP', 'EHS', 'RO', 'GG', 'MS', 'CW', 'SO', 'ATT', 'AFG', 'EHB', 'RP', 'FO', 'PC', 'APE', 'AF', 'DMW', 'BRS', 'GEN', 'ABS', 'CHA', 'TR', 'H2', 'BDW', 'LOM', 'ACR', 'AL', 'FW', 'COND', 'CCCW', 'IA', 'GSS', 'BOL', 'SSB', 'CO', 'OA', 'CTH-UPD', 'AS', 'DP']), WorkOrderData.reportdate.is_not(None), WorkOrderData.actstart.is_not(None), WorkOrderData.actfinish.is_not(None), WorkOrderData.unit.in_([3, 0]), WorkOrderData.reportdate >= datetime.strptime('2015-01-01', '%Y-%m-%d'), not_(WorkOrderData.wonum.like('T%')) ) ).group_by( WorkOrderData.location ).order_by( func.count(WorkOrderData.wonum).desc() ) result = await collector_db.execute(query) data = result.all() return { data.location: data.avg_cost for data in data }