@open-tender/utils
Version:
A library of utils for use with Open Tender applications that utilize our cloud-based Order API.
186 lines (185 loc) • 6.69 kB
JavaScript
import { prepStatus, tenderTypeNamesMap } from './constants';
import { capitalize } from './helpers';
export const makeChannelName = (channel) => {
switch (channel.type) {
case 'ONLINE':
return 'Web';
case 'APP':
return 'App';
case 'PORTAL':
return channel.ext_name;
default:
return channel.type;
}
};
export const makeTenderTypeName = (tenderType) => {
const name = tenderTypeNamesMap[tenderType];
return name || capitalize(tenderType.replace('_', ' '));
};
export const notDone = (prep_status) => {
const notDoneStates = [prepStatus.TODO, prepStatus.IN_PROGRESS];
return notDoneStates.includes(prep_status);
};
export const isDone = (prep_status) => {
const doneStates = [
prepStatus.DONE,
prepStatus.COMPLETED,
prepStatus.FULFILLED
];
return doneStates.includes(prep_status);
};
export const notCompleted = (prep_status) => {
const notCompletedStates = [
prepStatus.TODO,
prepStatus.IN_PROGRESS,
prepStatus.DONE
];
return notCompletedStates.includes(prep_status);
};
export const isCompleted = (prep_status) => {
const completeStates = [prepStatus.COMPLETED, prepStatus.FULFILLED];
return completeStates.includes(prep_status);
};
// const updateCounts = (
// counts: OrderCounts,
// ticketCounts: Record<string, number>
// ) => {
// // console.log('BEFORE', counts, ticketCounts)
// const updated: any = Object.entries(counts).reduce((obj, [key, count]) => {
// return { ...obj, [key]: count + (ticketCounts[key] || 0) }
// }, {})
// updated.Orders = counts.Orders + 1
// // console.log('AFTER', updated)
// return updated
// }
// export const makeOrdersCounts = (
// itemTypes: ItemTypes = [],
// orders: Orders = []
// ) => {
// const itemTypeCounts = itemTypes
// .filter(i => i.is_default)
// .reduce((obj, i) => ({ ...obj, [i.name]: 0 }), {})
// let current = { Orders: 0, ...itemTypeCounts }
// let qa = { Orders: 0, ...itemTypeCounts }
// let future = { Orders: 0, ...itemTypeCounts }
// const openOrders = orders.filter(i => notCompleted(i.prep_status))
// openOrders.forEach(order => {
// const tz = timezoneMap[order.timezone] as TimezonePython
// const fireDate = isoToDate(order.fire_at as ISOString, tz)
// const currentDate = currentLocalDate(tz)
// const isDone = order.prep_status === prepStatus.DONE
// const isCurrent = fireDate < currentDate
// const ticketCounts = order.tickets?.reduce((obj: any, ticket) => {
// const count = obj[ticket.item_type_name] || 0
// return {
// ...obj,
// [ticket.item_type_name]: count + ticket.item_nos.length
// }
// }, {})
// if (isDone) {
// qa = updateCounts(qa as any, ticketCounts)
// } else if (isCurrent) {
// current = updateCounts(current as any, ticketCounts)
// } else {
// future = updateCounts(future as any, ticketCounts)
// }
// })
// return { current, future, qa }
// }
// export const makeOrderBuckets = (
// orders: Orders,
// tz: TimezonePython | Timezone,
// prepStates: Array<PrepStatus> = []
// ) => {
// const intervals = makeIntervals(tz)
// const withOrders = intervals.map(i => {
// const inBucket = orders.filter(order => {
// const incomplete = prepStates.includes(order.prep_status)
// const readyAt = isoToDate(order.ready_at as ISOString, tz)
// return incomplete && i.start < readyAt && readyAt <= i.end
// })
// return { ...i, orders: inBucket }
// })
// return withOrders
// }
// export const makeOrderBucketsCounts = (
// itemTypes: ItemTypes = [],
// orders: Orders = []
// ) => {
// const itemTypeCounts = itemTypes
// .filter(i => i.is_default)
// .reduce((obj, i) => ({ ...obj, [i.name]: 0 }), {})
// let counts = { Orders: 0, ...itemTypeCounts }
// orders.forEach(order => {
// const ticketCounts = order.tickets?.reduce((obj: any, ticket) => {
// const count = obj[ticket.item_type_name] || 0
// return {
// ...obj,
// [ticket.item_type_name]: count + ticket.item_nos.length
// }
// }, {})
// counts = updateCounts(counts as any, ticketCounts)
// })
// return counts
// }
export const makeTicketCounts = (tickets) => {
return tickets.reduce((obj, i) => {
const count = obj[i.item_type_id] || 0;
return Object.assign(Object.assign({}, obj), { [i.item_type_id]: count + i.item_nos.length });
}, {});
};
export const makeCartLookup = (cart) => {
return cart.reduce((obj, i) => (i.item_no ? Object.assign(Object.assign({}, obj), { [i.item_no]: i }) : Object.assign({}, obj)), {});
};
export const makeItemTypeSettings = (itemType) => {
const { is_default, is_grouped, is_hidden_assembly, is_hidden_qa, print_on_completed } = itemType || {};
return {
is_default,
is_grouped,
is_hidden_assembly,
is_hidden_qa,
print_on_completed
};
};
export const makeItemTypesMap = (itemTypes) => {
return itemTypes
? itemTypes.reduce((obj, i) => (Object.assign(Object.assign({}, obj), { [i.item_type_id]: i })), {})
: {};
};
export const makeTicketGroups = (tickets, cart, itemTypes, isAssembly) => {
const lookup = makeCartLookup(cart);
const grouped = tickets.reduce((obj, i) => {
const items = i.item_nos.map(n => lookup[n]);
const settings = makeItemTypeSettings(itemTypes[i.item_type_id]);
const hideTicket = isAssembly && settings.is_hidden_assembly;
const ticket = Object.assign(Object.assign(Object.assign({}, i), { items }), settings);
const group = obj[i.item_type_id] || [];
const newGroup = hideTicket ? group : [...group, ticket];
return Object.assign(Object.assign({}, obj), { [i.item_type_id]: newGroup });
}, {});
return Object.values(grouped);
};
export const makeDisplayCounts = (counts) => {
if (!counts)
return '';
return Object.entries(counts).map(([, value]) => value);
};
export const displayCounts = (counts) => {
if (!counts)
return '';
const countStr = Object.entries(counts)
// .map(([key, value]) => `${value}-${key.charAt(0)}`)
.map(([, value]) => `${value}`)
.join('/');
return ` (${countStr})`;
};
export const makeColor = (settings, minutes) => {
const { warning_minutes, alert_minutes } = settings || {};
if (!warning_minutes && !alert_minutes)
return '';
return minutes < warning_minutes
? 'warning'
: minutes < alert_minutes
? 'alert'
: 'text';
};