Combining Technology with the Art of Planning and Forecasting

","body":"New channels have added great complexity to the planning and forecasting process. The good news is that technology can now be integrated into the art of merchandising. Download this report to learn what retailers need to know about the new omni-channel realities of planning and forecasting and learn steps to achieve better accuracy and sales in today's environment.
","alternateLabel":null,"whitePaperDocument":"/secure-file/13829","teaserImage":{"id":21790,"url":"https://assets1.risnews.com/styles/secondary_articles_short/s3/rsb05152t.jpg?itok=SCfwok7v","width":150,"alt":null,"height":181},"heroImage":null,"heroImageSrcset":null,"sponsored":false,"sponsorship":{"overrideAds":null},"businessTopic":[],"contentType":[],"company":[],"marketSegment":[],"topics":[{"id":95,"name":"Enterprise Resource Management","url":"/enterprise-resource-management"},{"id":45,"name":"Assortment Planning","url":"/assortment-planning"},{"id":43,"name":"Business Intelligence (BI)","url":"/business-intelligence"},{"id":107,"name":"Cloud Computing","url":"/cloud-computing"},{"id":7,"name":"Omnichannel","url":"/omnichannel"},{"id":15,"name":"Customer Relationship Management (CRM)","url":"/customer-relationship-management-crm"},{"id":5,"name":"Customer Service","url":"/customer-service"},{"id":135,"name":"Data Synchronization","url":"/data-synchronization"},{"id":124,"name":"Data Warehousing","url":"/data-warehousing"},{"id":22,"name":"E-Commerce","url":"/e-commerce"},{"id":12,"name":"Marketing","url":"/marketing"},{"id":41,"name":"Inventory Management","url":"/inventory-management"},{"id":62,"name":"Workforce Management","url":"/workforce-management"},{"id":103,"name":"Location Based Services","url":"/location-based-services"},{"id":126,"name":"Security","url":"/security"},{"id":155,"name":"Pricing Management","url":"/pricing-management"},{"id":40,"name":"Merchandise Management","url":"/merchandise-management"},{"id":31,"name":"Mobile Commerce","url":"/mobile-commerce"},{"id":30,"name":"Social Networking","url":"/social-networking"},{"id":455,"name":"Store Operations","url":"/store-operations"},{"id":33,"name":"Store Systems","url":"/store-systems"},{"id":48,"name":"Supply Chain Management","url":"/supply-chain-management"},{"id":456,"name":"Traffic Analysis","url":"/traffic-analysis"},{"id":131,"name":"Web Analytics","url":"/web-analytics"},{"id":195,"name":"Mobile Apps","url":"/mobile-apps"},{"id":13,"name":"Point of Sale","url":"/point-sale"}]};
const country = "US";
const language = "en-US,en;q=0.5";
const SITE_LANGUAGE = "en";
const siteName = "RIS News";
const userRoles = ["anonymous"];
const userUid = 0;
const indexName = "risnews";
window.dataLayer = window.dataLayer || [];
const data = {};
data.entityTaxonomy = {};
const contentTypes = [
"article",
"blog",
"bulletin",
"embed_page",
"landing_page",
"event",
"image",
"page",
"product",
"whitepaper",
"video",
"tags",
];
if (
routeInfo &&
"bundle" in routeInfo &&
contentTypes.includes(routeInfo["bundle"])
) {
data.entityBundle = routeInfo.bundle;
data.entityTitle = `${routeInfo.title} | ${siteName}`;
data.entityId = routeInfo.id;
data.entityName = routeInfo.author?.uname;
data.entityCreated = routeInfo.created;
data.sponsored = routeInfo.sponsored;
data.sponsor = routeInfo.sponsoringCompany;
data.entityType = "node";
data.entityLangcode = SITE_LANGUAGE;
data.siteName = siteName;
data.drupalLanguage = language;
data.drupalCountry = country;
data.userRoles = userRoles;
data.userUid = userUid;
data.entityTaxonomyKeys = {};
data.entityTaxonomyHierarchies = {};
data.parentNaicsCode = {};
data.isPro = false;
data.algoliaIndexName = indexName;
// Add toxonomy data
const taxonomies = {
businessTopic: "business_topic",
contentType: "content_type",
company: "company",
marketSegment: "market_segment",
};
const getHierarchy = (term, terms = []) => {
terms.push({ id: term.id, name: term.name });
if (term.parentTerm != null) {
getHierarchy(term.parentTerm, terms);
}
return terms;
};
const getTerms = (term, useApiId = false) => {
return { id: useApiId ? term.apiId : term.id, name: term.name };
};
const getKeys = (term) => {
return { id: term.id, name: term.apiId };
};
Object.entries(taxonomies).forEach(([key, item]) => {
terms = routeInfo[key];
if (terms && terms.length > 0) {
data["entityTaxonomy"][item] = terms.map((term) =>
getTerms(term, key === "company")
);
if (key !== "company") {
data["entityTaxonomyKeys"][item] = terms.map(getKeys);
termGroups = [];
terms.forEach((term, termInd) => {
termGroups[termInd] = getHierarchy(term);
});
data["entityTaxonomyHierarchies"][item] = termGroups;
}
}
});
data["entityTaxonomy"]["tags"] = routeInfo["topics"] || [];
// Primary Topic is either the business topic or the top tag.
if (routeInfo["businessTopic"]?.length > 0) {
data["entityPrimaryTopic"] = routeInfo["businessTopic"][0]["name"];
} else {
if (routeInfo["topics"]?.length > 0) {
data["entityPrimaryTopic"] = routeInfo["topics"][0]["name"];
}
}
// Primary and secondary entityNaicsCodes come from the MarketSegment
if (routeInfo.marketSegment?.length > 0) {
data.entityNaicsCode = {};
data["entityNaicsCode"]["id"] = routeInfo["marketSegment"][0]["id"];
data["entityNaicsCode"]["name"] =
routeInfo["marketSegment"][0]["naicsCode"];
if (routeInfo["marketSegment"][0]["parentTerm"] != null) {
data["parentNaicsCode"]["id"] =
routeInfo["marketSegment"][0]["parentTerm"]["id"];
data["parentNaicsCode"]["name"] =
routeInfo["marketSegment"][0]["parentTerm"]["naicsCode"];
}
} else {
data.entityNaicsCode = [];
}
if (routeInfo.taggedPro) {
data.isPro = routeInfo.taggedPro;
}
window.dataLayer.push(data);
} else if (routeInfo && "vid" in routeInfo) {
data.entityBundle = "tags";
data.entityTitle = routeInfo.name;
data.entityId = routeInfo.id;
data.entityName = routeInfo.author?.uname;
data.entityCreated = routeInfo.created;
data.entityType = "taxonomy_term";
data.entityLangcode = SITE_LANGUAGE;
data.siteName = siteName;
data.sponsored = routeInfo.sponsored;
data.sponsor = routeInfo.sponsoringCompany;
data.drupalLanguage = language;
data.drupalCountry = country;
data.userRoles = userRoles;
data.userUid = userUid;
data.algoliaIndexName = indexName;
data["entityTaxonomy"]["tags"] = {
id: routeInfo["id"],
name: routeInfo["name"],
};
window.dataLayer.push(data);
}
})();