Aplikace na podnikatelský odpad vydělá městům miliony. Živnostníci ji budou nenávidět

12.06.2025 | , Finance.cz
DANĚ


perex-img Zdroj: Shutterstock

Živnostník neplatí, město tratí. Českým obcím unikají miliony kvůli tomu, že drobní podnikatelé často netuší, že mají zákonnou povinnost platit za odpad. Nová aplikace pomáhá obcím zjednat pořádek – a podnikatelům ukazuje, že i krabice od monitoru má svou cenu.

sluchatka

Poslechněte si článek v audio verzi

00:00 / 00:00

Tento článek pro vás načetl robotický hlas. Jestliže v něm najdete chybu ve výslovnosti, dejte nám prosím vědět.

Ve dnech 4. a 5. června se v Hradci Králové konala odborná konference věnovaná problematice odpadového hospodářství. A přestože podobné akce bývají doménou technických přednášek, tak letos jedna společnost přitáhla neobvykle velkou pozornost. 

Na první pohled se zdá, že každé město má odpadové hospodářství pod kontrolou. Občané platí poplatky, kontejnery se vyvážejí, systém funguje. Jenže realita bývá jiná, odpadové hospodářství je často pro města ztrátové. Jak je to možné?  

Podle Roberta Peckyzakladatele projektu Odpadio, je klíčový rozdíl mezi občany, obyvateli daného místa, a podnikateli, kteří tam působí. Zatímco občané mají povinnost platit za odpad danou zákonem a místní vyhláškou, podnikatelé si podle zákona č. 541/2020 Sb., o odpadech, mohou svobodně zvolit, jak a s kým budou odpad likvidovat. A v tom je problém. Zejména malí živnostníci o této povinnosti často nevědí a za odpad neplatí vůbec. Výsledek? Města čelí narůstajícím nákladům, kontejnery u domů přetékají a příjmy z poplatků stagnují. Aby samosprávy pokryly ztrátu, nezbývá než zvýšit poplatky těm, kteří platí, tedy občanům.  

A právě tento problém pomáhá Odpadio řešit. Aplikace dokáže odhalit neplatiče a zároveň umožňuje podnikatelům snadno uzavřít smlouvu s městem na likvidaci odpadu. Na otázky spojené s likvidací odpadu z podnikání odpovídá Robert Pecka, jednatel společnosti Odpadio s.r.o.

Robert Pecka, jednatel společnosti Odpadio

Zdroj: Odpadio s.r.o., publikováno se souhlasem

Existují obce, které podnikatele zapojují do svého odpadového hospodářství?

Ano, snahy tu jsou, ale jejich úspěšnost bývá minimální. Když jsme se na konferenci bavili se zástupci měst, často s jistotou tvrdili, že žádnou aplikaci nepotřebují, protože se jim daří podnikatele do systému odpadového hospodářství zapojit i bez ní.  

Jenže realita je jiná. Na dotaz, kolik mají s podnikateli uzavřených smluv, zazněla například odpověď „padesát“ v případě menšího města. Když jsme jim ale na místě ze systému Odpadio vytiskli přehled všech podnikatelských subjektů v dané lokalitě, čítající více než tisíc položek, rychle si uvědomili, že problém je hlubší, než si mysleli. A kudy utíkají peníze z rozpočtu.

Kde vznikla myšlenka věnovat se podnikatelskému odpadu?

Myšlenka na vytvoření aplikace Odpadio se zrodila už před několika lety. Impulsem byla zdánlivě banální událost. Na nově opravené náměstí vyteklo z odpadkového koše několik desítek litrů použitého fritovacího oleje. Bylo zřejmé, že pochází z některého z místních bister nebo restaurací.  

Začal jsem se tehdy zajímat, jak je vůbec možné, že k něčemu takovému dojde, a jak město kontroluje, zda podnikatelé plní své zákonné povinnosti v oblasti nakládání s odpady. Odpovědi, které jsem dostal na živnostenském odboru i na odboru životního prostředí, mě překvapily. Kontroly se provádějí jen výjimečně, obvykle jen na základě oznámení. A ta prý bývají sotva tři do roka. Úředníci otevřeně přiznávali, že na systematickou kontrolu nemají kapacity. Času je málo, agenda rozsáhlá a odpadová problematika je organizačně i časově náročná. Před dvěma lety mě oslovil kolega Miroslav Kvapil. Přinesl prezentaci z odborné konference, kde zazněl alarmující údaj. Českým městům každoročně unikají kvůli nedostatečné evidenci a kontrole podnikatelů až 2,7 miliardy korun. A tehdy jsme se rozhodli, že se k nápadu vrátíme. Tak vznikla aplikace Odpadio.

Jak tedy aplikace pomáhá obcím? Kolik lidí na aplikaci pracuje?

Aplikace Odpadio pracuje tak, že identifikujeme všechny podnikatele a provozovny v dané obci. Přes datové schránky je požádáme, aby do systému nahráli smlouvy na svoz odpadu. Pokud takovou smlouvu nemají a obec umožňuje podnikatelům se zapojit do svozového systému města, tak se otevře e-shop, kde si podnikatel nakliká služby, které potřebuje, zaplatí a má vyřešeno. Pokud bude ignorovat veškeré výzvy a upozornění, tak naopak aplikace umí vystavit pokutu.

Podle čeho se bude určovat, v jaké obci má živnostník platit tyto poplatky? Bude rozhodující sídlo živnostníka uvedené v živnostenském oprávnění?

Platit poplatek je potřeba tam, kde odpad vzniká, tedy klasicky v místě, kde se nachází sídlo společnosti nebo provozovna.

 

Výši poplatků si mají obce určovat podle svých pravidel? 

Nejde o klasický poplatek, jaký podle zákona platí občané. V případě podnikatelů obce uzavírají smlouvy na svoz odpadu. A cenovou politiku si každá obec nastavuje podle vlastních pravidel. Výše platby i podmínky se tak mohou lišit podle míry, do jaké chce město podnikatele do systému zapojit. Některé obce například umožňují podnikatelům účast pouze na systému tříděného odpadu, zatímco směsný komunální odpad si musejí podnikatelé řešit samostatně. Tento model bývá mezi městy oblíbený, je administrativně jednodušší a lépe se kontroluje.

Jestliže živnostník vykonává činnost - například programování, při které neprodukuje žádný odpad, proč by měl takové poplatky platit? Má mít doma speciální nádoby na odpad z hodin podnikání a na zbytek hodin osobního času?

Zákon mluví jasně, podnikatel musí mít smlouvu na likvidaci odpadu dříve, než jej začne produkovat. Představa, že například programátor žádný odpad nevytváří, při bližším pohledu neobstojí. Kam se podějí krabice od nového telefonu, myši, monitoru, klávesnice, tiskárny, židle nebo pracovního stolu? Každý podnikatel, ať už pracuje manuálně nebo v kanceláři, generuje určitý druh odpadu, byť i minimální.  

Zkuste si představit město s tisícovkou živnostníků, z nichž každý „jen“ jednou ročně odloží 1 kg odpadu mimo systém. Výsledkem je černá skládka o váze jedné tuny. A to už zdaleka není zanedbatelné množství. Dnešní doba je navíc na odpad velmi „štědrá“, většina věcí, které používáme, je zabalená v plastu, kartonu či polystyrenu. A právě proto mnoho obcí podnikatelům umožňuje zapojení alespoň do systému tříděného sběru. Je to pro ně zpravidla jednodušší, levnější a zároveň to městům pomáhá řešit problém s přeplněnými kontejnerovými stanovišti.

Co se stane, když tyto poplatky platit nebudu? Může mě obec pokutovat?

Ano, podle zákona o odpadech může obec uložit pokutu až do výše 1 milionu korun, a to opakovaně, pokud podnikatel neplní svou povinnost zajistit si smluvní odvoz odpadu. Přitom roční náklady na řádný svoz se často pohybují jen ve stovkách korun. V porovnání s možnými sankcemi se tak vyplatí mít vše v pořádku.  

Zákon je v účinnosti již několik let, avšak nikdo po živnostnících poplatky nevyžaduje, proč?

Jak už jsem zmiňoval na příkladu rozlitého oleje na náměstí, existují dva hlavní důvody: nedostatek času a personální kapacity. Obce jsou zahlceny řadou jiných agend a kontrola odpadů podnikatelů bývá často až na konci seznamu priorit. Zároveň mnohdy nechtějí, nebo si ani nemohou dovolit navyšovat počet úředníků, kteří by se této problematice věnovali. Právě proto vznikla aplikace Odpadio, která celý proces kontroly výrazně zjednodušuje a automatizuje, zvládnete ho doslova na pět kliknutí. Obcím tak šetří nejen čas, ale i náklady.

Mohou platbu za odpad obce vyžadovat i zpětně?

Z právního pohledu to možné je, ale obec by musela prokázat, že konkrétní podnikatel skutečně využíval její odpadový systém. V takovém případě by bylo možné částku vymáhat zpětně až tři roky, a to jako bezdůvodné obohacení, s ohledem na zákonnou promlčecí lhůtu. Takový postup ale obcím důrazně nedoporučujeme. Cílem není vyvolat konflikt s podnikateli, ale nastavit férové podmínky, aby občané nefinancovali odpad za někoho jiného.

Vztahují se poplatky za odpad i na živnostníky vykonávající vedlejší samostatnou výdělečnou činnost?

Ano, zákon nerozlišuje, zda jde o hlavní nebo vedlejší samostatnou výdělečnou činnost. I z vedlejší činnosti totiž může vznikat významné množství odpadu a zákon o odpadech neřeší jeho objem, ale samotný fakt, že vzniká v rámci podnikání.  

Jakmile tedy začne právnická nebo fyzická osoba podnikat, bez ohledu na to, zda jako hlavní nebo vedlejší činnost, má povinnost zajistit si smluvní odvoz a likvidaci odpadu.

Máte už nějaké reakce od živnostníků, kteří se kvůli své obci museli do platby za odpad zapojit?

Většina reakcí podnikatelů je neutrální. Známe českou náturu: i když je chyba na straně podnikatele, který nemá uzavřenou smlouvu, vina se často přičítá úřadu, že „zase po něm něco chce“. Takové reakce se k nám ale většinou ani nedostanou a spíš si je domýšlíme. Ve finále v systému jen vidíme, že 99 % podnikatelů má vše v pořádku a poplatek za svoz odpadu uhradili bez problémů. Zbývá zhruba 1 % tzv. notorických stěžovatelů, kteří jako by si z rozporování úřadu udělali sport. Snaží se „vyhrát“, i když nemají pravdu. Nakonec však i oni zaplatí, jen je to otázka několika telefonátů a e-mailů navíc.


Čtěte také:

Také OSVČ a firmy, které poplatky platit nebudou, se musí registrovat u ČT a ČRo

Sexuální obtěžování nebo GDPR? Tvůrce Oznam.to objasňuje, co zaměstnanci nejčastěji nahlašují

AI na pracovišti? Bez školení riskujete vysoké sankce

Autor článku

Veronika Němcová

Veronika Němcová  

Redaktorka Finance.cz


Pomohl vám tento obsah? Dejte mu hodnocení:

Průměrné hodnocení: 2
Hlasováno: 15 krát

Články ze sekce: DANĚ


'; document.getElementById('preroll_iframe').onload = function(){ preroll_setupIframe(); } } function preroll_setupIframe() { prerollDocument = document.getElementById('preroll_iframe').contentWindow.document; let el = prerollDocument.createElement('style'); el.type = 'text/css'; prerollDocument.head.appendChild(el); el.innerText = "#preroll_adContainer>div:nth-of-type(1),#preroll_adContainer>div:nth-of-type(1) > iframe {width: 99% !important;height: 99% !important;max-width: 100%;}#preroll_videoContent,body{width:100vw;height:100vh}body{font-family:'Helvetica Neue',Arial,sans-serif}#preroll_videoContent{overflow:hidden;background:#000}#preroll_adMuteBtn{width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; preroll_videoContent = prerollDocument.getElementById('preroll_contentElement'); preroll_videoContent.style.display = 'none'; preroll_videoContent.volume = 1; preroll_videoContent.muted = false; const playPromise = preroll_videoContent.play(); if (playPromise !== undefined) { console.log('PREROLL sound forbidden');preroll_videoContent.volume = 0;preroll_videoContent.muted = true;preroll_setUpIMA(false); //playPromise.then(function () { console.log('PREROLL sound allowed');preroll_setUpIMA(true); }).catch(function () { console.log('PREROLL sound forbidden');preroll_videoContent.volume = 0;preroll_videoContent.muted = true;preroll_setUpIMA(false); }); } } function preroll_setUpIMA(sound) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. preroll_createAdDisplayContainer(); // Create ads loader. preroll_adsLoader = new google.ima.AdsLoader(preroll_adDisplayContainer); // Listen and respond to ads loaded and error events. preroll_adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, preroll_onAdsManagerLoaded, false); preroll_adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, preroll_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() { preroll_adsLoader.contentComplete(); }; preroll_videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (sound && preroll_iinfoVastUrlIndex <= preroll_iinfoVastUrls.length-1) { adsRequest.adTagUrl = preroll_iinfoVastUrls[preroll_iinfoVastUrlIndex]; console.log('Preroll advert: ' + preroll_iinfoVastUrls[preroll_iinfoVastUrlIndex]); preroll_current = 0; preroll_videoContent.muted = false; preroll_videoContent.volume = 1; } else { adsRequest.adTagUrl = preroll_iinfoVastUrlsMuted[preroll_iinfoVastUrlIndexMuted]; console.log('Preroll advert: ' + preroll_iinfoVastUrlsMuted[preroll_iinfoVastUrlIndexMuted]); preroll_current = 1; preroll_videoContent.muted = true; preroll_videoContent.volume = 0; } adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; preroll_adsLoader.requestAds(adsRequest); } function preroll_createAdDisplayContainer() { prerollDocument.getElementById('preroll_videoContent').style.display = 'none'; preroll_adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('preroll_adContainer'), preroll_videoContent); } function preroll_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. preroll_adsManager = adsManagerLoadedEvent.getAdsManager(preroll_videoContent, adsRenderingSettings); // Add listeners to the required events. preroll_adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, preroll_onAdError); preroll_adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, preroll_onContentPauseRequested); preroll_adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, preroll_onContentResumeRequested); preroll_adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, preroll_onAdEvent); // Listen to any additional events, if necessary. preroll_adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, preroll_onAdEvent); preroll_adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, preroll_onAdEvent); preroll_adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, preroll_onAdEvent); preroll_playAds(); } function preroll_playAds() { // Initialize the container. Must be done through a user action on mobile // devices. preroll_videoContent.load(); preroll_adDisplayContainer.initialize(); try { preroll_adsManager.init(preroll_width_init, preroll_height_init, google.ima.ViewMode.NORMAL); preroll_adsManager.start(); } catch (adError) { } } function preroll_onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: prerollDocument.getElementById('preroll_adContainer').style.width = '100%'; prerollDocument.getElementById('preroll_adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('preroll_adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: prerollDocument.getElementById('preroll_adMuteBtn').style.display = 'block'; preroll_init_container.style.display = 'none'; try { adsManager.pause(); } catch (error) { } break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: preroll_play_yt(); break; case google.ima.AdEvent.Type.COMPLETE: preroll_play_yt(); break; } } function preroll_onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); preroll_last_error = adErrorEvent.getError().getErrorCode(); console.log(preroll_last_error); if (!preroll_loadNext()) { preroll_play_yt(); } } function preroll_onContentPauseRequested() { preroll_videoContent.pause(); } function preroll_onContentResumeRequested() { preroll_videoContent.play(); } function preroll_loadNext() { if (preroll_current === 0) { preroll_iinfoVastUrlIndex++; if (preroll_iinfoVastUrls.length > preroll_iinfoVastUrlIndex) { preroll_init(); } else { return false; } } else { preroll_iinfoVastUrlIndexMuted++; if (preroll_iinfoVastUrlsMuted.length > preroll_iinfoVastUrlIndexMuted) { preroll_init(); } else { return false; } } preroll_adVolume = 1; return true; } function preroll_unmuteAdvert() { preroll_adVolume = !preroll_adVolume; if (preroll_adVolume) { preroll_adsManager.setVolume(1); prerollDocument.getElementById('preroll_adMuteBtn').innerHTML = ''; } else { preroll_adsManager.setVolume(0); prerollDocument.getElementById('preroll_adMuteBtn').innerHTML = ''; } } function tryToInicializePreroll() { preroll_init(); } function preroll_play_yt() { preroll_videoElement.style.display = 'block'; const youTubeUrlQueryString = preroll_videoElement.src.includes('?'); const firstLetterOfAddedUrl = youTubeUrlQueryString ? '&' : '?'; preroll_videoElement.src += firstLetterOfAddedUrl + 'autoplay=1&mute=0'; preroll_init_container.style.display = 'none'; document.querySelectorAll('.preroll-container').forEach(e => e.remove()); finance_init_container.style.display = 'block'; try { adsManager.pause(); } catch (error) { } }

'; document.getElementById('outstream-iframe').onload = function(){ setupIframe(); } } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); el.type = 'text/css'; outstreamDocument.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:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if (!outstream_direct_played) { console.log('Setup iframe: direct'); setUpIMA(true); } else if (iinfoOutstreamAllowed) { console.log('Setup iframe: allowed article'); const playPromise = videoContent.play(); playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { renderPassback(); }); } else { console.log('Setup iframe: passback'); renderPassback(); } } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { 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(); if (direct) { adsRequest.adTagUrl = iinfoVastDirect; console.log('Outstream DIRECT CAMPAING advert: ' + iinfoVastDirect); videoContent.muted = true; videoContent.volume = 0; outstream_direct_played = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(1); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); try { adsManager.init(outstream_width_init, outstream_height_init, google.ima.ViewMode.NORMAL); adsManager.start(); } catch (adError) { } } /** * Handles the ad manager loading and sets ad event listeners. * @param {!google.ima.AdsManagerLoadedEvent} adsManagerLoadedEvent */ 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(); } /** * Handles actions taken in response to ad events. * @param {!google.ima.AdEvent} adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function() { // Example: const remainingTime = adsManager.getRemainingTime(); }, 300); // every 300ms } //unmuteAdvert(); outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstream_last_error == 303) { renderPassback(); } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (true) { renderPassback(); } break; } } function renderPassback() { console.log('Outstream Spouštím Passback'); advertContainer.innerHTML = ""; advertContainer.appendChild(passBackDiv); } /** * Handles ad errors. * @param {!google.ima.AdErrorEvent} adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstream_last_error = adErrorEvent.getError().getErrorCode(); console.log(outstream_last_error); if (!loadNext()) { renderPassback(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrls.length > iinfoVastUrlIndex) { outstream_init(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { console.log('outstream onActiveView()'); var wrapper = document.getElementsByClassName('outstream-container')[0]; if (wrapper) { var containerOffset = wrapper.getBoundingClientRect(); var windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstream_paused) { adsManager.resume(); outstream_paused = false; /*window.removeEventListener('scroll', onActiveView);*/ console.log('Outstream: ad resume()'); } return true; } else { if (!outstream_paused) { adsManager.pause(); outstream_paused = true; /*window.removeEventListener('scroll', onActiveView);*/ console.log('Outstream: ad pause()'); } } } return false; } let outstream_initialize_interval = setInterval(tryToInicializeOutstream, 100); function tryToInicializeOutstream() { console.log(cpexPackage.adserver.displayed); var wrapper = document.getElementsByClassName('outstream-container')[0]; if (wrapper) { var containerOffset = wrapper.getBoundingClientRect(); var windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstream_initialize_interval); outstream_init(); } } } }
OSZAR »