mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-07 16:19:01 +00:00
115 lines
3.6 KiB
TypeScript
115 lines
3.6 KiB
TypeScript
import type {
|
|
CompletionDocTemplateOption,
|
|
LinkedServiceTemplate,
|
|
Service,
|
|
ServiceWorkOrderType,
|
|
} from "@/domain/services/types/service";
|
|
|
|
function asRecord(raw: unknown): Record<string, unknown> {
|
|
return typeof raw === "object" && raw !== null ? (raw as Record<string, unknown>) : {};
|
|
}
|
|
|
|
function readString(record: Record<string, unknown>, ...keys: string[]): string {
|
|
for (const key of keys) {
|
|
const value = record[key];
|
|
if (typeof value === "string") return value.trim();
|
|
if (typeof value === "number") return String(value);
|
|
}
|
|
return "";
|
|
}
|
|
|
|
function readId(record: Record<string, unknown>): string | number {
|
|
const value = record.id ?? record.Id;
|
|
return typeof value === "string" || typeof value === "number" ? value : "";
|
|
}
|
|
|
|
function readBool(record: Record<string, unknown>, ...keys: string[]): boolean {
|
|
for (const key of keys) {
|
|
const value = record[key];
|
|
if (typeof value === "boolean") return value;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function mapWorkOrderType(value: unknown): ServiceWorkOrderType | null {
|
|
if (typeof value === "number") {
|
|
return value === 2 ? "PM" : value === 3 ? "Emergency" : value === 6 ? "Reactive" : null;
|
|
}
|
|
if (typeof value !== "string") return null;
|
|
const normalized = value.trim().toLowerCase();
|
|
return normalized === "pm" || normalized === "preventivemaintenance"
|
|
? "PM"
|
|
: normalized === "emergency"
|
|
? "Emergency"
|
|
: normalized === "reactive"
|
|
? "Reactive"
|
|
: null;
|
|
}
|
|
|
|
function mapTemplate(raw: unknown): LinkedServiceTemplate | null {
|
|
if (!raw) return null;
|
|
const record = asRecord(raw);
|
|
const id = readId(record);
|
|
return id === "" ? null : { id, name: readString(record, "name", "Name") };
|
|
}
|
|
|
|
export function mapService(raw: unknown): Service {
|
|
const record = asRecord(raw);
|
|
const types = record.supportedWorkOrderTypes ?? record.SupportedWorkOrderTypes;
|
|
return {
|
|
id: readId(record),
|
|
name: readString(record, "name", "Name"),
|
|
trade: readString(record, "trade", "Trade"),
|
|
iconKey: readString(record, "iconKey", "IconKey"),
|
|
requiresCompletionDocument: readBool(
|
|
record,
|
|
"requiresCompletionDocument",
|
|
"RequiresCompletionDocument",
|
|
),
|
|
completionDocTemplate:
|
|
mapTemplate(record.completionDocTemplate ?? record.CompletionDocTemplate) ??
|
|
mapTemplate({
|
|
id: record.completionDocTemplateId ?? record.CompletionDocTemplateId,
|
|
}),
|
|
isActive: readBool(record, "isActive", "IsActive"),
|
|
supportedWorkOrderTypes: Array.isArray(types)
|
|
? types.flatMap((value) => {
|
|
const mapped = mapWorkOrderType(value);
|
|
return mapped ? [mapped] : [];
|
|
})
|
|
: [],
|
|
};
|
|
}
|
|
|
|
export function mapServices(raw: unknown): Service[] {
|
|
const items = asRecord(raw);
|
|
const payload = Array.isArray(raw)
|
|
? raw
|
|
: (items.items ?? items.Items ?? items.data ?? items.Data);
|
|
return Array.isArray(payload)
|
|
? payload.map(mapService).filter((service) => service.id !== "")
|
|
: [];
|
|
}
|
|
|
|
export function mapCompletionDocTemplates(raw: unknown): CompletionDocTemplateOption[] {
|
|
const payload = Array.isArray(raw)
|
|
? raw
|
|
: (() => {
|
|
const record = asRecord(raw);
|
|
return record.items ?? record.Items ?? record.data ?? record.Data;
|
|
})();
|
|
return Array.isArray(payload)
|
|
? payload.flatMap((item) => {
|
|
const record = asRecord(item);
|
|
const id = readId(record);
|
|
return id === ""
|
|
? []
|
|
: [
|
|
{
|
|
id,
|
|
name: readString(record, "name", "Name"),
|
|
} satisfies CompletionDocTemplateOption,
|
|
];
|
|
})
|
|
: [];
|
|
}
|