174 lines
4.3 KiB
TypeScript
174 lines
4.3 KiB
TypeScript
/**
|
|
* Device information lookup utilities
|
|
* Provides manufacturer and model information based on serial number patterns
|
|
*/
|
|
|
|
interface DeviceInfo {
|
|
manufacturer: string;
|
|
modelFamily?: string;
|
|
estimatedModel?: string;
|
|
}
|
|
|
|
/**
|
|
* Look up device information based on serial number
|
|
*/
|
|
export function lookupDeviceBySerial(serialNumber: string | undefined): DeviceInfo | null {
|
|
if (!serialNumber) return null;
|
|
|
|
const serial = serialNumber.toUpperCase().trim();
|
|
|
|
// Dell serial numbers (7 characters, alphanumeric)
|
|
if (/^[A-Z0-9]{7}$/.test(serial)) {
|
|
return {
|
|
manufacturer: 'Dell Inc.',
|
|
modelFamily: 'Dell',
|
|
estimatedModel: identifyDellModel(serial)
|
|
};
|
|
}
|
|
|
|
// HP serial numbers (often start with specific patterns)
|
|
if (/^(CNU|2UA|CND|CNF|MXL|SGH|USE|5CD|5CG)[A-Z0-9]+/.test(serial)) {
|
|
return {
|
|
manufacturer: 'HP',
|
|
modelFamily: 'HP',
|
|
estimatedModel: identifyHPModel(serial)
|
|
};
|
|
}
|
|
|
|
// Lenovo serial numbers (often start with specific patterns)
|
|
if (/^(MJ|PF|MP|R9|S4|PC|PB)[A-Z0-9]+/.test(serial)) {
|
|
return {
|
|
manufacturer: 'Lenovo',
|
|
modelFamily: 'ThinkPad/ThinkCentre',
|
|
estimatedModel: identifyLenovoModel(serial)
|
|
};
|
|
}
|
|
|
|
// Apple serial numbers (12 characters)
|
|
if (/^[A-Z0-9]{12}$/.test(serial)) {
|
|
const yearCode = serial.substring(3, 4);
|
|
if (['P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z'].includes(yearCode)) {
|
|
return {
|
|
manufacturer: 'Apple Inc.',
|
|
modelFamily: 'Mac',
|
|
estimatedModel: identifyAppleModel(serial)
|
|
};
|
|
}
|
|
}
|
|
|
|
// Microsoft Surface (often starts with specific patterns)
|
|
if (/^[0-9]{12}$/.test(serial) || serial.startsWith('00')) {
|
|
return {
|
|
manufacturer: 'Microsoft',
|
|
modelFamily: 'Surface',
|
|
estimatedModel: 'Surface Device'
|
|
};
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Identify Dell model based on service tag patterns
|
|
*/
|
|
function identifyDellModel(serial: string): string {
|
|
// Dell service tags can indicate model families
|
|
// This is a simplified example - real implementation would need more patterns
|
|
const firstChar = serial[0];
|
|
|
|
if (['H', 'J', 'K'].includes(firstChar)) {
|
|
return 'OptiPlex Desktop';
|
|
} else if (['F', 'G'].includes(firstChar)) {
|
|
return 'Latitude Laptop';
|
|
} else if (['D', 'C'].includes(firstChar)) {
|
|
return 'Precision Workstation';
|
|
}
|
|
|
|
return 'Dell Computer';
|
|
}
|
|
|
|
/**
|
|
* Identify HP model based on serial patterns
|
|
*/
|
|
function identifyHPModel(serial: string): string {
|
|
const prefix = serial.substring(0, 3);
|
|
|
|
switch (prefix) {
|
|
case 'CNU':
|
|
case 'CND':
|
|
return 'HP ProBook/EliteBook';
|
|
case '2UA':
|
|
case '5CD':
|
|
case '5CG':
|
|
return 'HP Desktop/Workstation';
|
|
case 'MXL':
|
|
return 'HP ProDesk';
|
|
case 'SGH':
|
|
return 'HP Server';
|
|
default:
|
|
return 'HP Computer';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Identify Lenovo model based on serial patterns
|
|
*/
|
|
function identifyLenovoModel(serial: string): string {
|
|
const prefix = serial.substring(0, 2);
|
|
|
|
switch (prefix) {
|
|
case 'MJ':
|
|
return 'ThinkCentre Desktop';
|
|
case 'PF':
|
|
case 'PC':
|
|
case 'PB':
|
|
return 'ThinkPad Laptop';
|
|
case 'MP':
|
|
return 'ThinkStation';
|
|
case 'R9':
|
|
case 'S4':
|
|
return 'IdeaPad/Yoga';
|
|
default:
|
|
return 'Lenovo Computer';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Identify Apple model based on serial number
|
|
*/
|
|
function identifyAppleModel(serial: string): string {
|
|
// Apple serial numbers encode model info in positions 4-5
|
|
const modelCode = serial.substring(4, 6);
|
|
|
|
// This is a simplified mapping - real implementation would need comprehensive list
|
|
if (modelCode.startsWith('M')) {
|
|
return 'MacBook Pro';
|
|
} else if (modelCode.startsWith('F')) {
|
|
return 'MacBook Air';
|
|
} else if (modelCode.startsWith('G')) {
|
|
return 'iMac';
|
|
} else if (modelCode.startsWith('J')) {
|
|
return 'Mac mini';
|
|
} else if (modelCode.startsWith('P')) {
|
|
return 'Mac Studio/Pro';
|
|
}
|
|
|
|
return 'Mac Computer';
|
|
}
|
|
|
|
/**
|
|
* Format device information for display
|
|
*/
|
|
export function formatDeviceInfo(info: DeviceInfo | null): string {
|
|
if (!info) return 'Unknown Device';
|
|
|
|
if (info.estimatedModel) {
|
|
return `${info.manufacturer} - ${info.estimatedModel}`;
|
|
}
|
|
|
|
if (info.modelFamily) {
|
|
return `${info.manufacturer} ${info.modelFamily}`;
|
|
}
|
|
|
|
return info.manufacturer;
|
|
}
|