;

Implementace nového ERP má dopady na fungování celé společnosti

7. 12. 2020
Doba čtení: 3 minuty

Sdílet

Autor: InfoConsulting Czech
Celý proces vyžaduje významné úsilí nejen od dodavatele, ale i od zákazníka, říká Milan Tesař, obchodní ředitel ve společnosti InfoConsulting Czech.

Jakou roli hraje podle vašeho názoru správa změn (change management) při implementaci ERP systému?

Vzhledem ke stále převažujícímu modelu implementace fix price / fix scope je řízení rozsahu projektu klíčové jak pro dodavatele, tak pro zákazníka. Správné stanovení rozsahu projektu a odpovědností obou zúčastněných stran je nezbytným předpokladem pro hladký průběh projektu, ale i řízení změn rozsahu po dobu projektu. Změny přijdou na každém projektu, ale jedině jasným počátečním stavem (rozsahem projektu) a transparentním průběhem změnového řízení s řádným uvedením dopadů do harmonogramu případně rozpočtu, lze projekt udržet v řízeném stavu a neztratit nad ním kontrolu.

Jaká jsou dnes z hlediska zákaznické firmy největší rizika plynoucí ze zrušení projektu implementace ERP systému?

Implementace nového ERP má dopady na fungování celé společnosti a vyžaduje významné úsilí nejen od dodavatele, ale i od zákazníka. A pokud se již firma rozhodla investovat, do nového systému, předcházela tomu řada úvah o možných budoucích zlepšeních a také interní příprava nebo informování. V okamžiku začátku výběru ERP systému má již typicky zákazník za sebou řadu schůzek s dodavateli nebo nezávislými procesními poradci, investoval řadu dní do úvah, příprav i interní motivace klíčových zaměstnanců. Pokud je projekt následně zrušen nebo výrazně odložen, nebude toto úsilí využito a díky relativně rychlým změnám (většinou jak na straně zákazníka, tak na straně dodavatelů ERP) se většina zmíněných činností opakuje. Zároveň se tím významně snižuje motivace a nadšení na straně zaměstnanců, kteří jsou pro úspěšnou implementaci nezbytní.

Jak může robotická automatizace procesů RPA oživit starší ERP systémy? Na co by si podniky při jejím nasazování měly dát pozor?

Zkusím použít příměr - když dáte prvky chytré domácnosti do starého domu, tak to sice bude lepší pro uživatele domu, ale chátrání domu to nezastaví a do sklepa bude zatékat pořád. RPA neřeší většinu problémů a překážek, které zastaralé ERP klade podnikům do cesty a přijde mi daleko důležitější investovat do inovace ERP systému než do jedné technologie.

Na co by se měly organizace především zaměřit při implementaci a provozu ERP systému využívaného zaměstnanci vzdáleně? Jaká jsou největší úskalí tohoto režimu?

Vzdálené používání ERP systému není záležitost nová a spojená s koronavirovou epidemií. Většina moderních systémů pracuje s tenkými nebo webovými klienty s příslušným zabezpečením a vzdáleně lze funkčnosti ERP systému využívat již celou řadu let. Prvním úskalím může být dostatečná internetová konektivita jak serveru tak jednotlivých koncových uživatelů – v případě, že velké množství uživatelů začne pracovat vzdáleně, může jejich činnost vyvolat poměrně velký datový provoz. Druhé úskalí, obvykle větší, je zabezpečení domácích sítí koncových uživatelských zařízení, která nebývá zdaleka na takové úrovni jako zabezpečení v rámci podniku a může vést k bezpečnostním incidentům. 

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »