pos-be/src/modules/queue/domain/usecases/formula/queue-condition.formula.ts

42 lines
1.2 KiB
TypeScript

import { QueueModel } from 'src/modules/queue/data/models/queue.model';
import { toTime } from '../../helpers/time.helper';
import * as math from 'mathjs';
export class QueueCondition {
private ticketItems = {};
constructor(readonly items: QueueModel[]) {
items.forEach((item) => {
const item_id = item.item_queue_id;
const currentItem = this.ticketItems[item_id];
this.ticketItems[item_id] = currentItem ? [...currentItem, item] : [item];
});
}
condition(item_id: string) {
const queues: QueueModel[] = this.ticketItems[item_id] ?? [];
const time = queues[0];
const nearest = time ? toTime(time.time) : 0;
const last = [...queues].pop();
const lastTime = last ? toTime(last.time) : 0;
return {
available: queues.length == 0,
average: this.averageTime(queues),
nearest: nearest,
crowded_level: queues.length,
available_time: lastTime,
};
}
averageTime(queues: QueueModel[]) {
if (queues.length == 0) return 0;
const calledQueue = queues.filter((q) => q.status === 'called');
const times = calledQueue.map((queue) => {
return queue.call_time - queue.time;
});
return math.sum(times) / times.length;
}
}