Do kdy podat daňové přiznání a do kdy přehledy? Přinášíme přehled termínů a důležitých informací

26. 2. 2025
Doba čtení: 8 minut

Sdílet

Mladá žena si drží před obličejem hodiny a upozorňuje na povinnost, kterou je třeba stihnout
Autor: Depositphotos.com, podle licence: Rights Managed
Ilustrační obrázek
Do kdy je letos nutné podat daňové přiznání na papíře, elektronicky nebo s poradcem a jaký v takovém případě platí termín pro podání přehledů?

S nadcházejícím březnem připomínáme lhůty podání daňového přiznání pro různé skupiny poplatníků a na to navazující termíny pro odevzdání přehledů pro zdravotní pojišťovnu a Českou správu sociálního zabezpečení (ČSSZ).

Daňové přiznání za rok 2024

Konkrétní datum pro podání přiznání se může lišit v případě, že termín padne na víkend nebo svátek. V takovém případě se posune na nejbližší pracovní den.

Přiznání k dani z příjmů fyzických osob poplatníci podávají standardně podle § 136 odst. 1 daňového řádu nejpozději do tří měsíců po uplynutí zdaňovacího období.

Poplatníci, kteří podávají přiznání elektronicky, mají na odevzdání o měsíc delší lhůtu. Tři měsíce navíc získávají poplatníci využívající služeb daňového poradce nebo advokáta (není nutné finančnímu úřadu předem odevzdávat plnou moc).

Letos tedy vychází lhůty pro řádné podání přiznání k dani z příjmů takto: 

  • základní lhůta pro papírové do 1. dubna 2025,
  • lhůta pro přiznání podávané elektronicky do 2. května 2025,
  • lhůta pro přiznání podané přes daňového poradce a advokáta do 1. července 2025.

Pro většinu poplatníků z řad fyzických osob platí květnový termín kvůli zavedení povinnosti podávat přiznání související s podnikáním elektronicky za podmínky, že stát subjektu zpřístupnil datovou schránku.

V případě, že poplatník zemře, musí osoba spravující pozůstalost podat řádné daňové přiznání do 3 měsíců od jeho smrti, a to za tu část roku, kdy ještě žil.

Ustanovení § 250 daňového řádu dává poplatníkům k termínu dalších 5 pracovních dnů na to, aby se vyhnuli pokutě za opožděné tvrzení daně.

Pokud stejně podáte přiznání pozdě, naúčtuje vám za to finanční úřad sankci ve výši 0,05 % stanovené daně za každý den prodlení, maximálně však 5 % stanovené daně (nejvýše 300 tis. Kč). Pokuta se však nepředepíše, pokud je nižší než 1000 Kč.

Když už jsme u těch sankcí, můžete je zkusit poměrně elegantně eliminovat právě volbou způsobu podání přiznání. Nestihnete-li řádný termín pro podání papírového formuláře, získáte měsíc navíc díky odevzdání v elektronické formě. Pokud byste nestihli ani tu, může vás zachránit daňový poradce v situaci, kdy by účtovaná sankce byla vyšší než platba za jeho služby (v minulosti toto nebylo možné kvůli povinnosti správci daně do konce základního termínu podávat zmocnění pro daňového poradce, to už ale neplatí). 

Sankce se začíná načítat až po skončení lhůty, která odpovídá tomu, jakou formou přiznání podáte. Podáte-li ho nakonec na papíře, bude se načítat už od dubna. Podáte-li ho elektronicky, napočítá vám správce daně sankce od května, a podáte-li ho sice pozdě, ale přes poradce, sankce poběží od července.

Daň z příjmů za rok 2024: Čím si letos můžete snížit základ daně? Přečtěte si také:

Daň z příjmů za rok 2024: Čím si letos můžete snížit základ daně?

Placení daně

Datum pro úhradu daně je shodné s datem pro podání daňového přiznání. Pro opozdilce platí opět liberační lhůta, která je podle § 252 daňového řádu ale v tomto případě dlouhá jen 3 kalendářní dny. Od čtvrtého dne prodlení do dne úhrady daně se načítá úrok z prodlení, který odpovídá repo sazbě stanovené centrální bankou pro první den kalendářního pololetí, ve kterém došlo k prodlení, navýšené o osm procentních bodů (v současnosti 12 %).

V případě, že úrok z prodlení v úhrnu u jednoho druhu daně nepřesáhne 1000 Kč za zdaňovací období nebo kalendářní rok, opět platí, že ho finanční úřad nepředepíše.

Daň můžete zaplatit:

  • na pokladně finančního úřadu,
  • bankovním převodem,
  • poštovní poukázkou typu A,
  • hotově na pobočce České národní banky.

V případě bezhotovostního převodu mějte na paměti, že dnem platby je až den, kdy se prostředky připíšou na účet finančního úřadu vedeného u centrální banky. 

Nesmíte zapomenout zvolit správné číslo účtu a také připojit správný variabilní symbol, kterým je buď vaše DIČ, nebo pokud ho nemáte, rodné číslo (právnické osoby uvádějí IČO). Konstantní symbol je v případě bezhotovostní platby 1148.

Název finančního úřadu Daň z příjmů právnických osob Daň z příjmů fyzických osob podávajících přiznání Daň z příjmů fyzických osob ze závislé činnosti
FÚ pro hlavní město Prahu 7704–77628031/0710 721–77628031/0710 713–77628031/0710
FÚ pro Středočeský kraj 7704–77628111/0710 721–77628111/0710 713–77628111/0710
FÚ pro Jihočeský kraj 7704–77627231/0710 721–77627231/0710 713–77627231/0710
FÚ pro Plzeňský kraj 7704–77627311/0710 721–77627311/0710 713– 77627311/0710
FÚ pro Karlovarský kraj 7704–77629341/0710 721–77629341/0710 713–77629341/0710
FÚ pro Ústecký kraj 7704–77621411/0710 721–77621411/0710 713–77621411/0710
FÚ pro Liberecký kraj 7704–77628461/0710 721–77628461/0710 713–77628461/0710
FÚ pro Královéhradecký kraj 7704–77626511/0710 721–77626511/0710 713–77626511/0710
FÚ pro Pardubický kraj 7704–77622561/0710 721–77622561/0710 713–77622561/0710
FÚ pro Kraj Vysočina 7704–67626681/0710 721–67626681/0710 713–67626681/0710
FÚ pro Jihomoravský kraj 7704–77628621/0710 721–77628621/0710 713–77628621/0710
FÚ pro Olomoucký kraj 7704–47623811/0710 721–47623811/0710 713–47623811/0710
FÚ pro Moravskoslezský kraj 7704–77621761/0710 721–77621761/0710 713–77621761/0710
FÚ pro Zlínský kraj 7704–47620661/0710 721–47620661/0710 713–47620661/0710
Specializovaný finanční úřad 7704–77620021/0710 713–77620021/0710

Elektronické podání daňového přiznání

Minulý rok se výrazně rozšířila skupina lidí, kteří mají datovou schránku zřízenou ze zákona. Datovku dostaly všechny podnikající fyzické osoby a nepodnikající právnické osoby (pokud už ji neměly).

Máte-li datovku ze zákona, musíte některá formulářová podání – hlavně daňová přiznání, která se aspoň částečně týkají vaší podnikatelské činnosti – provádět elektronicky. To znamená přiznání podat přes:

  • aplikaci Elektronická podání pro finanční správu (EPO), což je elektronická podatelna orgánů Finanční správy ČR pro podání v daňových věcech,
  • aplikaci Online finanční úřad, kde máte svou Daňovou informační schránku Plus (DIS+), což je taková vaše interaktivní daňová složka, kam se vám do dvou dnů po založení nahrají informace, které o vás má Finanční správa k dispozici,
  • datovou schránku ve formátu a struktuře XML souboru (viz Pokyn GFŘ-D-50). Tento soubor můžete vygenerovat přes aplikaci EPO (kde už ho ale rovnou můžete i podat),
  • program třetí strany, který umí po vyplnění daňového přiznání na vašem počítači vygenerovat XML soubor, který můžete poslat datovkou, nebo ho načíst do aplikace EPO. Takovou službu vám nabízí i naše formuláře.
Daňové slevy 2025: Čím si letos můžete snížit daň z příjmů? Přečtěte si také:

Daňové slevy 2025: Čím si letos můžete snížit daň z příjmů?

Podání přehledů

Přehledy pro ČSSZ a zdravotní pojišťovnu musíte odevzdat nejpozději do jednoho měsíce od doby, kdy máte podat daňové přiznání. V souvislosti s přehledem pro správu sociálního zabezpečení ale platí od letošního roku jedna novinka.

Přehled o příjmech a výdajích pro ČSSZ povinně elektronicky

Přehled o příjmech a výdajích OSVČ za rok 2024 musí ČSSZ podat každá OSVČ, která alespoň po část minulého roku vykonávala samostatnou výdělečnou činnost. To neplatí pro poplatníky v režimu paušální daně, odpovídá-li jejich daň paušální dani.

Od letošního roku i pro Přehled o příjmech a výdajích pro ČSSZ platí, že máte-li ze zákona zpřístupněnu datovou schránku, musíte dělat podání pro tento úřad už jen elektronicky (k podání v papírové formě se nepřihlíží).

Přehledy pro sociálku a další tiskopisy musí většina OSVČ od letoška podávat jen elektronicky Přečtěte si také:

Přehledy pro sociálku a další tiskopisy musí většina OSVČ od letoška podávat jen elektronicky

Přehled je letos za loňský rok nutné podat nejpozději do:

  • 2. 5. 2025, pokud jste daňové přiznání podali ve lhůtě 3 měsíců od uplynutí minulého roku (bez ohledu na formu podání),
  • 2. 6. 2025, pokud přiznání odevzdáte elektronicky po 1. 4. 2025,
  • 31. 7. 2025, pokud jste neměli povinnost podat daňové přiznání,
  • 1. 8. 2025, pokud daňové přiznání podá daňový poradce po 1. 4. 2025.

Způsob podání přehledu

Jak už jsme zmínili, pokud máte ze zákona zpřístupněnou datovou schránku, musíte přehled podat elektronicky. Zákon předepisuje, že elektronické podání by mělo být učiněno ve formátu XML. ČSSZ ale volí benevolentnější přístup a připouští i jinou elektronickou formu.

Byť je pro podání přehledu o příjmech a výdajích OSVČ zákonem předepsaný způsob, tj. podání ve formátu XML, tak i přesto ČSSZ akceptuje i podání ve formátu PDF (vyplnění přehledu ve formátu PDF a jeho následné zaslání do datové schránky příslušného kontaktního pracoviště územní správy sociálního zabezpečení, které je také považováno za elektronické podání), řekla serveru Měšec.cz mluvčí ČSSZ Jitka Drmolová.

Akceptovatelné způsoby elektronického podání tedy jsou:

  • prostřednictvím interaktivního formuláře z ePortálu ČSSZ – tiskopis pak odesíláte ve formátu XML přímo vaší místně příslušné správě sociálního zabezpečení (po přihlášení do ePortálu ČSSZ – např. prostřednictvím ověření datovou schránkou – se vám značná část údajů do přehledu vyplní automaticky),
  • ve formátu XML prostřednictvím přímého kanálu (přes veřejné rozhraní pro e-Podání (VREP/APEP) za podmínky, že vlastní uznávaný elektronický podpis,
  • v čitelném formátu (např. v PDF) doručit formulář na e-podatelnu nebo do datové schránky příslušné správy sociálního zabezpečení, pokud máte uznávaný elektronický podpis nebo datovou schránku.

Nemáte-li jako zpřístupněnou datovou schránku ze zákona, můžete zaslat formulář z ePortálu ČSSZ např. ve formátu PDF na e-podatelnu (máte-li uznávaný elektronický podpis) nebo ho doručit na příslušnou správu sociálního zabezpečení poštou či osobně. V situaci, kdy se potýkají s technickými obtížemi, mohou využít podání v listinné formě i OSVČ, které by měly podat formulář elektronicky. Musí ale důvod řádně vysvětlit, jinak nebude k této formě podání přihlédnuto.

Přehled o výši daňového základu OSVČ pro zdravotní pojišťovnu

I u Přehledu o výši daňového základu OSVČ (dříve Přehled OSVČ) platí, že ho musí OSVČ předložit nejpozději do jednoho měsíce ode dne, ve kterém měla podat daňové přiznání.

Termíny pro podání Přehledu za rok 2024 jsou:

  • do 8. 4. 2025 pro OSVČ, které nemají povinnost podávat daňové přiznání za rok 2024,
  • do 2. 5. 2025 pro OSVČ, kterým nezpracovává daňové přiznání za rok 2024 daňový poradce,
  • do 2. 6. 2025 pro OSVČ, které nepodaly daňové přiznání do 2. 4. 2025 a následně ho do 2. 5. 2025 podaly elektronicky,
  • do 1. 8. 2024 pro OSVČ, kterým zpracovává daňové přiznání daňový    poradce.

V případě přehledu pro zdravotní pojišťovnu si OSVČ může vybrat, zda zvolí elektronickou formu přes rozhraní konkrétní zdravotní pojišťovny, pošle formulář datovou schránkou, poštou, nebo ho donese na pobočku osobně.

Nedoplatek, který vyjde v přehledu, je nutné doplácet vždy do osmi dnů od data, kdy byl, nebo měl být podán. V opačném případě dojde k načítání penále ve výši 0,05 % z dlužné částky za každý kalendářní den. Nepředepisuje se k úhradě v případě, že za rok v úhrnu nepřesáhne 100 Kč.

bitcoin_smenarna

Připomeňme ještě, že u důchodového pojištění od loňska platí, že vyšel-li nový vyměřovací základ vyšší než ten původní, a je nutné navýšit zálohu na pojistné, ale vždy až od následujícího měsíce po tom, v němž byl, nebo měl být přehled podán.

Navyšování minimálních záloh v novém roce se sjednotí. Více na důchodové pojištění zaplatíte už od ledna Přečtěte si také:

Navyšování minimálních záloh v novém roce se sjednotí. Více na důchodové pojištění zaplatíte už od ledna

U zdravotního pojištění naopak platí, že novou výši zálohy vypočtenou dle přehledu zaplatí OSVČ poprvé už za měsíc, ve kterém byl, nebo měl být přehled podán.

Neutrální ikona do widgetu na odběr článků ze seriálů

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.


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