Studenti a pojistné při studiu a po něm. Přehled modelových situací

22. 7. 2019
Doba čtení: 9 minut

Sdílet

Autor: Depositphotos
Jaká pravidla ohledně placení pojistného na zdravotní a sociální pojištění platí pro studenty ještě ve škole a v různých situacích, které nastávají poté, co ji opustí? Připravili jsme řadu modelových situací, na kterých si pravidla placení pojistného vysvětlíme.

Konec školního roku neznamená jen dva až tři měsíce volna. Některým studentům se v tuto dobu také začíná odpočítávat lhůta, po které budou muset začít platit zálohy na pojistné. Koho se to týká a v jakých případech?

Student a pojistné

Pro pořádek je třeba říci, že na dobu studia se nevztahuje povinnost platit pojistné na zdravotní ani sociální pojištění. Z hlediska zdravotního pojištění (ZP) je student státním pojištěncem.

Za státní pojištěnce se považují například:

  • děti do ukončení jejich povinné školní docházky,
  • studenti do 26. roku, pokud se soustavně připravují na své budoucí povolání,
  • ženy na mateřské a osoby na rodičovské dovolené,
  • osoby, které pobírají některý z důchodů,
  • uchazeči o zaměstnání, pokud jsou v evidenci úřadu práce, atd.

Kompletní seznam osob, za které platí pojistné stát, najdete v § 7 odst. 1) zákona o veřejném zdravotním pojištění.

Jak už jsme uvedli, studenti neplatí pojistné ani na sociální zabezpečení, ale od 18. roku se k němu můžou dobrovolně přihlásit.

Doba studia od 1. 1. 2010 už není dobou důchodového pojištění ani tzv. dobou náhradní, a nezapočítává se tak do doby pojištění pro budoucí starobní důchod.

Student a výdělečná činnost

Tato pravidla může změnit fakt, že student už vykonává výdělečnou činnost, která zakládá účast na pojištění. (Pokud nedosáhl 26 let, je podnikání při studiu považováno z hlediska sociálního pojištění za výkon vedlejší samostatné výdělečné činnosti, u ZP se o vedlejší činnosti mluví pouze tehdy, pokud OSVČ má zaměstnání a odvádí zde pojistné alespoň z minimálního základu).

Podnikání s sebou nese povinnost platit pojistné. Při výkonu vedlejší činnosti se platí pojistné na důchodové pojištění pouze v případě, kdy daňový základ dosáhl výše zakládající povinnou účast na důchodovém pojištění, nebo se k účasti na něm OSVČ sama přihlásí. Rozhodnou částkou příjmů z vedlejší činnosti platnou pro rok 2019 je 78 476 Kč. Dále se OSVČ může přihlásit i k nemocenskému pojištění, účast je dobrovolná.

U ZP v případě, že je osoba státním pojištěncem z titulu studia, nebo se jedná o vedlejší činnost kvůli docházce do zaměstnání, není nutné při platbě záloh dodržet minimální vyměřovací základ OSVČ a platí pojistné ze svého skutečného příjmu po odpočtu výdajů.

Zahájení podnikání, přesně řečeno samostatné výdělečné činnosti, je třeba vždy oznámit zdravotní pojišťovně a OSSZ příslušné podle místa bydliště podnikatele, a to do osmi dnů.

V případě zaměstnání za studenty zálohy na pojistné sráží a odvádí zaměstnavatel. Povinnost platit pojistné se zde nevztahuje jen na případy, které nezakládají účast na pojištění. Tedy tzv. zaměstnání malého rozsahu, kdy měsíční příjem nedosahuje hranice 3000 Kč (např. dohoda o pracovní činnosti), a při zaměstnání vykonávaném na základě dohody o provedení práce, pokud výše měsíčního příjmu nepřesahuje 10 000 Kč.

Absolvent střední školy, nepokračuje dál ve studiu

Zdravotní pojištění

Absolvent střední školy (SŠ), který dále nepokračuje ve studiu, se považuje za nezaopatřené dítě do 30. června daného roku. Bez ohledu na to, jestli je výdělečně činný. Poté už na tom záleží. Pokud nevykonává výdělečnou činnost po celý kalendářní měsíc a nepřihlásil se na pracovní úřad (ÚP) k pobírání podpory v nezaměstnanosti (nebo podpory při rekvalifikaci), je nezaopatřeným dítětem ještě v době školních prázdnin, které na ukončení studia bezprostředně navazují. To se týká jak úspěšných absolventů střední školy, tak neúspěšných žáků, kteří v určeném termínu úspěšně nevykonali maturitní nebo závěrečnou zkoušku nebo absolutorium a byla jim povolena opravná zkouška, odklad zkoušky či její opakování, vysvětlila pro server Měšec.cz Iwona Navrátilová z tiskového oddělení Všeobecné zdravotní pojišťovny (VZP) a doplnila, že při ukončení studia SŠ v průběhu školního roku je dítě nezaopatřeným pouze do dne ukončení studia.

Absolvent vysoké školy, nepokračuje dál ve studiu

Zdravotní pojištění

Absolventům vysoké školy (VŠ), kteří dál nestudují, zůstává statut nezaopatřeného dítěte po celý kalendářní měsíc, ve kterém studium řádně ukončili (opět bez ohledu na to, zda jsou v té době výdělečně činní), a dále ještě jeden následující měsíc, pokud v něm nevykonávají po celou dobu výdělečnou činnost ani nemají nárok na podporu v nezaměstnanosti či při rekvalifikaci.

Absolvent SŠ, VŠ, který se (ne)přihlásí na pracovní úřad

Zdravotní pojištění

Poté, co studenti absolvují a užijí si své zbytky prázdnin, se předpokládá, že si většina z nich začne hledat práci. V případě, že se přihlásí na ÚP, se z hlediska zdravotního pojištění stávají státními pojištěnci, a pojistné za ně tedy platí stát. Pokud se na ÚP nezaregistrují, stávají se po ztrátě statutu nezaopatřeného dítěte osobou bez zdanitelných příjmů (v případě, že nejsou v jiné kategorii osob, za které hradí pojistné stát), která si musí platit zálohy na zdravotní pojištění sama, ale ve snížené výši. Pro letošek jsou tyto zálohy ve výši 1803 korun měsíčně.

Sociální pojištění při ukončení studia

U sociálního pojištění (SP) platí jiná pravidla. Samotným ukončením studia povinnost odvádět pojistné na sociální zabezpečení nevzniká. Rozhodujícím faktorem pro vznik povinnosti pojistné platit je zahájení výdělečné činnosti, která založí účast na pojištění. Pokud tedy absolvent opustí školu, ale nezačne s výdělečnou činností, která účast na pojištění zakládá, nemusí platit pojistné na sociální zabezpečení. Na místě je ale upozornit, že pak nezískává potřebnou dobu pojištění pro budoucí starobní důchod. Z tohoto hlediska by se ve vlastním zájmu měl registrovat na ÚP, protože doba vedení v evidenci uchazečů o zaměstnání je náhradní dobou důchodového pojištění. Pro budoucí důchod (ať už starobní, invalidní, pozůstalostní) se ale započítává jen v omezeném rozsahu. Z doby evidence bez pobírání podpory v nezaměstnanosti či rekvalifikaci před 55. rokem věku se pro potřeby důchodového pojištění započítává nejvýše jeden rok.

Pravidlo pro vznik povinnosti platit pojistné na sociální zabezpečení se aplikuje na všechny situace stejně, proto ho zde nebudeme opakovat stále dokola.

Informace o dobách důchodového pojištěnínáhradních dobách pojištění najdete na webu České správy sociálního zabezpečení.

Absolvent začne podnikat

Začne-li absolvent po škole podnikat jako OSVČ, musí dané do 8 dnů oznámit své zdravotní pojišťovně a příslušné okresní správě sociálního zabezpečení. Povinnost platit pojistné se na něj v takovém případě začne vztahovat hned následující měsíc po složení zkoušek. (Vedlejším zdrojem příjmů by podnikání z hlediska zdravotního pojištění mohlo být pouze v případě, že je absolvent zároveň zaměstnán a bylo zde odvedeno pojistné alespoň z minimálního vyměřovacího základu.)

Absolvent jde do zaměstnání

Nastoupí-li absolvent po škole do zaměstnání, ohlašovací povinnost by za něj měl splnit zaměstnavatel, který taktéž strhává a odvádí pojistné na zdravotní a sociální pojištění.

Absolvent jde na brigádu

V případě, že absolvent po zaměstnání pracuje na dohody o provedení práce (DPP) nebo na dohody o pracovní činnosti (DPČ) a úhrn příjmů z nich v jednom měsíci u jednoho zaměstnavatele nedosáhne započitatelného příjmu, není pro účely zdravotního pojištění zaměstnancem. Hranice příjmu je u DPP 10 000 Kč měsíčně a u DPČ 3000 Kč měsíčně.

Jestliže taková osoba není vedle této ‚brigády‘ zaměstnancem, OSVČ ani za ni není plátcem pojistného stát, musí si platit pojistné na zdravotní pojištění sama, jako osoba bez zdanitelných příjmů, informovala Navrátilová z VZP.

Povinnost platit pojistné na sociální zabezpečení nevzniká, pokud měsíční výdělek u dohod nepřesáhne zmíněné hranice. V opačném případě pojistné strhne a odvede zaměstnavatel.

Jak situaci mění dosažení 26 let?

Zdravotní pojištění

Za studenty na SŠ a VŠ do 26 let platí zdravotní pojištění stát jako za nezaopatřené děti. Pokračujete-li ve studiu i po dovršení 26 let, musíte si platit pojistné na zdravotní pojištění sami jako osoba bez zdanitelných příjmů (pokud nezůstáváte státním pojištěncem z jiného důvodu, třeba kvůli invalidnímu důchodu apod.). To neplatí pokud zároveň podnikáte nebo jste v zaměstnání a vaše činnost zakládá účast na pojištění. Pak platíte pojistné z titulu této výdělečné činnosti.

Připomínáme, že studenti, kteří už dosáhli 26. roku a studují prvně v doktorském studijním programu na vysoké škole v ČR ve standardní době prezenční formou a nejsou zaměstnanci ani OSVČ, patří od roku 2018 také do skupiny státních pojištěnců a zdravotní pojištění za ně platí stát.

Absolvent pokračuje na další školu

Zdravotní pojištění

Obecně platí, že studenti SŠ a VŠ jsou státními pojištěnci během roku, v době prázdnin mezi ročníky i o prázdninách po absolvování, pokud bezprostředně potom pokračují ve studiu na další škole.

Jak informovala server Měšec.cz Navrátilová z VZP, v případě střední školy (gymnázium, střední odborná škola, vyšší odborná škola, konzervatoř, střední odborné učiliště) ta musí být registrována v rejstříku škol a školských zařízení. V opačném případě student není považován za nezaopatřené dítě a stát pojistné neplatí. To samé platí i u dálkového, distančního, večerního nebo kombinovaného studia na SŠ, pokud je student současně výdělečně činný nebo má nárok na podporu v nezaměstnanosti nebo při rekvalifikaci.

U vysokoškolského studia taková podmínka neplatí: Zde nerozhoduje forma studia, neboť zákon o vysokých školách umožňuje studium na vysokých školách ve třech formách: prezenční (denní), distanční (dálkové) nebo kombinované. Pokud student studuje v rámci akreditovaného studijního programu (bakalářský, magisterský nebo doktorský studijní program), není ani podstatné, jestli studuje na vysoké škole univerzitní, nebo neuniverzitní, veřejné, soukromé nebo státní, uvedla Navrátilová.

Absolvent SŠ nebo VŠ se chystá odjet do zahraničí

Zdravotní pojištění

Krátkodobé pobyty absolventa v zahraničí z hlediska povinností v rámci zdravotního pojištění nic nemění. Rozdílná situace nastává, pokud bude v cizině nepřetržitě déle než 6 měsíců. Pak má pojištěnec možnost se odhlásit ze systému veřejného zdravotního pojištění v ČR. Povinnost platit pojistné zaniká dnem, který pojištěnec v Prohlášení uvedl, ne však dříve než dnem následujícím po dni, kdy bylo toto Prohlášení doručeno příslušnému pracovišti VZP. Pojistné na zdravotní pojištění za tuto osobu pak neplatí ani stát, ani zaměstnavatel, ani pojištěnec sám, vysvětlila Navrátilová z VZP.

Dodala také, že pro účely zdravotního pojištění se o dlouhodobý pobyt v cizině jedná, pokud pojištěnec splní následující podmínky:

  • nepřetržitý pobyt v cizině trvá nejméně 6 měsíců,
  • pojištěnec učinil písemné Prohlášení,
  • po návratu předloží doklad o uzavřeném zdravotním pojištění v cizině a jeho délce trvání.

Pokud tento doklad nepředložíte, musíte doplatit zpětně pojistné tak, jako by k odhlášení nedošlo.

Institut dlouhodobého pobytu v cizině nelze aplikovat v případě, že jste výdělečně činní v některém ze států EU.

skoleni_12_6

Sociální pojištění

Absolvent, který v ČR není výdělečně činný a pojistné na sociální zabezpečení neplatí, nemá vůči České správě sociálního zabezpečení (ČSSZ) žádnou povinnost (platí to při vycestování na stáž, studijní pobyt i za prací). Nemusí tedy na ČSSZ nic hlásit.

V souvislosti se zaměstnáním v EU je třeba připomenout, že v rámci EU platí pro oblast sociálního zabezpečení evropská koordinační pravidla. Ta určují, do kterého systému sociálního zabezpečení se bude z příjmu pojistné platit. Obvykle jdou prostředky do systému toho státu, kde je práce vykonávána. O povinnostech v konkrétní zemi je ale třeba se informovat u příslušné instituce daného státu.

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