Add period metrics to client details
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 54s

This commit is contained in:
Cauê Faleiros
2026-06-16 16:07:37 -03:00
parent c8d475808b
commit 37067751c7
2 changed files with 174 additions and 73 deletions

View File

@@ -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
};
};