Přehled změn v sociálním pojištění OSVČ v roce 2025

29. 11. 2024
Doba čtení: 6 minut

Sdílet

Ilustrační obrázek
Autor: Depositphotos.com, podle licence: Rights Managed
Ilustrační obrázek
OSVČ se v roce 2025 zvýší minimální zálohy na sociálním pojištění. Na druhou stranu ty, které si platí nemocenské pojištění, získají nárok na ošetřovné.

Další novinkou je, že OSVČ budou muset komunikovat se sociálkou elektronicky. Server Podnikatel.cz připravil přehled změn v sociálním pojištění, které se týkají OSVČ.

Co se dozvíte v článku
  1. OSVČ se zvýší minimální zálohy
  2. Začínající OSVČ nebudou muset platit zálohy
  3. OSVČ důchodci budou mít nižší pojistné
  4. OSVČ získají nárok na ošetřovné
  5. Nemocenské pojištění bude stačit i ze zaměstnání
  6. Snížení záloh na pojistné už nebude na žádost
  7. Konec výjimky pro začínající OSVČ v prosinci
  8. OSVČ nebudou moct zpětně měnit informace o hlavní a vedlejší činnosti
  9. Ukončení činnosti nepůjde hlásit zpětně za x let
  10. I pravděpodobné pojistné se bude počítat do důchodu
  11. OSVČ budou muset nově komunikovat elektronicky

OSVČ se zvýší minimální zálohy

Konsolidační balíček, který nabyl účinnosti na začátku letošního roku, zavedl v následujících několika letech zvyšování minimálního vyměřovacího základu pro OSVČ hlavní. Od roku 2024 vzrostl pro OSVČ hlavní vyměřovací základ z 25 % průměrné mzdy na 30 % a pro OSVČ vedlejší z 10 na 11 %, přičemž pro OSVČ hlavní má o dalších 5 p. b. vzrůst i v letech 2025 a 2026. 

Minimální záloha pro rok 2025 se u OSVČ hlavních tak bude počítat z 35 % průměrné mzdy a bude činit 4759 Kč. U OSVČ vedlejších se záloha zvýší ze stávajících 1413 Kč na 1496 Kč. Minimální měsíční vyměřovací základ pro OSVČ hlavní bude 16 295 Kč a pro vedlejší zmíněných 5122 Kč.

Výjimku mají začínající OSVČ hlavní, pro které je minimální vyměřovací základ v prvních dvou letech podnikání stanoven na úrovni 25 % průměrné mzdy. Pro ně budou v roce 2025 platit minimální zálohy ve výši 3399 Kč. 

Jak se mají OSVČ změnit zálohy na sociální a zdravotní pojištění v roce 2025? Přečtěte si také:

Jak se mají OSVČ změnit zálohy na sociální a zdravotní pojištění v roce 2025?

Začínající OSVČ nebudou muset platit zálohy

Už v Senátu se nachází novela, podle které nově OSVČ, které zahájí podnikání, nebudou muset v prvních měsících a v celém následujícím roce podnikání platit zálohy na sociální pojištění. Pojistné pak vždy doplatí až po skončení zdaňovacího období a po podání přehledu. Kdo tak například začne podnikat v září 2025, nebude muset platit zálohy ve 4 měsících roku 2025 ani v roce 2026.

Možnost neplatit zálohy budou moct využít OSVČ, které v předchozích pěti letech nepodnikaly. Neplacení záloh se pak nebude týkat OSVČ v paušálním režimu.

Zrušení začínajícím OSVČ zálohy na sociální pojistné vláda podpořila Přečtěte si také:

Zrušení začínajícím OSVČ zálohy na sociální pojistné vláda podpořila

OSVČ důchodci budou mít nižší pojistné

Součástí důchodové reformy, která rovněž čeká na projednání v Senátu, je i nahrazení trvalého zvyšování důchodů snížením sazby pojistného o 6,5 p. b. pro všechny starobní důchodce s výdělečnou činností. Snížení pojistného se tak bude týkat jak zaměstnaných seniorů, tak důchodců OSVČ. Poprvé bude možné uplatnit slevu za měsíc leden 2025, tj. při splatnosti pojistného za tento měsíc do 20. února 2025.

Jak uplatní pracující důchodci u zaměstnavatele slevu na pojistném? Přečtěte si také:

Jak uplatní pracující důchodci u zaměstnavatele slevu na pojistném?

OSVČ získají nárok na ošetřovné

Novela zákona o nemocenském pojištění, která již prošla Parlamentem, počítá s rozšířením počtu pojištěnců, kteří budou mít nárok na ošetřovné. Nově tak o něj budou moct žádat i OSVČ. Podmínkou bude dobrovolná účast na nemocenském pojištění. Pro OSVČ bude platit stejná úprava, která dosud platila jen pro zaměstnance a týká se podmínek nároku na ošetřovné, podpůrčí doby a výše ošetřovného.

Aby OSVČ získaly nárok na ošetřovné, musí žít s ošetřovanou osobou ve společné domácnosti nebo patřit do okruhu osob blízkých. OSVČ se též bude moct jednou vystřídat v ošetřování (péči). V případě vzniku nároku na ošetřovné z důvodu ošetřování (péče) o další osobu má nárok na poskytování po dobu souběhu nároků jen z prvního případu, při uplatňování nároku na ošetřovné bude také postupovat obdobně jako zaměstnanec, jen žádost bude podávat přímo ÚSSZ, píše se v důvodové zprávě.

OSVČ a lidé pracující na dohody získají nárok na ošetřovné Přečtěte si také:

OSVČ a lidé pracující na dohody získají nárok na ošetřovné

Nemocenské pojištění bude stačit i ze zaměstnání

U OSVČ navíc dojde k dalším změnám. Aktuálně platí, že OSVČ mají nárok na dávky (a to pouze na některé) nemocenského pojištění jen za předpokladu, že splnily podmínku tříměsíční čekací doby z nemocenského pojištění OSVČ. Pouze u peněžité pomoci v mateřství se vyžaduje pro nárok na tuto dávku účast na nemocenském pojištění v systému OSVČ po dobu aspoň 180 dnů v posledním roce před nástupem na tuto dávku.

Nově bude platit, že pokud se OSVČ přihlásí k dobrovolnému nemocenskému pojištění do 8 dnů po skončení zaměstnání a ve skončeném zaměstnání byla účastna nemocenského pojištění v posledních 3 měsících po celou dobu trvání zaměstnání, nebude se na ni vztahovat tříměsíční čekací doba pro vznik nároku na dávku nemocenského pojištění. Přihláška k nemocenskému pojištění OSVČ musí být doručena na ÚSSZ nejpozději 8. den po skončení zaměstnání, i kdyby tímto dnem byla sobota, neděle nebo svátek. Účast na nemocenském pojištění OSVČ nemůže vzniknout přede dnem, v němž ÚSSZ obdrží přihlášku, upřesňuje důvodová zpráva.

Snížení záloh na pojistné už nebude na žádost

Vzhledem k tomu, že v současnosti je skoro všem žádostem o snížení zálohy vyhověno pro splnění podmínek, nově se bude podávat jen oznámení o snížení záloh nebo jejich neplacení místo žádosti. Pokud by OSVČ podmínky pro snížení nesplnila, ÚSSZ sdělí OSVČ, že nesplňuje podmínky pro snížení zálohy, že k podanému oznámení nelze přihlédnout. Při snížení záloh musí být dodržena jejich minimální výše.

Kdy se OSVČ vyhne platbě sociálního pojištění? Přečtěte si také:

Kdy se OSVČ vyhne platbě sociálního pojištění?

Konec výjimky pro začínající OSVČ v prosinci

Dále dojde ke zrušení možnosti pro OSVČ neplatit zálohy na pojistné, pokud v prosinci zahájily samostatnou výdělečnou činnost nebo se v tomto měsíci přihlásily k účasti na důchodovém pojištění. I nadále bude nicméně pro začínající OSVČ, stejně jako pro ostatní OSVČ, které zahájily samostatnou výdělečnou činnost nebo se přihlásily k důchodovému pojištění v jiném měsíci, platit, že zálohu lze uhradit až do konce následujícího kalendářního měsíce.

OSVČ nebudou moct zpětně měnit informace o hlavní a vedlejší činnosti

OSVČ nebudou moci po podání přehledu za kalendářní rok měnit nebo rušit datum oznámení o zahájení nebo ukončení činnosti, o zániku oprávnění vykonávat činnost nebo o pozastavení činnosti a ani dodatečně oznamovat skončení důvodů pro vykonávání vedlejší samostatné výdělečné činnosti, pokud vznik nebo trvání těchto důvodů oznámily v průběhu kalendářního roku, za který přehled podávají.

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

Ukončení činnosti nepůjde hlásit zpětně za x let

V současnosti některé OSVČ oznamují skončení činnosti za dobu i několik roků zpětně, i když za takový rok podaly řádně přehled o příjmech a výdajích a zaplatily pojistné. Důvodem je zpravidla získat vrácení pojistného za dobu, kterou nepotřebují k získání potřebné doby důchodového pojištění pro nárok na důchod. Od roku 2025 ale bude platit, že OSVČ, která na přehledu uvedla, že vykonávala v daném kalendářním roce činnost, bude moct tento údaj opravit jen do konce kalendářního roku, v němž tento přehled podala.

I pravděpodobné pojistné se bude počítat do důchodu

Pokud OSVČ nesplní povinnost podat přehled o příjmech a výdajích, úřady jí stanoví pravděpodobnou výši pojistného. Nově bude platit, že v případě, kdy OSVČ tuto pravděpodobnou výši pojistného uhradí, zohlední se jí do doby důchodového pojištění, za kterou bylo pojistné uhrazeno, pro důchodové nároky.

OSVČ budou muset nově komunikovat elektronicky

Novela dále přináší i změny v oblasti podání OSVČ vůči ČSSZ. U ČSSZ bude nově platit obdobný postup jako u orgánů finanční správy, kde je již v současné době zavedena povinná elektronická komunikace se správcem daně, má-li osoba zřízenou datovou schránku (ze zákona). Od roku 2025 tak bude povinnost činit vybraná podání, má-li OSVČ zpřístupněnou datovou schránku ze zákona, pouze elektronicky i v oblasti sociálního a nemocenského pojištění OSVČ. 

Marketing meeting Influenceři a sociální sítě

U nemocenského pojištění se bude jednat o přihlášku k dobrovolnému nemocenskému pojištění OSVČ a o podání žádosti o dávky nemocenského pojištění, tedy o peněžitou pomoc v mateřství, o dlouhodobé ošetřovné a o otcovskou. U sociálního pojištění bude nutné podat elektronicky oznámení o zahájení samostatné výdělečné činnosti, přihlášku k účasti na důchodovém pojištění a přehled o příjmech a výdajích za uplynulý kalendářní rok a o pojistném placeném OSVČ.

Zároveň nicméně bude platit úleva v případě technických problémů. Podání nebo jiný úkon může OSVČ učinit v listinné podobě zasláním nebo předáním příslušné ÚSSZ, pokud toto nebude schopna činit v elektronické podobě z prokazatelných objektivních technických důvodů (např. z důvodu výpadku elektřiny).

Autor článku

Daniel Morávek píše o daních, zákonech a důchodech. Vysvětluje, jak legislativa ovlivňuje podnikatele a živnostníky. Profil autora →

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