sfcc-cip-analytics-client
Version:
SFCC Commerce Intelligence Platform Analytics Client
138 lines (137 loc) • 4.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.querySalesSummary = exports.querySalesAnalytics = void 0;
const types_1 = require("../types");
const helpers_1 = require("../helpers");
/**
* Query sales analytics data to track daily performance with automatic AOV/AOS calculations
* Business Question: How is my business performing across revenue and orders?
* Primary users: Merchandising teams
* @param client The Avatica client instance (must have an open connection)
* @param params Query parameters including siteId and dateRange
* @param batchSize Size of each batch to yield (default: 100)
*/
const querySalesAnalytics = async function* querySalesAnalytics(client, params, batchSize = 100) {
const { sql, parameters } = querySalesAnalytics.QUERY(params);
yield* (0, helpers_1.executeParameterizedQuery)(client, (0, types_1.cleanSQL)(sql), parameters, batchSize);
};
exports.querySalesAnalytics = querySalesAnalytics;
exports.querySalesAnalytics.metadata = {
name: "sales-analytics",
description: "Track daily sales performance with automatic AOV and AOS calculations",
category: "Sales Analytics",
requiredParams: ["siteId", "from", "to"],
};
exports.querySalesAnalytics.QUERY = (params) => {
(0, helpers_1.validateRequiredParams)(params, ["siteId", "dateRange"]);
const { startDate, endDate } = (0, helpers_1.formatDateRange)(params.dateRange);
const sql = `
SELECT
CAST(ss.submit_date AS VARCHAR) AS "date",
SUM(std_revenue) AS std_revenue,
SUM(num_orders) AS orders,
CAST(SUM(std_revenue) / SUM(num_orders) AS DECIMAL(15,2)) AS std_aov,
SUM(num_units) AS units,
CAST(SUM(num_units) / SUM(num_orders) AS DECIMAL(15,2)) AS aos,
SUM(std_tax) AS std_tax,
SUM(std_shipping) AS std_shipping
FROM ccdw_aggr_sales_summary ss
JOIN ccdw_dim_site s
ON s.site_id = ss.site_id
WHERE ss.submit_date >= '${startDate}'
AND ss.submit_date <= '${endDate}'
AND s.nsite_id = '${params.siteId}'
GROUP BY ss.submit_date
ORDER BY ss.submit_date
`;
return {
sql,
parameters: [],
};
};
/**
* Query raw sales summary data for custom aggregations
* @param client The Avatica client instance (must have an open connection)
* @param params Query parameters including optional filters
* @param batchSize Size of each batch to yield (default: 100)
*/
const querySalesSummary = async function* querySalesSummary(client, params, batchSize = 100) {
// Ensure dateRange has a default if not provided
const queryParams = {
...params,
dateRange: params.dateRange || { startDate: new Date(0), endDate: new Date() },
};
const { sql, parameters } = querySalesSummary.QUERY(queryParams);
yield* (0, helpers_1.executeParameterizedQuery)(client, (0, types_1.cleanSQL)(sql), parameters, batchSize);
};
exports.querySalesSummary = querySalesSummary;
exports.querySalesSummary.metadata = {
name: "sales-summary",
description: "Query raw sales summary data for custom aggregations",
category: "Sales Analytics",
requiredParams: [],
optionalParams: ["siteId", "deviceClassCode", "registered", "from", "to"],
};
exports.querySalesSummary.QUERY = (params) => {
(0, helpers_1.validateRequiredParams)(params, ["dateRange"]);
let sql = '';
const joins = [];
const conditions = [];
if (params.siteId) {
sql = `
SELECT
ss.submit_date,
ss.site_id,
ss.business_channel_id,
ss.registered,
ss.first_time_buyer,
ss.device_class_code,
ss.locale_code,
ss.std_revenue,
ss.num_orders,
ss.num_units,
ss.std_tax,
ss.std_shipping,
ss.std_total_discount
FROM ccdw_aggr_sales_summary ss
JOIN ccdw_dim_site s ON s.site_id = ss.site_id
`;
conditions.push(`s.nsite_id = '${params.siteId}'`);
}
else {
sql = `
SELECT
submit_date,
site_id,
business_channel_id,
registered,
first_time_buyer,
device_class_code,
locale_code,
std_revenue,
num_orders,
num_units,
std_tax,
std_shipping,
std_total_discount
FROM ccdw_aggr_sales_summary
`;
}
if (params.dateRange) {
const { startDate, endDate } = (0, helpers_1.formatDateRange)(params.dateRange);
conditions.push(`submit_date >= '${startDate}' AND submit_date <= '${endDate}'`);
}
if (params.deviceClassCode) {
conditions.push(`device_class_code = '${params.deviceClassCode}'`);
}
if (params.registered !== undefined) {
conditions.push(`registered = ${params.registered}`);
}
if (conditions.length > 0) {
sql += ' WHERE ' + conditions.join(' AND ');
}
return {
sql,
parameters: [],
};
};