24 lines
1.7 KiB
TypeScript
24 lines
1.7 KiB
TypeScript
import { createRequire } from 'node:module';
|
|
import { resolve } from 'node:path';
|
|
const require = createRequire(import.meta.url);
|
|
type Json = Record<string, any>;
|
|
export const hotelBatch = require(resolve(process.cwd(), 'chrome-extension/ltjt-order-assistant/hotel-batch.js')) as {
|
|
inspect(value: unknown): null | { completed: number; failed: number; uncertain: number; total: number; not_started: number; allCompleted: boolean; knownStopped: boolean };
|
|
resultText(batch: unknown): string;
|
|
verified(result: unknown, identifier: unknown): boolean;
|
|
};
|
|
// Bind every row back to the server's immutable parsed operation, not a plugin-supplied plan.
|
|
export function hotelBatchMatchesOperation(operation: unknown, result: unknown): boolean {
|
|
const op = operation as Json, batch = (result as Json)?.hotel_batch;
|
|
if (op?.action !== 'arrangement_hotel' || !Array.isArray(op.data?.arrangements) || !hotelBatch.inspect(batch)
|
|
|| batch.group_number !== op.data.existing_refs?.identifier || batch.items.length !== op.data.arrangements.length) return false;
|
|
const canonical = (value: any): any => Array.isArray(value) ? value.map(canonical) : value && typeof value === 'object'
|
|
? Object.fromEntries(Object.keys(value).sort().map(key => [key, canonical(value[key])])) : value;
|
|
if (batch.items.some((item: Json, index: number) => JSON.stringify(canonical(item.arrangement)) !== JSON.stringify(canonical(op.data.arrangements[index])))) return false;
|
|
return true;
|
|
}
|
|
|
|
export function verifiedHotelBatchItems(operation: unknown, result: unknown): Json[] {
|
|
return hotelBatchMatchesOperation(operation, result) ? (result as Json).hotel_batch.items.filter((item: Json) => item.status === 'completed') : [];
|
|
}
|