import { fetchAllWorkorders, fetchAllWorkordersJson, fetchLatestWorkordersJson, getIndexByLabel } from './propertyware.service'; import { logger } from '../../utils/logger'; import PwWorkOrders from '../../models/pwWorkOrders'; import PwUnit from '../../models/pwUnits'; export const syncWorkOrderDataService = async (): Promise => { try { const workOrderData = await fetchAllWorkorders(); const workOrderResponseData = workOrderData.map((workOrder: { id: number; number: number; location: string; portfolioID: number; buildingID: number; unitID: number; status: string; assignedVendors: string[]; }) => ({ pw_id: workOrder.id, number: workOrder.number, location: workOrder.location, portfolio_id: workOrder.portfolioID, building_id: workOrder.buildingID, unit_id: workOrder.unitID, status: workOrder.status, assignedVendors: workOrder.assignedVendors || [], })); await PwWorkOrders.bulkCreate(workOrderResponseData, { updateOnDuplicate: ['number', 'location', 'portfolio_id', 'building_id', 'unit_id', 'status', 'assigned_vendors'], }); logger.info("Work order data synced successfully"); return "Work order data synced successfully"; } catch (error) { logger.error("Error syncing Work order"); logger.error(error); throw new Error("Error syncing Work order"); } }; export const syncWorkOrderDataFromJsonService = async (syncAll = false): Promise => { try { let workOrderData; if (syncAll) { workOrderData = await fetchAllWorkordersJson(); } else { workOrderData = await fetchLatestWorkordersJson(); } const indexes = { pw_id: getIndexByLabel(workOrderData.columns, "WO Entity ID"), number:getIndexByLabel(workOrderData.columns, "WO#"), portfolio: getIndexByLabel(workOrderData.columns, "Portfolio"), building: getIndexByLabel(workOrderData.columns, "Building"), unit: getIndexByLabel(workOrderData.columns, "Unit"), buildingID: getIndexByLabel(workOrderData.columns, "Building ID"), unitID: getIndexByLabel(workOrderData.columns, "Unit ID"), status: getIndexByLabel(workOrderData.columns, "Status"), assignedVendors: getIndexByLabel(workOrderData.columns, "Vendors"), location: getIndexByLabel(workOrderData.columns, "Address"), }; const workOrderResponseData: any[] = []; for (const record of workOrderData.records) { const portfolioData = await PwUnit.findOne({ where: { pw_id: record[indexes.unitID as number], }, attributes: ['pw_portfolio_id'], }); const portfolio_id= portfolioData ? portfolioData.getDataValue('pw_portfolio_id') : null; workOrderResponseData.push({ pw_id: record[indexes.pw_id as number], number: extractWorkOrderNumber(record[indexes.number as number]), portfolio_id: portfolio_id, building_id: record[indexes.buildingID as number], unit_id: record[indexes.unitID as number], location: record[indexes.location as number], status: record[indexes.status as number], assigned_vendors: record[indexes.assignedVendors as number] || [] }); } await PwWorkOrders.bulkCreate(workOrderResponseData, { updateOnDuplicate: ['number', 'location', 'portfolio_id', 'building_id', 'unit_id', 'status', 'assigned_vendors'], }); logger.info("Total " + workOrderResponseData.length + " Work orders synced successfully"); return "Total " + workOrderResponseData.length + " Work orders synced successfully"; } catch (error) { logger.error("Error syncing Work order"); logger.error(error); throw new Error("Error syncing Work order"); } }; const extractWorkOrderNumber = (workOrder: string): string | null => { const match = workOrder.match(/#(\d+)/); // Matches "#" followed by one or more digits return match ? match[1] : null; }