Jak se změní penzijko? Kdo musí platit víc, aby nepřišel o příspěvek, a kdo ho už nedostane vůbec?

21. 11. 2023
Doba čtení: 6 minut

Sdílet

Autor: Shutterstock
Státní příspěvky na penzijko se budou vyplácet jinak. Abyste dostali aspoň minimum, musíte spořit víc. Starobní důchodci už na státní podporu nemají dosáhnout vůbec.

Státní podpora tzv. penzijka ve třetím pilíři se změní. Abyste dosáhli na příspěvek z penzijního připojištění v transformovaných fondech nebo doplňkového penzijního spoření v účastnických fondech, budete muset posílat víc. Další novinka pak omezí nárok státního příspěvku pro lidi ve starobním důchodu. Změn dozná i daňová podpora, která se rozšíří i na investice. Změny přinese novela z pera Ministerstva financí, kterou 15. listopadu schválila Sněmovna.

Státní příspěvky nyní a poté

Výše státního příspěvku na penzijní připojištění nebo doplňkové penzijní spoření závisí na výši vaší měsíční úložky. Nyní platí, že je-li výše měsíčního příspěvku:

  • 300 až 999 Kč, činí výše měsíčního státního příspěvku částku 90 Kč a 20 % z částky přesahující 300 Kč,
  • 1000 a více Kč, činí výše měsíčního státního příspěvku částku 230 Kč.
Výše státního příspěvku vzhledem k měsíční úložce
Měsíční úložka Státní příspěvek
do 299 Kč 0
300 Kč 90 Kč (podpora 30 % z úložky)
400 Kč 110 Kč (podpora 27,5 % z úložky)
500 Kč 130 Kč (podpora 26 % z úložky)
600 Kč 150 Kč (podpora 25 % z úložky)
700 Kč 170 Kč (podpora 24,3 % z úložky)
800 Kč 190 Kč (podpora 23,75 % z úložky)
900 Kč 210 Kč (podpora 23,33 % z úložky)
1000 Kč 230 Kč (podpora 23 % z úložky)

Protože si ale na důchod Češi obecně spoří málo, chce stát motivovat k vyšším úložkám. Od poloviny roku 2024 tak vzroste minimální částka, kterou zde musíte měsíčně odkládat, abyste dosáhli aspoň na nejnižší úroveň státního příspěvku, budete-li ale posílat dost, můžete získat i vyšší státní podporu, než umožňuje současný systém.

Od července 2024 má platit, že bude výše státního příspěvku u měsíční úložky ve výši od 500 do 1699 Kč činit 20 %. Maximálně budete moci získat příspěvek ve výši 340 Kč měsíčně při úložce 1700 Kč a více (nyní max. 230 Kč).

Na nových pravidlech vydělají ti, kteří na „penzijko“ budou posílat více než 1150 Kč. Nad tuto částku totiž bude státní příspěvek nově vyšší než podle současných pravidel. Budete-li spořit naopak méně, dostanete za stejnou úložku nižší státní podporu než dnes.

Porovnání současných a navrhovaných pravidel pro stanovení státního příspěvku
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č

Zdroj: Výpočty autora

Daňové novinky

Měsíční úložky zasílané do třetího pilíře si můžete při splnění určitých podmínek odečíst od daňového základu, a to do výše 24 000 Kč, ale s tím, že uplatnit takto můžete až platby přesahující 12 000 Kč ročně. Odpočet od základu daně je totiž možné uplatnit nad úložky, které zakládají nárok státní příspěvek. V současnosti je to tedy na měsíční úložky nad 1000 Kč, po účinnosti změn uplatníte odpočet od základu daně na platby nad 1700 Kč.

S odpočtem od základu daně souvisí i další změna. Nově se má limit pro odpočet od základu daně od příštího roku pro spoření na důchod ve III. pilíři sjednotit s limitem na životní pojištění (uznatelné jsou varianty kromě čistě rizikového). Platby na penzijko a životko půjdou uplatnit a od základu daně odečíst do částky 48 tis. Kč s tím, že kromě těchto produktů do limitu budete moci nově promítnout také platby na další tzv. podporované produkty spoření na stáří. Ty budou zejména z oblasti investic, vejdou-li se do definice tzv. dlouhodobého investičního produktu (DIP). A nově půjdou prostřednictvím tohoto produktu odečíst od základu daně také platby na tzv. pojištění dlouhodobé péče.

Dlouhodobý investiční produkt (DIP) je souhrnný název pro existující finanční produkty, prostřednictvím kterých můžete spořit na stáří a které mají sloužit jako alternativa ke státem podporovanému životku a penzijku. Může jít například o akcie, dluhopisy, investice do podílového fondu, ale i spořicí účet či termínovaný vklad. DIP bude moci poskytovat typicky banka, obchodník s cennými papíry nebo například investiční společnost, vždy pod dozorem centrální banky.

Jde vlastně o přejmenovaný původní koncept účtu dlouhodobých investic, který se měl v původním návrhu Ministerstva financí překřtít na investiční penzijní účet.

Pravidlo 60 + 60 nebo 60 + 120

Daňová podpora produktů spoření na stáří bude podmíněna pravidlem 60 + 60,  (není možné vypovědět dříve než 60 měsíců od založení a ne dříve než v 60 letech).

U smluv uzavřených od platnosti této novelizace by se podmínka časového testu prodloužila z 60 na 120 měsíců. Daňová podpora produktu spoření na stáří má být tedy nově podmíněna tím, že výplata peněžních prostředků, plnění z něj a odepsání majetku z dlouhodobého investičního produktu nastane ve prospěch poplatníka, který produkt sjednal, a to pouze:

  • po 120 měsících od sjednání – ale při dosažení 60 let (u doplňkového penzijního spoření zároveň musí platit, že poplatník dosáhne věku o 5 let nižšího, než je důchodový věk),
  • nebo při jeho invaliditě ve třetím stupni.

V případě porušení těchto pravidel bude nutné vybrané prostředky dodanit jako příjem.

Rozšířená daňová podpora se bude vztahovat i na příspěvky od zaměstnavatele. Zde ministerstvo zachovalo limit pro osvobození příjmů od daně ve výši 50 tis. Kč. I zaměstnavatelé tak budou moci nově přispívat kromě „penzijka“ a životka i na investice.

Pojištění dlouhodobé péče

V rámci pozměňovacích návrhů se do předlohy dostal návrh na další rozšíření možných odpočtů od základu daně. Odečítat by tak mělo jít i platby na tzv. Pojištění dlouhodobé péče.

Podle předlohy jde o pojištění, které má krýt riziko, že se pojistník nebo jeho blízká osoba stanou závislými na pomoci jiné osoby při zvládání základních životních potřeb kvůli dlouhodobě špatnému zdravotnímu stavu. Podmínkou je, aby produkt poskytovala pojišťovna z ČR, EU nebo Evropského hospodářského prostoru.

Daňová podpora by se měla vztahovat na krytí rizika závislosti odpovídající stupni III nebo IV podle zákona upravujícího sociální služby. Pojištění by mělo mít opakované měsíční plnění poskytované po celou dobu závislosti v daných stupních, nebo by mělo být plnění poskytované ve formě poskytnutí péče o pojištěného po celou dobu závislosti v daných stupních (III a IV) nebo náhrady nákladů na takovou péči.

Pojištění by nebylo daňově podporované, pokud by mohl pojistitel smlouvu vypovědět později než 2 měsíce ode dne jejího uzavření nebo by ji mohl vypovědět na základě oznámení vzniku pojistné události nebo by měl právo měnit výši pojistného v závislosti na věku nebo zdravotním stavu pojištěného.

Alternativní fond

Předloha dále počítá se vznikem alternativního účastnického fondu ve III. pilíři, který má nabídnout potenciálně výnosnější investice lidem, kteří jsou ochotni nést vyšší míru rizika, než nabízejí stávající dynamické fondy.

Alternativní účastnický fond by tedy mohl investovat i do dalších instrumentů, které dynamické fondy nenabízí. Např. private equity fondů, komoditních derivátů, nemovitostí, veřejné infrastruktury, práv duševního vlastnictví, plavidel, letadel, drážních vozidel nebo strojů, pohledávek na peněžitá plnění apod.

Penzijní společnost by ale mohla investovat nejvýše 10 % hodnoty majetku v alternativním účastnickém fondu do cenných papírů vydávaných jedním investičním fondem nebo jedním zahraničním investičním fondem.

Důchodci už nedostanou státní příspěvek

Předloha ale obsahuje ještě jednu novinku. Státní příspěvek k „penzijku“ ze třetího pilíře se od příštího července nově nemá vyplácet střadatelům, kteří jsou ve starobním důchodu.

S ohledem na skutečnost, že doplňkové penzijní spoření (resp. penzijní připojištění) nemá za cíl sloužit jako krátkodobý či střednědobý produkt s podporou státu, nýbrž jako prostředek k dlouhodobému odkládání spotřeby za účelem výplaty prostředků v období důchodového věku ke zmírnění případného propadu finančních příjmů, který se s odchodem do důchodu může pojit, upravuje, že státní příspěvek nebudou dostávat osoby, jimž byl přiznán starobní důchod, a osoby starší 65 let, vysvětluje důvodová zpráva s tím, že vzhledem k nastavení současných podmínek nároku na státní příspěvek k penzijku je dnes běžnou praxí tzv. točení smluv u účastníků, jež splnili podmínku 60 let.

Ti po vzniku nároku na dávky po 60 měsících prostředky vyberou a uzavřou novou smlouvu, kterou po 60 měsících opět vyberou.

skoleni_12_6

Poslanec Patrik Nacher se v této souvislosti snažil tuto část předlohy pozměňovacím návrhem zrušit, nebo docílit aspoň toho, aby se opatření vztahovalo jen na smlouvy, které budou uzavřené po jeho účinnosti. Jeho návrhy ale neprošly. O státní příspěvek by tak neměli přijít jen starobní důchodci, jejichž smlouva trvá aspoň 60 měsíců.

Předlohu ale ještě nyní musí posvětit Senát a podepsat ji prezident. Zatím se tedy nedá vyloučit, že se její části ještě změní.

'; 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 »