Add period metrics to client details
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 54s
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 54s
This commit is contained in:
@@ -33,10 +33,18 @@ export interface GroupedClientOrder {
|
||||
}
|
||||
|
||||
export interface ClientDetailsMetrics {
|
||||
chartData: Array<{
|
||||
date: string;
|
||||
value: number;
|
||||
}>;
|
||||
groupedOrders: GroupedClientOrder[];
|
||||
totalSpent: number;
|
||||
totalItems: number;
|
||||
allTimeOrderCount: number;
|
||||
clientPhone: string;
|
||||
hasClient: boolean;
|
||||
periodAverageTicket: number;
|
||||
periodOrderCount: number;
|
||||
periodSpent: number;
|
||||
periodItems: number;
|
||||
}
|
||||
|
||||
const scoreTertile = (value: number, values: number[], higherIsBetter = true) => {
|
||||
@@ -162,18 +170,23 @@ export const buildClientsSummary = (
|
||||
});
|
||||
};
|
||||
|
||||
export const buildClientDetailsMetrics = (ordersData: OrderData[], clientName: string): ClientDetailsMetrics => {
|
||||
export const buildClientDetailsMetrics = (ordersData: OrderData[], clientName: string, dateRange: DateRange): ClientDetailsMetrics => {
|
||||
const clientOrders = ordersData.filter(order => getClientDisplayName(order) === clientName);
|
||||
const periodOrders = filterOrdersByDateRange(clientOrders, dateRange);
|
||||
const groupedOrdersMap: Record<string, GroupedClientOrder> = {};
|
||||
const spentByDate: Record<string, number> = {};
|
||||
let clientPhone = '';
|
||||
let totalSpent = 0;
|
||||
let totalItems = 0;
|
||||
let periodSpent = 0;
|
||||
let periodItems = 0;
|
||||
|
||||
clientOrders.forEach(order => {
|
||||
if (order.Fone_Cliente && !clientPhone) clientPhone = order.Fone_Cliente;
|
||||
});
|
||||
|
||||
totalSpent += getOrderItemRevenue(order);
|
||||
totalItems += order.Quantidade;
|
||||
periodOrders.forEach(order => {
|
||||
periodSpent += getOrderItemRevenue(order);
|
||||
periodItems += order.Quantidade;
|
||||
spentByDate[order.Data_Pedido] = (spentByDate[order.Data_Pedido] || 0) + getOrderItemRevenue(order);
|
||||
|
||||
const key = order.ID_Pedido || `${order.Data_Pedido}_${order.Valor_Pedido}`;
|
||||
if (!groupedOrdersMap[key]) {
|
||||
@@ -191,5 +204,22 @@ export const buildClientDetailsMetrics = (ordersData: OrderData[], clientName: s
|
||||
return parseOrderDate(b.date).getTime() - parseOrderDate(a.date).getTime();
|
||||
});
|
||||
|
||||
return { groupedOrders, totalSpent, totalItems, clientPhone };
|
||||
const allTimeOrderIds = new Set(clientOrders.map(order => order.ID_Pedido || `${order.Data_Pedido}_${order.Valor_Pedido}`));
|
||||
const periodOrderCount = groupedOrders.length;
|
||||
const chartData = Object.keys(spentByDate).map(date => ({
|
||||
date,
|
||||
value: spentByDate[date]
|
||||
})).sort((a, b) => parseOrderDate(a.date).getTime() - parseOrderDate(b.date).getTime());
|
||||
|
||||
return {
|
||||
chartData,
|
||||
groupedOrders,
|
||||
allTimeOrderCount: allTimeOrderIds.size,
|
||||
clientPhone,
|
||||
hasClient: clientOrders.length > 0,
|
||||
periodAverageTicket: periodOrderCount ? periodSpent / periodOrderCount : 0,
|
||||
periodOrderCount,
|
||||
periodSpent,
|
||||
periodItems
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user