113 lines
3.4 KiB
TypeScript
113 lines
3.4 KiB
TypeScript
import { FeedSackColumnConfig } from '../types/counting.ts';
|
|
|
|
export function getFeedSackColumnType(cameraName: string): 'inbound' | 'usage' | 'outbound' {
|
|
if (cameraName.includes('karung_masuk')) return 'inbound';
|
|
if (cameraName.includes('karung_keluar')) return 'outbound';
|
|
return 'usage';
|
|
}
|
|
|
|
export function inferKandangIdFromCameraName(cameraName: string): number | null {
|
|
const match = cameraName.toLowerCase().match(/^kandang_(\d+)_/);
|
|
if (!match) {
|
|
return null;
|
|
}
|
|
|
|
const parsed = Number(match[1]);
|
|
return Number.isFinite(parsed) ? parsed : null;
|
|
}
|
|
|
|
export function normalizeFeedSackColumnConfig(column: FeedSackColumnConfig): FeedSackColumnConfig {
|
|
const rawKandangId: unknown = (column as { kandangId?: unknown }).kandangId;
|
|
let kandangId: number | null = null;
|
|
|
|
if (typeof rawKandangId === 'number' && Number.isFinite(rawKandangId)) {
|
|
kandangId = rawKandangId;
|
|
} else if (typeof rawKandangId === 'string' && rawKandangId.trim().length > 0) {
|
|
const parsed = Number(rawKandangId);
|
|
kandangId = Number.isFinite(parsed) ? parsed : null;
|
|
} else if (rawKandangId === undefined) {
|
|
kandangId = inferKandangIdFromCameraName(column.cameraName);
|
|
}
|
|
|
|
return {
|
|
...column,
|
|
type: column.type || getFeedSackColumnType(column.cameraName),
|
|
kandangId,
|
|
};
|
|
}
|
|
|
|
export function normalizeFeedSackColumnConfigs(
|
|
columns: FeedSackColumnConfig[]
|
|
): FeedSackColumnConfig[] {
|
|
return columns.map(normalizeFeedSackColumnConfig);
|
|
}
|
|
|
|
export function getUsageCameraNamesForKandang(
|
|
columns: FeedSackColumnConfig[],
|
|
kandangId?: number | null,
|
|
kandangName?: string | null
|
|
): string[] {
|
|
const usageColumns = columns.filter((column) => column.type === 'usage');
|
|
|
|
if (kandangId !== null && kandangId !== undefined) {
|
|
const mappedCameras = usageColumns
|
|
.filter((column) => column.kandangId === kandangId)
|
|
.map((column) => column.cameraName);
|
|
|
|
if (mappedCameras.length > 0) {
|
|
return mappedCameras;
|
|
}
|
|
|
|
const inferredCameras = usageColumns
|
|
.filter((column) => inferKandangIdFromCameraName(column.cameraName) === kandangId)
|
|
.map((column) => column.cameraName);
|
|
|
|
if (inferredCameras.length > 0) {
|
|
return inferredCameras;
|
|
}
|
|
}
|
|
|
|
if (kandangName) {
|
|
const kandangNameLower = kandangName.toLowerCase();
|
|
const kandangPrefix = kandangNameLower.replace(/\s+/g, '_');
|
|
|
|
if (kandangNameLower.includes('atas')) {
|
|
const atasCameras = usageColumns
|
|
.filter(
|
|
(column) =>
|
|
column.cameraName.toLowerCase().includes('atas') ||
|
|
column.cameraName.toLowerCase().includes('kiri')
|
|
)
|
|
.map((column) => column.cameraName);
|
|
|
|
if (atasCameras.length > 0) {
|
|
return atasCameras;
|
|
}
|
|
}
|
|
|
|
if (kandangNameLower.includes('bawah')) {
|
|
const bawahCameras = usageColumns
|
|
.filter(
|
|
(column) =>
|
|
column.cameraName.toLowerCase().includes('bawah') ||
|
|
column.cameraName.toLowerCase().includes('kanan')
|
|
)
|
|
.map((column) => column.cameraName);
|
|
|
|
if (bawahCameras.length > 0) {
|
|
return bawahCameras;
|
|
}
|
|
}
|
|
|
|
const prefixedCameras = usageColumns
|
|
.filter((column) => column.cameraName.toLowerCase().startsWith(kandangPrefix))
|
|
.map((column) => column.cameraName);
|
|
|
|
if (prefixedCameras.length > 0) {
|
|
return prefixedCameras;
|
|
}
|
|
}
|
|
|
|
return usageColumns.map((column) => column.cameraName);
|
|
}
|