sfcc-cip-analytics-client
Version:
SFCC Commerce Intelligence Platform Analytics Client
96 lines (95 loc) • 4.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.queryProductCoPurchaseAnalysis = exports.queryTopSellingProducts = void 0;
const types_1 = require("../types");
const helpers_1 = require("../helpers");
/**
* Query top selling products by performance dimensions
* Business Question: How do my products perform across different channels?
* Primary users: Buyers and Merchandising teams
* @param client The Avatica client instance (must have an open connection)
* @param siteId The natural site ID to filter by
* @param dateRange Date range to filter results
* @param batchSize Size of each batch to yield (default: 100)
*/
const queryTopSellingProducts = function queryTopSellingProducts(client, params, batchSize = 100) {
const { sql, parameters } = queryTopSellingProducts.QUERY(params);
return (0, helpers_1.executeParameterizedQuery)(client, (0, types_1.cleanSQL)(sql), parameters, batchSize);
};
exports.queryTopSellingProducts = queryTopSellingProducts;
exports.queryTopSellingProducts.metadata = {
name: "top-selling-products",
description: "Analyze product performance across different channels and dimensions",
category: "Product Analytics",
requiredParams: ["siteId", "from", "to"],
};
exports.queryTopSellingProducts.QUERY = (params) => {
(0, helpers_1.validateRequiredParams)(params, ["siteId", "dateRange"]);
const { startDate, endDate } = (0, helpers_1.formatDateRange)(params.dateRange);
const sql = `
SELECT
p.nproduct_id,
p.product_display_name,
SUM(pss.num_units) as units_sold,
SUM(pss.std_revenue) as std_revenue,
SUM(pss.num_orders) as order_count,
pss.device_class_code,
pss.registered,
s.nsite_id
FROM ccdw_aggr_product_sales_summary pss
JOIN ccdw_dim_product p ON p.product_id = pss.product_id
JOIN ccdw_dim_site s ON s.site_id = pss.site_id
WHERE pss.submit_date >= '${startDate}' AND pss.submit_date <= '${endDate}'
AND s.nsite_id = '${params.siteId}'
GROUP BY p.nproduct_id, p.product_display_name, pss.device_class_code, pss.registered, s.nsite_id
ORDER BY std_revenue DESC
`;
return {
sql,
parameters: [],
};
};
/**
* Query product co-purchase analysis for cross-sell optimization
* Business Question: Which products are frequently bought together?
* Primary users: Merchandising and Product teams
* @param client The Avatica client instance (must have an open connection)
* @param siteId The natural site ID to filter by
* @param dateRange Date range to filter results
* @param batchSize Size of each batch to yield (default: 100)
*/
const queryProductCoPurchaseAnalysis = async function* queryProductCoPurchaseAnalysis(client, params, batchSize = 100) {
const { sql, parameters } = queryProductCoPurchaseAnalysis.QUERY(params);
yield* (0, helpers_1.executeParameterizedQuery)(client, (0, types_1.cleanSQL)(sql), parameters, batchSize);
};
exports.queryProductCoPurchaseAnalysis = queryProductCoPurchaseAnalysis;
exports.queryProductCoPurchaseAnalysis.metadata = {
name: "product-co-purchase-analysis",
description: "Analyze frequently co-purchased products for cross-sell optimization",
category: "Product Analytics",
requiredParams: ["siteId", "from", "to"],
};
exports.queryProductCoPurchaseAnalysis.QUERY = (params) => {
(0, helpers_1.validateRequiredParams)(params, ["siteId", "dateRange"]);
const { startDate, endDate } = (0, helpers_1.formatDateRange)(params.dateRange);
const sql = `
SELECT
p1.nproduct_id as product_1_id,
p1.product_display_name as product_1_name,
p2.nproduct_id as product_2_id,
p2.product_display_name as product_2_name,
pcb.frequency_count as co_purchase_count,
pcb.std_cobuy_revenue
FROM ccdw_aggr_product_cobuy pcb
JOIN ccdw_dim_product p1 ON p1.product_id = pcb.product_one_id
JOIN ccdw_dim_product p2 ON p2.product_id = pcb.product_two_id
JOIN ccdw_dim_site s ON s.nsite_id = pcb.nsite_id
WHERE pcb.submit_date >= '${startDate}' AND pcb.submit_date <= '${endDate}'
AND s.nsite_id = '${params.siteId}'
ORDER BY pcb.frequency_count DESC
`;
return {
sql,
parameters: [],
};
};