El proceso de transformación del Sales and Operation Planning (S&OP) al Integrated Business Planning (IBP) es un paso crucial para cualquier organización que busque mejorar la eficiencia y la integración de sus operaciones. A continuación, te mostramos cómo se puede dar esta evolución de S&OP a IBP en las organizaciones y algunos aspectos a tener en cuenta.
En abril, previo a los días santos, se llevó a cabo una reunión del comité directivo donde la nueva Gerencia General presentó un objetivo ambicioso: transformar el proceso operativo de Sales and Operation Planning (S&OP) en una herramienta verdaderamente poderosa, evolucionando hacia el Integrated Business Planning (IBP). Este cambio, ya implementado en otras regiones, prometía mejorar la conexión entre los equipos y orientar las decisiones hacia la rentabilidad, generando altas expectativas sobre su impacto en el día a día y el futuro de la empresa.
Álvaro, gerente de planeación y responsable del proceso de S&OP, se enfrentaba a un reto considerable. Tras años de dedicación y pequeñas mejoras continuas, había logrado conectar la cadena de suministro con las necesidades de los equipos de marketing y comercial, utilizando la información del mercado para guiar la producción y los proveedores. Sin embargo, el proceso seguía siendo más operativo que táctico, con ventas no alcanzando las expectativas y estimaciones de marketing y ventas reales desalineadas.
El sistema de planificación de demanda, aunque útil en identificar picos de ventas debido a promociones y lanzamientos, se había quedado obsoleto. Este sistema colaborativo asignaba responsabilidades a todos los equipos involucrados, diluyendo la responsabilidad final. Además, la metodología DDMRP (Demand Driven MRP), aunque rápida, carecía de estabilidad y conexión con los retos financieros del negocio, operando con señales comerciales limitadas y proyecciones de demanda a corto plazo.
Implementación de IBP: primeros pasos
Para abordar estos desafíos, la compañía decidió iniciar un viaje hacia la integración de los procesos globales de planificación, con un enfoque en la estabilidad y predictibilidad financiera. Los reportes financieros semestrales pasaron a ser trimestrales, alineando los números financieros con los de la cadena de suministro.
Álvaro, inspirado por la frase de Albert Einstein “la locura es hacer lo mismo una y otra vez, y esperar resultados diferentes”, reconoció que era el momento de evolucionar el S&OP hacia el IBP. Este nuevo enfoque requería el apoyo de la alta dirección y la colaboración de todos los equipos: ventas, marketing, finanzas, innovación, manufactura, logística y compras.
La implementación del IBP implicaba un cambio adaptativo, más allá del aspecto técnico. Requería influir y movilizar a las personas, ajustando sus procesos y comportamientos hacia el objetivo común. El apoyo del equipo de Recursos Humanos fue crucial para comprometerse con el cambio y apoyar decididamente la transformación.
El proceso de IBP comienza con la gestión de portafolio, seguido de la revisión de proyecciones de demanda en el Volume Meeting, ajuste de capacidades de suministro en el Supply Review y análisis de brechas en el GAP análisis.
Algunos aprendizajes
La capacitación técnica fue esencial para todos los equipos, enfocándose en la planificación estratégica y la conexión con el IBP. La tecnología también jugó un papel clave, integrando información de múltiples fuentes en un desarrollo basado en Excel, permitiendo análisis detallados y decisiones tácticas.
En resumen, la evolución de S&OP a IBP ha sido un proceso de cambio adaptativo y técnico, movilizando a toda la organización hacia una mejor predictibilidad y estabilidad financiera. Para conocer más detalles sobre esta transformación, te invitamos a leer el artículo completo.
” + “
” + detail + “
” +
““;
pc_confirmation.style.display = ‘block’;
} else {
form.querySelector(‘._form-content’).style.display = ‘inline’;
pc_confirmation.style.display = ‘none’;
}
var hideButton = document.getElementById(‘hideButton’);
// Add event listener to the button
hideButton.addEventListener(‘click’, function() {
var submitButton = document.querySelector(‘#_form_168_submit’);
submitButton.disabled = false;
submitButton.classList.remove(‘processing’);
window.location.href = window.location.href;
});
const vgoAlias = typeof visitorGlobalObjectAlias === ‘undefined’ ? ‘vgo’ : visitorGlobalObjectAlias;
var visitorObject = window[vgoAlias];
if (email && typeof visitorObject !== ‘undefined’) {
visitorObject(‘setEmail’, email);
visitorObject(‘update’);
} else if (typeof(trackcmp_url) != ‘undefined’ && trackcmp_url) {
// Site tracking URL to use after inline form submission.
_load_script(trackcmp_url);
}
if (typeof window._form_callback !== ‘undefined’) window._form_callback(id);
};
window._load_script = function(url, callback, isSubmit) {
var head = document.querySelector(‘head’), script = document.createElement(‘script’), r = false;
var submitButton = document.querySelector(‘#_form_168_submit’);
script.charset = ‘utf-8’;
script.src = url;
if (callback) {
script.onload = script.onreadystatechange = function() {
if (!r && (!this.readyState || this.readyState == ‘complete’)) {
r = true;
callback();
}
};
}
script.onerror = function() {
if (isSubmit) {
if (script.src.length > 10000) {
_show_error(“168”, “Lo sentimos, ocurrió un error con el envío. Acorta tus respuestas y vuelve a intentarlo.”);
} else {
_show_error(“168”, “Lo sentimos, ocurrió un error con el envío. Vuelve a intentarlo.”);
}
submitButton.disabled = false;
submitButton.classList.remove(‘processing’);
}
}
head.appendChild(script);
};
(function() {
if (window.location.search.search(“excludeform”) !== -1) return false;
var getCookie = function(name) {
var match = document.cookie.match(new RegExp(‘(^|; )’ + name + ‘=([^;]+)’));
return match ? match[2] : null;
}
var setCookie = function(name, value) {
var now = new Date();
var time = now.getTime();
var expireTime = time + 1000 * 60 * 60 * 24 * 365;
now.setTime(expireTime);
document.cookie = name + ‘=’ + value + ‘; expires=’ + now + ‘;path=/; Secure; SameSite=Lax;’;
}
var addEvent = function(element, event, func) {
if (element.addEventListener) {
element.addEventListener(event, func);
} else {
var oldFunc = element[‘on’ + event];
element[‘on’ + event] = function() {
oldFunc.apply(this, arguments);
func.apply(this, arguments);
};
}
}
var _removed = false;
var form_to_submit = document.getElementById(‘_form_168_’);
var allInputs = form_to_submit.querySelectorAll(‘input, select, textarea’), tooltips = [], submitted = false;
var getUrlParam = function(name) {
if (name.toLowerCase() !== ’email’) {
var params = new URLSearchParams(window.location.search);
return params.get(name) || false;
}
// email is a special case because a plus is valid in the email address
var qString = window.location.search;
if (!qString) {
return false;
}
var parameters = qString.substr(1).split(‘&’);
for (var i = 0; i < parameters.length; i++) {
var parameter = parameters[i].split(‘=’);
if (parameter[0].toLowerCase() === ’email’) {
return parameter[1] === undefined ? true : decodeURIComponent(parameter[1]);
}
}
return false;
};
var acctDateFormat = “%d/%m/%Y”;
var getNormalizedDate = function(date, acctFormat) {
var decodedDate = decodeURIComponent(date);
if (acctFormat && acctFormat.match(/(%d|%e).*%m/gi) !== null) {
return decodedDate.replace(/(d{2}).*(d{2}).*(d{4})/g, ‘$3-$2-$1’);
} else if (Date.parse(decodedDate)) {
var dateObj = new Date(decodedDate);
var year = dateObj.getFullYear();
var month = dateObj.getMonth() + 1;
var day = dateObj.getDate();
return `${year}-${month < 10 ? `0${month}` : month}-${day < 10 ? `0${day}` : day}`;
}
return false;
};
var getNormalizedTime = function(time) {
var hour, minutes;
var decodedTime = decodeURIComponent(time);
var timeParts = Array.from(decodedTime.matchAll(/(d{1,2}):(d{1,2})W*([AaPp][Mm])?/gm))[0];
if (timeParts[3]) { // 12 hour format
var isPM = timeParts[3].toLowerCase() === ‘pm’;
if (isPM) {
hour = parseInt(timeParts[1]) === 12 ? ’12’ : `${parseInt(timeParts[1]) + 12}`;
} else {
hour = parseInt(timeParts[1]) === 12 ? ‘0’ : timeParts[1];
}
} else { // 24 hour format
hour = timeParts[1];
}
var normalizedHour = parseInt(hour) < 10 ? `0${parseInt(hour)}` : hour;
var minutes = timeParts[2];
return `${normalizedHour}:${minutes}`;
};
for (var i = 0; i < allInputs.length; i++) {
var regexStr = “field\[(\d+)\]”;
var results = new RegExp(regexStr).exec(allInputs[i].name);
if (results != undefined) {
allInputs[i].dataset.name = allInputs[i].name.match(/[time]$/)
? `${window.cfields[results[1]]}_time`
: window.cfields[results[1]];
} else {
allInputs[i].dataset.name = allInputs[i].name;
}
var fieldVal = getUrlParam(allInputs[i].dataset.name);
if (fieldVal) {
if (allInputs[i].dataset.autofill === “false”) {
continue;
}
if (allInputs[i].type == “radio” || allInputs[i].type == “checkbox”) {
if (allInputs[i].value == fieldVal) {
allInputs[i].checked = true;
}
} else if (allInputs[i].type == “date”) {
allInputs[i].value = getNormalizedDate(fieldVal, acctDateFormat);
} else if (allInputs[i].type == “time”) {
allInputs[i].value = getNormalizedTime(fieldVal);
} else {
allInputs[i].value = fieldVal;
}
}
}
var remove_tooltips = function() {
for (var i = 0; i < tooltips.length; i++) {
tooltips[i].tip.parentNode.removeChild(tooltips[i].tip);
}
tooltips = [];
};
var remove_tooltip = function(elem) {
for (var i = 0; i < tooltips.length; i++) {
if (tooltips[i].elem === elem) {
tooltips[i].tip.parentNode.removeChild(tooltips[i].tip);
tooltips.splice(i, 1);
return;
}
}
};
var create_tooltip = function(elem, text) {
var tooltip = document.createElement(‘div’),
arrow = document.createElement(‘div’),
inner = document.createElement(‘div’), new_tooltip = {};
if (elem.type != ‘radio’ && elem.type != ‘checkbox’) {
tooltip.className = ‘_error’;
arrow.className = ‘_error-arrow’;
inner.className = ‘_error-inner’;
inner.innerHTML = text;
tooltip.appendChild(arrow);
tooltip.appendChild(inner);
elem.parentNode.appendChild(tooltip);
} else {
tooltip.className = ‘_error-inner _no_arrow’;
tooltip.innerHTML = text;
elem.parentNode.insertBefore(tooltip, elem);
new_tooltip.no_arrow = true;
}
new_tooltip.tip = tooltip;
new_tooltip.elem = elem;
tooltips.push(new_tooltip);
return new_tooltip;
};
var resize_tooltip = function(tooltip) {
var rect = tooltip.elem.getBoundingClientRect();
var doc = document.documentElement,
scrollPosition = rect.top – ((window.pageYOffset || doc.scrollTop) – (doc.clientTop || 0));
if (scrollPosition < 40) {
tooltip.tip.className = tooltip.tip.className.replace(/ ?(_above|_below) ?/g, ”) + ‘ _below’;
} else {
tooltip.tip.className = tooltip.tip.className.replace(/ ?(_above|_below) ?/g, ”) + ‘ _above’;
}
};
var resize_tooltips = function() {
if (_removed) return;
for (var i = 0; i < tooltips.length; i++) {
if (!tooltips[i].no_arrow) resize_tooltip(tooltips[i]);
}
};
var validate_field = function(elem, remove) {
var tooltip = null, value = elem.value, no_error = true;
remove ? remove_tooltip(elem) : false;
if (elem.type != ‘checkbox’) elem.className = elem.className.replace(/ ?_has_error ?/g, ”);
if (elem.getAttribute(‘required’) !== null) {
if (elem.type == ‘radio’ || (elem.type == ‘checkbox’ && /any/.test(elem.className))) {
var elems = form_to_submit.elements[elem.name];
if (!(elems instanceof NodeList || elems instanceof HTMLCollection) || elems.length <= 1) {
no_error = elem.checked;
}
else {
no_error = false;
for (var i = 0; i < elems.length; i++) {
if (elems[i].checked) no_error = true;
}
}
if (!no_error) {
tooltip = create_tooltip(elem, “Seleccione una opción.”);
}
} else if (elem.type ==’checkbox’) {
var elems = form_to_submit.elements[elem.name], found = false, err = [];
no_error = true;
for (var i = 0; i < elems.length; i++) {
if (elems[i].getAttribute(‘required’) === null) continue;
if (!found && elems[i] !== elem) return true;
found = true;
elems[i].className = elems[i].className.replace(/ ?_has_error ?/g, ”);
if (!elems[i].checked) {
no_error = false;
elems[i].className = elems[i].className + ‘ _has_error’;
err.push(“Es necesario verificar %s”.replace(“%s”, elems[i].value));
}
}
if (!no_error) {
tooltip = create_tooltip(elem, err.join(‘
‘));
}
} else if (elem.tagName == ‘SELECT’) {
var selected = true;
if (elem.multiple) {
selected = false;
for (var i = 0; i < elem.options.length; i++) {
if (elem.options[i].selected) {
selected = true;
break;
}
}
} else {
for (var i = 0; i < elem.options.length; i++) {
if (elem.options[i].selected
&& (!elem.options[i].value
|| (elem.options[i].value.match(/n/g)))
) {
selected = false;
}
}
}
if (!selected) {
elem.className = elem.className + ‘ _has_error’;
no_error = false;
tooltip = create_tooltip(elem, “Seleccione una opción.”);
}
} else if (value === undefined || value === null || value === ”) {
elem.className = elem.className + ‘ _has_error’;
no_error = false;
tooltip = create_tooltip(elem, “Este campo es obligatorio.”);
}
}
if (no_error && (elem.id == ‘field[]’ || elem.id == ‘ca[11][v]’)) {
if (elem.className.includes(‘phone-input-error’)) {
elem.className = elem.className + ‘ _has_error’;
no_error = false;
}
}
if (no_error && elem.name == ’email’) {
if (!value.match(/^[+_a-z0-9-‘&=]+(.[+_a-z0-9-‘]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,})$/i)) {
elem.className = elem.className + ‘ _has_error’;
no_error = false;
tooltip = create_tooltip(elem, “Introduzca una dirección de correo electrónico válida.”);
}
}
if (no_error && /date_field/.test(elem.className)) {
if (!value.match(/^dddd-dd-dd$/)) {
elem.className = elem.className + ‘ _has_error’;
no_error = false;
tooltip = create_tooltip(elem, “Introduzca una fecha válida.”);
}
}
tooltip ? resize_tooltip(tooltip) : false;
return no_error;
};
var needs_validate = function(el) {
if(el.getAttribute(‘required’) !== null){
return true
}
if(el.name === ’email’ && el.value !== “”){
return true
}
if((el.id == ‘field[]’ || el.id == ‘ca[11][v]’) && el.className.includes(‘phone-input-error’)){
return true
}
return false
};
var validate_form = function(e) {
var err = form_to_submit.querySelector(‘._form_error’), no_error = true;
if (!submitted) {
submitted = true;
for (var i = 0, len = allInputs.length; i < len; i++) {
var input = allInputs[i];
if (needs_validate(input)) {
if (input.type == ‘tel’) {
addEvent(input, ‘blur’, function() {
this.value = this.value.trim();
validate_field(this, true);
});
}
if (input.type == ‘text’ || input.type == ‘number’ || input.type == ‘time’) {
addEvent(input, ‘blur’, function() {
this.value = this.value.trim();
validate_field(this, true);
});
addEvent(input, ‘input’, function() {
validate_field(this, true);
});
} else if (input.type == ‘radio’ || input.type == ‘checkbox’) {
(function(el) {
var radios = form_to_submit.elements[el.name];
for (var i = 0; i < radios.length; i++) {
addEvent(radios[i], ‘click’, function() {
validate_field(el, true);
});
}
})(input);
} else if (input.tagName == ‘SELECT’) {
addEvent(input, ‘change’, function() {
validate_field(this, true);
});
} else if (input.type == ‘textarea’){
addEvent(input, ‘input’, function() {
validate_field(this, true);
});
}
}
}
}
remove_tooltips();
for (var i = 0, len = allInputs.length; i < len; i++) {
var elem = allInputs[i];
if (needs_validate(elem)) {
if (elem.tagName.toLowerCase() !== “select”) {
elem.value = elem.value.trim();
}
validate_field(elem) ? true : no_error = false;
}
}
if (!no_error && e) {
e.preventDefault();
}
resize_tooltips();
return no_error;
};
addEvent(window, ‘resize’, resize_tooltips);
addEvent(window, ‘scroll’, resize_tooltips);
var hidePhoneInputError = function(inputId) {
var errorMessage = document.getElementById(“error-msg-” + inputId);
var input = document.getElementById(inputId);
errorMessage.classList.remove(“phone-error”);
errorMessage.classList.add(“phone-error-hidden”);
input.classList.remove(“phone-input-error”);
};
var initializePhoneInput = function(input, defaultCountry) {
return window.intlTelInput(input, {
utilsScript: “https://unpkg.com/intl-tel-input@17.0.18/build/js/utils.js”,
autoHideDialCode: false,
separateDialCode: true,
initialCountry: defaultCountry,
preferredCountries: []
});
}
var setPhoneInputEventListeners = function(inputId, input, iti) {
input.addEventListener(‘blur’, function() {
var errorMessage = document.getElementById(“error-msg-” + inputId);
if (input.value.trim()) {
if (iti.isValidNumber()) {
iti.setNumber(iti.getNumber());
if (errorMessage.classList.contains(“phone-error”)){
hidePhoneInputError(inputId);
}
} else {
showPhoneInputError(inputId)
}
} else {
if (errorMessage.classList.contains(“phone-error”)){
hidePhoneInputError(inputId);
}
}
});
input.addEventListener(“countrychange”, function() {
iti.setNumber(”);
});
input.addEventListener(“keydown”, function(e) {
var charCode = (e.which) ? e.which : e.keyCode;
if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode !== 8) {
e.preventDefault();
}
});
};
var showPhoneInputError = function(inputId) {
var errorMessage = document.getElementById(“error-msg-” + inputId);
var input = document.getElementById(inputId);
errorMessage.classList.add(“phone-error”);
errorMessage.classList.remove(“phone-error-hidden”);
input.classList.add(“phone-input-error”);
};
var _form_serialize = function(form){if(!form||form.nodeName!==”FORM”){return }var i,j,q=[];for(i=0;i {
if (key !== ‘hideButton’) {
formData.append(key, value);
}
//formData.append(key, value);
});
let request = {
headers: {
“Accept”: “application/json”
},
body: formData,
method: “POST”
};
let pageUrlParams = new URLSearchParams(window.location.search);
if (pageUrlParams.has(‘t’)) {
request.headers.Authorization = ‘Bearer ‘ + pageUrlParams.get(‘t’);
}
const response = await fetch(‘https://zonalogistica2794.activehosted.com/proc.php?jsonp=true’, request);
return response.json();
}
if (formSupportsPost) {
submitForm().then((data) => {
eval(data.js);
});
} else {
_load_script(‘https://zonalogistica2794.activehosted.com/proc.php?’ + serialized + ‘&jsonp=true’, null, true);
}
}
return false;
};
addEvent(form_to_submit, ‘submit’, form_submit);
})();
El proceso de transformación del Sales and Operation Planning (S&OP) al Integrated Business Planning (IBP) es un paso crucial para cualquier organización que busque mejorar la eficiencia y la integración de sus operaciones. A continuación, te mostramos cómo se puede dar esta evolución de S&OP
La entrada Evolución de S&OP a IBP: un nuevo paradigma se publicó primero en Zonalogística. Read More