UNPKG

@cityssm/faster-report-parser

Version:

Parses select Excel and CSV reports from the FASTER Web Fleet Management System into usable data objects.

109 lines (92 loc) 3.26 kB
import { type DateString, type TimeString, dateToString, dateToTimeString } from '@cityssm/utils-datetime' import type { W603ReportRow } from '../csvReports.js' const inventoryImportBlockStartMessagePrefix = 'Inventory Import process started' const inventoryImportBlockEndMessagePrefix = 'Inventory Import process completed' interface InventoryImportError { messageId: number messageDateTime: `${DateString} ${TimeString}` message: string fileName?: string } function formatDateTime(dateTimeString: string): `${DateString} ${TimeString}` { const dateTime = new Date(dateTimeString) return `${dateToString(dateTime)} ${dateToTimeString(dateTime)}` as `${DateString} ${TimeString}` } /** * Filters out the errors that occurred during the Inventory Import process from the W603 CSV report. * * The data must include at minimum the following filters: * - Message Type = 'Information', 'Error' * - Application Type = 'Integration' * * Other data will be ignored. * @param messageLoggerData - Data parsed from the W603 CSV report * @returns - A list of errors that occurred during the Inventory Import process, * along with the file associated with each error. */ export function extractInventoryImportErrors( messageLoggerData: W603ReportRow[] ): InventoryImportError[] { /* * Ensure the data is sorted by the "messageId" column */ messageLoggerData.sort((a, b) => { const messageIdA = Number.parseInt(a.messageId === '' ? '0' : a.messageId) const messageIdB = Number.parseInt(b.messageId === '' ? '0' : b.messageId) return messageIdA - messageIdB }) /* * Build error list */ const errorData: InventoryImportError[] = [] let inventoryImportBlockStartMessageId: number | undefined for (const row of messageLoggerData) { if (row.messageId === '') { continue } if (row.message.trim().startsWith(inventoryImportBlockStartMessagePrefix)) { inventoryImportBlockStartMessageId = Number.parseInt(row.messageId) } if (row.message.trim().startsWith(inventoryImportBlockEndMessagePrefix)) { inventoryImportBlockStartMessageId = undefined } if (inventoryImportBlockStartMessageId !== undefined) { if (row.messageType === 'Error') { errorData.push({ messageId: Number.parseInt(row.messageId), messageDateTime: formatDateTime(row.messageDateTime), message: row.message }) } else if ( row.messageType === 'Information' && (row.message.includes(' file copied ') || row.message.includes(' file deleted ')) ) { const fileName = row.message .slice(0, Math.max(0, row.message.indexOf(' file '))) .trim() for (let index = errorData.length - 1; index >= 0; index--) { if ( errorData[index].fileName === undefined && errorData[index].messageId > inventoryImportBlockStartMessageId ) { errorData[index].fileName = fileName } else { break } } } } } /* * Return error list */ return errorData }