Refine seller dashboard chart
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 1m24s
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 1m24s
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import type { DashboardAnalytics, DateRange, OrderData } from '../types';
|
||||
import { filterOrdersByDateRange, getBaseProductName, getOrderItemRevenue } from './orders';
|
||||
import { filterOrdersByDateRange, getBaseProductName, getOrderItemRevenue, parseOrderDate } from './orders';
|
||||
import { formatDisplayName, removeTrailingSellerId } from '../displayFormatters';
|
||||
|
||||
const COLORS = [
|
||||
@@ -27,6 +27,11 @@ export interface ChartProductMetric {
|
||||
fill: string;
|
||||
}
|
||||
|
||||
export interface SellerDateRevenueMetric extends ChartProductMetric {
|
||||
date: string;
|
||||
orders: number;
|
||||
}
|
||||
|
||||
export interface DashboardMetrics {
|
||||
totalRevenue: number;
|
||||
totalOrders: number;
|
||||
@@ -35,6 +40,7 @@ export interface DashboardMetrics {
|
||||
revenueByProduct: ChartProductMetric[];
|
||||
revenueBySeller: ChartProductMetric[];
|
||||
ordersBySeller: ChartProductMetric[];
|
||||
sellerRevenueByDate: SellerDateRevenueMetric[];
|
||||
}
|
||||
|
||||
export const applyDashboardColors = (metrics: DashboardAnalytics): DashboardMetrics => {
|
||||
@@ -42,7 +48,8 @@ export const applyDashboardColors = (metrics: DashboardAnalytics): DashboardMetr
|
||||
...metrics.salesByProduct.map(product => product.name),
|
||||
...metrics.revenueByProduct.map(product => product.name),
|
||||
...(metrics.revenueBySeller || []).map(seller => seller.name),
|
||||
...(metrics.ordersBySeller || []).map(seller => seller.name)
|
||||
...(metrics.ordersBySeller || []).map(seller => seller.name),
|
||||
...(metrics.sellerRevenueByDate || []).map(seller => seller.name)
|
||||
])).sort();
|
||||
const productColors = displayProducts.reduce<Record<string, string>>((colors, name) => {
|
||||
colors[name] = getProductColor(name);
|
||||
@@ -70,6 +77,12 @@ export const applyDashboardColors = (metrics: DashboardAnalytics): DashboardMetr
|
||||
...seller,
|
||||
name: formatDisplayName(removeTrailingSellerId(seller.name)),
|
||||
fill: productColors[seller.name]
|
||||
})),
|
||||
sellerRevenueByDate: (metrics.sellerRevenueByDate || []).map(seller => ({
|
||||
...seller,
|
||||
name: formatDisplayName(removeTrailingSellerId(seller.name)),
|
||||
orders: seller.orders || 0,
|
||||
fill: productColors[seller.name]
|
||||
}))
|
||||
};
|
||||
};
|
||||
@@ -82,6 +95,8 @@ export const buildDashboardMetrics = (ordersData: OrderData[], dateRange: DateRa
|
||||
const productRevenueMap: Record<string, number> = {};
|
||||
const productNameIdMap: Record<string, string> = {};
|
||||
const sellerRevenueMap: Record<string, number> = {};
|
||||
const sellerRevenueByDateMap: Record<string, Record<string, number>> = {};
|
||||
const sellerOrderKeysByDateMap: Record<string, Record<string, Set<string>>> = {};
|
||||
const sellerOrderKeysMap: Record<string, Set<string>> = {};
|
||||
const sellerIdMap: Record<string, string> = {};
|
||||
|
||||
@@ -99,8 +114,18 @@ export const buildDashboardMetrics = (ordersData: OrderData[], dateRange: DateRa
|
||||
productRevenueMap[productName] = (productRevenueMap[productName] || 0) + itemRevenue;
|
||||
|
||||
if (sellerName) {
|
||||
const parsedOrderDate = parseOrderDate(order.Data_Pedido);
|
||||
const dateKey = Number.isNaN(parsedOrderDate.getTime())
|
||||
? order.Data_Pedido
|
||||
: parsedOrderDate.toISOString().slice(0, 10);
|
||||
|
||||
sellerIdMap[sellerName] = sellerId;
|
||||
sellerRevenueMap[sellerName] = (sellerRevenueMap[sellerName] || 0) + itemRevenue;
|
||||
if (!sellerRevenueByDateMap[sellerName]) sellerRevenueByDateMap[sellerName] = {};
|
||||
sellerRevenueByDateMap[sellerName][dateKey] = (sellerRevenueByDateMap[sellerName][dateKey] || 0) + itemRevenue;
|
||||
if (!sellerOrderKeysByDateMap[sellerName]) sellerOrderKeysByDateMap[sellerName] = {};
|
||||
if (!sellerOrderKeysByDateMap[sellerName][dateKey]) sellerOrderKeysByDateMap[sellerName][dateKey] = new Set();
|
||||
sellerOrderKeysByDateMap[sellerName][dateKey].add(orderKey);
|
||||
if (!sellerOrderKeysMap[sellerName]) sellerOrderKeysMap[sellerName] = new Set();
|
||||
sellerOrderKeysMap[sellerName].add(orderKey);
|
||||
}
|
||||
@@ -144,6 +169,19 @@ export const buildDashboardMetrics = (ordersData: OrderData[], dateRange: DateRa
|
||||
fill: getProductColor(name)
|
||||
}));
|
||||
|
||||
const sellerRevenueByDate = topSellerRevenueNames.flatMap(name => (
|
||||
Object.keys(sellerRevenueByDateMap[name] || {})
|
||||
.sort()
|
||||
.map(date => ({
|
||||
name,
|
||||
id: sellerIdMap[name],
|
||||
date,
|
||||
value: sellerRevenueByDateMap[name][date],
|
||||
orders: sellerOrderKeysByDateMap[name]?.[date]?.size || 0,
|
||||
fill: getProductColor(name)
|
||||
}))
|
||||
));
|
||||
|
||||
return {
|
||||
totalRevenue: revenue,
|
||||
totalOrders: totalItems,
|
||||
@@ -151,6 +189,7 @@ export const buildDashboardMetrics = (ordersData: OrderData[], dateRange: DateRa
|
||||
salesByProduct,
|
||||
revenueByProduct,
|
||||
revenueBySeller,
|
||||
ordersBySeller
|
||||
ordersBySeller,
|
||||
sellerRevenueByDate
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user