UNPKG

sfcc-cip-analytics-client

Version:

SFCC Commerce Intelligence Platform Analytics Client

138 lines (137 loc) 4.92 kB
"use strict"; 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: [], }; };