Produkt spoření na stáří: Obsáhne fondy, životko, ale i akcie a dluhopisy

13. 6. 2023
Doba čtení: 5 minut

Sdílet

Ilustrační obrázek
Autor: Depositphotos.com, podle licence: Rights Managed
Ilustrační obrázek
Novela přináší úpravu spoření na důchod i daňových výhod. Od roku 2024 se bude na stáří spořit podle nových podmínek, včetně příspěvků zaměstnavatele.

Upravují se podmínky nezdanitelných částí základu daně v rámci spoření na stáří i možnosti osvobozených příspěvků zaměstnavatele. Zavádí se i nový pojem, a to „produkt spoření na stáří“. Cílem předloženého návrhu zákona je zejména zavést některá opatření, která mají přispět k rozvoji kapitálového trhu v ČR.

Co se dozvíte v článku
  1. Penzijní připojištění a doplňkové penzijní spoření
  2. Produkt spoření na stáří
  3. Příspěvek zaměstnavatele a porušení podmínek
  4. Dodanění jednorázových výběrů či penzí
  5. Zdanění výnosu ze spoření

Hlavními navrhovanými opatřeními jsou tzv. dlouhodobý investiční produkt a některé změny ve III. penzijním pilíři. Novela zákona o daních z příjmů je součástí návrhu zákona, kterým se mění některé zákony v souvislosti s rozvojem finančního trhu. Je teprve na začátku legislativního procesu, nejsou vyloučeny případné úpravy. Účinnost se předpokládá již od roku 2024.

Penzijní připojištění a doplňkové penzijní spoření

Poskytování státního příspěvku v penzijních fondech (doplňkové penzijní spoření nebo starší transformovaný fond penzijního připojištění se státním příspěvkem) je vázáno na příspěvek účastníka. Minimální výše příspěvku účastníka je 300 Kč měsíčně a maximální výše tohoto příspěvku, nad kterou se státní příspěvek již dále nezvyšuje, činí 1000 Kč měsíčně. Navrhuje se zvýšit spodní hranici ze současných 300 Kč na 500 Kč měsíčně a horní hranici příspěvku ze současných 1000 Kč na 1700 Kč měsíčně.

Navrženou změnu zobrazuje následující tabulka:

Výše měsíční úložky Současný státní příspěvek Nový státní příspěvek
300 Kč 90 Kč 0 Kč
400 Kč 110 Kč 0 Kč
500 Kč 130 Kč 100 Kč
600 Kč 150 Kč 120 Kč
700 Kč 170 Kč 140 Kč
800 Kč 190 Kč 160 Kč
900 Kč 210 Kč 180 Kč
1000 Kč 230 Kč 200 Kč
1100 Kč 230 Kč 220 Kč
1150 Kč 230 Kč 230 Kč
1200 Kč 230 Kč 240 Kč
1300 Kč 230 Kč 260 Kč
1400 Kč 230 Kč 280 Kč
1500 Kč 230 Kč 300 Kč
1600 Kč 230 Kč 320 Kč
1700 Kč a více 230 Kč 340 Kč

Produkt spoření na stáří

To ale není jediná změna. Spolu s poskytováním státního příspěvku může účastník spoření využívat i daňové výhody. Současná nezdanitelná část základu daně činí 24 000 Kč za zaplacené příspěvky na životní pojištění a 24 000 Kč za zaplacené příspěvky v penzijních fondech (zde aktuálně částky převyšující 1000 Kč měsíčně). Tento limit by se měl od roku 2024 sjednotit. Celková maximální částka, o kterou lze snížit základ daně, se navrhuje ve výši 48 000 Kč (jeden produkt nebo kombinace více produktů). S ohledem na navrhovanou účinnost zákona k 1. lednu 2024 ji ale poplatníci v daních reálně využijí až v roce 2025 (roční zúčtování či daňové přiznání po skončení zdaňovacího období 2024).

Avšak nepůjde jen o takzvané životko a penzijní fondy. Produktem spoření na stáří má být:

  • a) penzijní připojištění se státním příspěvkem podle zákona upravujícího penzijní připojištění se státním příspěvkem,
  • b) doplňkové penzijní spoření podle zákona upravujícího doplňkové penzijní spoření,
  • c) penzijní pojištění u instituce penzijního pojištění,
  • d) soukromé životní pojištění,
  • e) nový dlouhodobý investiční produkt podle zákona upravujícího podnikání na kapitálovém trhu a obdobný produkt poskytovaný bankou podle zákona upravujícího činnost bank, spořitelním a úvěrním družstvem, obchodníkem s cennými papíry, investiční společností, samosprávným investičním fondem nebo obdobnou zahraniční osobou oprávněnou poskytovat své služby v členském státě Evropské unie nebo státě tvořícím Evropský hospodářský prostor (jeho prostřednictvím bude poplatník moci nakupovat různé finanční produkty, např. akcie, dluhopisy, podíly v investičním fondu, jako dlouhodobou daňově podporovanou formu spoření na stáří).

Z toho důvodu se do zákona o daních z příjmů navrhují nové paragrafy 15a a 15b, kde budou vymezeny daňově podporované produkty spoření na stáří. A to včetně všech podmínek, které tyto produkty musí splňovat, aby bylo možné na ně daňové výhody využít.

Příspěvek zaměstnavatele a porušení podmínek

Nejeden zaměstnavatel v současné době přispívá svým zaměstnancům na důchod. To bude samozřejmě umožněno i v budoucnu. Podle upraveného § 6 odst. 9 písm. p) zákona o daních z příjmů bude na straně poplatníka s příjmy ze závislé činnosti osvobozen od daně z příjmů příspěvek zaměstnavatele poskytnutý na zaměstnancův produkt spoření na stáří. Stejně jako dnes, tj. do výše 50 000 Kč ročně. Nově se bude vztahovat na úhrn příspěvků zaplacených zaměstnavatelem na všechny zaměstnancovy daňově podporované produkty spoření na stáří (tedy včetně nového investičního produktu).

Ptejte se odborníka v poradně Mzdové účetnictví
PhDr. Dagmar Kučerová
mzdový poradce

Pokud by došlo k výplatě peněžních prostředků nebo plnění z tohoto produktu nebo k odepsání majetku z dlouhodobého investičního produktu podle zákona upravujícího podnikání na kapitálovém trhu nebo obdobného produktu ve prospěch poplatníka, před splněním podmínek, musí dojít k navrácení daňové podpory. Prostředky nesmí být vyplaceny před uplynutím 120 kalendářních měsíců (dosud 60 měsíců) od jeho vzniku nebo před kalendářním rokem, ve kterém poplatník dosáhne 60 let věku (s určitými výjimkami – např. plnění při invaliditě třetího stupně atd.). To se týká jak nezdanitelné části základu daně, tak i dosud osvobozeného příspěvku zaměstnavatele (předčasnou výplatou plnění ztrácí poplatník nárok na osvobození od daně z příjmů).

Dodanění jednorázových výběrů či penzí

Obdobně se upravuje i § 4 odst. 1 písm. l) zákona o daních z příjmů z důvodu nepřehlednosti a nepřesnosti. V případě plnění z pojištění osob se navrhuje od daně osvobodit pouze pojistné plnění. S taxativně vyjmenovanými výjimkami, které jsou přebírány z dosavadní úpravy – tj. jednorázová plnění či důchody, u kterých je vymezeno období pobírání kratší než 10 let, vyplácených z pojištění pro případ dožití, z pojištění pro případ dožití ze stanoveného věku nebo dřívější smrti nebo z pojištění důchodu). Od daně však nebude osvobozeno žádné plnění, které není pojistným plněním, tedy bez ohledu na to, zda zakládá zánik pojistné smlouvy, či nikoli (např. odkupné nebo tzv. průběžné výběry u investičního životního pojištění).

U penzijního připojištění se státním příspěvkem, doplňkového penzijního spoření a penzijního pojištění je hlavním smyslem získání penze ve stáří, a to dlouhodobé nebo doživotní. Proto nemohou být osvobozena jednorázová plnění a penze, které mají být pobírány po dobu kratší než 10 let.

školení červen - ochrana os. údajů

Zdanění výnosu ze spoření

V § 8 odst. 6 zákona o daních z příjmů se navrhuje nově stanovit pravidlo pro určení základu daně. Příjmy z produktu na stáří se sníží o příspěvky, resp. o jakékoli zaplacené pojistné. Takto určeným základem daně se zajistí, že se při výplatě zdaní pouze výnos z daných produktů, tj. zhodnocení naspořených prostředků (nikoli vlastních poplatníkem naspořených prostředků či prostředků zaplacených zaměstnavatelem). Avšak při porušení podmínek bude nezbytné (stejně jako je tomu dnes) dodanit uplatněné daňové výhody. Nebudou již ale umožněny jednorázové výběry.

Navržená úprava § 8 odst. 6 zákona o daních z příjmů: Plnění z penzijního připojištění se státním příspěvkem podle zákona upravujícího penzijní připojištění se státním příspěvkem, doplňkového penzijního spoření podle zákona upravujícího doplňkové penzijní spoření a penzijního pojištění jsou základem daně po snížení o zaplacené příspěvky a státní příspěvky hrazené Českou republikou, pokud tyto státní příspěvky nebyly vráceny. V případě tohoto plnění ve formě penze se zaplacené příspěvky a státní příspěvky rozloží na vymezené období pobírání penze. ..

Na základě přechodných ustanovení se má na smlouvy o důchodovém připojištění a soukromém životním pojištění uzavřené před tímto datem použít stávající právní úprava. V ostatním, tj. např. nový jednotný limit pro nezdanitelnou část základu daně, se i pro starší smlouvy využije nová právní úprava.

Bude doplňkové penzijní spoření pro mladší ročníky atraktivní?

Seriál: Důchody

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.


Autor článku

Dagmar Kučerová je odborná redaktorka a lektorka, která se specializuje na mzdy, personalistiku a výklad zákoníku práce. Profil autorky →

'; 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'; } }
Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).
'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); 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 ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * 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 = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream 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 = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * 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(0.3); 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(); // 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(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * 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(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } 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 (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »