Add seller performance dashboard charts
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 35s

This commit is contained in:
Cauê Faleiros
2026-06-24 13:24:28 -03:00
parent ca9615a1fd
commit ef27cff046
5 changed files with 262 additions and 12 deletions

View File

@@ -43,6 +43,13 @@ const CUSTOMER_IDENTITY_CTE = `
`;
const CUSTOMER_KEY_SQL = 'customer_key';
const TRAILING_SELLER_ID_SQL_PATTERN = '[[:space:]]*#([0-9]+)[[:space:]]*$';
const SELLER_ID_SQL = `
COALESCE(
NULLIF(TRIM(id_vendedor), ''),
substring(NULLIF(TRIM(nome_vendedor), '') from '${TRAILING_SELLER_ID_SQL_PATTERN}')
)
`;
const SELLER_NAME_SQL = `NULLIF(TRIM(regexp_replace(COALESCE(nome_vendedor, ''), '${TRAILING_SELLER_ID_SQL_PATTERN}', '')), '')`;
const getClientTokenSecret = () => (
process.env.CLIENT_TOKEN_SECRET ||
@@ -462,7 +469,7 @@ const buildRfmClients = (baseClients) => {
const getDashboardAnalytics = async (range = {}) => {
const { params, whereClause } = buildDateFilter(range);
const [totalsResult, salesResult, revenueResult] = await Promise.all([
const [totalsResult, salesResult, revenueResult, sellerRevenueResult, sellerOrdersResult] = await Promise.all([
pool.query(`
SELECT
COALESCE(SUM(quantidade * valor_unitario), 0) as total_revenue,
@@ -492,6 +499,50 @@ const getDashboardAnalytics = async (range = {}) => {
GROUP BY name
ORDER BY value DESC
LIMIT 10;
`, params),
pool.query(`
WITH seller_orders AS (
SELECT
COALESCE(${SELLER_ID_SQL}, 'name:' || ${SELLER_NAME_SQL}) as seller_key,
COALESCE(${SELLER_NAME_SQL}, ${SELLER_ID_SQL}, 'Sem vendedor') as seller_name,
quantidade,
valor_unitario,
pedido_id,
data_pedido,
valor_pedido
FROM orders
${whereClause}
AND (${SELLER_ID_SQL} IS NOT NULL OR ${SELLER_NAME_SQL} IS NOT NULL)
)
SELECT
seller_key as id,
MAX(seller_name) as name,
COALESCE(SUM(quantidade * valor_unitario), 0) as value
FROM seller_orders
GROUP BY seller_key
ORDER BY value DESC
LIMIT 10;
`, params),
pool.query(`
WITH seller_orders AS (
SELECT
COALESCE(${SELLER_ID_SQL}, 'name:' || ${SELLER_NAME_SQL}) as seller_key,
COALESCE(${SELLER_NAME_SQL}, ${SELLER_ID_SQL}, 'Sem vendedor') as seller_name,
pedido_id,
data_pedido,
valor_pedido
FROM orders
${whereClause}
AND (${SELLER_ID_SQL} IS NOT NULL OR ${SELLER_NAME_SQL} IS NOT NULL)
)
SELECT
seller_key as id,
MAX(seller_name) as name,
COUNT(DISTINCT COALESCE(NULLIF(pedido_id, ''), data_pedido || '_' || valor_pedido::text))::int as value
FROM seller_orders
GROUP BY seller_key
ORDER BY value DESC
LIMIT 10;
`, params)
]);
@@ -517,6 +568,16 @@ const getDashboardAnalytics = async (range = {}) => {
name: row.name,
id: row.id,
value: toNumber(row.value)
})),
revenueBySeller: sellerRevenueResult.rows.map(row => ({
name: row.name,
id: row.id,
value: toNumber(row.value)
})),
ordersBySeller: sellerOrdersResult.rows.map(row => ({
name: row.name,
id: row.id,
value: toNumber(row.value)
}))
};
};
@@ -717,11 +778,8 @@ const getClientFilterOptions = async () => {
pool.query(`
WITH seller_options AS (
SELECT
COALESCE(
NULLIF(TRIM(id_vendedor), ''),
substring(NULLIF(TRIM(nome_vendedor), '') from '${TRAILING_SELLER_ID_SQL_PATTERN}')
) as id,
NULLIF(TRIM(regexp_replace(COALESCE(nome_vendedor, ''), '${TRAILING_SELLER_ID_SQL_PATTERN}', '')), '') as name
${SELLER_ID_SQL} as id,
${SELLER_NAME_SQL} as name
FROM orders
WHERE (
NULLIF(TRIM(id_vendedor), '') IS NOT NULL