pagamio-frontend-commons-lib
Version:
Pagamio library for Frontend reusable components like the form engine and table container
344 lines (343 loc) • 12.6 kB
JavaScript
// Common product data
const products = {
PROCESSED_MILK: 'Processed Milk',
BILTONG: 'Biltong Sliced Chill',
MUFFIN: 'Muffin',
BLUEBERRY_MUFFIN: 'Blueberry Muffin',
JELLY_TOTS: 'Jelly Tots',
CHOCOLATE_BAR: 'Chocolate Bar',
COLA: 'Cola 330ml',
PREMIUM_BEER: 'Premium Beer',
DRY_PEANUTS: 'Dry Roasted Peanuts',
};
// Common locations
const locations = {
VIP_LOUNGE: 'VIP LOUNGE',
SPIRIT_BAR: 'SPIRIT BAR',
MAIN_ENTRANCE: 'MAIN ENTRANCE',
FOOD_COURT: 'FOOD COURT',
};
// Common metrics config
const metricEndpoints = {
METRICS: '/dashboard/metrics',
QUERY: '/dashboard/query',
};
// Common query parameter configurations
const queryParams = {
METRICS: {
COUNT: { aggregationType: 'COUNT' },
SUM: { aggregationType: 'SUM' },
},
SORT: {
ASC: 'ASC',
DESC: 'DESC',
},
DIMENSIONS: {
PRODUCT: ['productName'],
LOCATION_PRODUCT: ['stationName', 'productName'],
TIME_PRODUCT: ['date', 'productName'],
STOCK_DETAIL: ['stationName', 'productName', 'initialStock', 'reorderLevel', 'unitPrice'],
},
};
// Helper function to create metric response
const createMetricResponse = (metric, currentValue, previousValue) => ({
metric,
currentValue,
previousValue,
percentageChange: ((currentValue - previousValue) / previousValue) * 100,
formattedValue: null,
formattedChange: null,
additionalData: {
[metric]: currentValue,
},
});
// Helper function to create product stock data
const createProductStock = (stationName, productName, { currentStock, initialStock, reorderLevel, unitPrice, daysInStock, }) => {
const stockRatio = Math.round((currentStock / initialStock) * 100);
return {
stationName,
productName,
currentStock,
initialStock,
reorderLevel,
unitPrice,
daysInStock,
stockRatio,
};
};
// Helper function for time series data
const generateTimeSeriesData = (date, products) => products.map((p) => ({ date, productName: p.name, stockLevel: p.level }));
// Helper function to create query params
const createQueryParams = (dimensions, metrics, { limit, sortBy, sortDirection, aggregationType, } = {}) => ({
dimensions,
metrics,
...(limit && { limit }),
...(sortBy && { sortBy }),
...(sortDirection && { sortDirection }),
...(aggregationType && { aggregationType }),
});
// Helper function for depletion metrics
const createDepletionData = (productName, { depletionPercentage, initialStock, currentStock, }) => ({
productName,
depletionPercentage,
initialStock,
currentStock,
});
export const mockApiRequestsConfig = [
// Total SKUs metric
{
path: metricEndpoints.METRICS,
method: 'POST',
params: createQueryParams(queryParams.DIMENSIONS.PRODUCT, ['totalSKUs'], queryParams.METRICS.COUNT),
response: createMetricResponse('totalSKUs', 156, 142),
},
// Stock Value metric
{
path: metricEndpoints.METRICS,
method: 'POST',
params: createQueryParams(queryParams.DIMENSIONS.PRODUCT, ['stockValue'], queryParams.METRICS.SUM),
response: createMetricResponse('stockValue', 1256780.45, 1345890.23),
},
// Low Stock Items metric
{
path: metricEndpoints.METRICS,
method: 'POST',
params: createQueryParams(queryParams.DIMENSIONS.PRODUCT, ['lowStockCount'], queryParams.METRICS.COUNT),
response: createMetricResponse('lowStockCount', 12, 8),
},
// Initial vs Current Inventory per SKU
{
path: metricEndpoints.QUERY,
method: 'POST',
params: createQueryParams(queryParams.DIMENSIONS.PRODUCT, ['initialStock', 'currentStock'], {
limit: 10,
sortBy: 'initialStock',
sortDirection: queryParams.SORT.DESC,
}),
response: [
createProductStock(locations.VIP_LOUNGE, products.BLUEBERRY_MUFFIN, {
currentStock: 2,
initialStock: 40,
reorderLevel: 10,
unitPrice: 3.0,
daysInStock: 5,
}),
createProductStock(locations.SPIRIT_BAR, products.BLUEBERRY_MUFFIN, {
currentStock: 5,
initialStock: 50,
reorderLevel: 10,
unitPrice: 2.25,
daysInStock: 3,
}),
createProductStock(locations.MAIN_ENTRANCE, products.PREMIUM_BEER, {
currentStock: 8,
initialStock: 100,
reorderLevel: 20,
unitPrice: 4.75,
daysInStock: 15,
}),
createProductStock(locations.FOOD_COURT, products.BLUEBERRY_MUFFIN, {
currentStock: 12,
initialStock: 120,
reorderLevel: 30,
unitPrice: 2.25,
daysInStock: 10,
}),
createProductStock(locations.SPIRIT_BAR, products.COLA, {
currentStock: 15,
initialStock: 100,
reorderLevel: 30,
unitPrice: 2.5,
daysInStock: 45,
}),
createProductStock(locations.MAIN_ENTRANCE, products.DRY_PEANUTS, {
currentStock: 15,
initialStock: 50,
reorderLevel: 15,
unitPrice: 1.99,
daysInStock: 40,
}),
createProductStock(locations.SPIRIT_BAR, products.PREMIUM_BEER, {
currentStock: 27,
initialStock: 120,
reorderLevel: 25,
unitPrice: 4.75,
daysInStock: 30,
}),
createProductStock(locations.FOOD_COURT, products.PREMIUM_BEER, {
currentStock: 29,
initialStock: 80,
reorderLevel: 20,
unitPrice: 4.5,
daysInStock: 20,
}),
createProductStock(locations.VIP_LOUNGE, products.DRY_PEANUTS, {
currentStock: 30,
initialStock: 50,
reorderLevel: 15,
unitPrice: 2.5,
daysInStock: 45,
}),
createProductStock(locations.MAIN_ENTRANCE, products.COLA, {
currentStock: 32,
initialStock: 150,
reorderLevel: 40,
unitPrice: 2.5,
daysInStock: 20,
}),
],
},
// SKU Depletion Over Time
{
path: metricEndpoints.QUERY,
method: 'POST',
params: createQueryParams(queryParams.DIMENSIONS.TIME_PRODUCT, ['stockLevel'], {
limit: 30,
sortBy: 'date',
sortDirection: queryParams.SORT.ASC,
}),
response: [
...generateTimeSeriesData('2025-01-01', [
{ name: products.PROCESSED_MILK, level: 100 },
{ name: products.BILTONG, level: 100 },
{ name: products.MUFFIN, level: 100 },
{ name: products.JELLY_TOTS, level: 100 },
{ name: products.CHOCOLATE_BAR, level: 100 },
]),
...generateTimeSeriesData('2025-01-08', [
{ name: products.PROCESSED_MILK, level: 78 },
{ name: products.BILTONG, level: 82 },
{ name: products.MUFFIN, level: 85 },
{ name: products.JELLY_TOTS, level: 92 },
{ name: products.CHOCOLATE_BAR, level: 87 },
]),
...generateTimeSeriesData('2025-01-15', [
{ name: products.PROCESSED_MILK, level: 62 },
{ name: products.BILTONG, level: 72 },
{ name: products.MUFFIN, level: 73 },
{ name: products.JELLY_TOTS, level: 85 },
{ name: products.CHOCOLATE_BAR, level: 78 },
]),
...generateTimeSeriesData('2025-01-22', [
{ name: products.PROCESSED_MILK, level: 48 },
{ name: products.BILTONG, level: 59 },
{ name: products.MUFFIN, level: 62 },
{ name: products.JELLY_TOTS, level: 73 },
{ name: products.CHOCOLATE_BAR, level: 65 },
]),
...generateTimeSeriesData('2025-01-29', [
{ name: products.PROCESSED_MILK, level: 32 },
{ name: products.BILTONG, level: 45 },
{ name: products.MUFFIN, level: 50 },
{ name: products.JELLY_TOTS, level: 62 },
{ name: products.CHOCOLATE_BAR, level: 53 },
]),
...generateTimeSeriesData('2025-02-05', [
{ name: products.PROCESSED_MILK, level: 20 },
{ name: products.BILTONG, level: 32 },
{ name: products.MUFFIN, level: 35 },
{ name: products.JELLY_TOTS, level: 43 },
{ name: products.CHOCOLATE_BAR, level: 40 },
]),
],
},
// Top Fast-Moving SKUs
{
path: metricEndpoints.QUERY,
method: 'POST',
params: createQueryParams(queryParams.DIMENSIONS.PRODUCT, ['depletionRate'], {
limit: 3,
sortBy: 'depletionRate',
sortDirection: queryParams.SORT.DESC,
}),
response: [
{ productName: products.PROCESSED_MILK, depletionRate: 80.0 },
{ productName: products.BILTONG, depletionRate: 68.0 },
{ productName: products.MUFFIN, depletionRate: 65.0 },
],
},
// Stock Status for Critical Items
{
path: metricEndpoints.QUERY,
method: 'POST',
params: createQueryParams(queryParams.DIMENSIONS.PRODUCT, ['stockPercentage'], {
limit: 4,
sortBy: 'stockPercentage',
sortDirection: queryParams.SORT.ASC,
}),
response: [
{ productName: products.PROCESSED_MILK, stockPercentage: 20.0 },
{ productName: products.BILTONG, stockPercentage: 32.0 },
{ productName: products.MUFFIN, stockPercentage: 35.0 },
],
},
// Inventory Depletion by Product
{
path: metricEndpoints.QUERY,
method: 'POST',
params: createQueryParams(queryParams.DIMENSIONS.PRODUCT, ['depletionPercentage'], {
limit: 5,
sortBy: 'depletionPercentage',
sortDirection: queryParams.SORT.DESC,
}),
response: [
createDepletionData(products.PROCESSED_MILK, {
depletionPercentage: 80,
initialStock: 500,
currentStock: 100,
}),
createDepletionData(products.BILTONG, {
depletionPercentage: 68,
initialStock: 625,
currentStock: 200,
}),
createDepletionData(products.MUFFIN, {
depletionPercentage: 65,
initialStock: 800,
currentStock: 280,
}),
createDepletionData(products.JELLY_TOTS, {
depletionPercentage: 57,
initialStock: 300,
currentStock: 129,
}),
createDepletionData(products.CHOCOLATE_BAR, {
depletionPercentage: 64,
initialStock: 750,
currentStock: 270,
}),
],
},
// Low Stock Items by Location
{
path: metricEndpoints.QUERY,
method: 'POST',
params: createQueryParams(queryParams.DIMENSIONS.STOCK_DETAIL, ['currentStock'], {
sortBy: 'currentStock',
sortDirection: queryParams.SORT.ASC,
}),
response: [
createProductStock(locations.VIP_LOUNGE, products.BLUEBERRY_MUFFIN, {
currentStock: 2,
initialStock: 40,
reorderLevel: 10,
unitPrice: 3.0,
daysInStock: 5,
}),
createProductStock(locations.MAIN_ENTRANCE, products.PREMIUM_BEER, {
currentStock: 8,
initialStock: 100,
reorderLevel: 20,
unitPrice: 4.75,
daysInStock: 15,
}),
createProductStock(locations.SPIRIT_BAR, products.BLUEBERRY_MUFFIN, {
currentStock: 5,
initialStock: 50,
reorderLevel: 10,
unitPrice: 2.25,
daysInStock: 3,
}),
],
},
];